[babl/wip/pippin/inverted-cmyk: 6/8] extensions: replace naive-CMYK with new CMYK extensions
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl/wip/pippin/inverted-cmyk: 6/8] extensions: replace naive-CMYK with new CMYK extensions
- Date: Tue, 13 Nov 2018 13:55:30 +0000 (UTC)
commit f995b127f4ad7f0f384bbe110c6bdf998e543aa8
Author: Øyvind Kolås <pippin gimp org>
Date: Mon Nov 12 23:35:31 2018 +0100
extensions: replace naive-CMYK with new CMYK extensions
extensions/CMYK.c | 720 ++++++++++++++++++++++++++++++++++++++++++++++++
extensions/Makefile.am | 4 +-
extensions/naive-CMYK.c | 270 ------------------
3 files changed, 722 insertions(+), 272 deletions(-)
---
diff --git a/extensions/CMYK.c b/extensions/CMYK.c
new file mode 100644
index 0000000..2d321d5
--- /dev/null
+++ b/extensions/CMYK.c
@@ -0,0 +1,720 @@
+/* babl - dynamically extendable universal pixel conversion library.
+ * Copyright (C) 2005, 2018 Øyvind Kolås.
+ *
+ * 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
+ * Lesser 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/>.
+ */
+
+/* This file define the "cmy" and "cmyk" models and related formats these
+ * are CMYK formats withthe components stored so that 0 means full coverage
+ * and 1.0 means no coverage which makes additive compositing/blending work
+ * like as if it was RGB
+
+ * conversions should be made with reference to the icc profile in the space
+ * using lcms2 for handling.
+ */
+
+#include "config.h"
+#include <math.h>
+#include <string.h>
+
+#include "babl.h"
+#include "base/util.h"
+
+static void rgba_to_cmykA (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void cmykA_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void rgba_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void cmyka_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void rgba_to_cmyk (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void cmyk_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void rgba_to_cmy (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void cmy_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+
+static void
+cmyk_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void
+cmyka_to_cmyk (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void
+cmykA_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+static void
+cmyka_to_cmykA(const Babl *conversion,char *src,
+ char *dst,
+ long n);
+
+int init (void);
+
+int
+init (void)
+{
+ babl_component_new ("cyan", NULL);
+ babl_component_new ("yellow", NULL);
+ babl_component_new ("magenta", NULL);
+ babl_component_new ("key", NULL);
+
+
+ babl_component_new ("ca", NULL);
+ babl_component_new ("ma", NULL);
+ babl_component_new ("ya", NULL);
+ babl_component_new ("ka", NULL);
+
+
+ babl_model_new (
+ "name", "camayakaA",
+ babl_component ("ca"),
+ babl_component ("ma"),
+ babl_component ("ya"),
+ babl_component ("ka"),
+ babl_component ("A"),
+ NULL
+ );
+
+ babl_model_new (
+ "name", "cmykA",
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ babl_component ("A"),
+ NULL
+ );
+ babl_model_new (
+ "name", "cmyk",
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ NULL
+ );
+ babl_model_new (
+ "name", "cmy",
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ NULL
+ );
+
+
+ babl_conversion_new (
+ babl_model ("cmykA"),
+ babl_model ("cmyk"),
+ "linear", cmyka_to_cmyk,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("cmyk"),
+ babl_model ("cmykA"),
+ "linear", cmyk_to_cmyka,
+ NULL
+ );
+
+
+ babl_conversion_new (
+ babl_model ("cmykA"),
+ babl_model ("camayakaA"),
+ "linear", cmyka_to_cmykA,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("camayakaA"),
+ babl_model ("cmykA"),
+ "linear", cmykA_to_cmyka,
+ NULL
+ );
+
+
+ babl_conversion_new (
+ babl_model ("RGBA"),
+ babl_model ("camayakaA"),
+ "linear", rgba_to_cmykA,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("camayakaA"),
+ babl_model ("RGBA"),
+ "linear", cmykA_to_rgba,
+ NULL
+ );
+
+ babl_conversion_new (
+ babl_model ("RGBA"),
+ babl_model ("cmykA"),
+ "linear", rgba_to_cmyka,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("cmykA"),
+ babl_model ("RGBA"),
+ "linear", cmyka_to_rgba,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("RGBA"),
+ babl_model ("cmyk"),
+ "linear", rgba_to_cmyk,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("cmyk"),
+ babl_model ("RGBA"),
+ "linear", cmyk_to_rgba,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("cmyk"),
+ babl_model ("cmykA"),
+ "linear", cmyk_to_cmyka,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("RGBA"),
+ babl_model ("cmy"),
+ "linear", rgba_to_cmy,
+ NULL
+ );
+ babl_conversion_new (
+ babl_model ("cmy"),
+ babl_model ("RGBA"),
+ "linear", cmy_to_rgba,
+ NULL
+ );
+
+ babl_format_new (
+ "name", "camayakaA float",
+ babl_model ("camayakaA"),
+ babl_type ("float"),
+ babl_component ("ca"),
+ babl_component ("ma"),
+ babl_component ("ya"),
+ babl_component ("ka"),
+ babl_component ("A"),
+ NULL
+ );
+
+ babl_format_new (
+ "name", "cmykA float",
+ babl_model ("cmykA"),
+ babl_type ("float"),
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ babl_component ("A"),
+ NULL
+ );
+ babl_format_new (
+ "name", "cmyk float",
+ babl_model ("cmyk"),
+ babl_type ("float"),
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ NULL
+ );
+ babl_format_new (
+ "name", "cmy float",
+ babl_model ("cmy"),
+ babl_type ("float"),
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ NULL
+ );
+
+ babl_format_new (
+ "name", "cmyk u8",
+ babl_model ("cmyk"),
+ babl_type ("u8"),
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ NULL
+ );
+ babl_format_new (
+ "name", "cmykA u8",
+ babl_model ("cmykA"),
+ babl_type ("u8"),
+ babl_component ("cyan"),
+ babl_component ("magenta"),
+ babl_component ("yellow"),
+ babl_component ("key"),
+ babl_component ("A"),
+ NULL
+ );
+
+ return 0;
+}
+
+static void
+rgba_to_cmykA (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double red = (((double *) src)[0]);
+ double green = (((double *) src)[1]);
+ double blue = (((double *) src)[2]);
+ double alpha = ((double *) src)[3];
+
+ double cyan, magenta, yellow, key;
+
+ double pullout = 1.0;
+
+ cyan = 1.0 - red;
+ magenta = 1.0 - green;
+ yellow = 1.0 - blue;
+
+ key = 1.0;
+ if (cyan < key) key = cyan;
+ if (magenta < key) key = magenta;
+ if (yellow < key) key = yellow;
+
+ key *= pullout;
+
+ if (key < 1.0)
+ {
+ cyan = (cyan - key) / (1.0 - key);
+ magenta = (magenta - key) / (1.0 - key);
+ yellow = (yellow - key) / (1.0 - key);
+ }
+ else
+ {
+ cyan = 0.0;
+ magenta = 0.0;
+ yellow = 0.0;
+ }
+
+ ((double *) dst)[0] = (1.0-cyan) * alpha;
+ ((double *) dst)[1] = (1.0-magenta) * alpha;
+ ((double *) dst)[2] = (1.0-yellow) * alpha;
+ ((double *) dst)[3] = (1.0-key) * alpha;
+ ((double *) dst)[4] = alpha;
+
+ src += 4 * sizeof (double);
+ dst += 5 * sizeof (double);
+ }
+}
+
+static void
+cmyka_to_cmykA (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = ((double *) src)[0];
+ double magenta = ((double *) src)[1];
+ double yellow = ((double *) src)[2];
+ double key = ((double *) src)[3];
+ double alpha = ((double *) src)[4];
+
+ ((double *) dst)[0] = (cyan) * alpha;
+ ((double *) dst)[1] = (magenta) * alpha;
+ ((double *) dst)[2] = (yellow) * alpha;
+ ((double *) dst)[3] = (key) * alpha;
+ ((double *) dst)[4] = alpha;
+
+ src += 5 * sizeof (double);
+ dst += 5 * sizeof (double);
+ }
+}
+
+static void
+cmykA_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double alpha = ((double *) src)[4];
+ double ralpha = alpha>0.000001?1.0/alpha:0.0;
+ double cyanI = ((double *) src)[0] * ralpha;
+ double magentaI= ((double *) src)[1] * ralpha;
+ double yellowI = ((double *) src)[2] * ralpha;
+ double keyI = ((double *) src)[3] * ralpha;
+
+ double cyan = 1.0-cyanI;
+ double magenta = 1.0-magentaI;
+ double yellow = 1.0-yellowI;
+ double key = 1.0-keyI;
+
+ double red, green, blue;
+
+ if (key < 1.0)
+ {
+ cyan = cyan * (1.0 - key) + key;
+ magenta = magenta * (1.0 - key) + key;
+ yellow = yellow * (1.0 - key) + key;
+ }
+ else
+ {
+ cyan = magenta = yellow = 1.0;
+ }
+
+ red = 1.0 - cyan;
+ green = 1.0 - magenta;
+ blue = 1.0 - yellow;
+
+ ((double *) dst)[0] = (red);
+ ((double *) dst)[1] = (green);
+ ((double *) dst)[2] = (blue);
+ ((double *) dst)[3] = alpha;
+
+ src += 5 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
+
+static void
+cmykA_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double alpha = ((double *) src)[4];
+ double ralpha = alpha>0.000001?1.0/alpha:0.0;
+ double cyan = ((double *) src)[0] * ralpha;
+ double magenta= ((double *) src)[1] * ralpha;
+ double yellow = ((double *) src)[2] * ralpha;
+ double key = ((double *) src)[3] * ralpha;
+
+ ((double *) dst)[0] = cyan;
+ ((double *) dst)[1] = magenta;
+ ((double *) dst)[2] = yellow;
+ ((double *) dst)[3] = key;
+ ((double *) dst)[4] = alpha;
+
+ src += 5 * sizeof (double);
+ dst += 5 * sizeof (double);
+ }
+}
+
+
+static void
+rgba_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double red = (((double *) src)[0]);
+ double green = (((double *) src)[1]);
+ double blue = (((double *) src)[2]);
+ double alpha = ((double *) src)[3];
+
+ double cyan, magenta, yellow, key;
+
+ double pullout = 1.0;
+
+ cyan = 1.0 - red;
+ magenta = 1.0 - green;
+ yellow = 1.0 - blue;
+
+ key = 1.0;
+ if (cyan < key) key = cyan;
+ if (magenta < key) key = magenta;
+ if (yellow < key) key = yellow;
+
+ key *= pullout;
+
+ if (key < 1.0)
+ {
+ cyan = (cyan - key) / (1.0 - key);
+ magenta = (magenta - key) / (1.0 - key);
+ yellow = (yellow - key) / (1.0 - key);
+ }
+ else
+ {
+ cyan = 0.0;
+ magenta = 0.0;
+ yellow = 0.0;
+ }
+
+ ((double *) dst)[0] = 1.0-cyan;
+ ((double *) dst)[1] = 1.0-magenta;
+ ((double *) dst)[2] = 1.0-yellow;
+ ((double *) dst)[3] = 1.0-key;
+ ((double *) dst)[4] = alpha;
+
+ src += 4 * sizeof (double);
+ dst += 5 * sizeof (double);
+ }
+}
+
+static void
+cmyka_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = 1.0-((double *) src)[0];
+ double magenta = 1.0-((double *) src)[1];
+ double yellow = 1.0-((double *) src)[2];
+ double key = 1.0-((double *) src)[3];
+ double alpha = ((double *) src)[4];
+
+ double red, green, blue;
+
+ if (key < 1.0)
+ {
+ cyan = cyan * (1.0 - key) + key;
+ magenta = magenta * (1.0 - key) + key;
+ yellow = yellow * (1.0 - key) + key;
+ }
+ else
+ {
+ cyan = magenta = yellow = 1.0;
+ }
+
+ red = 1.0 - cyan;
+ green = 1.0 - magenta;
+ blue = 1.0 - yellow;
+
+ ((double *) dst)[0] = (red);
+ ((double *) dst)[1] = (green);
+ ((double *) dst)[2] = (blue);
+ ((double *) dst)[3] = alpha;
+
+ src += 5 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
+
+static void
+rgba_to_cmyk (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double red = (((double *) src)[0]);
+ double green = (((double *) src)[1]);
+ double blue = (((double *) src)[2]);
+
+ double cyan, magenta, yellow, key;
+
+ double pullout = 1.0;
+
+ cyan = 1.0 - red;
+ magenta = 1.0 - green;
+ yellow = 1.0 - blue;
+
+ key = 1.0;
+ if (cyan < key) key = cyan;
+ if (magenta < key) key = magenta;
+ if (yellow < key) key = yellow;
+
+ key *= pullout;
+
+ if (key < 1.0)
+ {
+ cyan = (cyan - key) / (1.0 - key);
+ magenta = (magenta - key) / (1.0 - key);
+ yellow = (yellow - key) / (1.0 - key);
+ }
+ else
+ {
+ cyan = 0.0;
+ magenta = 0.0;
+ yellow = 0.0;
+ }
+
+ ((double *) dst)[0] = 1.0-cyan;
+ ((double *) dst)[1] = 1.0-magenta;
+ ((double *) dst)[2] = 1.0-yellow;
+ ((double *) dst)[3] = 1.0-key;
+
+ src += 4 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
+
+static void
+cmyk_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = 1.0-((double *) src)[0];
+ double magenta = 1.0-((double *) src)[1];
+ double yellow = 1.0-((double *) src)[2];
+ double key = 1.0-((double *) src)[3];
+
+ double red, green, blue;
+
+ if (key < 1.0)
+ {
+ cyan = cyan * (1.0 - key) + key;
+ magenta = magenta * (1.0 - key) + key;
+ yellow = yellow * (1.0 - key) + key;
+ }
+ else
+ {
+ cyan = magenta = yellow = 1.0;
+ }
+
+ red = 1.0 - cyan;
+ green = 1.0 - magenta;
+ blue = 1.0 - yellow;
+
+ ((double *) dst)[0] = (red);
+ ((double *) dst)[1] = (green);
+ ((double *) dst)[2] = (blue);
+
+ ((double *) dst)[3] = 1.0;
+
+ src += 4 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
+
+static void
+cmyk_to_cmyka (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = ((double *) src)[0];
+ double magenta = ((double *) src)[1];
+ double yellow = ((double *) src)[2];
+ double key = ((double *) src)[3];
+
+ ((double *) dst)[0] = cyan;
+ ((double *) dst)[1] = magenta;
+ ((double *) dst)[2] = yellow;
+ ((double *) dst)[3] = key;
+ ((double *) dst)[4] = 1.0;
+
+ src += 4 * sizeof (double);
+ dst += 5 * sizeof (double);
+ }
+}
+
+
+
+static void
+rgba_to_cmy (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double red = (((double *) src)[0]);
+ double green = (((double *) src)[1]);
+ double blue = (((double *) src)[2]);
+
+ double cyan, magenta, yellow;
+
+ cyan = 1.0 - red;
+ magenta = 1.0 - green;
+ yellow = 1.0 - blue;
+
+ ((double *) dst)[0] = 1.0-cyan;
+ ((double *) dst)[1] = 1.0-magenta;
+ ((double *) dst)[2] = 1.0-yellow;
+
+ src += 4 * sizeof (double);
+ dst += 3 * sizeof (double);
+ }
+}
+
+static void
+cmy_to_rgba (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = 1.0-((double *) src)[0];
+ double magenta = 1.0-((double *) src)[1];
+ double yellow = 1.0-((double *) src)[2];
+
+ double red, green, blue;
+
+ red = 1.0 - cyan;
+ green = 1.0 - magenta;
+ blue = 1.0 - yellow;
+
+ ((double *) dst)[0] = (red);
+ ((double *) dst)[1] = (green);
+ ((double *) dst)[2] = (blue);
+
+ ((double *) dst)[3] = 1.0;
+
+ src += 3 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
+
+
+static void
+cmyka_to_cmyk (const Babl *conversion,char *src,
+ char *dst,
+ long n)
+{
+ while (n--)
+ {
+ double cyan = ((double *) src)[0];
+ double magenta = ((double *) src)[1];
+ double yellow = ((double *) src)[2];
+ double key = ((double *) src)[3];
+
+ ((double *) dst)[0] = cyan;
+ ((double *) dst)[1] = magenta;
+ ((double *) dst)[2] = yellow;
+ ((double *) dst)[3] = key;
+
+ src += 5 * sizeof (double);
+ dst += 4 * sizeof (double);
+ }
+}
diff --git a/extensions/Makefile.am b/extensions/Makefile.am
index a066e8d..879f58d 100644
--- a/extensions/Makefile.am
+++ b/extensions/Makefile.am
@@ -30,7 +30,7 @@ ext_LTLIBRARIES = \
double.la \
float.la \
fast-float.la \
- naive-CMYK.la \
+ CMYK.la \
HCY.la \
HSL.la \
HSV.la \
@@ -54,7 +54,7 @@ gggl_table_la_SOURCES = gggl-table.c
gggl_la_SOURCES = gggl.c
gimp_8bit_la_SOURCES = gimp-8bit.c
grey_la_SOURCES = grey.c
-naive_CMYK_la_SOURCES = naive-CMYK.c
+CMYK_la_SOURCES = CMYK.c
HCY_la_SOURCES = HCY.c
HSL_la_SOURCES = HSL.c
HSV_la_SOURCES = HSV.c
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]