I attached a patch using cmsFLAGS_NOOPTIMIZE.
I also fixed a bug when using lcms1.
---
Koji Otani

From: Albert Astals Cid <[email protected]>
Subject: Re: [poppler] Migrating poppler to liblcms2 from liblcms1
Date: Sat, 28 Jan 2012 16:47:52 +0100
Message-ID: <4901739.zfF41fXVq6@xps>

aacid> El Divendres, 27 de gener de 2012, a les 18:23:50, Albert Astals Cid va 
aacid> escriure:
aacid> > El Divendres, 27 de gener de 2012, a les 10:39:18, Maria, Marti va 
escriure:
aacid> > > Bon dia Albert,
aacid> > 
aacid> > Hola
aacid> > 
aacid> > > That makes a lot of sense. Lcms2 spends more time on optimizing the
aacid> > > transform in order to make it faster. That means create transform is
aacid> > > currently slower that lcms1 but applying transforms  is way faster. 
This
aacid> > > was indeed a design decision, as most of time creation of transforms
aacid> > > happens only once at the very beginning and then this transform is
aacid> > > applied to huge amounts of raster. The performance tests I send 
didn't
aacid> > > take creation time into account.
aacid> > > 
aacid> > > I will take this action item to review creation time in the next
aacid> > > release.
aacid> > > Otherwise, you may consider reusing transforms.
aacid> > 
aacid> > We reuse the transforms, it is just that this file has lots of them.
aacid> > 
aacid> > > That would speed up both
aacid> > > lcms1 and lcms2.  If this is not feasible, there is a flags
aacid> > > cmsFLAGS_NOOPTIMIZE, that makes transform creation fast, at the 
expense
aacid> > > of slower dotransfom operation. This is not recommended at all 
because
aacid> > > you disable all optimizations, but may solve the issue when creating
aacid> > > transforms that are applied only to few bytes.
aacid> > 
aacid> > Not sure if i can now to how many bytes it'll be applied but i'll do 
some
aacid> > testing and maybe just enable it for the time being so at least we 
have the
aacid> > same behaviour than when using lcms1, might not be faster but we not 
slower
aacid> > either.
aacid> 
aacid> Using cmsFLAGS_NOOPTIMIZE brings back altona_technical_1v2_x3.pdf to an 
aacid> acceptable speed again.
aacid> 
aacid> Koji can you please update your patch so it uses the cmsFLAGS_NOOPTIMIZE 
when 
aacid> compiling with lmcs2?
aacid> 
aacid> Albert
aacid> 
aacid> > 
aacid> > Thanks,
aacid> >   Albert
aacid> > 
aacid> > > Again, thanks for reporting. I'm putting the transform creation time
aacid> > > issue high in my priority list.
aacid> > > 
aacid> > > Best regards
aacid> > > 
aacid> > > Marti Maria,  Color Engineer
aacid> > > HP Large Format Printers Division - Barcelona
aacid> > > [email protected]
aacid> > > 
aacid> > > 
aacid> > > 
aacid> > > -----Original Message-----
aacid> > > From: Albert Astals Cid [mailto:[email protected]] On Behalf Of 
Albert
aacid> > > Astals Cid Sent: jueves, 26 de enero de 2012 19:43
aacid> > > To: [email protected]
aacid> > > Cc: Maria, Marti; Till Kamppeter; [email protected]
aacid> > > Subject: Re: [poppler] Migrating poppler to liblcms2 from liblcms1
aacid> > > 
aacid> > > El Dilluns, 23 de gener de 2012, a les 11:16:03, Maria, Marti va 
escriure:
aacid> > > > Hi,
aacid> > > > In my testings lcms2 is significantly faster that lcms1 except when
aacid> > > > using floating point, then lcms2 favors precision.
aacid> > > 
aacid> > > Is this precision is so important to justify a 10x slowliness? Maybe
aacid> > > it'd be a good idea to have a fallback fast mode for those not 
willing
aacid> > > to take that 10x hit?
aacid> > > 
aacid> > > > 
http://littlecms2.blogspot.com/2010/03/xput-comparative-119-vs-20.ht
aacid> > > > ml
aacid> > > > 
aacid> > > > Altona test does many different color conversions it would be
aacid> > > > interesting to know which transformation is going slow.
aacid> > > 
aacid> > > Attached the callgrind output of running poppler there, you can see 
the
aacid> > > time is almost totally spent on creating the transforms.
aacid> > > 
aacid> > > Wild guess: I'm wondering if the thing is that not transformations 
are
aacid> > > all precalculated (meaning a faster overall if you do lots of access)
aacid> > > and previously they were done each time and thus if we end up doing
aacid> > > "few" transformations it was just much faster?
aacid> > > 
aacid> > > Cheers,
aacid> > > 
aacid> > >   Albert
aacid> > >   
aacid> > > > Regards
aacid> > > > Marti
aacid> > > > 
aacid> > > > ________________________________________
aacid> > > > From: Till Kamppeter [[email protected]]
aacid> > > > Sent: Monday, January 23, 2012 8:58 AM
aacid> > > > To: Albert Astals Cid
aacid> > > > Cc: [email protected]; Maria, Marti; Sebastien Bacher;
aacid> > > > Koji Otani Subject: Re: [poppler] Migrating poppler to liblcms2 
from
aacid> > > > 
aacid> > > > liblcms1 On 01/22/2012 11:18 PM, Albert Astals Cid wrote:
aacid> > > > > Same thing, altona_technical_1v2_x3.pdf still goes up from x
aacid> > > > > seconds
aacid> > > > > to 10x seconds when going from lcms1 to lcms2.
aacid> > > > > 
aacid> > > > > That is in my opinion not acceptable (of course i'm not ruling
aacid> > > > > out
aacid> > > > > that we in poppler are using lcms2 wrong). Till, does your
aacid> > > > > ubuntu
aacid> > > > > work cover fixing the regressions of moving from lcms1 to lcms2
aacid> > > > > or
aacid> > > > > all your work covers is making stuff compile?
aacid> > > > 
aacid> > > > I downloaded altona_technical_1v2_x3.pdf from
aacid> > > > http://www.eci.org/doku.php?id=es:downloads and tried pdftops on
aacid> > > > Ubuntu Oneiric (11.10, lcms1) and on Precise (12.04, lcms2, Koji
aacid> > > > Otani's patch) and with lcms1 it takes 3.5 seconds and with lcms2
aacid> > > > 17.5
aacid> > > > seconds.
aacid> > > > 
aacid> > > > The same problem occurs with Ghostscript: There the same transition
aacid> > > > happened from Oneiric to Precise and here Oneiric is much faster
aacid> > > > with
aacid> > > > this file, too. In Precise PDF rendering for printing is done by
aacid> > > > Ghostscript and not by Poppler, so lcms2 is already used for
aacid> > > > printing
aacid> > > > in Precise for some time. As there are no performance complaints by
aacid> > > > users yet, it seems that for everyday files there is not such a
aacid> > > > significant performance loss. and this
aacid> > > > 
aacid> > > > Marti, can you check what is the problem with lcms2 and this PDF
aacid> > > > file
aacid> > > > and also why most files are somewhat slower with lcms2?
aacid> > > > 
aacid> > > >     Till
aacid> > > > 
aacid> > > > _______________________________________________
aacid> > > > poppler mailing list
aacid> > > > [email protected]
aacid> > > > http://lists.freedesktop.org/mailman/listinfo/poppler
aacid> > 
aacid> > _______________________________________________
aacid> > poppler mailing list
aacid> > [email protected]
aacid> > http://lists.freedesktop.org/mailman/listinfo/poppler
aacid> 
diff -ru poppler-0.18.2.org/configure.ac poppler-0.18.2/configure.ac
--- poppler-0.18.2.org/configure.ac	2011-12-04 23:43:49.000000000 +0900
+++ poppler-0.18.2/configure.ac	2012-01-30 17:19:52.000000000 +0900
@@ -552,15 +552,28 @@
               enable_cms=$enableval,
               enable_cms="try")
 if test x$enable_cms = xyes; then
