static cmsHPROFILE * gimp_color_profile_new_d50_gray_lab_trc_internal (void) { cmsHPROFILE profile; /* white point is D50 from the ICC profile illuminant specs */ cmsCIExyY whitepoint = {0.345702915, 0.358538597, 1.0}; cmsFloat64Number lab_parameters[5] = { 3.0, 1.0 / 1.16, 0.16 / 1.16, 2700.0 / 24389.0, 0.08000 }; cmsToneCurve *curve = cmsBuildParametricToneCurve (NULL, 4, lab_parameters); profile = cmsCreateGrayProfile (&whitepoint, curve); cmsFreeToneCurve (curve); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "GIMP built-in D50 Grayscale with LAB L TRC"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "D50 Grayscale with LAB L TRC"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); return profile; }
static cmsHPROFILE gimp_color_profile_new_d65_gray_linear_internal (void) { cmsHPROFILE profile; /* white point is D65 from the sRGB specs */ cmsCIExyY whitepoint = { 0.3127, 0.3290, 1.0 }; cmsToneCurve *curve = cmsBuildGamma (NULL, 1.0); profile = cmsCreateGrayProfile (&whitepoint, curve); cmsFreeToneCurve (curve); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "GIMP built-in D65 Linear Grayscale"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "D65 Linear Grayscale"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); return profile; }
static cmsHPROFILE * gimp_color_profile_new_d65_gray_srgb_trc_internal (void) { cmsHPROFILE profile; /* white point is D65 from the sRGB specs */ cmsCIExyY whitepoint = { 0.3127, 0.3290, 1.0 }; cmsFloat64Number srgb_parameters[5] = { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 }; cmsToneCurve *curve = cmsBuildParametricToneCurve (NULL, 4, srgb_parameters); profile = cmsCreateGrayProfile (&whitepoint, curve); cmsFreeToneCurve (curve); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "GIMP built-in D65 Grayscale with sRGB TRC"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "D65 Grayscale with sRGB TRC"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); return profile; }
static cmsHPROFILE * gimp_color_profile_new_rgb_srgb_internal (void) { cmsHPROFILE profile; /* white point is D65 from the sRGB specs */ cmsCIExyY whitepoint = { 0.3127, 0.3290, 1.0 }; /* primaries are ITU‐R BT.709‐5 (xYY), which are also the primaries * from the sRGB specs, modified to properly account for hexadecimal * quantization during the profile making process. */ cmsCIExyYTRIPLE primaries = { /* R { 0.6400, 0.3300, 1.0 }, */ /* G { 0.3000, 0.6000, 1.0 }, */ /* B { 0.1500, 0.0600, 1.0 } */ /* R */ { 0.639998686, 0.330010138, 1.0 }, /* G */ { 0.300003784, 0.600003357, 1.0 }, /* B */ { 0.150002046, 0.059997204, 1.0 } }; cmsFloat64Number srgb_parameters[5] = { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 }; cmsToneCurve *curve[3]; /* sRGB curve */ curve[0] = curve[1] = curve[2] = cmsBuildParametricToneCurve (NULL, 4, srgb_parameters); profile = cmsCreateRGBProfile (&whitepoint, &primaries, curve); cmsFreeToneCurve (curve[0]); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "GIMP built-in sRGB"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "sRGB"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); /* The following line produces a V2 profile with a point curve TRC. * Profiles with point curve TRCs can't be used in LCMS2 unbounded * mode ICC profile conversions. A V2 profile might be appropriate * for embedding in sRGB images saved to disk, if the image is to be * opened by an image editing application that doesn't understand V4 * profiles. * * cmsSetProfileVersion (srgb_profile, 2.1); */ return profile; }
static GimpColorProfile gimp_color_profile_new_srgb_internal (void) { cmsHPROFILE srgb_profile; cmsCIExyY d65_srgb_specs = { 0.3127, 0.3290, 1.0 }; cmsCIExyYTRIPLE srgb_primaries_pre_quantized = { { 0.639998686, 0.330010138, 1.0 }, { 0.300003784, 0.600003357, 1.0 }, { 0.150002046, 0.059997204, 1.0 } }; cmsFloat64Number srgb_parameters[5] = { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 }; cmsToneCurve *srgb_parametric_curve = cmsBuildParametricToneCurve (NULL, 4, srgb_parameters); cmsToneCurve *tone_curve[3]; tone_curve[0] = tone_curve[1] = tone_curve[2] = srgb_parametric_curve; srgb_profile = cmsCreateRGBProfile (&d65_srgb_specs, &srgb_primaries_pre_quantized, tone_curve); cmsFreeToneCurve (srgb_parametric_curve); gimp_color_profile_set_tag (srgb_profile, cmsSigProfileDescriptionTag, "GIMP built-in sRGB"); gimp_color_profile_set_tag (srgb_profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (srgb_profile, cmsSigDeviceModelDescTag, "sRGB"); gimp_color_profile_set_tag (srgb_profile, cmsSigCopyrightTag, "Public Domain"); /* The following line produces a V2 profile with a point curve TRC. * Profiles with point curve TRCs can't be used in LCMS2 unbounded * mode ICC profile conversions. A V2 profile might be appropriate * for embedding in sRGB images saved to disk, if the image is to be * opened by an image editing application that doesn't understand V4 * profiles. * * cmsSetProfileVersion (srgb_profile, 2.1); */ return srgb_profile; }
static cmsHPROFILE * gimp_color_profile_new_rgb_adobe_internal (void) { cmsHPROFILE profile; /* white point is D65 from the sRGB specs */ cmsCIExyY whitepoint = { 0.3127, 0.3290, 1.0 }; /* AdobeRGB1998 and sRGB have the same white point. * * The primaries below are technically correct, but because of * hexadecimal rounding these primaries don't make a profile that * matches the original. * * cmsCIExyYTRIPLE primaries = { * { 0.6400, 0.3300, 1.0 }, * { 0.2100, 0.7100, 1.0 }, * { 0.1500, 0.0600, 1.0 } * }; */ cmsCIExyYTRIPLE primaries = { { 0.639996511, 0.329996864, 1.0 }, { 0.210005295, 0.710004866, 1.0 }, { 0.149997606, 0.060003644, 1.0 } }; cmsToneCurve *curve[3]; /* gamma 2.2 */ curve[0] = curve[1] = curve[2] = cmsBuildGamma (NULL, 2.19921875); profile = cmsCreateRGBProfile (&whitepoint, &primaries, curve); cmsFreeToneCurve (curve[0]); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "Compatible with Adobe RGB (1998)"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "Compatible with Adobe RGB (1998)"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); return profile; }
static cmsHPROFILE gimp_color_profile_new_rgb_srgb_linear_internal (void) { cmsHPROFILE profile; /* white point is D65 from the sRGB specs */ cmsCIExyY whitepoint = { 0.3127, 0.3290, 1.0 }; /* primaries are ITU‐R BT.709‐5 (xYY), which are also the primaries * from the sRGB specs, modified to properly account for hexadecimal * quantization during the profile making process. */ cmsCIExyYTRIPLE primaries = { /* R { 0.6400, 0.3300, 1.0 }, */ /* G { 0.3000, 0.6000, 1.0 }, */ /* B { 0.1500, 0.0600, 1.0 } */ /* R */ { 0.639998686, 0.330010138, 1.0 }, /* G */ { 0.300003784, 0.600003357, 1.0 }, /* B */ { 0.150002046, 0.059997204, 1.0 } }; cmsToneCurve *curve[3]; /* linear light */ curve[0] = curve[1] = curve[2] = cmsBuildGamma (NULL, 1.0); profile = cmsCreateRGBProfile (&whitepoint, &primaries, curve); cmsFreeToneCurve (curve[0]); gimp_color_profile_set_tag (profile, cmsSigProfileDescriptionTag, "GIMP built-in Linear sRGB"); gimp_color_profile_set_tag (profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (profile, cmsSigDeviceModelDescTag, "Linear sRGB"); gimp_color_profile_set_tag (profile, cmsSigCopyrightTag, "Public Domain"); return profile; }
static GimpColorProfile * gimp_color_profile_new_from_color_profile (GimpColorProfile *profile, gboolean linear) { GimpColorProfile *new_profile; cmsHPROFILE target_profile; GimpMatrix3 matrix = { 0, }; cmsCIEXYZ *whitepoint; cmsToneCurve *curve; const gchar *model; gchar *new_model; g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (profile), NULL); if (gimp_color_profile_is_rgb (profile)) { if (! gimp_color_profile_get_rgb_matrix_colorants (profile, &matrix)) return NULL; } else if (! gimp_color_profile_is_gray (profile)) { return NULL; } whitepoint = cmsReadTag (profile->priv->lcms_profile, cmsSigMediaWhitePointTag); target_profile = cmsCreateProfilePlaceholder (0); cmsSetProfileVersion (target_profile, 4.3); cmsSetDeviceClass (target_profile, cmsSigDisplayClass); cmsSetPCS (target_profile, cmsSigXYZData); cmsWriteTag (target_profile, cmsSigMediaWhitePointTag, whitepoint); if (linear) { /* linear light */ curve = cmsBuildGamma (NULL, 1.00); gimp_color_profile_set_tag (target_profile, cmsSigProfileDescriptionTag, "linear TRC variant generated by GIMP"); } else { cmsFloat64Number srgb_parameters[5] = { 2.4, 1.0 / 1.055, 0.055 / 1.055, 1.0 / 12.92, 0.04045 }; /* sRGB curve */ curve = cmsBuildParametricToneCurve (NULL, 4, srgb_parameters); gimp_color_profile_set_tag (target_profile, cmsSigProfileDescriptionTag, "sRGB TRC variant generated by GIMP"); } if (gimp_color_profile_is_rgb (profile)) { cmsCIEXYZ red; cmsCIEXYZ green; cmsCIEXYZ blue; cmsSetColorSpace (target_profile, cmsSigRgbData); 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]; cmsWriteTag (target_profile, cmsSigRedColorantTag, &red); cmsWriteTag (target_profile, cmsSigGreenColorantTag, &green); cmsWriteTag (target_profile, cmsSigBlueColorantTag, &blue); cmsWriteTag (target_profile, cmsSigRedTRCTag, curve); cmsWriteTag (target_profile, cmsSigGreenTRCTag, curve); cmsWriteTag (target_profile, cmsSigBlueTRCTag, curve); } else { cmsSetColorSpace (target_profile, cmsSigGrayData); cmsWriteTag (target_profile, cmsSigGrayTRCTag, curve); } cmsFreeToneCurve (curve); model = gimp_color_profile_get_model (profile); if (model && g_str_has_prefix (model, "Generated from '")) { /* don't add multiple "Generated from 'foo'" */ new_model = g_strdup (model); } else { new_model = g_strdup_printf ("Generated from '%s'", gimp_color_profile_get_description (profile)); } gimp_color_profile_set_tag (target_profile, cmsSigDeviceMfgDescTag, "GIMP"); gimp_color_profile_set_tag (target_profile, cmsSigDeviceModelDescTag, new_model); gimp_color_profile_set_tag (target_profile, cmsSigCopyrightTag, "Public Domain"); g_free (new_model); new_profile = gimp_color_profile_new_from_lcms_profile (target_profile, NULL); cmsCloseProfile (target_profile); return new_profile; }