summaryrefslogtreecommitdiffstats
path: root/libgimpcolor/gimpcmyk.c
diff options
context:
space:
mode:
Diffstat (limited to 'libgimpcolor/gimpcmyk.c')
-rw-r--r--libgimpcolor/gimpcmyk.c233
1 files changed, 233 insertions, 0 deletions
diff --git a/libgimpcolor/gimpcmyk.c b/libgimpcolor/gimpcmyk.c
new file mode 100644
index 0000000..28b08eb
--- /dev/null
+++ b/libgimpcolor/gimpcmyk.c
@@ -0,0 +1,233 @@
+/* LIBGIMP - The GIMP 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
+ * <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <glib-object.h>
+
+#include "libgimpmath/gimpmath.h"
+
+#include "gimpcolortypes.h"
+
+#include "gimpcmyk.h"
+
+
+/**
+ * SECTION: gimpcmyk
+ * @title: GimpCMYK
+ * @short_description: Definitions and Functions relating to CMYK colors.
+ *
+ * Definitions and Functions relating to CMYK colors.
+ **/
+
+
+/*
+ * GIMP_TYPE_CMYK
+ */
+
+static GimpCMYK * gimp_cmyk_copy (const GimpCMYK *cmyk);
+
+
+GType
+gimp_cmyk_get_type (void)
+{
+ static GType cmyk_type = 0;
+
+ if (!cmyk_type)
+ cmyk_type = g_boxed_type_register_static ("GimpCMYK",
+ (GBoxedCopyFunc) gimp_cmyk_copy,
+ (GBoxedFreeFunc) g_free);
+
+ return cmyk_type;
+}
+
+static GimpCMYK *
+gimp_cmyk_copy (const GimpCMYK *cmyk)
+{
+ return g_memdup (cmyk, sizeof (GimpCMYK));
+}
+
+
+/* CMYK functions */
+
+/**
+ * gimp_cmyk_set:
+ * @cmyk: A #GimpCMYK 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 #GimpCMYK structure. Channel
+ * values are doubles in the range 0 to 1.
+ **/
+void
+gimp_cmyk_set (GimpCMYK *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;
+}
+
+/**
+ * gimp_cmyk_set_uchar:
+ * @cmyk: A #GimpCMYK 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 gimp_cmyk_set(), except that channel values are
+ * unsigned chars in the range 0 to 255.
+ **/
+void
+gimp_cmyk_set_uchar (GimpCMYK *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;
+}
+
+/**
+ * gimp_cmyk_get_uchar:
+ * @cmyk: A #GimpCMYK 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
+ *
+ * Retrieve individual channel values from a #GimpCMYK structure. Channel
+ * values are pointers to unsigned chars in the range 0 to 255.
+ **/
+void
+gimp_cmyk_get_uchar (const GimpCMYK *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 */
+
+/**
+ * gimp_cmyka_set:
+ * @cmyka: A #GimpCMYK 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 #GimpCMYK structure. Channel values are
+ * doubles in the range 0 to 1.
+ **/
+void
+gimp_cmyka_set (GimpCMYK *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;
+}
+
+/**
+ * gimp_cmyka_set_uchar:
+ * @cmyka: A #GimpCMYK 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 gimp_cmyka_set(), except that channel values are
+ * unsigned chars in the range 0 to 255.
+ **/
+void
+gimp_cmyka_set_uchar (GimpCMYK *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;
+}
+/**
+ * gimp_cmyka_get_uchar:
+ * @cmyka: A #GimpCMYK 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
+ *
+ * Retrieve individual channel values from a #GimpCMYK structure.
+ * Channel values are pointers to unsigned chars in the range 0 to 255.
+ **/
+void
+gimp_cmyka_get_uchar (const GimpCMYK *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);
+}