-  PKG_CHECK_MODULES(LCMS, lcms)
+  PKG_CHECK_MODULES(LCMS, lcms2, [lcms2=yes], [lcms2=no])
+  if test x$lcms2 = xno; then
+      PKG_CHECK_MODULES(LCMS, lcms)
+  fi
 elif test x$enable_cms = xtry; then
-  PKG_CHECK_MODULES(LCMS, lcms, [enable_cms=yes], [enable_cms=no])
+  PKG_CHECK_MODULES(LCMS, lcms2,[lcms2=yes],[lcms2=no])
+  if test x$lcms2 = xyes; then
+    enable_cms=yes
+  else
+      PKG_CHECK_MODULES(LCMS, lcms,[enable_cms=yes],[enable_cms=no])
+  fi
 fi
 
 if test "x$enable_cms" = "xyes"; then
   AC_DEFINE(USE_CMS, 1, [Defines if use cms])
+  if test "x$lcms2" != "xyes"; then
+    lcms1=yes;
+    AC_DEFINE(USE_LCMS1, 1, [Defines if use lcms1])
+  fi
 fi
 AM_CONDITIONAL(USE_CMS, test x$enable_cms = xyes)
+AM_CONDITIONAL(USE_LCMS1, test x$lcms1 = xyes)
 
 if test "x$GCC" != xyes; then
   enable_compile_warnings=no
