/* LIBPIKA - The PIKA Library * Copyright (C) 1995-1997 Peter Mattis and Spencer Kimball * * This library is free software: you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 3 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library. If not, see * . */ #include "config.h" #include #include "libpikamath/pikamath.h" #include "pikacolortypes.h" #include "pikacmyk.h" /** * SECTION: pikacmyk * @title: PikaCMYK * @short_description: Definitions and Functions relating to CMYK colors. * * Definitions and Functions relating to CMYK colors. **/ /* * PIKA_TYPE_CMYK */ static PikaCMYK * pika_cmyk_copy (const PikaCMYK *cmyk); G_DEFINE_BOXED_TYPE (PikaCMYK, pika_cmyk, pika_cmyk_copy, g_free) static PikaCMYK * pika_cmyk_copy (const PikaCMYK *cmyk) { return g_memdup2 (cmyk, sizeof (PikaCMYK)); } /* CMYK functions */ /** * pika_cmyk_set: * @cmyk: A #PikaCMYK structure which will hold the specified CMYK value. * @cyan: The Cyan channel of the CMYK value * @magenta: The Magenta channel * @yellow: The Yellow channel * @black: The blacK channel * * Very basic initialiser for the internal #PikaCMYK structure. Channel * values are doubles in the range 0 to 1. **/ void pika_cmyk_set (PikaCMYK *cmyk, gdouble cyan, gdouble magenta, gdouble yellow, gdouble black) { g_return_if_fail (cmyk != NULL); cmyk->c = cyan; cmyk->m = magenta; cmyk->y = yellow; cmyk->k = black; } /** * pika_cmyk_set_uchar: * @cmyk: A #PikaCMYK structure which will hold the specified CMYK value. * @cyan: The Cyan channel of the CMYK value * @magenta: The Magenta channel * @yellow: The Yellow channel * @black: The blacK channel * * The same as pika_cmyk_set(), except that channel values are * unsigned chars in the range 0 to 255. **/ void pika_cmyk_set_uchar (PikaCMYK *cmyk, guchar cyan, guchar magenta, guchar yellow, guchar black) { g_return_if_fail (cmyk != NULL); cmyk->c = (gdouble) cyan / 255.0; cmyk->m = (gdouble) magenta / 255.0; cmyk->y = (gdouble) yellow / 255.0; cmyk->k = (gdouble) black / 255.0; } /** * pika_cmyk_get_uchar: * @cmyk: A #PikaCMYK structure which will hold the specified CMYK value. * @cyan: (out) (optional): The Cyan channel of the CMYK value * @magenta: (out) (optional): The Magenta channel * @yellow: (out) (optional): The Yellow channel * @black: (out) (optional): The blacK channel * * Retrieve individual channel values from a #PikaCMYK structure. Channel * values are pointers to unsigned chars in the range 0 to 255. **/ void pika_cmyk_get_uchar (const PikaCMYK *cmyk, guchar *cyan, guchar *magenta, guchar *yellow, guchar *black) { g_return_if_fail (cmyk != NULL); if (cyan) *cyan = ROUND (CLAMP (cmyk->c, 0.0, 1.0) * 255.0); if (magenta) *magenta = ROUND (CLAMP (cmyk->m, 0.0, 1.0) * 255.0); if (yellow) *yellow = ROUND (CLAMP (cmyk->y, 0.0, 1.0) * 255.0); if (black) *black = ROUND (CLAMP (cmyk->k, 0.0, 1.0) * 255.0); } /* CMYKA functions */ /** * pika_cmyka_set: * @cmyka: A #PikaCMYK structure which will hold the specified CMYKA value. * @cyan: The Cyan channel of the CMYK value * @magenta: The Magenta channel * @yellow: The Yellow channel * @black: The blacK channel * @alpha: The Alpha channel * * Initialiser for the internal #PikaCMYK structure. Channel values are * doubles in the range 0 to 1. **/ void pika_cmyka_set (PikaCMYK *cmyka, gdouble cyan, gdouble magenta, gdouble yellow, gdouble black, gdouble alpha) { g_return_if_fail (cmyka != NULL); cmyka->c = cyan; cmyka->m = magenta; cmyka->y = yellow; cmyka->k = black; cmyka->a = alpha; } /** * pika_cmyka_set_uchar: * @cmyka: A #PikaCMYK structure which will hold the specified CMYKA value. * @cyan: The Cyan channel of the CMYK value * @magenta: The Magenta channel * @yellow: The Yellow channel * @black: The blacK channel * @alpha: The Alpha channel * * The same as pika_cmyka_set(), except that channel values are * unsigned chars in the range 0 to 255. **/ void pika_cmyka_set_uchar (PikaCMYK *cmyka, guchar cyan, guchar magenta, guchar yellow, guchar black, guchar alpha) { g_return_if_fail (cmyka != NULL); cmyka->c = (gdouble) cyan / 255.0; cmyka->m = (gdouble) magenta / 255.0; cmyka->y = (gdouble) yellow / 255.0; cmyka->k = (gdouble) black / 255.0; cmyka->a = (gdouble) alpha / 255.0; } /** * pika_cmyka_get_uchar: * @cmyka: A #PikaCMYK structure which will hold the specified CMYKA value. * @cyan: (out) (optional): The Cyan channel of the CMYK value * @magenta: (out) (optional): The Magenta channel * @yellow: (out) (optional): The Yellow channel * @black: (out) (optional): The blacK channel * @alpha: (out) (optional): The Alpha channel * * Retrieve individual channel values from a #PikaCMYK structure. * Channel values are pointers to unsigned chars in the range 0 to 255. **/ void pika_cmyka_get_uchar (const PikaCMYK *cmyka, guchar *cyan, guchar *magenta, guchar *yellow, guchar *black, guchar *alpha) { g_return_if_fail (cmyka != NULL); if (cyan) *cyan = ROUND (CLAMP (cmyka->c, 0.0, 1.0) * 255.0); if (magenta) *magenta = ROUND (CLAMP (cmyka->m, 0.0, 1.0) * 255.0); if (yellow) *yellow = ROUND (CLAMP (cmyka->y, 0.0, 1.0) * 255.0); if (black) *black = ROUND (CLAMP (cmyka->k, 0.0, 1.0) * 255.0); if (alpha) *alpha = ROUND (CLAMP (cmyka->a, 0.0, 1.0) * 255.0); }