From 30af0e2edbf061b71bed9536d826894449f0390d Mon Sep 17 00:00:00 2001 From: Nils Philippsen Date: Mon, 23 Sep 2013 16:11:31 +0200 Subject: [PATCH] patch: lcms2 Squashed commit of the following: commit f975accf7e1a08438b63580ea848457d373200f5 Author: Nils Philippsen Date: Mon Sep 23 14:53:45 2013 +0200 Add support for lcms 2.x. --- configure.in | 22 ++++++++++++++---- include/config.h.in | 8 ++++++- src/xsane-preview.c | 6 +++-- src/xsane-save.c | 38 ++++++++++++++++++++++++++----- src/xsane-viewer.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++--- src/xsane.h | 8 ++++++- 6 files changed, 130 insertions(+), 17 deletions(-) diff --git a/configure.in b/configure.in index df7b114..3659c97 100644 --- a/configure.in +++ b/configure.in @@ -130,7 +130,17 @@ if test "${USE_TIFF}" = "yes"; then fi if test "${USE_LCMS}" = "yes"; then - AC_CHECK_LIB(lcms, cmsOpenProfileFromFile) + AC_SEARCH_LIBS(cmsOpenProfileFromFile, [lcms2 lcms]) + if test "${ac_cv_search_cmsOpenProfileFromFile}" != "no"; then + AC_DEFINE(HAVE_LIBLCMS, 1, [Define if LCMS is to be used.]) + fi + if test "${ac_cv_search_cmsOpenProfileFromFile}" == "-llcms2"; then + AC_DEFINE(HAVE_LIBLCMS2, 1, [Define if you have liblcms2.]) + else + if test "${ac_cv_search_cmsOpenProfileFromFile}" == "-llcms"; then + AC_DEFINE(HAVE_LIBLCMS1, 1, [Define if you have liblcms.]) + fi + fi fi dnl Checks for library functions. @@ -294,10 +304,14 @@ else echo "* - PNG support deactivated *" fi -if test "${ac_cv_lib_lcms_cmsOpenProfileFromFile}" = "yes"; then - echo "* - LCMS (color management) support activated *" +if test "${ac_cv_search_cmsOpenProfileFromFile}" = "-llcms2"; then + echo "* - LCMS (color management) support activated (lcms2) *" else - echo "* - LCMS (color management) support deactivated *" + if test "${ac_cv_search_cmsOpenProfileFromFile}" = "-llcms"; then + echo "* - LCMS (color management) support activated (lcms) *" + else + echo "* - LCMS (color management) support deactivated *" + fi fi echo "* *" diff --git a/include/config.h.in b/include/config.h.in index ecc9637..f9a3e40 100755 --- a/include/config.h.in +++ b/include/config.h.in @@ -290,9 +290,15 @@ /* Define if you have libtiff. */ #undef HAVE_LIBTIFF -/* Define if you have liblcms. */ +/* Define if LCMS is to be used. */ #undef HAVE_LIBLCMS +/* Define if you have liblcms. */ +#undef HAVE_LIBLCMS1 + +/* Define if you have liblcms2. */ +#undef HAVE_LIBLCMS2 + #ifndef HAVE_STRNCASECMP /* OS/2 needs this */ # define strncasecmp(a, b, c) strnicmp(a, b, c) diff --git a/src/xsane-preview.c b/src/xsane-preview.c index 6327ca7..6eaf687 100644 --- a/src/xsane-preview.c +++ b/src/xsane-preview.c @@ -6346,8 +6346,8 @@ int preview_do_color_correction(Preview *p) cmsHPROFILE hOutProfile = NULL; cmsHPROFILE hProofProfile = NULL; cmsHTRANSFORM hTransform = NULL; - DWORD input_format, output_format; - DWORD cms_flags = 0; + cmsUInt32Number input_format, output_format; + cmsUInt32Number cms_flags = 0; int proof = 0; char *cms_proof_icm_profile = NULL; int linesize = 0; @@ -6355,7 +6355,9 @@ int preview_do_color_correction(Preview *p) DBG(DBG_proc, "preview_do_color_correction\n"); +#ifdef HAVE_LIBLCMS1 cmsErrorAction(LCMS_ERROR_SHOW); +#endif if (preferences.cms_bpc) { diff --git a/src/xsane-save.c b/src/xsane-save.c index 75e0a63..2d0e44b 100644 --- a/src/xsane-save.c +++ b/src/xsane-save.c @@ -832,9 +832,9 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio cmsHPROFILE hInProfile = NULL; cmsHPROFILE hOutProfile = NULL; cmsHTRANSFORM hTransform = NULL; - DWORD cms_input_format; - DWORD cms_output_format; - DWORD cms_flags = 0; + cmsUInt32Number cms_input_format; + cmsUInt32Number cms_output_format; + cmsUInt32Number cms_flags = 0; if (cms_function == XSANE_CMS_FUNCTION_EMBED_SCANNER_ICM_PROFILE) { @@ -843,7 +843,9 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio DBG(DBG_info, "Prepare CMS transform\n"); +#ifdef HAVE_LIBLCMS1 cmsErrorAction(LCMS_ERROR_SHOW); +#endif if (cms_bpc) { @@ -890,10 +892,18 @@ cmsHTRANSFORM xsane_create_cms_transform(Image_info *image_info, int cms_functio if (image_info->channels == 1) /* == 1 (grayscale) */ { #if 1 /* xxx oli */ +# ifdef HAVE_LIBLCMS2 + cmsToneCurve *Gamma = cmsBuildGamma(NULL, 2.2); +# else LPGAMMATABLE Gamma = cmsBuildGamma(256, 2.2); +# endif hOutProfile = cmsCreateGrayProfile(cmsD50_xyY(), Gamma); +# ifdef HAVE_LIBLCMS2 + cmsFreeToneCurve(Gamma); +# else cmsFreeGamma(Gamma); +# endif #endif } else @@ -2896,7 +2906,11 @@ static int xsane_write_CSA(FILE *outfile, char *input_profile, int intent) return -1; } +#ifdef HAVE_LIBLCMS2 + n = cmsGetPostScriptCSA(NULL, hProfile, intent, 0, NULL, 0); +#else n = cmsGetPostScriptCSA(hProfile, intent, NULL, 0); +#endif if (n == 0) { return -2; @@ -2908,7 +2922,11 @@ static int xsane_write_CSA(FILE *outfile, char *input_profile, int intent) return -3; } +#ifdef HAVE_LIBLCMS2 + cmsGetPostScriptCSA(NULL, hProfile, intent, 0, buffer, n); +#else cmsGetPostScriptCSA(hProfile, intent, buffer, n); +#endif buffer[n] = 0; fprintf(outfile, "%s", buffer); @@ -2927,7 +2945,7 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int cmsHPROFILE hProfile; size_t n; char* buffer; - DWORD flags = cmsFLAGS_NODEFAULTRESOURCEDEF; + cmsUInt32Number flags = cmsFLAGS_NODEFAULTRESOURCEDEF; hProfile = cmsOpenProfileFromFile(output_profile, "r"); if (!hProfile) @@ -2940,7 +2958,11 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int flags |= cmsFLAGS_BLACKPOINTCOMPENSATION; } +#ifdef HAVE_LIBLCMS2 + n = cmsGetPostScriptCRD(NULL, hProfile, intent, flags, NULL, 0); +#else n = cmsGetPostScriptCRDEx(hProfile, intent, flags, NULL, 0); +#endif if (n == 0) { return -2; @@ -2952,7 +2974,11 @@ static int xsane_write_CRD(FILE *outfile, char *output_profile, int intent, int return -3; } +#ifdef HAVE_LIBLCMS2 + cmsGetPostScriptCRD(NULL, hProfile, intent, flags, buffer, n); +#else cmsGetPostScriptCRDEx(hProfile, intent, flags, buffer, n); +#endif buffer[n] = 0; fprintf(outfile, "%s", buffer); @@ -4349,7 +4375,7 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const { FILE *icm_profile; size_t size, embed_len; - LPBYTE embed_buffer; + cmsUInt8Number *embed_buffer; DBG(DBG_proc, "xsane_jpeg_embed_scanner_icm_profile(%s)\n", icm_filename); @@ -4363,7 +4389,7 @@ static void xsane_jpeg_embed_scanner_icm_profile(j_compress_ptr cinfo_ptr, const size = ftell(icm_profile); fseek(icm_profile, 0, SEEK_SET); - embed_buffer = (LPBYTE) malloc(size + 1); + embed_buffer = (cmsUInt8Number *) malloc(size + 1); if (embed_buffer) { embed_len = fread(embed_buffer, 1, size, icm_profile); diff --git a/src/xsane-viewer.c b/src/xsane-viewer.c index 69a444d..844c077 100644 --- a/src/xsane-viewer.c +++ b/src/xsane-viewer.c @@ -1795,6 +1795,9 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g { Viewer *v = (Viewer *) data; int val; +#ifdef HAVE_LIBLCMS2 + cmsUInt16Number alarm_codes[cmsMAXCHANNELS]; +#endif g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[0]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v); g_signal_handlers_block_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v); @@ -1811,6 +1814,49 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g v->cms_gamut_alarm_color = val; gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(v->cms_gamut_alarm_color_widget[v->cms_gamut_alarm_color]), TRUE); +#ifdef HAVE_LIBLCMS2 + switch(v->cms_gamut_alarm_color) + { + default: + case 0: /* black */ + alarm_codes[0] = (cmsUInt16Number) 0; + alarm_codes[1] = (cmsUInt16Number) 0; + alarm_codes[2] = (cmsUInt16Number) 0; + break; + + case 1: /* gray */ + alarm_codes[0] = (cmsUInt16Number) 128; + alarm_codes[1] = (cmsUInt16Number) 128; + alarm_codes[2] = (cmsUInt16Number) 128; + break; + + case 2: /* white */ + alarm_codes[0] = (cmsUInt16Number) 255; + alarm_codes[1] = (cmsUInt16Number) 255; + alarm_codes[2] = (cmsUInt16Number) 255; + break; + + case 3: /* red */ + alarm_codes[0] = (cmsUInt16Number) 255; + alarm_codes[1] = (cmsUInt16Number) 0; + alarm_codes[2] = (cmsUInt16Number) 0; + break; + + case 4: /* green */ + alarm_codes[0] = (cmsUInt16Number) 0; + alarm_codes[1] = (cmsUInt16Number) 255; + alarm_codes[2] = (cmsUInt16Number) 0; + break; + + case 5: /* blue */ + alarm_codes[0] = (cmsUInt16Number) 0; + alarm_codes[1] = (cmsUInt16Number) 0; + alarm_codes[2] = (cmsUInt16Number) 255; + break; + } + + cmsSetAlarmCodes(alarm_codes); +#else switch(v->cms_gamut_alarm_color) { default: @@ -1838,6 +1884,7 @@ static void xsane_viewer_set_cms_gamut_alarm_color_callback(GtkWidget *widget, g cmsSetAlarmCodes(0, 0, 255); break; } +#endif g_signal_handlers_unblock_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[0]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v); g_signal_handlers_unblock_by_func(GTK_OBJECT(v->cms_gamut_alarm_color_widget[1]), (GtkSignalFunc) xsane_viewer_set_cms_gamut_alarm_color_callback, v); @@ -2172,9 +2219,9 @@ static int xsane_viewer_read_image(Viewer *v) cmsHTRANSFORM hTransform = NULL; int proof = 0; char *cms_proof_icm_profile = NULL; - DWORD cms_input_format; - DWORD cms_output_format; - DWORD cms_flags = 0; + cmsUInt32Number cms_input_format; + cmsUInt32Number cms_output_format; + cmsUInt32Number cms_flags = 0; #endif /* open imagefile */ @@ -2203,7 +2250,9 @@ static int xsane_viewer_read_image(Viewer *v) if ((v->enable_color_management) && (v->cms_enable)) { +#ifdef HAVE_LIBLCMS1 cmsErrorAction(LCMS_ERROR_SHOW); +#endif if (v->cms_bpc) { @@ -2801,6 +2850,9 @@ Viewer *xsane_viewer_new(char *filename, char *selection_filetype, int allow_red GtkWidget *scrolled_window; GtkWidget *zoom_option_menu, *zoom_menu, *zoom_menu_item; int i, selection; +#ifdef HAVE_LIBLCMS2 + cmsUInt16Number alarm_codes[cmsMAXCHANNELS]; +#endif DBG(DBG_proc, "viewer_new(%s)\n", filename); @@ -2830,8 +2882,15 @@ Viewer *xsane_viewer_new(char *filename, char *selection_filetype, int allow_red v->cms_proofing_intent = INTENT_ABSOLUTE_COLORIMETRIC; v->cms_gamut_check = 0; v->cms_gamut_alarm_color = 3; /* red */ +#ifdef HAVE_LIBLCMS2 + alarm_codes[0] = (cmsUInt16Number) 255; + alarm_codes[1] = (cmsUInt16Number) 0; + alarm_codes[2] = (cmsUInt16Number) 0; + cmsSetAlarmCodes(alarm_codes); +#else cmsSetAlarmCodes(255, 0, 0); #endif +#endif if (selection_filetype) { v->selection_filetype = strdup(selection_filetype); diff --git a/src/xsane.h b/src/xsane.h index 4067d61..adcc0ed 100644 --- a/src/xsane.h +++ b/src/xsane.h @@ -70,7 +70,13 @@ #include #ifdef HAVE_LIBLCMS -# include +# ifdef HAVE_LIBLCMS2 +# include +# else +# include +typedef BYTE cmsUInt8Number; +typedef DWORD cmsUInt32Number; +# endif #else # define cmsHTRANSFORM void * #endif -- 1.8.3.1