@@ -644,6 +657,13 @@
 echo "  use libcurl:        $enable_libcurl"
 echo "  use libopenjpeg:    $enable_libopenjpeg"
 echo "  use cms:            $enable_cms"
+if test x$enable_cms = xyes;then
+    if test x$lcms1 = xyes;then
+        echo "      with lcms1"
+    else
+        echo "      with lcms2"
+    fi
+fi
 echo "  command line utils: $enable_utils"
 echo ""
 
diff -ru poppler-0.18.2.org/poppler/GfxState.cc poppler-0.18.2/poppler/GfxState.cc
--- poppler-0.18.2.org/poppler/GfxState.cc	2011-11-23 06:33:12.000000000 +0900
+++ poppler-0.18.2/poppler/GfxState.cc	2012-01-30 17:53:40.000000000 +0900
@@ -146,7 +146,40 @@
 
 #ifdef USE_CMS
 
+#ifdef USE_LCMS1
 #include <lcms.h>
+#define cmsColorSpaceSignature icColorSpaceSignature
+#define cmsSetLogErrorHandler cmsSetErrorHandler
+#define cmsSigXYZData icSigXYZData
+#define cmsSigLuvData icSigLuvData
+#define cmsSigLabData icSigLabData
+#define cmsSigYCbCrData icSigYCbCrData
+#define cmsSigYxyData icSigYxyData
+#define cmsSigRgbData icSigRgbData
+#define cmsSigHsvData icSigHsvData
+#define cmsSigHlsData icSigHlsData
+#define cmsSigCmyData icSigCmyData
+#define cmsSig3colorData icSig3colorData
+#define cmsSigGrayData icSigGrayData
+#define cmsSigCmykData icSigCmykData
+#define cmsSig4colorData icSig4colorData
+#define cmsSig2colorData icSig2colorData
+#define cmsSig5colorData icSig5colorData
+#define cmsSig6colorData icSig6colorData
+#define cmsSig7colorData icSig7colorData
+#define cmsSig8colorData icSig8colorData
+#define cmsSig9colorData icSig9colorData
+#define cmsSig10colorData icSig10colorData
+#define cmsSig11colorData icSig11colorData
+#define cmsSig12colorData icSig12colorData
+#define cmsSig13colorData icSig13colorData
+#define cmsSig14colorData icSig14colorData
+#define cmsSig15colorData icSig15colorData
+#define LCMS_FLAGS 0
+#else
+#include <lcms2.h>
+#define LCMS_FLAGS cmsFLAGS_NOOPTIMIZE
+#endif
 
 #define COLOR_PROFILE_DIR "/ColorProfiles/"
 #define GLOBAL_COLOR_PROFILE_DIR POPPLER_DATADIR COLOR_PROFILE_DIR
@@ -180,8 +213,8 @@
 static GfxColorTransform *XYZ2DisplayTransform = NULL;
 
 // convert color space signature to cmsColor type 
-static unsigned int getCMSColorSpaceType(icColorSpaceSignature cs);
-static unsigned int getCMSNChannels(icColorSpaceSignature cs);
+static unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs);
+static unsigned int getCMSNChannels(cmsColorSpaceSignature cs);
 static cmsHPROFILE loadColorProfile(const char *fileName);
 
 void GfxColorSpace::setDisplayProfile(void *displayProfileA) {
@@ -332,11 +365,18 @@
   return hp;
 }
 
+#ifdef USE_LCMS1
 static int CMSError(int ecode, const char *msg)
 {
     error(-1, "%s", msg);
-    return 1;
 }
