[babl] babl/base: use symmetric alpha transformations for CMYK
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] babl/base: use symmetric alpha transformations for CMYK
- Date: Wed, 19 Jun 2019 10:02:58 +0000 (UTC)
commit e7e416c97ec401b834d57471d61c6c02901c4cd4
Author: Øyvind Kolås <pippin gimp org>
Date: Wed Jun 19 11:35:30 2019 +0200
babl/base: use symmetric alpha transformations for CMYK
babl/base/model-cmyk.c | 80 +++++++++++++++++++++++++++-----------------------
1 file changed, 43 insertions(+), 37 deletions(-)
---
diff --git a/babl/base/model-cmyk.c b/babl/base/model-cmyk.c
index 1c68c66..fac82c9 100644
--- a/babl/base/model-cmyk.c
+++ b/babl/base/model-cmyk.c
@@ -43,16 +43,17 @@ cmyka_to_cmykA (const Babl *conversion,
{
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 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 used_alpha = babl_epsilon_for_zero (alpha);
+
+ ((double *) dst)[0] = (cyan) * used_alpha;
+ ((double *) dst)[1] = (magenta) * used_alpha;
+ ((double *) dst)[2] = (yellow) * used_alpha;
+ ((double *) dst)[3] = (key) * used_alpha;
((double *) dst)[4] = alpha;
src += 5 * sizeof (double);
@@ -68,12 +69,13 @@ cmykA_to_cmyka (const Babl *conversion,
{
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 alpha = ((double *) src)[4];
+ double used_alpha = babl_epsilon_for_zero (alpha);
+ double ralpha = 1.0/used_alpha;
+ 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;
@@ -142,16 +144,17 @@ cmyka_to_CMYKA (const Babl *conversion,
{
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] = (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 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 used_alpha = babl_epsilon_for_zero (alpha);
+
+ ((double *) dst)[0] = (1.0-cyan) * used_alpha;
+ ((double *) dst)[1] = (1.0-magenta) * used_alpha;
+ ((double *) dst)[2] = (1.0-yellow) * used_alpha;
+ ((double *) dst)[3] = (1.0-key) * used_alpha;
((double *) dst)[4] = alpha;
src += 5 * sizeof (double);
@@ -167,12 +170,13 @@ CMYKA_to_cmyka (const Babl *conversion,
{
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 alpha = ((double *) src)[4];
+ double used_alpha = babl_epsilon_for_zero (alpha);
+ double ralpha = 1.0 / used_alpha;
+ 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] = 1.0-cyan;
((double *) dst)[1] = 1.0-magenta;
@@ -278,6 +282,7 @@ rgba_to_cmykA (const Babl *conversion,
double green = (((double *) src)[1]);
double blue = (((double *) src)[2]);
double alpha = ((double *) src)[3];
+ double used_alpha = babl_epsilon_for_zero (alpha);
double cyan, magenta, yellow, key;
@@ -307,10 +312,10 @@ rgba_to_cmykA (const Babl *conversion,
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)[0] = (1.0-cyan) * used_alpha;
+ ((double *) dst)[1] = (1.0-magenta) * used_alpha;
+ ((double *) dst)[2] = (1.0-yellow) * used_alpha;
+ ((double *) dst)[3] = (1.0-key) * used_alpha;
((double *) dst)[4] = alpha;
src += 4 * sizeof (double);
@@ -327,7 +332,8 @@ cmykA_to_rgba (const Babl *conversion,
while (n--)
{
double alpha = ((double *) src)[4];
- double ralpha = alpha>0.000001?1.0/alpha:0.0;
+ double used_alpha = babl_epsilon_for_zero (alpha);
+ double ralpha = 1.0 / used_alpha;
double cyanI = ((double *) src)[0] * ralpha;
double magentaI= ((double *) src)[1] * ralpha;
double yellowI = ((double *) src)[2] * ralpha;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]