void gimp_color_frame_set_color_config (GimpColorFrame *frame, GimpColorConfig *config) { g_return_if_fail (GIMP_IS_COLOR_FRAME (frame)); g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config)); if (config != frame->config) { if (frame->config) { g_signal_handlers_disconnect_by_func (frame->config, gimp_color_frame_destroy_transform, frame); g_object_unref (frame->config); gimp_color_frame_destroy_transform (frame); } frame->config = config; if (frame->config) { g_object_ref (frame->config); g_signal_connect_swapped (frame->config, "notify", G_CALLBACK (gimp_color_frame_destroy_transform), frame); } gimp_color_area_set_color_config (GIMP_COLOR_AREA (frame->color_area), config); } }
GimpColorDisplayStack * gimp_display_shell_filter_new (GimpDisplayShell *shell, GimpColorConfig *config) { g_return_val_if_fail (GIMP_IS_DISPLAY_SHELL (shell), NULL); g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), NULL); if (config->display_module) { GType type = g_type_from_name (config->display_module); if (g_type_is_a (type, GIMP_TYPE_COLOR_DISPLAY)) { GimpColorDisplay *display; GimpColorDisplayStack *stack; display = g_object_new (type, "color-config", config, "color-managed", shell, NULL); stack = gimp_color_display_stack_new (); gimp_color_display_stack_add (stack, display); g_object_unref (display); return stack; } } return NULL; }
static GimpPDBStatusType lcms_icc_info (GimpColorConfig *config, gint32 image, gchar **name, gchar **desc, gchar **info) { cmsHPROFILE profile; GError *error = NULL; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); profile = lcms_image_get_profile (config, image, &error); if (error) { g_message ("%s", error->message); g_clear_error (&error); } if (! profile) profile = gimp_lcms_create_srgb_profile (); if (name) *name = gimp_lcms_profile_get_model (profile); if (desc) *desc = gimp_lcms_profile_get_description (profile); if (info) *info = gimp_lcms_profile_get_summary (profile); cmsCloseProfile (profile); return GIMP_PDB_SUCCESS; }
GimpColorProfile * gimp_color_config_get_cmyk_color_profile (GimpColorConfig *config, GError **error) { GimpColorProfile *profile = NULL; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (config->cmyk_profile) { GFile *file = g_file_new_for_path (config->cmyk_profile); profile = gimp_color_profile_new_from_file (file, error); if (profile && ! gimp_color_profile_is_cmyk (profile)) { g_object_unref (profile); profile = NULL; g_set_error (error, GIMP_CONFIG_ERROR, 0, _("Color profile '%s' is not for CMYK color space."), gimp_file_get_utf8_name (file)); } g_object_unref (file); } return profile; }
/** * gimp_color_selection_set_config: * @selection: * @config: * * Sets the color management configuration to use with this color selection. * * Since: GIMP 2.4 */ void gimp_color_selection_set_config (GimpColorSelection *selection, GimpColorConfig *config) { g_return_if_fail (GIMP_IS_COLOR_SELECTION (selection)); g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config)); gimp_color_selector_set_config (GIMP_COLOR_SELECTOR (selection->notebook), config); gimp_color_selector_set_config (GIMP_COLOR_SELECTOR (selection->scales), config); }
/** * gimp_color_selector_set_config: * @selector: a #GimpColorSelector widget. * @config: a #GimpColorConfig object. * * Sets the color management configuration to use with this color selector. * * Since: GIMP 2.4 */ void gimp_color_selector_set_config (GimpColorSelector *selector, GimpColorConfig *config) { GimpColorSelectorClass *selector_class; g_return_if_fail (GIMP_IS_COLOR_SELECTOR (selector)); g_return_if_fail (config == NULL || GIMP_IS_COLOR_CONFIG (config)); selector_class = GIMP_COLOR_SELECTOR_GET_CLASS (selector); if (selector_class->set_config) selector_class->set_config (selector, config); }
static GimpPDBStatusType lcms_icc_set (GimpColorConfig *config, gint32 image, const gchar *filename) { gboolean success; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); if (! filename) filename = config->rgb_profile; success = lcms_image_set_profile (image, NULL, filename); return success ? GIMP_PDB_SUCCESS : GIMP_PDB_EXECUTION_ERROR; }
GimpColorProfile * gimp_color_config_get_printer_color_profile (GimpColorConfig *config, GError **error) { GimpColorProfile *profile = NULL; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), NULL); g_return_val_if_fail (error == NULL || *error == NULL, NULL); if (config->printer_profile) { GFile *file = g_file_new_for_path (config->printer_profile); profile = gimp_color_profile_new_from_file (file, error); g_object_unref (file); } return profile; }
static GimpPDBStatusType lcms_icc_info (GimpColorConfig *config, gint32 image, gchar **name, gchar **desc, gchar **info) { cmsHPROFILE profile; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); profile = lcms_image_get_profile (config, image, NULL); if (profile && ! lcms_icc_profile_is_rgb (profile)) { g_printerr ("lcms: attached color profile is not for RGB color space " "(skipping)\n"); cmsCloseProfile (profile); profile = NULL; } if (profile) { if (name) *name = lcms_icc_profile_get_name (profile); if (desc) *desc = lcms_icc_profile_get_desc (profile); if (info) *info = lcms_icc_profile_get_info (profile); cmsCloseProfile (profile); } else { if (name) *name = g_strdup ("sRGB"); if (desc) *desc = g_strdup ("sRGB built-in"); if (info) *info = g_strdup (_("Default RGB working space")); } return GIMP_PDB_SUCCESS; }
static GimpPDBStatusType lcms_icc_set (GimpColorConfig *config, gint32 image, GFile *file) { gboolean success; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); if (file) g_object_ref (file); else if (config->rgb_profile) file = g_file_new_for_path (config->rgb_profile); success = lcms_image_set_profile (image, NULL, file); if (file) g_object_unref (file); return success ? GIMP_PDB_SUCCESS : GIMP_PDB_EXECUTION_ERROR; }
GimpColorTransform gimp_widget_get_color_transform (GtkWidget *widget, GimpColorConfig *config, GimpColorProfile *src_profile, const Babl **src_format, const Babl **dest_format) { GimpColorTransform transform = NULL; GimpColorProfile *dest_profile = NULL; GimpColorProfile *proof_profile = NULL; cmsHPROFILE src_lcms; cmsHPROFILE dest_lcms; cmsUInt32Number lcms_src_format; cmsUInt32Number lcms_dest_format; cmsUInt16Number alarmCodes[cmsMAXCHANNELS] = { 0, }; g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), NULL); g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (src_profile), NULL); g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), NULL); g_return_val_if_fail (src_format != NULL, NULL); g_return_val_if_fail (dest_format != NULL, NULL); switch (config->mode) { case GIMP_COLOR_MANAGEMENT_OFF: return NULL; case GIMP_COLOR_MANAGEMENT_SOFTPROOF: proof_profile = gimp_color_config_get_printer_color_profile (config, NULL); /* fallthru */ case GIMP_COLOR_MANAGEMENT_DISPLAY: dest_profile = get_display_profile (widget, config); break; } src_lcms = gimp_color_profile_get_lcms_profile (src_profile); dest_lcms = gimp_color_profile_get_lcms_profile (dest_profile); *src_format = gimp_color_profile_get_format (*src_format, &lcms_src_format); *dest_format = gimp_color_profile_get_format (*dest_format, &lcms_dest_format); if (proof_profile) { cmsHPROFILE proof_lcms; cmsUInt32Number softproof_flags = cmsFLAGS_SOFTPROOFING; proof_lcms = gimp_color_profile_get_lcms_profile (proof_profile); if (config->simulation_use_black_point_compensation) { softproof_flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } if (config->simulation_gamut_check) { guchar r, g, b; softproof_flags |= cmsFLAGS_GAMUTCHECK; gimp_rgb_get_uchar (&config->out_of_gamut_color, &r, &g, &b); alarmCodes[0] = (cmsUInt16Number) r * 256; alarmCodes[1] = (cmsUInt16Number) g * 256; alarmCodes[2] = (cmsUInt16Number) b * 256; cmsSetAlarmCodes (alarmCodes); } transform = cmsCreateProofingTransform (src_lcms, lcms_src_format, dest_lcms, lcms_dest_format, proof_lcms, config->simulation_intent, config->display_intent, softproof_flags); g_object_unref (proof_profile); } else if (! gimp_color_profile_is_equal (src_profile, dest_profile)) { cmsUInt32Number display_flags = 0; if (config->display_use_black_point_compensation) { display_flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } transform = cmsCreateTransform (src_lcms, lcms_src_format, dest_lcms, lcms_dest_format, config->display_intent, display_flags); } g_object_unref (dest_profile); return transform; }
GimpColorTransform * gimp_widget_get_color_transform (GtkWidget *widget, GimpColorConfig *config, GimpColorProfile *src_profile, const Babl *src_format, const Babl *dest_format) { static gboolean initialized = FALSE; GimpColorProfile *dest_profile = NULL; GimpColorProfile *proof_profile = NULL; TransformCache *cache; g_return_val_if_fail (widget == NULL || GTK_IS_WIDGET (widget), NULL); g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), NULL); g_return_val_if_fail (GIMP_IS_COLOR_PROFILE (src_profile), NULL); g_return_val_if_fail (src_format != NULL, NULL); g_return_val_if_fail (dest_format != NULL, NULL); if (G_UNLIKELY (! initialized)) { initialized = TRUE; debug_cache = g_getenv ("GIMP_DEBUG_TRANSFORM_CACHE") != NULL; } switch (gimp_color_config_get_mode (config)) { case GIMP_COLOR_MANAGEMENT_OFF: return NULL; case GIMP_COLOR_MANAGEMENT_SOFTPROOF: proof_profile = gimp_color_config_get_simulation_color_profile (config, NULL); /* fallthru */ case GIMP_COLOR_MANAGEMENT_DISPLAY: dest_profile = get_display_profile (widget, config); break; } cache = transform_cache_get (config, src_profile, src_format, dest_profile, dest_format, proof_profile); if (cache) { g_object_unref (dest_profile); if (proof_profile) g_object_unref (proof_profile); if (cache->transform) return g_object_ref (cache->transform); return NULL; } if (! proof_profile && gimp_color_profile_is_equal (src_profile, dest_profile)) { g_object_unref (dest_profile); return NULL; } cache = g_new0 (TransformCache, 1); if (debug_cache) g_printerr ("creating cache %p\n", cache); cache->config = g_object_ref (config); cache->src_profile = g_object_ref (src_profile); cache->src_format = src_format; cache->dest_profile = dest_profile; cache->dest_format = dest_format; cache->proof_profile = proof_profile; cache->notify_id = g_signal_connect (cache->config, "notify", G_CALLBACK (transform_cache_config_notify), cache); transform_caches = g_list_prepend (transform_caches, cache); if (cache->proof_profile) { GimpColorTransformFlags flags = 0; if (gimp_color_config_get_simulation_bpc (config)) flags |= GIMP_COLOR_TRANSFORM_FLAGS_BLACK_POINT_COMPENSATION; if (! gimp_color_config_get_simulation_optimize (config)) flags |= GIMP_COLOR_TRANSFORM_FLAGS_NOOPTIMIZE; if (gimp_color_config_get_simulation_gamut_check (config)) { cmsUInt16Number alarmCodes[cmsMAXCHANNELS] = { 0, }; guchar r, g, b; flags |= GIMP_COLOR_TRANSFORM_FLAGS_GAMUT_CHECK; gimp_rgb_get_uchar (&config->out_of_gamut_color, &r, &g, &b); alarmCodes[0] = (cmsUInt16Number) r * 256; alarmCodes[1] = (cmsUInt16Number) g * 256; alarmCodes[2] = (cmsUInt16Number) b * 256; cmsSetAlarmCodes (alarmCodes); } cache->transform = gimp_color_transform_new_proofing (cache->src_profile, cache->src_format, cache->dest_profile, cache->dest_format, cache->proof_profile, gimp_color_config_get_simulation_intent (config), gimp_color_config_get_display_intent (config), flags); } else { GimpColorTransformFlags flags = 0; if (gimp_color_config_get_display_bpc (config)) flags |= GIMP_COLOR_TRANSFORM_FLAGS_BLACK_POINT_COMPENSATION; if (! gimp_color_config_get_display_optimize (config)) flags |= GIMP_COLOR_TRANSFORM_FLAGS_NOOPTIMIZE; cache->transform = gimp_color_transform_new (cache->src_profile, cache->src_format, cache->dest_profile, cache->dest_format, gimp_color_config_get_display_intent (config), flags); } if (cache->transform) return g_object_ref (cache->transform); return NULL; }
static GimpPDBStatusType lcms_icc_apply (GimpColorConfig *config, GimpRunMode run_mode, gint32 image, const gchar *filename, GimpColorRenderingIntent intent, gboolean bpc, gboolean *dont_ask) { GimpPDBStatusType status = GIMP_PDB_SUCCESS; cmsHPROFILE src_profile = NULL; cmsHPROFILE dest_profile = NULL; guchar src_md5[16]; guchar dest_md5[16]; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); if (! filename) filename = config->rgb_profile; if (filename) { dest_profile = lcms_load_profile (filename, dest_md5); if (! dest_profile) return GIMP_PDB_EXECUTION_ERROR; if (! lcms_icc_profile_is_rgb (dest_profile)) { g_message (_("Color profile '%s' is not for RGB color space."), gimp_filename_to_utf8 (filename)); cmsCloseProfile (dest_profile); return GIMP_PDB_EXECUTION_ERROR; } } src_profile = lcms_image_get_profile (config, image, src_md5); if (src_profile && ! lcms_icc_profile_is_rgb (src_profile)) { g_printerr ("lcms: attached color profile is not for RGB color space " "(skipping)\n"); cmsCloseProfile (src_profile); src_profile = NULL; } if (! src_profile && ! dest_profile) return GIMP_PDB_SUCCESS; if (! src_profile) { src_profile = cmsCreate_sRGBProfile (); lcms_sRGB_checksum (src_md5); } if (! dest_profile) { dest_profile = cmsCreate_sRGBProfile (); lcms_sRGB_checksum (dest_md5); } if (memcmp (src_md5, dest_md5, 16) == 0) { gchar *src_desc = lcms_icc_profile_get_desc (src_profile); gchar *dest_desc = lcms_icc_profile_get_desc (dest_profile); cmsCloseProfile (src_profile); cmsCloseProfile (dest_profile); g_printerr ("lcms: skipping conversion because profiles seem to be equal:\n"); g_printerr (" %s\n", src_desc); g_printerr (" %s\n", dest_desc); g_free (src_desc); g_free (dest_desc); return GIMP_PDB_SUCCESS; } if (run_mode == GIMP_RUN_INTERACTIVE && ! lcms_icc_apply_dialog (image, src_profile, dest_profile, dont_ask)) { status = GIMP_PDB_CANCEL; } if (status == GIMP_PDB_SUCCESS && ! lcms_image_apply_profile (image, src_profile, dest_profile, filename, intent, bpc)) { status = GIMP_PDB_EXECUTION_ERROR; } cmsCloseProfile (src_profile); cmsCloseProfile (dest_profile); return status; }
static GimpPDBStatusType lcms_icc_apply (GimpColorConfig *config, GimpRunMode run_mode, gint32 image, GFile *file, GimpColorRenderingIntent intent, gboolean bpc, gboolean *dont_ask) { GimpPDBStatusType status = GIMP_PDB_SUCCESS; cmsHPROFILE src_profile = NULL; cmsHPROFILE dest_profile = NULL; GError *error = NULL; g_return_val_if_fail (GIMP_IS_COLOR_CONFIG (config), GIMP_PDB_CALLING_ERROR); g_return_val_if_fail (image != -1, GIMP_PDB_CALLING_ERROR); if (file) g_object_ref (file); else if (config->rgb_profile) file = g_file_new_for_path (config->rgb_profile); if (file) { GError *error = NULL; dest_profile = gimp_lcms_profile_open_from_file (file, &error); if (! dest_profile) { g_message ("%s", error->message); g_clear_error (&error); return GIMP_PDB_EXECUTION_ERROR; } if (! gimp_lcms_profile_is_rgb (dest_profile)) { g_message (_("Color profile '%s' is not for RGB color space."), gimp_file_get_utf8_name (file)); cmsCloseProfile (dest_profile); g_object_unref (file); return GIMP_PDB_EXECUTION_ERROR; } } src_profile = lcms_image_get_profile (config, image, &error); if (error) { g_message ("%s", error->message); g_clear_error (&error); } if (! src_profile && ! dest_profile) return GIMP_PDB_SUCCESS; if (! src_profile) src_profile = gimp_lcms_create_srgb_profile (); if (! dest_profile) dest_profile = gimp_lcms_create_srgb_profile (); if (gimp_lcms_profile_is_equal (src_profile, dest_profile)) { gchar *src_label = gimp_lcms_profile_get_label (src_profile); gchar *dest_label = gimp_lcms_profile_get_label (dest_profile); cmsCloseProfile (src_profile); cmsCloseProfile (dest_profile); g_printerr ("lcms: skipping conversion because profiles seem to be equal:\n"); g_printerr (" %s\n", src_label); g_printerr (" %s\n", dest_label); g_free (src_label); g_free (dest_label); if (file) g_object_unref (file); return GIMP_PDB_SUCCESS; } if (run_mode == GIMP_RUN_INTERACTIVE && ! lcms_icc_apply_dialog (image, src_profile, dest_profile, dont_ask)) { status = GIMP_PDB_CANCEL; } if (status == GIMP_PDB_SUCCESS && ! lcms_image_apply_profile (image, src_profile, dest_profile, file, intent, bpc)) { status = GIMP_PDB_EXECUTION_ERROR; } cmsCloseProfile (src_profile); cmsCloseProfile (dest_profile); if (file) g_object_unref (file); return status; }