[babl] extensions/CIE.c: improve handling of near zero values
- From: Øyvind "pippin" Kolås <ok src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [babl] extensions/CIE.c: improve handling of near zero values
- Date: Thu, 4 Jul 2019 11:12:16 +0000 (UTC)
commit 9931248dd9e0865aefa5d13c9a38f9fecedca69f
Author: Øyvind Kolås <pippin gimp org>
Date: Thu Jul 4 13:11:05 2019 +0200
extensions/CIE.c: improve handling of near zero values
Negative values were treated as near zero, causing more clipping than
neccesary to occur.
extensions/CIE.c | 58 +++++++++++++++++++++++++++++---------------------------
1 file changed, 30 insertions(+), 28 deletions(-)
---
diff --git a/extensions/CIE.c b/extensions/CIE.c
index 459831d..9bfb41b 100644
--- a/extensions/CIE.c
+++ b/extensions/CIE.c
@@ -1,7 +1,7 @@
/* babl - dynamically extendable universal pixel conversion library.
- * Copyright (C) 2005, 2014 Øyvind Kolås.
+ * Copyright (C) 2005, 2014, 2019 Øyvind Kolås.
* Copyright (C) 2009, Martin Nordholts
- * Copyright (C) 2014, Elle Stone
+ * Copyright (C) 2014, 2019 Elle Stone
* Copyright (C) 2017, 2018 Red Hat, Inc.
*
* This library is free software; you can redistribute it and/or
@@ -57,6 +57,8 @@
#define D50_WHITE_REF_Z 0.824905400f
#define NEAR_ZERO 0.0000000001f
+#define near_zero(a) ((a) < NEAR_ZERO && (a) > -NEAR_ZERO)
+
#define D50_WHITE_REF_x 0.345702921222f
#define D50_WHITE_REF_y 0.358537532290f
@@ -311,7 +313,7 @@ XYZ_to_xyY (double X,
double *to_Y)
{
double sum = X + Y + Z;
- if (sum < NEAR_ZERO)
+ if (near_zero (sum))
{ *to_Y = 0.0;
*to_x = D50_WHITE_REF_x;
*to_y = D50_WHITE_REF_y;
@@ -332,7 +334,7 @@ xyY_to_XYZ (double x,
double *to_Y,
double *to_Z)
{
- if ( Y < NEAR_ZERO )
+ if (near_zero (Y))
{
*to_X = 0.0;
*to_Y = 0.0;
@@ -363,17 +365,17 @@ XYZ_to_Yuv (double X,
double *to_v)
{
double sum = X + (15.0 * Y) + (3.0 * Z);
- if (sum < NEAR_ZERO)
- {
- *to_Y = 0.0;
- *to_u = 4.0/19.0;
- *to_v = 9.0/19.0;
- }
- else
- {
- *to_Y = Y;
- *to_u = (4.0 * X) / sum;
- *to_v = (9.0 * Y) / sum;
+ if (near_zero (sum))
+ {
+ *to_Y = 0.0;
+ *to_u = 4.0/19.0;
+ *to_v = 9.0/19.0;
+ }
+ else
+ {
+ *to_Y = Y;
+ *to_u = (4.0 * X) / sum;
+ *to_v = (9.0 * Y) / sum;
}
}
@@ -385,7 +387,7 @@ Yuv_to_XYZ (double Y,
double *to_Y,
double *to_Z)
{
- if ( v < NEAR_ZERO )
+ if (near_zero (v))
{
*to_X = 0.0;
*to_Y = 0.0;
@@ -600,7 +602,7 @@ rgbaf_to_xyYaf (const Babl *conversion,
b = src[2];
a = src[3];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
x = D50_WHITE_REF_x;
@@ -650,7 +652,7 @@ rgbf_to_xyYf (const Babl *conversion,float *src,
g = src[1];
b = src[2];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
x = D50_WHITE_REF_x;
@@ -701,7 +703,7 @@ rgbaf_to_xyYf (const Babl *conversion,
g = src[1];
b = src[2];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
x = D50_WHITE_REF_x;
@@ -755,7 +757,7 @@ rgbaf_to_Yuvaf (const Babl *conversion,
b = src[2];
a = src[3];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
u = 4.0/19.0;
@@ -806,7 +808,7 @@ rgbf_to_Yuvf (const Babl *conversion,float *src,
g = src[1];
b = src[2];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
u = 4.0/19.0;
@@ -858,7 +860,7 @@ rgbaf_to_Yuvf (const Babl *conversion,
g = src[1];
b = src[2];
- if ( r < NEAR_ZERO && g < NEAR_ZERO && b < NEAR_ZERO )
+ if (near_zero(r) && near_zero(g) && near_zero(b))
{
Y = 0.0f;
u = 4.0/19.0;
@@ -1057,7 +1059,7 @@ xyYf_to_rgbf (const Babl *conversion,float *src,
float y = src[1];
float Y = src[2];
- if ( Y < NEAR_ZERO )
+ if (near_zero (y))
{
X = 0.0f;
Y = 0.0f;
@@ -1111,7 +1113,7 @@ xyYf_to_rgbaf (const Babl *conversion,
float Y = src[2];
- if ( Y < NEAR_ZERO )
+ if (near_zero (Y))
{
X = 0.0f;
Y = 0.0f;
@@ -1164,7 +1166,7 @@ xyYaf_to_rgbaf (const Babl *conversion,
float Y = src[2];
float a = src[3];
- if ( Y < NEAR_ZERO )
+ if (near_zero (Y))
{
X = 0.0f;
Y = 0.0f;
@@ -1219,7 +1221,7 @@ Yuvf_to_rgbf (const Babl *conversion,float *src,
float u = src[1];
float v = src[2];
- if ( v < NEAR_ZERO )
+ if (near_zero (v))
{
X = 0.0f;
Y = 0.0f;
@@ -1272,7 +1274,7 @@ Yuvf_to_rgbaf (const Babl *conversion,
float u = src[1];
float v = src[2];
- if ( v < NEAR_ZERO )
+ if (near_zero (v))
{
X = 0.0f;
Y = 0.0f;
@@ -1325,7 +1327,7 @@ Yuvaf_to_rgbaf (const Babl *conversion,
float v = src[2];
float a = src[3];
- if ( v < NEAR_ZERO )
+ if (near_zero (v))
{
X = 0.0f;
Y = 0.0f;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]