/** * cd_util_create_x11_gamma: **/ static gboolean cd_util_create_x11_gamma (CdUtilPrivate *priv, CdDom *dom, const GNode *root, GError **error) { const GNode *tmp; gboolean ret; gdouble fraction; CdColorRGB rgb; gdouble points[3]; guint16 data[3][256]; guint i, j; /* parse gamma values */ tmp = cd_dom_get_node (dom, root, "x11_gamma"); if (tmp == NULL) { g_set_error_literal (error, 1, 0, "XML error, expected x11_gamma"); return FALSE; } if (!cd_dom_get_node_rgb (tmp, &rgb)) { g_set_error_literal (error, 1, 0, "XML error, invalid x11_gamma"); return FALSE; } points[0] = rgb.R; points[1] = rgb.G; points[2] = rgb.B; /* create a bog-standard sRGB profile */ priv->lcms_profile = cmsCreate_sRGBProfileTHR (cd_icc_get_context (priv->icc)); if (priv->lcms_profile == NULL) { g_set_error_literal (error, 1, 0, "failed to create profile"); return FALSE; } /* scale all the values by the floating point values */ for (i = 0; i < 256; i++) { fraction = (gdouble) i / 256.0f; for (j = 0; j < 3; j++) data[j][i] = fraction * points[j] * 0xffff; } /* write vcgt */ ret = set_vcgt_from_data (priv->lcms_profile, data[0], data[1], data[2], 256); if (!ret) { g_set_error_literal (error, 1, 0, "failed to write VCGT"); return FALSE; } return TRUE; }
cmsHPROFILE CMSEXPORT cmsCreate_sRGBProfile(void) { return cmsCreate_sRGBProfileTHR(NULL); }
/** * cd_util_create_temperature: **/ static gboolean cd_util_create_temperature (CdUtilPrivate *priv, CdDom *dom, const GNode *root, GError **error) { CdColorRGB white_point; const GNode *tmp; const guint size = 256; gboolean ret; gdouble curve_gamma; guint16 data[3][256]; guint i; guint temp; /* create a bog-standard sRGB profile */ priv->lcms_profile = cmsCreate_sRGBProfileTHR (cd_icc_get_context (priv->icc)); if (priv->lcms_profile == NULL) { g_set_error_literal (error, 1, 0, "failed to create profile"); return FALSE; } /* parse temperature value */ tmp = cd_dom_get_node (dom, root, "temperature"); if (tmp == NULL) { g_set_error_literal (error, 1, 0, "XML error, expected temperature"); return FALSE; } temp = atoi (cd_dom_get_node_data (tmp)); /* parse gamma value */ tmp = cd_dom_get_node (dom, root, "gamma"); if (tmp == NULL) { g_set_error_literal (error, 1, 0, "XML error, expected gamma"); return FALSE; } curve_gamma = cd_dom_get_node_data_as_double (tmp); if (curve_gamma == G_MAXDOUBLE) { g_set_error (error, 1, 0, "failed to parse gamma: '%s'", cd_dom_get_node_data (tmp)); return FALSE; } /* generate the VCGT table */ cd_color_get_blackbody_rgb (temp, &white_point); for (i = 0; i < size; i++) { data[0][i] = pow ((gdouble) i / size, 1.0 / curve_gamma) * 0xffff * white_point.R; data[1][i] = pow ((gdouble) i / size, 1.0 / curve_gamma) * 0xffff * white_point.G; data[2][i] = pow ((gdouble) i / size, 1.0 / curve_gamma) * 0xffff * white_point.B; } /* write vcgt */ ret = set_vcgt_from_data (priv->lcms_profile, data[0], data[1], data[2], 256); if (!ret) { g_set_error_literal (error, 1, 0, "failed to write VCGT"); return FALSE; } return TRUE; }
// Virtual profiles are handled here. cmsHPROFILE OpenStockProfile(cmsContext ContextID, const char* File) { if (!File) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lab2") == 0) return cmsCreateLab2ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab4") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*Lab") == 0) return cmsCreateLab4ProfileTHR(ContextID, NULL); if (cmsstrcasecmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp( &D65xyY, 6504); return cmsCreateLab4ProfileTHR(ContextID, &D65xyY); } if (cmsstrcasecmp(File, "*XYZ") == 0) return cmsCreateXYZProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Gray22") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*Gray30") == 0) { cmsToneCurve* Curve = cmsBuildGamma(ContextID, 3.0); cmsHPROFILE hProfile = cmsCreateGrayProfileTHR(ContextID, cmsD50_xyY(), Curve); cmsFreeToneCurve(Curve); return hProfile; } if (cmsstrcasecmp(File, "*srgb") == 0) return cmsCreate_sRGBProfileTHR(ContextID); if (cmsstrcasecmp(File, "*null") == 0) return cmsCreateNULLProfileTHR(ContextID); if (cmsstrcasecmp(File, "*Lin2222") == 0) { cmsToneCurve* Gamma = cmsBuildGamma(0, 2.2); cmsToneCurve* Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(cmsSigCmykData, Gamma4); cmsFreeToneCurve(Gamma); return hProfile; } return cmsOpenProfileFromFileTHR(ContextID, File, "r"); }