From: Debarshi Ray Date: Tue, 31 Oct 2017 08:43:53 +0000 (+0100) Subject: CIE: Make the RGB to Lab fast paths as accurate as the reference X-Git-Tag: archive/raspbian/1%0.1.106-3+rpi1^2~139^2^2~67 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e17807f235557d5d7b5d2dff3e4c96a7386d5d36;p=babl.git CIE: Make the RGB to Lab fast paths as accurate as the reference The matrices used by the fast paths to convert from RGB to XYZ didn't exactly match the reference matrices in the Babl space. This caused a measurable error in their output. https://bugzilla.gnome.org/show_bug.cgi?id=789695 --- diff --git a/extensions/CIE.c b/extensions/CIE.c index e93b985..56108fc 100644 --- a/extensions/CIE.c +++ b/extensions/CIE.c @@ -625,9 +625,9 @@ rgbf_to_Labf (const Babl *conversion,float *src, float g = src[1]; float b = src[2]; - float xr = 0.43603516f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14305115f / D50_WHITE_REF_X * b; - float yr = 0.22248840f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06060791f / D50_WHITE_REF_Y * b; - float zr = 0.01391602f / D50_WHITE_REF_Z * r + 0.09706116f / D50_WHITE_REF_Z * g + 0.71392822f / D50_WHITE_REF_Z * b; + float xr = 0.43605042f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14303589f / D50_WHITE_REF_X * b; + float yr = 0.22250366f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06059265f / D50_WHITE_REF_Y * b; + float zr = 0.01393127f / D50_WHITE_REF_Z * r + 0.09707642f / D50_WHITE_REF_Z * g + 0.71389771f / D50_WHITE_REF_Z * b; float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 116.0f; float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 116.0f; @@ -659,9 +659,9 @@ rgbaf_to_Labf (const Babl *conversion,float *src, float g = src[1]; float b = src[2]; - float xr = 0.43603516f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14305115f / D50_WHITE_REF_X * b; - float yr = 0.22248840f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06060791f / D50_WHITE_REF_Y * b; - float zr = 0.01391602f / D50_WHITE_REF_Z * r + 0.09706116f / D50_WHITE_REF_Z * g + 0.71392822f / D50_WHITE_REF_Z * b; + float xr = 0.43605042f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14303589f / D50_WHITE_REF_X * b; + float yr = 0.22250366f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06059265f / D50_WHITE_REF_Y * b; + float zr = 0.01393127f / D50_WHITE_REF_Z * r + 0.09707642f / D50_WHITE_REF_Z * g + 0.71389771f / D50_WHITE_REF_Z * b; float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 116.0f; float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 116.0f; @@ -694,9 +694,9 @@ rgbaf_to_Labaf (const Babl *conversion,float *src, float b = src[2]; float a = src[3]; - float xr = 0.43603516f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14305115f / D50_WHITE_REF_X * b; - float yr = 0.22248840f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06060791f / D50_WHITE_REF_Y * b; - float zr = 0.01391602f / D50_WHITE_REF_Z * r + 0.09706116f / D50_WHITE_REF_Z * g + 0.71392822f / D50_WHITE_REF_Z * b; + float xr = 0.43605042f / D50_WHITE_REF_X * r + 0.38511658f / D50_WHITE_REF_X * g + 0.14303589f / D50_WHITE_REF_X * b; + float yr = 0.22250366f / D50_WHITE_REF_Y * r + 0.71690369f / D50_WHITE_REF_Y * g + 0.06059265f / D50_WHITE_REF_Y * b; + float zr = 0.01393127f / D50_WHITE_REF_Z * r + 0.09707642f / D50_WHITE_REF_Z * g + 0.71389771f / D50_WHITE_REF_Z * b; float fx = xr > LAB_EPSILON ? _cbrtf (xr) : (LAB_KAPPA * xr + 16.0f) / 116.0f; float fy = yr > LAB_EPSILON ? _cbrtf (yr) : (LAB_KAPPA * yr + 16.0f) / 116.0f;