diff --git a/configure b/configure index 51fdf1d..42efbcc 100755 --- a/configure +++ b/configure @@ -16019,7 +16019,7 @@ fi fi -pkg_modules="gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11" +pkg_modules="gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms2 dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11" diff --git a/configure.in b/configure.in index 19d704a..cefdcf7 100644 --- a/configure.in +++ b/configure.in @@ -83,7 +83,7 @@ AC_CHECK_LIB(tiff, TIFFOpen, tiff_ok=yes, tiff_ok=no) fi AC_SUBST(LIBTIFF) -pkg_modules="gthread-2.0 gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11" +pkg_modules="gthread-2.0 gtk+-2.0 >= 2.8.0 libxml-2.0 >= 2.4 gconf-2.0 >= 2.0 lcms2 dbus-1 exiv2 fftw3f lensfun libcurl flickcurl sqlite3 libssl libgphoto2 x11" PKG_CHECK_MODULES(PACKAGE, [$pkg_modules]) AC_SUBST(PACKAGE_CFLAGS) AC_SUBST(PACKAGE_LIBS) diff --git a/plugins/colorspace-transform/colorspace_transform.c b/plugins/colorspace-transform/colorspace_transform.c index c9a7633..9617d74 100644 --- a/plugins/colorspace-transform/colorspace_transform.c +++ b/plugins/colorspace-transform/colorspace_transform.c @@ -20,7 +20,7 @@ /* Plugin tmpl version 5 */ #include <rawstudio.h> -#include <lcms.h> +#include <lcms2.h> #include "rs-cmm.h" #include "colorspace_transform.h" diff --git a/plugins/colorspace-transform/colorspace_transform.h b/plugins/colorspace-transform/colorspace_transform.h index 8728f48..a3964d6 100644 --- a/plugins/colorspace-transform/colorspace_transform.h +++ b/plugins/colorspace-transform/colorspace_transform.h @@ -20,7 +20,7 @@ /* Plugin tmpl version 5 */ #include <rawstudio.h> -#include <lcms.h> +#include <lcms2.h> #include "rs-cmm.h" #define RS_TYPE_COLORSPACE_TRANSFORM (rs_colorspace_transform_type) diff --git a/plugins/colorspace-transform/colorspace_transform_sse2.c b/plugins/colorspace-transform/colorspace_transform_sse2.c index 53e9e0d..1639d3d 100644 --- a/plugins/colorspace-transform/colorspace_transform_sse2.c +++ b/plugins/colorspace-transform/colorspace_transform_sse2.c @@ -20,7 +20,7 @@ /* Plugin tmpl version 5 */ #include <rawstudio.h> -#include <lcms.h> +#include <lcms2.h> #include "rs-cmm.h" #include "colorspace_transform.h" diff --git a/plugins/colorspace-transform/rs-cmm.c b/plugins/colorspace-transform/rs-cmm.c index 99f5456..ca63ef5 100644 --- a/plugins/colorspace-transform/rs-cmm.c +++ b/plugins/colorspace-transform/rs-cmm.c @@ -1,5 +1,5 @@ /* - * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>, + * * Copyright (C) 2006-2011 Anders Brander <anders@brander.dk>, * * Anders Kvist <akv@lnxbx.dk> and Klaus Post <klauspost@gmail.com> * * This program is free software; you can redistribute it and/or @@ -17,9 +17,18 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ -#include <lcms.h> +#include <lcms2.h> #include "rs-cmm.h" + +#ifndef LCMS_WIN_TYPES_ALREADY_DEFINED +typedef unsigned char BYTE, *LPBYTE; +typedef unsigned short WORD, *LPWORD; +typedef unsigned long DWORD, *LPDWORD; +typedef char *LPSTR; +typedef void *LPVOID; +#endif + static gushort gammatable22[65536]; struct _RSCmm { @@ -40,6 +49,7 @@ struct _RSCmm { cmsHTRANSFORM lcms_transform8; cmsHTRANSFORM lcms_transform16; + gboolean is_gamma_corrected; }; G_DEFINE_TYPE (RSCmm, rs_cmm, G_TYPE_OBJECT) @@ -152,29 +162,59 @@ rs_cmm_transform16(RSCmm *cmm, RS_IMAGE16 *input, RS_IMAGE16 *output) gushort *in = GET_PIXEL(input, 0, y); gushort *out = GET_PIXEL(output, 0, y); gushort *buffer_pointer = buffer; - for(x=0;x<input->w;x++) + if (cmm->is_gamma_corrected) { - register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++; - register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++; - register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++; - in++; - - r = MIN(r, cmm->clip[R]); - g = MIN(g, cmm->clip[G]); - b = MIN(b, cmm->clip[B]); - - r = r * cmm->premul[R]; - g = g * cmm->premul[G]; - b = b * cmm->premul[B]; - - r = MIN(r, 65535.0); - g = MIN(g, 65535.0); - b = MIN(b, 65535.0); - - *(buffer_pointer++) = (gushort) r; - *(buffer_pointer++) = (gushort) g; - *(buffer_pointer++) = (gushort) b; - buffer_pointer++; + for(x=0; x<input->w;x++) + { + register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++; + register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++; + register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++; + in++; + + r = MIN(r, cmm->clip[R]); + g = MIN(g, cmm->clip[G]); + b = MIN(b, cmm->clip[B]); + + r = r * cmm->premul[R]; + g = g * cmm->premul[G]; + b = b * cmm->premul[B]; + + r = MIN(r, 65535.0); + g = MIN(g, 65535.0); + b = MIN(b, 65535.0); + + *(buffer_pointer++) = gammatable22[(gushort) r]; + *(buffer_pointer++) = gammatable22[(gushort) g]; + *(buffer_pointer++) = gammatable22[(gushort) b]; + buffer_pointer++; + } + } + else + { + for(x=0; x<input->w;x++) + { + register gfloat r = (gfloat) MIN(*in, cmm->clip[R]); in++; + register gfloat g = (gfloat) MIN(*in, cmm->clip[G]); in++; + register gfloat b = (gfloat) MIN(*in, cmm->clip[B]); in++; + in++; + + r = MIN(r, cmm->clip[R]); + g = MIN(g, cmm->clip[G]); + b = MIN(b, cmm->clip[B]); + + r = r * cmm->premul[R]; + g = g * cmm->premul[G]; + b = b * cmm->premul[B]; + + r = MIN(r, 65535.0); + g = MIN(g, 65535.0); + b = MIN(b, 65535.0); + + *(buffer_pointer++) = (gushort) r; + *(buffer_pointer++) = (gushort) g; + *(buffer_pointer++) = (gushort) b; + buffer_pointer++; + } } cmsDoTransform(cmm->lcms_transform16, buffer, out, input->w); } @@ -202,36 +242,6 @@ rs_cmm_transform8(RSCmm *cmm, RS_IMAGE16 *input, GdkPixbuf *output) return TRUE; } -static guchar * -pack_rgb_w4(void *info, register WORD wOut[], register LPBYTE output) -{ - *(LPWORD) output = wOut[0]; output+= 2; - *(LPWORD) output = wOut[1]; output+= 2; - *(LPWORD) output = wOut[2]; output+= 4; - - return(output); -} - -static guchar * -unroll_rgb_w4(void *info, register WORD wIn[], register LPBYTE accum) -{ - wIn[0] = *(LPWORD) accum; accum+= 2; - wIn[1] = *(LPWORD) accum; accum+= 2; - wIn[2] = *(LPWORD) accum; accum+= 4; - - return(accum); -} - -static guchar * -unroll_rgb_w4_gammatable22(void *info, register WORD wIn[], register LPBYTE accum) -{ - wIn[0] = gammatable22[*(LPWORD) accum]; accum+= 2; - wIn[1] = gammatable22[*(LPWORD) accum]; accum+= 2; - wIn[2] = gammatable22[*(LPWORD) accum]; accum+= 4; - - return(accum); -} - static void load_profile(RSCmm *cmm, const RSIccProfile *profile, const RSIccProfile **profile_target, cmsHPROFILE *lcms_target) { @@ -308,10 +318,12 @@ is_profile_gamma_22_corrected(cmsHPROFILE *profile) {0.115, 0.826, 0.724938}, {0.157, 0.018, 0.016875}}; cmsCIExyY D65; - LPGAMMATABLE gamma[3]; - cmsWhitePointFromTemp(6504, &D65); - gamma[0] = gamma[1] = gamma[2] = cmsBuildGamma(2,1.0); + gint context = 1337; + cmsToneCurve* gamma[3]; + cmsWhitePointFromTemp(&D65, 6504); + gamma[0] = gamma[1] = gamma[2] = cmsBuildGamma(&context,1.0); + linear = cmsCreateRGBProfile(&D65, &srgb_primaries, gamma); } g_mutex_unlock(is_profile_gamma_22_corrected_linear_lock); @@ -347,21 +359,14 @@ prepare16(RSCmm *cmm) cmm->lcms_transform16 = cmsCreateTransform( cmm->lcms_input_profile, TYPE_RGB_16, cmm->lcms_output_profile, TYPE_RGB_16, - INTENT_PERCEPTUAL, 0); + INTENT_PERCEPTUAL, cmsFLAGS_NOCACHE); g_warn_if_fail(cmm->lcms_transform16 != NULL); /* Enable packing/unpacking for pixelsize==4 */ /* If we estimate that the input profile will apply gamma correction, we try to undo it in 16 bit transform */ - if (is_profile_gamma_22_corrected(cmm->lcms_input_profile)) - cmsSetUserFormatters(cmm->lcms_transform16, - TYPE_RGB_16, unroll_rgb_w4_gammatable22, - TYPE_RGB_16, pack_rgb_w4); - else - cmsSetUserFormatters(cmm->lcms_transform16, - TYPE_RGB_16, unroll_rgb_w4, - TYPE_RGB_16, pack_rgb_w4); + cmm->is_gamma_corrected = is_profile_gamma_22_corrected(cmm->lcms_input_profile); cmm->dirty16 = FALSE; } diff --git a/plugins/load-dcraw/dcraw.cc b/plugins/load-dcraw/dcraw.cc index a080442..216b61c 100644 --- a/plugins/load-dcraw/dcraw.cc +++ b/plugins/load-dcraw/dcraw.cc @@ -62,7 +62,7 @@ dcraw_api.h [1.42] NO_LCMS disables the "-p" option. */ #ifndef NO_LCMS -#include <lcms.h> +#include <lcms2.h> #endif #ifdef HAVE_LIBJPEG extern "C" { @@ -8267,7 +8267,7 @@ void CLASS apply_profile (const char *input, const char *output) FILE *fp; unsigned size; - cmsErrorAction (LCMS_ERROR_SHOW); +// cmsErrorAction (LCMS_ERROR_SHOW); if (strcmp (input, "embed")) hInProfile = cmsOpenProfileFromFile (input, "r"); else if (profile_length) { diff --git a/src/gtk-helper.c b/src/gtk-helper.c index 2ef2177..f075ab8 100644 --- a/src/gtk-helper.c +++ b/src/gtk-helper.c @@ -31,7 +31,7 @@ #include "gtk-helper.h" #include "rs-preview-widget.h" #include <gettext.h> -#include <lcms.h> +#include <lcms2.h> struct _RS_CONFBOX {