Bug 728610 - Code for retrieving the XYZ values of a matrix RGB profile

Add two private functions which are currently unused but will
become public once it's clear where exactly we need them:

gimp_color_profile_get_rgb_matrix_colorants(): returns a GimpMatrix2
with the RGB colorants.

gimp_color_profile_new_foobar(): takes an existing profile and creates
a new one with the same RGB colorants but a linear gamma TRC. To be
renamed and made more general.
This commit is contained in:
Elle Stone
2015-08-21 17:29:39 -04:00
committed by Michael Natterer
parent e491bf8e09
commit b8902a7d95

View File

@ -663,6 +663,117 @@ gimp_color_profile_set_tag (cmsHPROFILE profile,
cmsMLUfree (mlu);
}
static gboolean
gimp_color_profile_get_rgb_matrix_colorants (GimpColorProfile *profile,
GimpMatrix3 *matrix)
{
cmsHPROFILE lcms_profile;
cmsCIEXYZ *red;
cmsCIEXYZ *green;
cmsCIEXYZ *blue;
g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (profile), FALSE);
lcms_profile = profile->priv->lcms_profile;
red = cmsReadTag (lcms_profile, cmsSigRedColorantTag);
green = cmsReadTag (lcms_profile, cmsSigGreenColorantTag);
blue = cmsReadTag (lcms_profile, cmsSigBlueColorantTag);
if (red && green && blue)
{
if (matrix)
{
matrix->coeff[0][0] = red->X;
matrix->coeff[0][1] = red->Y;
matrix->coeff[0][2] = red->Z;
matrix->coeff[1][0] = green->X;
matrix->coeff[1][1] = green->Y;
matrix->coeff[1][2] = green->Z;
matrix->coeff[2][0] = blue->X;
matrix->coeff[2][1] = blue->X;
matrix->coeff[2][2] = blue->X;
}
return TRUE;
}
return FALSE;
}
static GimpColorProfile *
gimp_color_profile_new_foobar (GimpColorProfile *profile)
{
/* Make the target RGB working space. Until the ICC allows other
* illuminants, and corresponding LCMS code has been added, use the
* D50 color space reference white and illuminant.
*/
GimpColorProfile *new_profile;
cmsHPROFILE target_profile;
cmsToneCurve *gamma100[3];
GimpMatrix3 matrix;
cmsCIEXYZ red;
cmsCIEXYZ green;
cmsCIEXYZ blue;
cmsCIEXYZ D50 = { 0.96420288, 1.00000000, 0.82490540 };
g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (profile), NULL);
if (! gimp_color_profile_get_rgb_matrix_colorants (profile, &matrix))
return NULL;
red.X = matrix.coeff[0][0];
red.Y = matrix.coeff[0][1];
red.Z = matrix.coeff[0][2];
green.X = matrix.coeff[1][0];
green.Y = matrix.coeff[1][1];
green.Z = matrix.coeff[1][2];
blue.X = matrix.coeff[2][0];
blue.Y = matrix.coeff[2][1];
blue.Z = matrix.coeff[2][2];
target_profile = cmsCreateProfilePlaceholder (0);
gamma100[0] = gamma100[1] = gamma100[2] = cmsBuildGamma (NULL, 1.00);
cmsSetProfileVersion (target_profile, 4.3);
cmsSetDeviceClass (target_profile, cmsSigDisplayClass);
cmsSetColorSpace (target_profile, cmsSigRgbData);
cmsSetPCS (target_profile, cmsSigXYZData);
cmsWriteTag (target_profile, cmsSigMediaWhitePointTag, &D50);
cmsWriteTag (target_profile, cmsSigRedColorantTag, &red);
cmsWriteTag (target_profile, cmsSigGreenColorantTag, &green);
cmsWriteTag (target_profile, cmsSigBlueColorantTag, &blue);
cmsFreeToneCurve (gamma100[0]);
/* I made this profile with the linear gamma TRC, just so it would be
* a little different from the GIMP sRGB profile. There's a way to
* only have one copy of the TRC in the profile, but I haven't figured
* out how to avoid writing three separate but identical curves.
*/
cmsWriteTag (target_profile, cmsSigRedTRCTag, gamma100[0]);
cmsWriteTag (target_profile, cmsSigGreenTRCTag, gamma100[0]);
cmsWriteTag (target_profile, cmsSigBlueTRCTag, gamma100[0]);
gimp_color_profile_set_tag (profile, cmsSigCopyrightTag,
"Copyright 2015 by GIMP, Creative Commons Attribution-ShareAlike 3.0 Unported License (https://creativecommons.org/licenses/by-sa/3.0/legalcode).");
gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag,
"GIMP user working space with linear gamma TRC.");
gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag,
"GIMP");
new_profile = gimp_color_profile_new_from_lcms_profile (target_profile, NULL);
cmsCloseProfile (target_profile);
return new_profile;
}
static cmsHPROFILE *
gimp_color_profile_new_srgb_internal (void)
{
@ -760,6 +871,34 @@ gimp_color_profile_new_srgb (void)
profile = gimp_color_profile_new_from_lcms_profile (lcms_profile, NULL);
cmsCloseProfile (lcms_profile);
#if 0
/* for testing the code to get the colorants and make a new profile */
{
GimpMatrix3 matrix;
if (gimp_color_profile_get_rgb_matrix_colorants (profile, &matrix))
{
GimpColorProfile *test;
g_printerr ("Profile Red colorant XYZ: %1.8f, %1.8f, %1.8f \n",
matrix.coeff[0][0],
matrix.coeff[0][1],
matrix.coeff[0][2]);
g_printerr ("Profile Green colorant XYZ: %1.8f, %1.8f, %1.8f \n",
matrix.coeff[1][0],
matrix.coeff[1][1],
matrix.coeff[1][2]);
g_printerr ("Profile Blue colorant XYZ: %1.8f, %1.8f, %1.8f \n",
matrix.coeff[2][0],
matrix.coeff[2][1],
matrix.coeff[2][2]);
test = gimp_color_profile_new_foobar (profile);
g_object_unref (test);
}
}
#endif
}
data = gimp_color_profile_get_icc_profile (profile, &length);