+#else
+static void CMSError(cmsContext contextId, cmsUInt32Number ecode,
+   const char *text)
+{
+    error(-1, "%s", text);
+}
+#endif
 
 int GfxColorSpace::setupColorProfiles()
 {
@@ -349,7 +389,7 @@
   initialized = gTrue;
 
   // set error handlor
-  cmsSetErrorHandler(CMSError);
+  cmsSetLogErrorHandler(CMSError);
 
   if (displayProfile == NULL) {
     // load display profile if it was not already loaded.
@@ -375,7 +415,7 @@
 	   displayProfile, 
 	   COLORSPACE_SH(displayPixelType) |
 	     CHANNELS_SH(nChannels) | BYTES_SH(1),
-	  INTENT_RELATIVE_COLORIMETRIC,0)) == 0) {
+	  INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
       error(-1, "Can't create Lab transform");
     } else {
       XYZ2DisplayTransform = new GfxColorTransform(transform);
@@ -385,125 +425,124 @@
   return 0;
 }
 
-unsigned int getCMSColorSpaceType(icColorSpaceSignature cs)
+unsigned int getCMSColorSpaceType(cmsColorSpaceSignature cs)
 {
     switch (cs) {
-    case icSigXYZData:
+    case cmsSigXYZData:
       return PT_XYZ;
       break;
-    case icSigLabData:
+    case cmsSigLabData:
       return PT_Lab;
       break;
-    case icSigLuvData:
+    case cmsSigLuvData:
       return PT_YUV;
       break;
-    case icSigYCbCrData:
+    case cmsSigYCbCrData:
       return PT_YCbCr;
       break;
-    case icSigYxyData:
+    case cmsSigYxyData:
       return PT_Yxy;
       break;
-    case icSigRgbData:
+    case cmsSigRgbData:
       return PT_RGB;
       break;
-    case icSigGrayData:
+    case cmsSigGrayData:
       return PT_GRAY;
       break;
-    case icSigHsvData:
+    case cmsSigHsvData:
       return PT_HSV;
       break;
-    case icSigHlsData:
+    case cmsSigHlsData:
       return PT_HLS;
       break;
-    case icSigCmykData:
+    case cmsSigCmykData:
       return PT_CMYK;
       break;
-    case icSigCmyData:
+    case cmsSigCmyData:
       return PT_CMY;
       break;
-    case icSig2colorData:
-    case icSig3colorData:
-    case icSig4colorData:
-    case icSig5colorData:
-    case icSig6colorData:
-    case icSig7colorData:
-    case icSig8colorData:
-    case icSig9colorData:
-    case icSig10colorData:
-    case icSig11colorData:
-    case icSig12colorData:
-    case icSig13colorData:
-    case icSig14colorData:
-    case icSig15colorData:
+    case cmsSig2colorData:
+    case cmsSig3colorData:
+    case cmsSig4colorData:
+    case cmsSig5colorData:
+    case cmsSig6colorData:
+    case cmsSig7colorData:
+    case cmsSig8colorData:
+    case cmsSig9colorData:
+    case cmsSig10colorData:
+    case cmsSig11colorData:
+    case cmsSig12colorData:
+    case cmsSig13colorData:
+    case cmsSig14colorData:
+    case cmsSig15colorData:
     default:
       break;
     }
     return PT_RGB;
 }
 
-unsigned int getCMSNChannels(icColorSpaceSignature cs)
+unsigned int getCMSNChannels(cmsColorSpaceSignature cs)
 {
     switch (cs) {
-    case icSigXYZData:
-    case icSigLuvData:
-    case icSigLabData:
-    case icSigYCbCrData:
-    case icSigYxyData:
-    case icSigRgbData:
-    case icSigHsvData:
-    case icSigHlsData:
-    case icSigCmyData:
-    case icSig3colorData:
+    case cmsSigXYZData:
+    case cmsSigLuvData:
+    case cmsSigLabData:
+    case cmsSigYCbCrData:
+    case cmsSigYxyData:
+    case cmsSigRgbData:
+    case cmsSigHsvData:
+    case cmsSigHlsData:
+    case cmsSigCmyData:
+    case cmsSig3colorData:
       return 3;
       break;
-    case icSigGrayData:
+    case cmsSigGrayData:
       return 1;
       break;
-    case icSigCmykData:
-    case icSig4colorData:
+    case cmsSigCmykData:
+    case cmsSig4colorData:
       return 4;
       break;
-    case icSig2colorData:
+    case cmsSig2colorData:
       return 2;
       break;
-    case icSig5colorData:
+    case cmsSig5colorData:
       return 5;
       break;
-    case icSig6colorData:
+    case cmsSig6colorData:
       return 6;
       break;
-    case icSig7colorData:
+    case cmsSig7colorData:
       return 7;
       break;
-    case icSig8colorData:
+    case cmsSig8colorData:
       return 8;
       break;
-    case icSig9colorData:
+    case cmsSig9colorData:
       return 9;
       break;
-    case icSig10colorData:
+    case cmsSig10colorData:
       return 10;
       break;
-    case icSig11colorData:
+    case cmsSig11colorData:
       return 11;
       break;
-    case icSig12colorData:
+    case cmsSig12colorData:
       return 12;
       break;
-    case icSig13colorData:
+    case cmsSig13colorData:
       return 13;
       break;
-    case icSig14colorData:
+    case cmsSig14colorData:
       return 14;
       break;
-    case icSig15colorData:
+    case cmsSig15colorData:
       return 15;
     default:
       break;
     }
     return 3;
 }
