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:

committed by
Michael Natterer

parent
e491bf8e09
commit
b8902a7d95
@ -663,6 +663,117 @@ gimp_color_profile_set_tag (cmsHPROFILE profile,
|
|||||||
cmsMLUfree (mlu);
|
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 *
|
static cmsHPROFILE *
|
||||||
gimp_color_profile_new_srgb_internal (void)
|
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);
|
profile = gimp_color_profile_new_from_lcms_profile (lcms_profile, NULL);
|
||||||
|
|
||||||
cmsCloseProfile (lcms_profile);
|
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);
|
data = gimp_color_profile_get_icc_profile (profile, &length);
|
||||||
|
Reference in New Issue
Block a user