[poppler] 3 commits - poppler/DCTStream.cc poppler/DCTStream.h poppler/Stream.cc poppler/Stream.h

Albert Astals Cid aacid at kemper.freedesktop.org
Fri Mar 8 07:42:09 PST 2013


 poppler/DCTStream.cc |   22 +++++++++++++++++++---
 poppler/DCTStream.h  |    6 +++++-
 poppler/Stream.cc    |    8 ++++----
 poppler/Stream.h     |    2 +-
 4 files changed, 29 insertions(+), 9 deletions(-)

New commits:
commit ec7140b3f56b034fbbc53cb8066ba01fe9f60f47
Merge: c86062f 5db6585
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Mar 8 16:41:21 2013 +0100

    Merge remote-tracking branch 'origin/poppler-0.22'
    
    Conflicts:
    	poppler/Stream.cc
    	poppler/Stream.h

diff --cc poppler/Stream.cc
index fa050e1,e8f5ec7..6ffd5d3
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@@ -181,7 -157,7 +181,7 @@@ Stream *Stream::addFilters(Object *dict
      dict->dictLookup("DP", &params);
    }
    if (obj.isName()) {
-     str = makeFilter(obj.getName(), str, &params, recursion);
 -    str = makeFilter(obj.getName(), str, &params, dict);
++    str = makeFilter(obj.getName(), str, &params, recursion, dict);
    } else if (obj.isArray()) {
      for (i = 0; i < obj.arrayGetLength(); ++i) {
        obj.arrayGet(i, &obj2);
@@@ -207,7 -183,7 +207,7 @@@
    return str;
  }
  
- Stream *Stream::makeFilter(char *name, Stream *str, Object *params, int recursion) {
 -Stream *Stream::makeFilter(char *name, Stream *str, Object *params, Object *dict) {
++Stream *Stream::makeFilter(char *name, Stream *str, Object *params, int recursion, Object *dict) {
    int pred;			// parameters
    int colors;
    int bits;
diff --cc poppler/Stream.h
index 3d48f92,7a5ff1c..7581d04
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@@ -226,12 -224,9 +226,12 @@@ private
    virtual GBool hasGetChars() { return false; }
    virtual int getChars(int nChars, Guchar *buffer);
  
-   Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0);
 -  Stream *makeFilter(char *name, Stream *str, Object *params, Object *dict = NULL);
++  Stream *makeFilter(char *name, Stream *str, Object *params, int recursion = 0, Object *dict = NULL);
  
    int ref;			// reference count
 +#if MULTITHREADED
 +  GooMutex mutex;
 +#endif
  };
  
  
commit 5db6585c2b02dd4071f1adabd53509506333dcf8
Author: Albert Astals Cid <aacid at kde.org>
Date:   Fri Mar 8 16:38:49 2013 +0100

    Make the non jpeglib based DCTStream compile

diff --git a/poppler/Stream.cc b/poppler/Stream.cc
index 964bfb7..e8f5ec7 100644
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@ -2410,7 +2410,7 @@ static const int dctZigZag[64] = {
   63
 };
 
-DCTStream::DCTStream(Stream *strA, int colorXformA):
+DCTStream::DCTStream(Stream *strA, int colorXformA, Object *dict):
     FilterStream(strA) {
   int i, j;
 
commit 6402e291e1f9374fbaf4de3b97b21f43d38d6ab8
Author: Thomas Freitag <Thomas.Freitag at alfa.de>
Date:   Fri Mar 8 16:37:11 2013 +0100

    Workaround broken jpeg stream definitions
    
    Bug #61994

diff --git a/poppler/DCTStream.cc b/poppler/DCTStream.cc
index 6302c8b..decfd0f 100644
--- a/poppler/DCTStream.cc
+++ b/poppler/DCTStream.cc
@@ -10,7 +10,7 @@
 // Copyright 2010 Carlos Garcia Campos <carlosgc at gnome.org>
 // Copyright 2011 Daiki Ueno <ueno at unixuser.org>
 // Copyright 2011 Tomas Hoger <thoger at redhat.com>
-// Copyright 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+// Copyright 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
 //
 //========================================================================
 
@@ -60,9 +60,20 @@ static void str_term_source(j_decompress_ptr cinfo)
 {
 }
 
-DCTStream::DCTStream(Stream *strA, int colorXformA) :
+DCTStream::DCTStream(Stream *strA, int colorXformA, Object *dict) :
   FilterStream(strA) {
   colorXform = colorXformA;
+  if (dict != NULL) {
+    Object obj;
+
+    dict->dictLookup("Width", &obj);
+    err.width = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
+    obj.free();
+    dict->dictLookup("Height", &obj);
+    err.height = (obj.isInt() && obj.getInt() <= JPEG_MAX_DIMENSION) ? obj.getInt() : 0;
+    obj.free();
+  } else
+    err.height = err.width = 0;
   init();
 }
 
@@ -74,7 +85,12 @@ DCTStream::~DCTStream() {
 static void exitErrorHandler(jpeg_common_struct *error) {
   j_decompress_ptr cinfo = (j_decompress_ptr)error;
   str_error_mgr * err = (struct str_error_mgr *)cinfo->err;
-  longjmp(err->setjmp_buffer, 1);
+  if (cinfo->err->msg_code == JERR_IMAGE_TOO_BIG && err->width != 0 && err->height != 0) {
+    cinfo->image_height = err->height;
+    cinfo->image_width = err->width;
+  } else {
+    longjmp(err->setjmp_buffer, 1);
+  }
 }
 
 void DCTStream::init()
diff --git a/poppler/DCTStream.h b/poppler/DCTStream.h
index 55bd985..7a566ce 100644
--- a/poppler/DCTStream.h
+++ b/poppler/DCTStream.h
@@ -9,6 +9,7 @@
 // Copyright 2005-2007, 2009-2011 Albert Astals Cid <aacid at kde.org>
 // Copyright 2010 Carlos Garcia Campos <carlosgc at gnome.org>
 // Copyright 2011 Daiki Ueno <ueno at unixuser.org>
+// Copyright 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
 //
 //========================================================================
 
@@ -43,6 +44,7 @@
 
 extern "C" {
 #include <jpeglib.h>
+#include <jerror.h>
 }
 
 struct str_src_mgr {
@@ -55,12 +57,14 @@ struct str_src_mgr {
 struct str_error_mgr {
   struct jpeg_error_mgr pub;
   jmp_buf setjmp_buffer;
+  int width;
+  int height;
 };
 
 class DCTStream: public FilterStream {
 public:
 
-  DCTStream(Stream *strA, int colorXformA);
+  DCTStream(Stream *strA, int colorXformA, Object *dict);
   virtual ~DCTStream();
   virtual StreamKind getKind() { return strDCT; }
   virtual void reset();
diff --git a/poppler/Stream.cc b/poppler/Stream.cc
index 4cb3326..964bfb7 100644
--- a/poppler/Stream.cc
+++ b/poppler/Stream.cc
@@ -23,7 +23,7 @@
 // Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
 // Copyright (C) 2010 Tomas Hoger <thoger at redhat.com>
 // Copyright (C) 2011, 2012 William Bader <williambader at hotmail.com>
-// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+// Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
 // Copyright (C) 2012 Oliver Sander <sander at mi.fu-berlin.de>
 // Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
 // Copyright (C) 2012 Even Rouault <even.rouault at mines-paris.org>
@@ -157,7 +157,7 @@ Stream *Stream::addFilters(Object *dict) {
     dict->dictLookup("DP", &params);
   }
   if (obj.isName()) {
-    str = makeFilter(obj.getName(), str, &params);
+    str = makeFilter(obj.getName(), str, &params, dict);
   } else if (obj.isArray()) {
     for (i = 0; i < obj.arrayGetLength(); ++i) {
       obj.arrayGet(i, &obj2);
@@ -183,7 +183,7 @@ Stream *Stream::addFilters(Object *dict) {
   return str;
 }
 
-Stream *Stream::makeFilter(char *name, Stream *str, Object *params) {
+Stream *Stream::makeFilter(char *name, Stream *str, Object *params, Object *dict) {
   int pred;			// parameters
   int colors;
   int bits;
@@ -284,7 +284,7 @@ Stream *Stream::makeFilter(char *name, Stream *str, Object *params) {
       }
       obj.free();
     }
-    str = new DCTStream(str, colorXform);
+    str = new DCTStream(str, colorXform, dict);
   } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) {
     pred = 1;
     columns = 1;
diff --git a/poppler/Stream.h b/poppler/Stream.h
index 20b5fd6..7a5ff1c 100644
--- a/poppler/Stream.h
+++ b/poppler/Stream.h
@@ -20,7 +20,7 @@
 // Copyright (C) 2009 Stefan Thomas <thomas at eload24.com>
 // Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
 // Copyright (C) 2011, 2012 William Bader <williambader at hotmail.com>
-// Copyright (C) 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+// Copyright (C) 2012, 2013 Thomas Freitag <Thomas.Freitag at alfa.de>
 // Copyright (C) 2012 Fabio D'Urso <fabiodurso at hotmail.it>
 //
 // To see a description of the changes please see the Changelog file that
@@ -224,7 +224,7 @@ private:
   virtual GBool hasGetChars() { return false; }
   virtual int getChars(int nChars, Guchar *buffer);
 
-  Stream *makeFilter(char *name, Stream *str, Object *params);
+  Stream *makeFilter(char *name, Stream *str, Object *params, Object *dict = NULL);
 
   int ref;			// reference count
 };


More information about the poppler mailing list