[poppler] poppler/JPEG2000Stream.cc

Albert Astals Cid aacid at kemper.freedesktop.org
Mon Mar 7 19:24:24 UTC 2016


 poppler/JPEG2000Stream.cc |   58 ++++++++++++++++++++++++++++++----------------
 1 file changed, 38 insertions(+), 20 deletions(-)

New commits:
commit 37c7469955d465e006d74eecebb766eb8513bbf3
Author: Thomas Freitag <Thomas.Freitag at alfa.de>
Date:   Mon Mar 7 20:23:11 2016 +0100

    JPXStream: Don't scale image comps to 8 bits in case of an indexed colorspace
    
    Followup of bug #94371

diff --git a/poppler/JPEG2000Stream.cc b/poppler/JPEG2000Stream.cc
index 8699b10..a6763e0 100644
--- a/poppler/JPEG2000Stream.cc
+++ b/poppler/JPEG2000Stream.cc
@@ -41,6 +41,7 @@ struct JPXStreamPrivate {
   int ccounter;
   int npixels;
   int ncomps;
+  GBool indexed;
   GBool inited;
 #ifdef USE_OPENJPEG1
   opj_dinfo_t *dinfo;
@@ -51,6 +52,20 @@ struct JPXStreamPrivate {
 #endif
 };
 
+static inline Guchar adjustComp(int r, int adjust, int depth, int sgndcorr, GBool indexed) {
+  if (!indexed) {
+    r += sgndcorr;
+    if (adjust) {
+      r = (r >> adjust)+((r >> (adjust-1))%2);
+    } else if (depth < 8) {
+      r = r << (8 - depth);
+    }
+  }
+  if (unlikely(r > 255))
+    r = 255;
+  return r;  
+}
+
 static inline int doLookChar(JPXStreamPrivate* priv) {
   if (unlikely(priv->counter >= priv->npixels))
     return EOF;
@@ -73,6 +88,7 @@ JPXStream::JPXStream(Stream *strA) : FilterStream(strA) {
   priv->image = NULL;
   priv->npixels = 0;
   priv->ncomps = 0;
+  priv->indexed = gFalse;
 #ifdef USE_OPENJPEG1
   priv->dinfo = NULL;
 #endif
@@ -166,13 +182,22 @@ static void libopenjpeg_warning_callback(const char *msg, void * /*client_data*/
 
 void JPXStream::init()
 {
-  Object oLen;
+  Object oLen, cspace;
   if (getDict()) getDict()->lookup("Length", &oLen);
+  if (getDict()) getDict()->lookup("ColorSpace", &cspace);
 
   int bufSize = BUFFER_INITIAL_SIZE;
   if (oLen.isInt()) bufSize = oLen.getInt();
   oLen.free();
 
+  if (cspace.isArray() && cspace.arrayGetLength() > 0) {
+    Object cstype;
+    cspace.arrayGet(0, &cstype);
+    if (cstype.isName("Indexed")) priv->indexed = gTrue;
+    cstype.free();
+  }
+  cspace.free();
+
   int length = 0;
   unsigned char *buf = str->toUnsignedChars(&length, bufSize);
   priv->init2(buf, length, CODEC_JP2);
@@ -196,15 +221,7 @@ void JPXStream::init()
 	sgndcorr = 1 << (priv->image->comps[0].prec - 1);
       for (int i = 0; i < priv->npixels; i++) {
 	int r = priv->image->comps[component].data[i];
-	r += sgndcorr;
-	if (adjust) {
-	  r = (r >> adjust)+((r >> (adjust-1))%2);
-	  if (unlikely(r > 255))
-	    r = 255;
-        }
-        if (depth < 8)
-          r = r << (8 - depth);
-	*(cdata++) = r;
+	*(cdata++) = adjustComp(r, adjust, depth, sgndcorr, priv->indexed);
       }
     }
   } else
@@ -316,13 +333,22 @@ static OPJ_BOOL jpxSeek_callback(OPJ_OFF_T seek_pos, void * p_user_data)
 
 void JPXStream::init()
 {
-  Object oLen;
+  Object oLen, cspace;
   if (getDict()) getDict()->lookup("Length", &oLen);
+  if (getDict()) getDict()->lookup("ColorSpace", &cspace);
 
   int bufSize = BUFFER_INITIAL_SIZE;
   if (oLen.isInt()) bufSize = oLen.getInt();
   oLen.free();
 
+  if (cspace.isArray() && cspace.arrayGetLength() > 0) {
+    Object cstype;
+    cspace.arrayGet(0, &cstype);
+    if (cstype.isName("Indexed")) priv->indexed = gTrue;
+    cstype.free();
+  }
+  cspace.free();
+
   int length = 0;
   unsigned char *buf = str->toUnsignedChars(&length, bufSize);
   priv->init2(OPJ_CODEC_JP2, buf, length);
@@ -346,15 +372,7 @@ void JPXStream::init()
 	sgndcorr = 1 << (priv->image->comps[0].prec - 1);
       for (int i = 0; i < priv->npixels; i++) {
 	int r = priv->image->comps[component].data[i];
-	r += sgndcorr;
-	if (adjust) {
-	  r = (r >> adjust)+((r >> (adjust-1))%2);
-	  if (unlikely(r > 255))
-	    r = 255;
-        }
-        if (depth < 8)
-          r = r << (8 - depth);
-	*(cdata++) = r;
+	*(cdata++) = adjustComp(r, adjust, depth, sgndcorr, priv->indexed);
       }
     }
   } else {


More information about the poppler mailing list