-
 #endif
 
 //------------------------------------------------------------------------
@@ -1631,7 +1670,7 @@
 	   dhp,
 	   COLORSPACE_SH(dcst) |
 	     CHANNELS_SH(dNChannels) | BYTES_SH(1),
-	  INTENT_RELATIVE_COLORIMETRIC,0)) == 0) {
+	  INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
       error(-1, "Can't create transform");
       cs->transform = NULL;
     } else {
@@ -1641,7 +1680,7 @@
        // create line transform only when the display is RGB type color space 
       if ((transform = cmsCreateTransform(hp,
 	    CHANNELS_SH(nCompsA) | BYTES_SH(1),dhp,
-	    TYPE_RGB_8,INTENT_RELATIVE_COLORIMETRIC,0)) == 0) {
+	    TYPE_RGB_8,INTENT_RELATIVE_COLORIMETRIC,LCMS_FLAGS)) == 0) {
 	error(-1, "Can't create transform");
 	cs->lineTransform = NULL;
       } else {
diff -ru poppler-0.18.2.org/qt4/src/poppler-document.cc poppler-0.18.2/qt4/src/poppler-document.cc
--- poppler-0.18.2.org/qt4/src/poppler-document.cc	2011-11-23 06:33:21.000000000 +0900
+++ poppler-0.18.2/qt4/src/poppler-document.cc	2012-01-13 16:49:12.000000000 +0900
@@ -40,7 +40,11 @@
 #include "poppler-page-private.h"
 
 #if defined(USE_CMS)
+#if defined(USE_LCMS1)
 #include <lcms.h>
+#else
+#include <lcms2.h>
+#endif
 #endif
 
 namespace Poppler {
diff -ru poppler-0.18.2.org/utils/pdftocairo.cc poppler-0.18.2/utils/pdftocairo.cc
--- poppler-0.18.2.org/utils/pdftocairo.cc	2011-12-04 23:36:13.000000000 +0900
+++ poppler-0.18.2/utils/pdftocairo.cc	2012-01-13 17:01:51.000000000 +0900
@@ -50,7 +50,11 @@
 #include "PDFDocFactory.h"
 #include "CairoOutputDev.h"
 #if USE_CMS
+#ifdef USE_LCMS1
 #include <lcms.h>
+#else
+#include <lcms2.h>
+#endif
 #endif
 #include <cairo.h>
 #if CAIRO_HAS_PS_SURFACE
@@ -257,10 +261,22 @@
       writer = new PNGWriter(PNGWriter::RGB);
 
 #if USE_CMS
+#ifdef USE_LCMS1
     if (icc_data)
       static_cast<PNGWriter*>(writer)->setICCProfile(cmsTakeProductName(profile), icc_data, icc_data_size);
     else
       static_cast<PNGWriter*>(writer)->setSRGBProfile();
+#else
+    if (icc_data) {
+      cmsUInt8Number profileID[17];
+      profileID[16] = '\0';
+
+      cmsGetHeaderProfileID(profile,profileID);
+      static_cast<PNGWriter*>(writer)->setICCProfile(reinterpret_cast<char *>(profileID), icc_data, icc_data_size);
+    } else {
+      static_cast<PNGWriter*>(writer)->setSRGBProfile();
+    }
+#endif
 #endif
 #endif
 
_______________________________________________
poppler mailing list
[email protected]
http://lists.freedesktop.org/mailman/listinfo/poppler

Reply via email to