static gchar * gimp_lcms_profile_get_info (GimpColorProfile profile, cmsInfoType info) { cmsUInt32Number size; gchar *text = NULL; g_return_val_if_fail (profile != NULL, NULL); size = cmsGetProfileInfoASCII (profile, info, "en", "US", NULL, 0); if (size > 0) { gchar *data = g_new (gchar, size + 1); size = cmsGetProfileInfoASCII (profile, info, "en", "US", data, size); if (size > 0) text = gimp_any_to_utf8 (data, -1, NULL); g_free (data); } return text; }
static void cdisplay_proof_combo_box_set_active (GimpColorProfileComboBox *combo, const gchar *filename) { cmsHPROFILE profile = NULL; gchar *label = NULL; if (filename) profile = cmsOpenProfileFromFile (filename, "r"); if (profile) { cmsUInt32Number descSize; gchar *descData; descSize = cmsGetProfileInfoASCII (profile, cmsInfoDescription, "en", "US", NULL, 0); if (descSize > 0) { descData = g_new (gchar, descSize + 1); descSize = cmsGetProfileInfoASCII (profile, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) label = gimp_any_to_utf8 (descData, -1, NULL); g_free (descData); } if (! label) { descSize = cmsGetProfileInfoASCII (profile, cmsInfoModel, "en", "US", NULL, 0); if (descSize > 0) { descData = g_new (gchar, descSize + 1); descSize = cmsGetProfileInfoASCII (profile, cmsInfoModel, "en", "US", descData, descSize); if (descSize > 0) label = gimp_any_to_utf8 (descData, -1, NULL); g_free (descData); } } cmsCloseProfile (profile); } gimp_color_profile_combo_box_set_active (combo, filename, label); g_free (label); }
QString dkCmsTakeManufacturer(cmsHPROFILE hProfile) { char buffer[1024]; buffer[0] = '\0'; cmsGetProfileInfoASCII(hProfile, cmsInfoManufacturer, "en", "US", buffer, 1024); return QString::fromLatin1(buffer); }
static gchar *color_man_get_profile_name(ColorManProfileType type, cmsHPROFILE profile) { switch (type) { case COLOR_PROFILE_SRGB: return g_strdup(_("sRGB")); case COLOR_PROFILE_ADOBERGB: return g_strdup(_("Adobe RGB compatible")); break; case COLOR_PROFILE_MEM: case COLOR_PROFILE_FILE: if (profile) { #ifdef HAVE_LCMS2 cmsUInt32Number r; char buffer[20]; buffer[0] = '\0'; r = cmsGetProfileInfoASCII(profile, cmsInfoDescription, "en", "US", buffer, 20); buffer[19] = '\0'; /* Just to be sure */ return g_strdup(buffer); #else return g_strdup(cmsTakeProductName(profile)); #endif } return g_strdup(_("Custom profile")); break; case COLOR_PROFILE_NONE: default: return g_strdup(""); } }
// Auxiliar for printing information on profile static void PrintInfo(cmsHPROFILE h, cmsInfoType Info) { char* text; int len; len = cmsGetProfileInfoASCII(h, Info, "en", "US", NULL, 0); if (len == 0) return; text = malloc(len * sizeof(char)); if (text == NULL) return; cmsGetProfileInfoASCII(h, Info, "en", "US", text, len); if (strlen(text) > 0) printf("%s\n", text); free(text); }
QString ScLcms2ColorProfileImpl::productDescription() const { if (m_productDescription.isEmpty()) { if (m_profileHandle) { #ifdef _WIN32 cmsUInt32Number descSize = cmsGetProfileInfo(m_profileHandle, cmsInfoDescription, "en", "US", nullptr, 0); if (descSize > 0) { wchar_t* descData = (wchar_t*) malloc(descSize + sizeof(wchar_t)); descSize = cmsGetProfileInfo(m_profileHandle, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) { uint stringLen = descSize / sizeof(wchar_t); descData[stringLen] = 0; if (sizeof(wchar_t) == sizeof(QChar)) { m_productDescription = QString::fromUtf16((ushort *) descData); } else { m_productDescription = QString::fromUcs4((uint *) descData); } free(descData); } } #else cmsUInt32Number descSize = cmsGetProfileInfoASCII(m_profileHandle, cmsInfoDescription, "en", "US", nullptr, 0); if (descSize > 0) { char* descData = (char*) malloc(descSize + sizeof(char)); descSize = cmsGetProfileInfoASCII(m_profileHandle, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) { m_productDescription = QString(descData); free(descData); } } #endif } } return m_productDescription; }
static PyObject* _profile_getattr(CmsProfileObject* self, cmsInfoType field) { // UNDONE -- check that I'm getting the right fields on these. // return PyUnicode_DecodeFSDefault(cmsTakeProductName(self->profile)); //wchar_t buf[256]; -- UNDONE need wchar_t for unicode version. char buf[256]; cmsUInt32Number written; written = cmsGetProfileInfoASCII(self->profile, field, "en", "us", buf, 256); if (written) { return PyUnicode_FromString(buf); } // UNDONE suppressing error here by sending back blank string. return PyUnicode_FromString(""); }
void gui_init(struct dt_iop_module_t *self) { self->gui_data = malloc(sizeof(dt_iop_colorout_gui_data_t)); memset(self->gui_data,0,sizeof(dt_iop_colorout_gui_data_t)); dt_iop_colorout_gui_data_t *g = (dt_iop_colorout_gui_data_t *)self->gui_data; g->profiles = NULL; dt_iop_color_profile_t *prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t)); g_strlcpy(prof->filename, "sRGB", sizeof(prof->filename)); g_strlcpy(prof->name, "sRGB", sizeof(prof->name)); int pos; int display_pos; prof->pos = 0; prof->display_pos = 0; g->profiles = g_list_append(g->profiles, prof); prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t)); g_strlcpy(prof->filename, "adobergb", sizeof(prof->filename)); g_strlcpy(prof->name, "adobergb", sizeof(prof->name)); prof->pos = 1; prof->display_pos = 1; g->profiles = g_list_append(g->profiles, prof); prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t)); g_strlcpy(prof->filename, "X profile", sizeof(prof->filename)); g_strlcpy(prof->name, "X profile", sizeof(prof->name)); prof->pos = -1; prof->display_pos = 2; g->profiles = g_list_append(g->profiles, prof); prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t)); g_strlcpy(prof->filename, "linear_rgb", sizeof(prof->filename)); g_strlcpy(prof->name, "linear_rgb", sizeof(prof->name)); pos = prof->pos = 2; display_pos = prof->display_pos = 3; g->profiles = g_list_append(g->profiles, prof); // read {conf,data}dir/color/out/*.icc char datadir[DT_MAX_PATH_LEN]; char confdir[DT_MAX_PATH_LEN]; char dirname[DT_MAX_PATH_LEN]; char filename[DT_MAX_PATH_LEN]; dt_loc_get_user_config_dir(confdir, DT_MAX_PATH_LEN); dt_loc_get_datadir(datadir, DT_MAX_PATH_LEN); snprintf(dirname, DT_MAX_PATH_LEN, "%s/color/out", confdir); if(!g_file_test(dirname, G_FILE_TEST_IS_DIR)) snprintf(dirname, DT_MAX_PATH_LEN, "%s/color/out", datadir); cmsHPROFILE tmpprof; const gchar *d_name; GDir *dir = g_dir_open(dirname, 0, NULL); if(dir) { while((d_name = g_dir_read_name(dir))) { snprintf(filename, DT_MAX_PATH_LEN, "%s/%s", dirname, d_name); tmpprof = cmsOpenProfileFromFile(filename, "r"); if(tmpprof) { char *lang = getenv("LANG"); if (!lang) lang = "en_US"; dt_iop_color_profile_t *prof = (dt_iop_color_profile_t *)g_malloc0(sizeof(dt_iop_color_profile_t)); char name[1024]; cmsGetProfileInfoASCII(tmpprof, cmsInfoDescription, lang, lang+3, name, 1024); g_strlcpy(prof->name, name, sizeof(prof->name)); g_strlcpy(prof->filename, d_name, sizeof(prof->filename)); prof->pos = ++pos; prof->display_pos = ++display_pos; cmsCloseProfile(tmpprof); g->profiles = g_list_append(g->profiles, prof); } } g_dir_close(dir); } self->widget = gtk_vbox_new(TRUE, DT_BAUHAUS_SPACE); // TODO: g->cbox1 = dt_bauhaus_combobox_new(self); gtk_box_pack_start(GTK_BOX(self->widget), g->cbox1, TRUE, TRUE, 0); dt_bauhaus_widget_set_label(g->cbox1, _("output intent")); dt_bauhaus_combobox_add(g->cbox1, _("perceptual")); dt_bauhaus_combobox_add(g->cbox1, _("relative colorimetric")); dt_bauhaus_combobox_add(g->cbox1, C_("rendering intent", "saturation")); dt_bauhaus_combobox_add(g->cbox1, _("absolute colorimetric")); g->cbox4 = dt_bauhaus_combobox_new(self); dt_bauhaus_widget_set_label(g->cbox4, _("display intent")); gtk_box_pack_start(GTK_BOX(self->widget), g->cbox4, TRUE, TRUE, 0); dt_bauhaus_combobox_add(g->cbox4, _("perceptual")); dt_bauhaus_combobox_add(g->cbox4, _("relative colorimetric")); dt_bauhaus_combobox_add(g->cbox4, C_("rendering intent", "saturation")); dt_bauhaus_combobox_add(g->cbox4, _("absolute colorimetric")); g->cbox2 = dt_bauhaus_combobox_new(self); g->cbox3 = dt_bauhaus_combobox_new(self); g->cbox5 = dt_bauhaus_combobox_new(self); dt_bauhaus_widget_set_label(g->cbox2, _("output profile")); dt_bauhaus_widget_set_label(g->cbox5, _("softproof profile")); dt_bauhaus_widget_set_label(g->cbox3, _("display profile")); gtk_box_pack_start(GTK_BOX(self->widget), g->cbox2, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->cbox5, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(self->widget), g->cbox3, TRUE, TRUE, 0); GList *l = g->profiles; while(l) { dt_iop_color_profile_t *prof = (dt_iop_color_profile_t *)l->data; if(!strcmp(prof->name, "X profile")) { // the system display profile is only suitable for display purposes dt_bauhaus_combobox_add(g->cbox3, _("system display profile")); } else if(!strcmp(prof->name, "linear_rgb")) { dt_bauhaus_combobox_add(g->cbox2, _("linear RGB")); dt_bauhaus_combobox_add(g->cbox3, _("linear RGB")); dt_bauhaus_combobox_add(g->cbox5, _("linear RGB")); } else if(!strcmp(prof->name, "sRGB")) { dt_bauhaus_combobox_add(g->cbox2, _("sRGB (web-safe)")); dt_bauhaus_combobox_add(g->cbox3, _("sRGB (web-safe)")); dt_bauhaus_combobox_add(g->cbox5, _("sRGB (web-safe)")); } else if(!strcmp(prof->name, "adobergb")) { dt_bauhaus_combobox_add(g->cbox2, _("Adobe RGB")); dt_bauhaus_combobox_add(g->cbox3, _("Adobe RGB")); dt_bauhaus_combobox_add(g->cbox5, _("Adobe RGB")); } else { dt_bauhaus_combobox_add(g->cbox2, prof->name); dt_bauhaus_combobox_add(g->cbox3, prof->name); dt_bauhaus_combobox_add(g->cbox5, prof->name); } l = g_list_next(l); } char tooltip[1024]; g_object_set(G_OBJECT(g->cbox1), "tooltip-text", _("rendering intent"), (char *)NULL); snprintf(tooltip, 1024, _("icc profiles in %s/color/out or %s/color/out"), confdir, datadir); g_object_set(G_OBJECT(g->cbox2), "tooltip-text", tooltip, (char *)NULL); snprintf(tooltip, 1024, _("display icc profiles in %s/color/out or %s/color/out"), confdir, datadir); g_object_set(G_OBJECT(g->cbox3), "tooltip-text", tooltip, (char *)NULL); snprintf(tooltip, 1024, _("softproof icc profiles in %s/color/out or %s/color/out"), confdir, datadir); g_object_set(G_OBJECT(g->cbox5), "tooltip-text", tooltip, (char *)NULL); g_signal_connect (G_OBJECT (g->cbox1), "value-changed", G_CALLBACK (intent_changed), (gpointer)self); g_signal_connect (G_OBJECT (g->cbox4), "value-changed", G_CALLBACK (display_intent_changed), (gpointer)self); g_signal_connect (G_OBJECT (g->cbox2), "value-changed", G_CALLBACK (output_profile_changed), (gpointer)self); g_signal_connect (G_OBJECT (g->cbox3), "value-changed", G_CALLBACK (display_profile_changed), (gpointer)self); g_signal_connect (G_OBJECT (g->cbox5), "value-changed", G_CALLBACK (softproof_profile_changed), (gpointer)self); // reload the profiles when the display profile changed! dt_control_signal_connect(darktable.signals, DT_SIGNAL_CONTROL_PROFILE_CHANGED, G_CALLBACK(_signal_profile_changed), self); }
void gui_init (dt_lib_module_t *self) { dt_lib_export_t *d = (dt_lib_export_t *)malloc(sizeof(dt_lib_export_t)); self->data = (void *)d; self->widget = gtk_table_new(8, 2, FALSE); gtk_table_set_row_spacings(GTK_TABLE(self->widget), 5); GtkWidget *label; label = dtgtk_label_new(_("target storage"), DARKTABLE_LABEL_TAB | DARKTABLE_LABEL_ALIGN_RIGHT); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 2, 0, 1, GTK_FILL|GTK_EXPAND, 0, 0, 0); d->storage = GTK_COMBO_BOX(gtk_combo_box_new_text()); GList *it = darktable.imageio->plugins_storage; while(it) { dt_imageio_module_storage_t *module = (dt_imageio_module_storage_t *)it->data; gtk_combo_box_append_text(d->storage, module->name(module)); it = g_list_next(it); } dt_control_signal_connect(darktable.signals,DT_SIGNAL_IMAGEIO_STORAGE_CHANGE,G_CALLBACK(on_storage_list_changed),self); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->storage), 0, 2, 1, 2, GTK_EXPAND|GTK_FILL, 0, 0, 0); g_signal_connect (G_OBJECT (d->storage), "changed", G_CALLBACK (storage_changed), (gpointer)d); d->storage_box = GTK_CONTAINER(gtk_alignment_new(1.0, 1.0, 1.0, 1.0)); gtk_alignment_set_padding(GTK_ALIGNMENT(d->storage_box), 0, 0, 0, 0); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->storage_box), 0, 2, 2, 3, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = dtgtk_label_new(_("file format"), DARKTABLE_LABEL_TAB | DARKTABLE_LABEL_ALIGN_RIGHT); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_set_row_spacing(GTK_TABLE(self->widget), 2, 20); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 2, 3, 4, GTK_EXPAND|GTK_FILL, 0, 0, 0); d->format = GTK_COMBO_BOX(gtk_combo_box_new_text()); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->format), 0, 2, 4, 5, GTK_EXPAND|GTK_FILL, 0, 0, 0); g_signal_connect (G_OBJECT (d->format), "changed", G_CALLBACK (format_changed), (gpointer)d); d->format_box = GTK_CONTAINER(gtk_alignment_new(1.0, 1.0, 1.0, 1.0)); gtk_alignment_set_padding(GTK_ALIGNMENT(d->format_box), 0, 0, 0, 0); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->format_box), 0, 2, 5, 6, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = dtgtk_label_new(_("global options"), DARKTABLE_LABEL_TAB | DARKTABLE_LABEL_ALIGN_RIGHT); gtk_table_set_row_spacing(GTK_TABLE(self->widget), 5, 20); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 2, 6, 7, GTK_EXPAND|GTK_FILL, 0, 0, 0); d->width = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0, 10000, 1)); g_object_set(G_OBJECT(d->width), "tooltip-text", _("maximum output width\nset to 0 for no scaling"), (char *)NULL); d->height = GTK_SPIN_BUTTON(gtk_spin_button_new_with_range(0, 10000, 1)); g_object_set(G_OBJECT(d->height), "tooltip-text", _("maximum output height\nset to 0 for no scaling"), (char *)NULL); dt_gui_key_accel_block_on_focus_connect (GTK_WIDGET (d->width)); dt_gui_key_accel_block_on_focus_connect (GTK_WIDGET (d->height)); /* gtk_widget_add_events(GTK_WIDGET(d->width), GDK_FOCUS_CHANGE_MASK); g_signal_connect (G_OBJECT (d->width), "focus-in-event", G_CALLBACK(focus_in), NULL); g_signal_connect (G_OBJECT (d->width), "focus-out-event", G_CALLBACK(focus_out), NULL); gtk_widget_add_events(GTK_WIDGET(d->height), GDK_FOCUS_CHANGE_MASK); g_signal_connect (G_OBJECT (d->height), "focus-in-event", G_CALLBACK(focus_in), NULL); g_signal_connect (G_OBJECT (d->height), "focus-out-event", G_CALLBACK(focus_out), NULL); */ label = gtk_label_new(_("max size")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 1, 7, 8, GTK_EXPAND|GTK_FILL, 0, 0, 0); GtkBox *hbox = GTK_BOX(gtk_hbox_new(FALSE, 5)); gtk_box_pack_start(hbox, GTK_WIDGET(d->width), TRUE, TRUE, 0); gtk_box_pack_start(hbox, gtk_label_new(_("x")), FALSE, FALSE, 0); gtk_box_pack_start(hbox, GTK_WIDGET(d->height), TRUE, TRUE, 0); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(hbox), 1, 2, 7, 8, GTK_EXPAND|GTK_FILL, 0, 0, 0); label = gtk_label_new(_("intent")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 1, 8, 9, GTK_EXPAND|GTK_FILL, 0, 0, 0); d->intent = GTK_COMBO_BOX(gtk_combo_box_new_text()); gtk_combo_box_append_text(d->intent, _("image settings")); gtk_combo_box_append_text(d->intent, _("perceptual")); gtk_combo_box_append_text(d->intent, _("relative colorimetric")); gtk_combo_box_append_text(d->intent, C_("rendering intent", "saturation")); gtk_combo_box_append_text(d->intent, _("absolute colorimetric")); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->intent), 1, 2, 8, 9, GTK_EXPAND|GTK_FILL, 0, 0, 0); // Add profile combo d->profiles = NULL; dt_lib_export_profile_t *prof = (dt_lib_export_profile_t *)g_malloc0(sizeof(dt_lib_export_profile_t)); g_strlcpy(prof->filename, "sRGB", sizeof(prof->filename)); g_strlcpy(prof->name, _("sRGB (web-safe)"), sizeof(prof->name)); int pos; prof->pos = 1; d->profiles = g_list_append(d->profiles, prof); prof = (dt_lib_export_profile_t *)g_malloc0(sizeof(dt_lib_export_profile_t)); g_strlcpy(prof->filename, "adobergb", sizeof(prof->filename)); g_strlcpy(prof->name, _("Adobe RGB"), sizeof(prof->name)); prof->pos = 2; d->profiles = g_list_append(d->profiles, prof); prof = (dt_lib_export_profile_t *)g_malloc0(sizeof(dt_lib_export_profile_t)); g_strlcpy(prof->filename, "X profile", sizeof(prof->filename)); g_strlcpy(prof->name, "X profile", sizeof(prof->name)); prof->pos = 3; d->profiles = g_list_append(d->profiles, prof); prof = (dt_lib_export_profile_t *)g_malloc0(sizeof(dt_lib_export_profile_t)); g_strlcpy(prof->filename, "linear_rgb", sizeof(prof->filename)); g_strlcpy(prof->name, _("linear RGB"), sizeof(prof->name)); pos = prof->pos = 4; d->profiles = g_list_append(d->profiles, prof); // read datadir/color/out/*.icc char datadir[DT_MAX_PATH_LEN]; char confdir[DT_MAX_PATH_LEN]; char dirname[DT_MAX_PATH_LEN]; char filename[DT_MAX_PATH_LEN]; dt_loc_get_user_config_dir(confdir, DT_MAX_PATH_LEN); dt_loc_get_datadir(datadir, DT_MAX_PATH_LEN); cmsHPROFILE tmpprof; const gchar *d_name; snprintf(dirname, DT_MAX_PATH_LEN, "%s/color/out", confdir); if(!g_file_test(dirname, G_FILE_TEST_IS_DIR)) snprintf(dirname, DT_MAX_PATH_LEN, "%s/color/out", datadir); GDir *dir = g_dir_open(dirname, 0, NULL); if(dir) { while((d_name = g_dir_read_name(dir))) { snprintf(filename, DT_MAX_PATH_LEN, "%s/%s", dirname, d_name); tmpprof = cmsOpenProfileFromFile(filename, "r"); if(tmpprof) { char *lang = getenv("LANG"); if (!lang) lang = "en_US"; dt_lib_export_profile_t *prof = (dt_lib_export_profile_t *)g_malloc0(sizeof(dt_lib_export_profile_t)); char name[1024]; cmsGetProfileInfoASCII(tmpprof, cmsInfoDescription, lang, lang+3, name, 1024); g_strlcpy(prof->name, name, sizeof(prof->name)); g_strlcpy(prof->filename, d_name, sizeof(prof->filename)); prof->pos = ++pos; cmsCloseProfile(tmpprof); d->profiles = g_list_append(d->profiles, prof); } } g_dir_close(dir); } GList *l = d->profiles; label = gtk_label_new(_("profile")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 1, 9, 10, GTK_EXPAND|GTK_FILL, 0, 0, 0); d->profile = GTK_COMBO_BOX(gtk_combo_box_new_text()); dt_ellipsize_combo(d->profile); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->profile), 1, 2, 9, 10, GTK_SHRINK|GTK_EXPAND|GTK_FILL, 0, 0, 0); // gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->profile), 1, 2, 9, 10, GTK_EXPAND|GTK_FILL, 0, 0, 0); gtk_combo_box_append_text(d->profile, _("image settings")); while(l) { dt_lib_export_profile_t *prof = (dt_lib_export_profile_t *)l->data; if(!strcmp(prof->name, "X profile")) gtk_combo_box_append_text(d->profile, _("system display profile")); else gtk_combo_box_append_text(d->profile, prof->name); l = g_list_next(l); } gtk_combo_box_set_active(d->profile, 0); char tooltip[1024]; snprintf(tooltip, 1024, _("output icc profiles in %s/color/out or %s/color/out"), confdir, datadir); g_object_set(G_OBJECT(d->profile), "tooltip-text", tooltip, (char *)NULL); // Add style combo label = gtk_label_new(_("style")); gtk_misc_set_alignment(GTK_MISC(label), 0.0, 0.5); gtk_table_attach(GTK_TABLE(self->widget), label, 0, 1, 10, 11, GTK_EXPAND|GTK_FILL, 0, 0, 0); d->style = GTK_COMBO_BOX(gtk_combo_box_new_text()); dt_ellipsize_combo(d->style); gtk_combo_box_append_text(d->style, _("none")); GList *styles = dt_styles_get_list(""); while (styles) { dt_style_t *style=(dt_style_t *)styles->data; gtk_combo_box_append_text(d->style, style->name); styles=g_list_next(styles); } gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(d->style), 1, 2, 10, 11, GTK_EXPAND|GTK_FILL, 0, 0, 0); g_object_set(G_OBJECT(d->style), "tooltip-text", _("temporary style to append while exporting"), (char *)NULL); // Set callback signals g_signal_connect (G_OBJECT (d->intent), "changed", G_CALLBACK (intent_changed), (gpointer)d); g_signal_connect (G_OBJECT (d->profile), "changed", G_CALLBACK (profile_changed), (gpointer)d); g_signal_connect (G_OBJECT (d->style), "changed", G_CALLBACK (style_changed), (gpointer)d); // Export button GtkButton *button = GTK_BUTTON(gtk_button_new_with_label(_("export"))); d->export_button = button; g_object_set(G_OBJECT(button), "tooltip-text", _("export with current settings (ctrl-e)"), (char *)NULL); gtk_table_attach(GTK_TABLE(self->widget), GTK_WIDGET(button), 1, 2, 11, 12, GTK_EXPAND|GTK_FILL, 0, 0, 0); g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (export_button_clicked), (gpointer)self); g_signal_connect (G_OBJECT (d->width), "value-changed", G_CALLBACK (width_changed), (gpointer)0); g_signal_connect (G_OBJECT (d->height), "value-changed", G_CALLBACK (height_changed), (gpointer)0); self->gui_reset(self); }
void Color::LoadICCProfiles() { if(m_iccSearchPaths!= NULL){ delete m_iccSearchPaths; } const Int32 NUMSEARCHPATHS = 4; m_iccSearchPaths = new String[NUMSEARCHPATHS]; Filename cmykDir = GeGetPluginPath(); cmykDir += Filename(String("cmyk")); m_iccSearchPaths[0] = cmykDir.GetString(); m_iccSearchPaths[1] = "/Library/ColorSync/Profiles/"; m_iccSearchPaths[2] = "/Users/vidarn/Library/ColorSync"; m_iccSearchPaths[3] = "C:\\Windows\\System32\\Spool\\Drivers\\Color\\"; Logger::AddLine("Creating LAB profile",1); m_LABProfile = cmsCreateLab4Profile(NULL); Logger::AddLine("Creating default sRGB profile",1); m_displayProfile = cmsCreate_sRGBProfile(); m_RGBProfiles.Insert(vnColorProfile("sRGB",m_displayProfile),0); for(Int32 i=0;i<NUMSEARCHPATHS;++i){ BrowseFiles* bf = BrowseFiles::Alloc(); Filename dir(m_iccSearchPaths[i]); bf->Init(dir,FALSE); int RGBPos = m_RGBProfiles.GetCount(); int CMYKPos = m_CMYKProfiles.GetCount(); int spotPos = m_spotProfiles.GetCount(); if (bf) { while (bf->GetNext()) { Filename fileName = bf->GetFilename(); fileName.SetDirectory(dir); String str = fileName.GetString(); Char *buffer = new Char[str.GetCStringLen()+1]; str.GetCString(buffer,str.GetCStringLen()+1); Logger::AddLine(buffer,1); cmsHPROFILE profile = cmsOpenProfileFromFile(buffer, "r"); if(profile != NULL){ cmsColorSpaceSignature sig = cmsGetColorSpace(profile); Int32 length = cmsGetProfileInfoASCII(profile,cmsInfoDescription,"en","US",NULL,0); Char *buffer2 = new Char[length]; cmsGetProfileInfoASCII(profile,cmsInfoDescription,"en","US",buffer2,length); String info(buffer2); int pt = _cmsLCMScolorSpace(sig); if(PT_RGB == pt){ Logger::AddLine("RGB profile",1); m_RGBProfiles.Insert(vnColorProfile(info,profile),RGBPos); RGBPos++; } if(PT_CMYK == pt){ cmsHTRANSFORM xform = cmsCreateTransform(profile,TYPE_NAMED_COLOR_INDEX,m_displayProfile,TYPE_RGB_DBL,INTENT_PERCEPTUAL,0); if(xform != NULL){ cmsNAMEDCOLORLIST* colorList = cmsGetNamedColorList(xform); if(colorList != NULL){ m_spotProfiles.Insert(vnColorProfile(info,profile),spotPos); spotPos++; } else{ Logger::AddLine("CMYK profile",1); m_CMYKProfiles.Insert(vnColorProfile(info,profile),CMYKPos); CMYKPos++; } cmsDeleteTransform(xform); } } delete buffer2; } else { Logger::AddLine("Invalid",1); } delete buffer; } } BrowseFiles::Free(bf); } }
bool GetMonitorProfile(char *path, int buf_len, const void *hwnd) { std::list<std::string> profile_descriptions; std::map<std::string, std::string> profile_paths; // path to the monitor's profile char monitor_profile_path[256] = { '\0' }; DWORD path_size = 256; BOOL get_icm_result = GetICMProfile(GetDC((HWND)hwnd), &path_size, monitor_profile_path); // directory where Windows stores its profiles char profile_directory[256] = { '\0' }; DWORD dir_name_size = 256; BOOL get_color_dir_result = GetColorDirectory(NULL, profile_directory, &dir_name_size); // Get the profile file names from Windows ENUMTYPE enum_type; enum_type.dwSize = sizeof(ENUMTYPE); enum_type.dwVersion = ENUM_TYPE_VERSION; enum_type.dwFields = ET_DEVICECLASS; // alternately could use ET_CLASS enum_type.dwDeviceClass = CLASS_MONITOR; BYTE *buf = NULL; DWORD buf_size = 0; DWORD num_profiles = 0; BOOL other_enum_result = EnumColorProfiles(NULL, &enum_type, buf, &buf_size, &num_profiles); if(buf_size > 0 && num_profiles > 0) { buf = (BYTE *)malloc(buf_size); other_enum_result = EnumColorProfiles(NULL, &enum_type, buf, &buf_size, &num_profiles); if(other_enum_result) { // build a list of the profile descriptions // and a map to return the paths char *prof_name = (char *)buf; for(int i=0; i < num_profiles; i++) { std::string prof = prof_name; std::string prof_path = std::string(profile_directory) + "\\" + prof_name; cmsHPROFILE hProfile = cmsOpenProfileFromFile(prof_path.c_str(), "r"); // Note: Windows will give us profiles that aren't ICC (.cdmp for example). // Don't worry, LittleCMS will just return NULL for those. if(hProfile) { char profile_description[256]; cmsUInt32Number got_desc = cmsGetProfileInfoASCII(hProfile, cmsInfoDescription, "en", "US", profile_description, 256); if(got_desc) { profile_descriptions.push_back(profile_description); profile_paths[ profile_description ] = prof_path; } cmsCloseProfile(hProfile); } prof_name += strlen(prof_name) + 1; } } free(buf); } if(profile_descriptions.size() > 0) { // set a vector and selected index for building the profile menu profile_descriptions.sort(); profile_descriptions.unique(); std::vector<std::string> profile_vec; int selected = 0; for(std::list<std::string>::const_iterator i = profile_descriptions.begin(); i != profile_descriptions.end(); i++) { profile_vec.push_back( *i ); if( profile_paths[ *i ] == monitor_profile_path) { selected = profile_vec.size() - 1; } } // run the dialog g_profile_vec = &profile_vec; g_selected_item = selected; int status = DialogBox(hDllInstance, (LPSTR)"PROFILEDIALOG", (HWND)hwnd, (DLGPROC)DialogProc); if(status == -1) { // dialog didn't open, my bad return true; } else if(g_item_clicked == DLOG_Cancel) { return false; } else { strncpy(path, profile_paths[ profile_vec[ g_selected_item ] ].c_str(), buf_len); return true; } } else return true; }
QList<ScColorProfileInfo> ScLcms2ColorMgmtEngineImpl::getAvailableProfileInfo(const QString& directory, bool recursive) { QList<ScColorProfileInfo> profileInfos; QDir d(directory, "*", QDir::Name, QDir::Files | QDir::Readable | QDir::Dirs | QDir::NoSymLinks); if ((!d.exists()) || (d.count() == 0)) return profileInfos; QString nam = ""; cmsHPROFILE hIn = NULL; for (uint dc = 0; dc < d.count(); ++dc) { QString file = d[dc]; if (file == "." || file == "..") continue; QFileInfo fi(directory + "/" + file); if (fi.isDir() && !recursive) continue; else if (fi.isDir() && !file.startsWith('.')) { QList<ScColorProfileInfo> profileInfos2 = getAvailableProfileInfo(fi.filePath()+"/", true); profileInfos.append(profileInfos2); continue; } ScColorProfileInfo profileInfo; profileInfo.file = fi.filePath(); QFile f(fi.filePath()); QByteArray bb(40, ' '); if (!f.open(QIODevice::ReadOnly)) { profileInfo.debug = QString("couldn't open %1 as color profile").arg(fi.filePath()); profileInfos.append(profileInfo); continue; } int len = f.read(bb.data(), 40); f.close(); if (len == 40 && bb[36] == 'a' && bb[37] == 'c' && bb[38] == 's' && bb[39] == 'p') { const QByteArray profilePath( QString(directory + "/" + file).toLocal8Bit() ); hIn = cmsOpenProfileFromFile(profilePath.data(), "r"); if (hIn == NULL) continue; #ifdef _WIN32 cmsUInt32Number descSize = cmsGetProfileInfo(hIn, cmsInfoDescription, "en", "US", NULL, 0); if (descSize > 0) { wchar_t* descData = (wchar_t*) malloc(descSize + sizeof(wchar_t)); descSize = cmsGetProfileInfo(hIn, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) { uint stringLen = descSize / sizeof(wchar_t); descData[stringLen] = 0; if (sizeof(wchar_t) == sizeof(QChar)) { profileInfo.description = QString::fromUtf16((ushort *) descData); } else { profileInfo.description = QString::fromUcs4((uint *) descData); } free(descData); } } #else cmsUInt32Number descSize = cmsGetProfileInfoASCII(hIn, cmsInfoDescription, "en", "US", NULL, 0); if (descSize > 0) { char* descData = (char*) malloc(descSize + sizeof(char)); descSize = cmsGetProfileInfoASCII(hIn, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) { profileInfo.description = QString(descData); free(descData); } } #endif if (profileInfo.description.isEmpty()) { cmsCloseProfile(hIn); profileInfo.debug = QString("Color profile %1 is broken : no valid description").arg(fi.filePath()); profileInfos.append(profileInfo); continue; } profileInfo.colorSpace = translateLcmsColorSpaceType( cmsGetColorSpace(hIn) ); profileInfo.deviceClass = translateLcmsProfileClass( cmsGetDeviceClass(hIn) ); profileInfos.append(profileInfo); cmsCloseProfile(hIn); hIn = NULL; } } return profileInfos; }
static void cdisplay_lcms_profile_get_info (cmsHPROFILE profile, gchar **name, gchar **info) { if (profile) { cmsUInt32Number descSize; gchar *descData; descSize = cmsGetProfileInfoASCII (profile, cmsInfoDescription, "en", "US", NULL, 0); if (descSize > 0) { descData = g_new (gchar, descSize + 1); descSize = cmsGetProfileInfoASCII (profile, cmsInfoDescription, "en", "US", descData, descSize); if (descSize > 0) *name = descData; else g_free (descData); } if (! *name) { descSize = cmsGetProfileInfoASCII (profile, cmsInfoModel, "en", "US", NULL, 0); if (descSize > 0) { descData = g_new (gchar, descSize + 1); descSize = cmsGetProfileInfoASCII(profile, cmsInfoModel, "en", "US", descData, descSize); if (descSize > 0) *name = descData; else g_free (descData); } } if (*name && ! g_utf8_validate (*name, -1, NULL)) { g_free (*name); *name = g_strdup (_("(invalid UTF-8 string)")); } if (! *name) { /* a color profile without a name */ *name = g_strdup (_("(unnamed profile)")); } descSize = cmsGetProfileInfoASCII (profile, cmsInfoManufacturer, "en", "US", NULL, 0); if (descSize > 0) { descData = g_new (gchar, descSize + 1); descSize = cmsGetProfileInfoASCII (profile, cmsInfoManufacturer, "en", "US", descData, descSize); if (descSize > 0) *info = descData; else g_free (descData); } if (*info && ! g_utf8_validate (*info, -1, NULL)) { g_free (*info); *info = NULL; } } else { *name = g_strdup (_("None")); *info = NULL; } }