static gpointer jpeg_load_cmyk_transform (guint8 *profile_data, gsize profile_len) { GimpColorConfig *config = gimp_get_color_configuration (); GimpColorProfile cmyk_profile = NULL; GimpColorProfile rgb_profile = NULL; cmsUInt32Number flags = 0; cmsHTRANSFORM transform; /* try to load the embedded CMYK profile */ if (profile_data) { cmyk_profile = gimp_lcms_profile_open_from_data (profile_data, profile_len, NULL); if (cmyk_profile && ! gimp_lcms_profile_is_cmyk (cmyk_profile)) { gimp_lcms_profile_close (cmyk_profile); cmyk_profile = NULL; } } /* if that fails, try to load the CMYK profile configured in the prefs */ if (! cmyk_profile) cmyk_profile = gimp_color_config_get_cmyk_profile (config, NULL); /* bail out if we can't load any CMYK profile */ if (! cmyk_profile) { g_object_unref (config); return NULL; } /* try to load the RGB profile configured in the prefs */ rgb_profile = gimp_color_config_get_rgb_profile (config, NULL); /* make the real sRGB profile as a fallback */ if (! rgb_profile) rgb_profile = gimp_lcms_create_srgb_profile (); if (config->display_intent == GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC) { flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } transform = cmsCreateTransform (cmyk_profile, TYPE_CMYK_8_REV, rgb_profile, TYPE_RGB_8, config->display_intent, flags); gimp_lcms_profile_close (cmyk_profile); gimp_lcms_profile_close (rgb_profile); g_object_unref (config); return transform; }
static void run (const gchar *name, gint nparams, const GimpParam *param, gint *nreturn_vals, GimpParam **return_vals) { GimpPDBStatusType status = GIMP_PDB_CALLING_ERROR; gint proc = NONE; GimpRunMode run_mode = GIMP_RUN_NONINTERACTIVE; gint32 image = -1; const gchar *filename = NULL; GimpColorConfig *config = NULL; gboolean dont_ask = FALSE; GimpColorRenderingIntent intent; gboolean bpc; static GimpParam values[6]; INIT_I18N (); values[0].type = GIMP_PDB_STATUS; *nreturn_vals = 1; *return_vals = values; for (proc = 0; proc < G_N_ELEMENTS (procedures); proc++) { if (strcmp (name, procedures[proc].name) == 0) break; } if (proc == NONE) goto done; if (nparams < procedures[proc].min_params) goto done; if (proc != PROC_FILE_INFO) config = gimp_get_color_configuration (); if (config) intent = config->display_intent; else intent = GIMP_COLOR_RENDERING_INTENT_PERCEPTUAL; bpc = (intent == GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC); switch (proc) { case PROC_SET: run_mode = param[0].data.d_int32; image = param[1].data.d_image; if (nparams > 2) filename = param[2].data.d_string; break; case PROC_APPLY: run_mode = param[0].data.d_int32; image = param[1].data.d_image; if (nparams > 2) filename = param[2].data.d_string; if (nparams > 3) intent = param[3].data.d_int32; if (nparams > 4) bpc = param[4].data.d_int32 ? TRUE : FALSE; break; case PROC_SET_RGB: run_mode = param[0].data.d_int32; image = param[1].data.d_image; break; case PROC_APPLY_RGB: run_mode = param[0].data.d_int32; image = param[1].data.d_image; if (nparams > 2) intent = param[2].data.d_int32; if (nparams > 3) bpc = param[3].data.d_int32 ? TRUE : FALSE; break; case PROC_INFO: image = param[0].data.d_image; break; case PROC_FILE_INFO: filename = param[0].data.d_string; break; } if (run_mode == GIMP_RUN_INTERACTIVE) { LcmsValues values = { intent, bpc }; switch (proc) { case PROC_SET: status = lcms_dialog (config, image, FALSE, &values); goto done; case PROC_APPLY: gimp_get_data (name, &values); status = lcms_dialog (config, image, TRUE, &values); if (status == GIMP_PDB_SUCCESS) gimp_set_data (name, &values, sizeof (LcmsValues)); goto done; default: break; } } cmsErrorAction (LCMS_ERROR_SHOW); switch (proc) { case PROC_SET: case PROC_SET_RGB: status = lcms_icc_set (config, image, filename); break; case PROC_APPLY: case PROC_APPLY_RGB: status = lcms_icc_apply (config, run_mode, image, filename, intent, bpc, &dont_ask); if (run_mode == GIMP_RUN_INTERACTIVE) { *nreturn_vals = 2; values[1].type = GIMP_PDB_INT32; values[1].data.d_int32 = dont_ask; } break; case PROC_INFO: case PROC_FILE_INFO: { gchar *name = NULL; gchar *desc = NULL; gchar *info = NULL; cmsErrorAction (LCMS_ERROR_IGNORE); if (proc == PROC_INFO) status = lcms_icc_info (config, image, &name, &desc, &info); else status = lcms_icc_file_info (filename, &name, &desc, &info); if (status == GIMP_PDB_SUCCESS) { *nreturn_vals = NUM_RETURN_VALS; values[PROFILE_NAME].type = GIMP_PDB_STRING; values[PROFILE_NAME].data.d_string = name; values[PROFILE_DESC].type = GIMP_PDB_STRING; values[PROFILE_DESC].data.d_string = desc; values[PROFILE_INFO].type = GIMP_PDB_STRING; values[PROFILE_INFO].data.d_string = info; } } break; } done: if (run_mode != GIMP_RUN_NONINTERACTIVE) gimp_displays_flush (); if (config) g_object_unref (config); values[0].data.d_status = status; }
static gpointer jpeg_load_cmyk_transform (guint8 *profile_data, gsize profile_len) { #ifdef HAVE_LCMS GimpColorConfig *config = gimp_get_color_configuration (); cmsHPROFILE cmyk_profile = NULL; cmsHPROFILE rgb_profile = NULL; cmsUInt32Number flags = 0; cmsHTRANSFORM transform; /* try to load the embedded CMYK profile */ if (profile_data) { cmyk_profile = cmsOpenProfileFromMem (profile_data, profile_len); if (cmyk_profile) { #ifdef HAVE_LCMS1 if (cmsGetColorSpace (cmyk_profile) != icSigCmykData) #else if (cmsGetColorSpace (cmyk_profile) != cmsSigCmykData) #endif { cmsCloseProfile (cmyk_profile); cmyk_profile = NULL; } } } /* if that fails, try to load the CMYK profile configured in the prefs */ if (! cmyk_profile && config->cmyk_profile) { cmyk_profile = cmsOpenProfileFromFile (config->cmyk_profile, "r"); #ifdef HAVE_LCMS1 if (cmyk_profile && cmsGetColorSpace (cmyk_profile) != icSigCmykData) #else if (cmyk_profile && cmsGetColorSpace (cmyk_profile) != cmsSigCmykData) #endif { cmsCloseProfile (cmyk_profile); cmyk_profile = NULL; } } /* bail out if we can't load any CMYK profile */ if (! cmyk_profile) { g_object_unref (config); return NULL; } /* try to load the RGB profile configured in the prefs */ if (config->rgb_profile) { rgb_profile = cmsOpenProfileFromFile (config->rgb_profile, "r"); #ifdef HAVE_LCMS1 if (rgb_profile && cmsGetColorSpace (rgb_profile) != icSigRgbData) #else if (rgb_profile && cmsGetColorSpace (rgb_profile) != cmsSigRgbData) #endif { cmsCloseProfile (rgb_profile); rgb_profile = NULL; } } /* use the built-in sRGB profile as fallback */ if (! rgb_profile) { rgb_profile = cmsCreate_sRGBProfile (); } if (config->display_intent == GIMP_COLOR_RENDERING_INTENT_RELATIVE_COLORIMETRIC) { flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } transform = cmsCreateTransform (cmyk_profile, TYPE_CMYK_8_REV, rgb_profile, TYPE_RGB_8, config->display_intent, flags); cmsCloseProfile (cmyk_profile); cmsCloseProfile (rgb_profile); g_object_unref (config); return transform; #else /* HAVE_LCMS */ return NULL; #endif }