// Creates a fake XYZ identity cmsHPROFILE LCMSEXPORT cmsCreateXYZProfile(void) { cmsHPROFILE hProfile; LPLUT Lut; hProfile = cmsCreateRGBProfile(cmsD50_xyY(), NULL, NULL); if (hProfile == NULL) return NULL; cmsSetDeviceClass(hProfile, icSigAbstractClass); cmsSetColorSpace(hProfile, icSigXYZData); cmsSetPCS(hProfile, icSigXYZData); cmsAddTag(hProfile, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)"); cmsAddTag(hProfile, icSigProfileDescriptionTag, (LPVOID) "lcms XYZ identity"); cmsAddTag(hProfile, icSigDeviceModelDescTag, (LPVOID) "XYZ built-in"); // An empty LUTs is all we need Lut = Create3x3EmptyLUT(); if (Lut == NULL) { cmsCloseProfile(hProfile); return NULL; } cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigPreview0Tag, (LPVOID) Lut); cmsFreeLUT(Lut); return hProfile; }
// Creates a fake Lab identity. cmsHPROFILE LCMSEXPORT cmsCreateLabProfile(LPcmsCIExyY WhitePoint) { cmsHPROFILE hProfile; LPLUT Lut; hProfile = cmsCreateRGBProfile(WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetDeviceClass(hProfile, icSigAbstractClass); cmsSetColorSpace(hProfile, icSigLabData); cmsSetPCS(hProfile, icSigLabData); cmsAddTag(hProfile, icSigDeviceMfgDescTag, (LPVOID) "(lcms internal)"); cmsAddTag(hProfile, icSigProfileDescriptionTag, (LPVOID) "lcms Lab identity"); cmsAddTag(hProfile, icSigDeviceModelDescTag, (LPVOID) "Lab built-in"); // An empty LUTs is all we need Lut = Create3x3EmptyLUT(); if (Lut == NULL) { cmsCloseProfile(hProfile); return NULL; } cmsAddTag(hProfile, icSigAToB0Tag, (LPVOID) Lut); cmsAddTag(hProfile, icSigBToA0Tag, (LPVOID) Lut); cmsFreeLUT(Lut); return hProfile; }
static cmsHPROFILE OpenProfile(const char* File) { if (!File) return cmsCreate_sRGBProfile(); if (stricmp(File, "*sRGB") == 0) return cmsCreate_sRGBProfile(NULL); if (stricmp(File, "*Lab") == 0) return cmsCreateLabProfile(NULL); if (stricmp(File, "*LabD65") == 0) { cmsCIExyY D65xyY; cmsWhitePointFromTemp(6504, &D65xyY); return cmsCreateLabProfile(&D65xyY); } if (stricmp(File, "*XYZ") == 0) return cmsCreateXYZProfile(); if (stricmp(File, "*Gray22") == 0) { LPGAMMATABLE Gamma = cmsBuildGamma(256, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfile(cmsD50_xyY(), Gamma); cmsFreeGamma(Gamma); return hProfile; } return cmsOpenProfileFromFile(File, "r"); }
static cmsHPROFILE OpenProfile(const char* File) { cmsHPROFILE h; if (!File) return cmsCreate_sRGBProfile(); if (stricmp(File, "*Lab") == 0) return cmsCreateLabProfile(NULL); if (stricmp(File, "*XYZ") == 0) return cmsCreateXYZProfile(); if (stricmp(File, "*srgb") == 0) return cmsCreate_sRGBProfile(); if (stricmp(File, "*Gray22") == 0) { LPGAMMATABLE Gamma = cmsBuildGamma(256, 2.2); cmsHPROFILE hProfile = cmsCreateGrayProfile(cmsD50_xyY(), Gamma); cmsFreeGamma(Gamma); return hProfile; } if (stricmp(File, "*Lin2222") == 0) { LPGAMMATABLE Gamma = cmsBuildGamma(256, 2.2); LPGAMMATABLE Gamma4[4]; cmsHPROFILE hProfile; Gamma4[0] = Gamma4[1] = Gamma4[2] = Gamma4[3] = Gamma; hProfile = cmsCreateLinearizationDeviceLink(icSigCmykData, Gamma4); cmsFreeGamma(Gamma); return hProfile; } h = cmsOpenProfileFromFile(File, "r"); if (cmsGetDeviceClass(h) == icSigNamedColorClass) FatalError("ERROR: Cannot make devicelink of named color profiles!"); return h; }
static void init(void) { cmsCIEXYZ D65_XYZ = {0.95047, 1.0, 1.08883 }; cmsCIExyY D65; cmsXYZ2xyY(&D65, &D65_XYZ); cmsToneCurve *linear = cmsBuildGamma(NULL, 1.0); cmsToneCurve *linrgb[3] = {linear,linear,linear}; cmsCIExyYTRIPLE primaries = { {0.64, 0.33, 1.0}, {0.30, 0.60, 1.0}, {0.15, 0.06, 1.0} }; cmsFloat64Number P[5] = { 2.4, 1. / 1.055, 0.055 / 1.055, 1. / 12.92, 0.04045 }; cmsToneCurve *srgb = cmsBuildParametricToneCurve(NULL, 4, P); cmsToneCurve *srgbcurve[3] = {srgb,srgb,srgb}; cmsHPROFILE hsRGB = cmsCreateRGBProfile(&D65, &primaries, srgbcurve); cmsHPROFILE hLab = cmsCreateLab4Profile(NULL); cmsHPROFILE hlRGB = cmsCreateRGBProfile(&D65, &primaries, linrgb); cmsHPROFILE hlGray = cmsCreateGrayProfile(cmsD50_xyY(), linear); cmsSetHeaderFlags(hlGray, cmsEmbeddedProfileTrue); cmsSaveProfileToFile(hlGray,"lgray.icc"); cmsSetHeaderFlags(hlRGB, cmsEmbeddedProfileTrue); cmsSaveProfileToFile(hlRGB,"lrgb.icc"); xform_srgb_to_lrgb = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hlRGB, TYPE_RGB_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE /* preserve precision */ ); xform_srgb_to_lab = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hLab, TYPE_Lab_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); xform_srgb_to_lgray = cmsCreateTransform(hsRGB, TYPE_RGB_DBL, hlGray, TYPE_GRAY_DBL, INTENT_RELATIVE_COLORIMETRIC, cmsFLAGS_NOOPTIMIZE); cmsCloseProfile(hsRGB); cmsCloseProfile(hlRGB); cmsCloseProfile(hLab); cmsCloseProfile(hlGray); cmsFreeToneCurve(linear); cmsFreeToneCurve(srgb); cmsSetLogErrorHandler(errlog); /* sRGB, RGB, Lab, Gray */ printf("R',G',B',R,G,B,L,a,b,Gray\n"); }
static PyObject * pycms_CreateGrayProfile(PyObject *self, PyObject *args) { cmsHPROFILE hProfile; LPGAMMATABLE gamma; cmsErrorAction(LCMS_ERROR_IGNORE); gamma = cmsBuildGamma(256, 2.2); hProfile = cmsCreateGrayProfile(cmsD50_xyY(), gamma); cmsFreeGamma(gamma); if(hProfile==NULL) { Py_INCREF(Py_None); return Py_None; } return Py_BuildValue("O", PyCObject_FromVoidPtr((void *)hProfile, (void *)cmsCloseProfile)); }
// Creates a fake XYZ identity cmsHPROFILE CMSEXPORT cmsCreateXYZProfileTHR(cmsContext ContextID) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, cmsD50_xyY(), NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 4.3); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigXYZData); cmsSetPCS(hProfile, cmsSigXYZData); if (!SetTextTags(hProfile, L"XYZ identity built-in")) goto Error; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCurves(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; }
// Creates a fake Lab identity. cmsHPROFILE CMSEXPORT cmsCreateLab2ProfileTHR(cmsContext ContextID, const cmsCIExyY* WhitePoint) { cmsHPROFILE hProfile; cmsPipeline* LUT = NULL; hProfile = cmsCreateRGBProfileTHR(ContextID, WhitePoint == NULL ? cmsD50_xyY() : WhitePoint, NULL, NULL); if (hProfile == NULL) return NULL; cmsSetProfileVersion(hProfile, 2.1); cmsSetDeviceClass(hProfile, cmsSigAbstractClass); cmsSetColorSpace(hProfile, cmsSigLabData); cmsSetPCS(hProfile, cmsSigLabData); if (!SetTextTags(hProfile, L"Lab identity built-in")) return NULL; // An identity LUT is all we need LUT = cmsPipelineAlloc(ContextID, 3, 3); if (LUT == NULL) goto Error; if (!cmsPipelineInsertStage(LUT, cmsAT_BEGIN, _cmsStageAllocIdentityCLut(ContextID, 3))) goto Error; if (!cmsWriteTag(hProfile, cmsSigAToB0Tag, LUT)) goto Error; cmsPipelineFree(LUT); return hProfile; Error: if (LUT != NULL) cmsPipelineFree(LUT); if (hProfile != NULL) cmsCloseProfile(hProfile); return NULL; }
cmsHPROFILE dt_colorspaces_create_lab_profile() { return cmsCreateLab4Profile(cmsD50_xyY()); }
/** * mcm_picker_refresh_results: **/ static void mcm_picker_refresh_results (void) { McmXyz *xyz = NULL; GtkImage *image; GtkLabel *label; GdkPixbuf *pixbuf = NULL; gdouble color_xyz[3]; guint8 color_rgb[3]; gdouble color_lab[3]; gdouble color_error[3]; gchar *text_xyz = NULL; gchar *text_lab = NULL; gchar *text_rgb = NULL; gchar *text_error = NULL; cmsHPROFILE profile_xyz; cmsHPROFILE profile_rgb; cmsHPROFILE profile_lab; cmsHTRANSFORM transform_rgb; cmsHTRANSFORM transform_lab; cmsHTRANSFORM transform_error; /* nothing set yet */ if (profile_filename == NULL) goto out; /* get new value */ g_object_get (calibrate, "xyz", &xyz, NULL); /* create new pixbuf of the right size */ pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, 200, 200); /* get values */ g_object_get (xyz, "cie-x", &color_xyz[0], "cie-y", &color_xyz[1], "cie-z", &color_xyz[2], NULL); /* lcms scales these for some reason */ color_xyz[0] /= 100.0f; color_xyz[1] /= 100.0f; color_xyz[2] /= 100.0f; /* get profiles */ profile_xyz = cmsCreateXYZProfile (); profile_rgb = cmsOpenProfileFromFile (profile_filename, "r"); profile_lab = cmsCreateLab4Profile (cmsD50_xyY ()); /* create transforms */ transform_rgb = cmsCreateTransform (profile_xyz, TYPE_XYZ_DBL, profile_rgb, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); if (transform_rgb == NULL) goto out; transform_lab = cmsCreateTransform (profile_xyz, TYPE_XYZ_DBL, profile_lab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); if (transform_lab == NULL) goto out; transform_error = cmsCreateTransform (profile_rgb, TYPE_RGB_8, profile_xyz, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); if (transform_error == NULL) goto out; cmsDoTransform (transform_rgb, color_xyz, color_rgb, 1); cmsDoTransform (transform_lab, color_xyz, color_lab, 1); cmsDoTransform (transform_error, color_rgb, color_error, 1); /* destroy lcms state */ cmsDeleteTransform (transform_rgb); cmsDeleteTransform (transform_lab); cmsDeleteTransform (transform_error); cmsCloseProfile (profile_xyz); cmsCloseProfile (profile_rgb); cmsCloseProfile (profile_lab); /* set XYZ */ label = GTK_LABEL (gtk_builder_get_object (builder, "label_xyz")); text_xyz = g_strdup_printf ("%.3f, %.3f, %.3f", color_xyz[0], color_xyz[1], color_xyz[2]); gtk_label_set_label (label, text_xyz); /* set LAB */ label = GTK_LABEL (gtk_builder_get_object (builder, "label_lab")); text_lab = g_strdup_printf ("%.3f, %.3f, %.3f", color_lab[0], color_lab[1], color_lab[2]); gtk_label_set_label (label, text_lab); /* set RGB */ label = GTK_LABEL (gtk_builder_get_object (builder, "label_rgb")); text_rgb = g_strdup_printf ("%i, %i, %i (#%02X%02X%02X)", color_rgb[0], color_rgb[1], color_rgb[2], color_rgb[0], color_rgb[1], color_rgb[2]); gtk_label_set_label (label, text_rgb); mcm_picker_set_pixbuf_color (pixbuf, color_rgb[0], color_rgb[1], color_rgb[2]); /* set error */ label = GTK_LABEL (gtk_builder_get_object (builder, "label_error")); text_error = g_strdup_printf ("%.1f%%, %.1f%%, %.1f%%", ABS ((color_error[0] - color_xyz[0]) / color_xyz[0] * 100), ABS ((color_error[1] - color_xyz[1]) / color_xyz[1] * 100), ABS ((color_error[2] - color_xyz[2]) / color_xyz[2] * 100)); gtk_label_set_label (label, text_error); /* set image */ image = GTK_IMAGE (gtk_builder_get_object (builder, "image_preview")); gtk_image_set_from_pixbuf (image, pixbuf); out: g_free (text_xyz); g_free (text_lab); g_free (text_rgb); g_free (text_error); if (xyz != NULL) g_object_unref (xyz); if (pixbuf != NULL) g_object_unref (pixbuf); }
// 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"); }
static void gcm_picker_refresh_results (GcmPickerPrivate *priv) { cmsCIExyY xyY; cmsHPROFILE profile_lab; cmsHPROFILE profile_rgb; cmsHPROFILE profile_xyz; cmsHTRANSFORM transform_error; cmsHTRANSFORM transform_lab; cmsHTRANSFORM transform_rgb; gboolean ret; CdColorLab color_lab; CdColorRGB8 color_rgb; CdColorXYZ color_error; CdColorXYZ color_xyz; gdouble temperature = 0.0f; GtkImage *image; GtkLabel *label; g_autoptr(GdkPixbuf) pixbuf = NULL; g_autofree gchar *text_ambient = NULL; g_autofree gchar *text_error = NULL; g_autofree gchar *text_lab = NULL; g_autofree gchar *text_rgb = NULL; g_autofree gchar *text_temperature = NULL; g_autofree gchar *text_whitepoint = NULL; g_autofree gchar *text_xyz = NULL; /* nothing set yet */ if (priv->profile_filename == NULL) return; /* copy as we're modifying the value */ cd_color_xyz_copy (&priv->last_sample, &color_xyz); /* create new pixbuf of the right size */ image = GTK_IMAGE (gtk_builder_get_object (priv->builder, "image_preview")); pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB, FALSE, 8, gtk_widget_get_allocated_width (GTK_WIDGET (image)), gtk_widget_get_allocated_height (GTK_WIDGET (image))); /* lcms scales these for some reason */ color_xyz.X /= 100.0f; color_xyz.Y /= 100.0f; color_xyz.Z /= 100.0f; /* get profiles */ profile_xyz = cmsCreateXYZProfile (); profile_rgb = cmsOpenProfileFromFile (priv->profile_filename, "r"); profile_lab = cmsCreateLab4Profile (cmsD50_xyY ()); /* create transforms */ transform_rgb = cmsCreateTransform (profile_xyz, TYPE_XYZ_DBL, profile_rgb, TYPE_RGB_8, INTENT_PERCEPTUAL, 0); if (transform_rgb == NULL) return; transform_lab = cmsCreateTransform (profile_xyz, TYPE_XYZ_DBL, profile_lab, TYPE_Lab_DBL, INTENT_PERCEPTUAL, 0); if (transform_lab == NULL) return; transform_error = cmsCreateTransform (profile_rgb, TYPE_RGB_8, profile_xyz, TYPE_XYZ_DBL, INTENT_PERCEPTUAL, 0); if (transform_error == NULL) return; cmsDoTransform (transform_rgb, &color_xyz, &color_rgb, 1); cmsDoTransform (transform_lab, &color_xyz, &color_lab, 1); cmsDoTransform (transform_error, &color_rgb, &color_error, 1); /* destroy lcms state */ cmsDeleteTransform (transform_rgb); cmsDeleteTransform (transform_lab); cmsDeleteTransform (transform_error); cmsCloseProfile (profile_xyz); cmsCloseProfile (profile_rgb); cmsCloseProfile (profile_lab); /* set XYZ */ label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_xyz")); text_xyz = g_strdup_printf ("%.3f, %.3f, %.3f", priv->last_sample.X, priv->last_sample.Y, priv->last_sample.Z); gtk_label_set_label (label, text_xyz); /* set LAB */ label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_lab")); text_lab = g_strdup_printf ("%.3f, %.3f, %.3f", color_lab.L, color_lab.a, color_lab.b); gtk_label_set_label (label, text_lab); /* set whitepoint */ cmsXYZ2xyY (&xyY, (cmsCIEXYZ *)&priv->last_sample); label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_whitepoint")); text_whitepoint = g_strdup_printf ("%.3f,%.3f [%.3f]", xyY.x, xyY.y, xyY.Y); gtk_label_set_label (label, text_whitepoint); /* set temperature */ ret = cmsTempFromWhitePoint (&temperature, &xyY); if (ret) { /* round to nearest 10K */ temperature = (((guint) temperature) / 10) * 10; } label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_temperature")); text_temperature = g_strdup_printf ("%.0fK", temperature); gtk_label_set_label (label, text_temperature); /* set RGB */ label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_rgb")); text_rgb = g_strdup_printf ("%i, %i, %i (#%02X%02X%02X)", color_rgb.R, color_rgb.G, color_rgb.B, color_rgb.R, color_rgb.G, color_rgb.B); gtk_label_set_label (label, text_rgb); gcm_picker_set_pixbuf_color (pixbuf, color_rgb.R, color_rgb.G, color_rgb.B); /* set error */ label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_error")); if (color_xyz.X > 0.01f && color_xyz.Y > 0.01f && color_xyz.Z > 0.01f) { text_error = g_strdup_printf ("%.1f%%, %.1f%%, %.1f%%", ABS ((color_error.X - color_xyz.X) / color_xyz.X * 100), ABS ((color_error.Y - color_xyz.Y) / color_xyz.Y * 100), ABS ((color_error.Z - color_xyz.Z) / color_xyz.Z * 100)); gtk_label_set_label (label, text_error); } else { /* TRANSLATORS: this is when the error is invalid */ gtk_label_set_label (label, _("Unknown")); } /* set ambient */ label = GTK_LABEL (gtk_builder_get_object (priv->builder, "label_ambient")); if (priv->last_ambient < 0) { /* TRANSLATORS: this is when the ambient light level is unknown */ gtk_label_set_label (label, _("Unknown")); } else { text_ambient = g_strdup_printf ("%.1f Lux", priv->last_ambient); gtk_label_set_label (label, text_ambient); } /* set image */ gtk_image_set_from_pixbuf (image, pixbuf); }