[poppler/f16] Backport of the most important changes from 0.18.1 - 0.18.4

mkasik mkasik at fedoraproject.org
Thu Apr 26 14:11:11 UTC 2012


commit 6b11475bb51f53d7c6a41db110f2f571e1188f5b
Author: Marek Kasik <mkasik at redhat.com>
Date:   Thu Apr 26 16:10:40 2012 +0200

    Backport of the most important changes from 0.18.1 - 0.18.4

 poppler-0.18.4.patch | 1233 ++++++++++++++++++++++++++++++++++++++++++++++++++
 poppler.spec         |    7 +-
 2 files changed, 1239 insertions(+), 1 deletions(-)
---
diff --git a/poppler-0.18.4.patch b/poppler-0.18.4.patch
new file mode 100644
index 0000000..8800a71
--- /dev/null
+++ b/poppler-0.18.4.patch
@@ -0,0 +1,1233 @@
+--- a/glib/poppler-attachment.cc	2011-06-30 23:41:10.000000000 +0200
++++ b/glib/poppler-attachment.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -210,7 +210,7 @@ poppler_attachment_save (PopplerAttachme
+       return FALSE;
+     }
+ 
+-  return TRUE;
++  return result;
+ }
+ 
+ #define BUF_SIZE 1024
+--- a/goo/GooString.cc	2011-08-29 22:06:43.000000000 +0200
++++ b/goo/GooString.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -19,6 +19,7 @@
+ // Copyright (C) 2006 Krzysztof Kowalczyk <kkowalczyk at gmail.com>
+ // Copyright (C) 2007 Jeff Muizelaar <jeff at infidigm.net>
+ // Copyright (C) 2008-2011 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2011 Kenji Uno <ku at digitaldolphins.jp>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -129,6 +130,8 @@ void inline GooString::resize(int newLen
+       } else {
+ 	memcpy(s1, s, length);
+       }
++      if (s != sStatic)
++	gfree(s);
+     }
+ 
+   }
+--- a/goo/JpegWriter.cc	2011-07-29 00:24:01.000000000 +0200
++++ b/goo/JpegWriter.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -53,6 +53,10 @@ bool JpegWriter::init(FILE *f, int width
+ 	// Initialize libjpeg
+ 	jpeg_create_compress(&cinfo);
+ 	
++        // Set colorspace and initialise defaults
++	cinfo.in_color_space = colorMode; /* colorspace of input image */
++	jpeg_set_defaults(&cinfo);
++
+ 	// Set destination file
+ 	jpeg_stdio_dest(&cinfo, f);
+ 	
+@@ -62,7 +66,6 @@ bool JpegWriter::init(FILE *f, int width
+ 	cinfo.density_unit = 1; // dots per inch
+ 	cinfo.X_density = hDPI;
+ 	cinfo.Y_density = vDPI;
+-	cinfo.in_color_space = colorMode; /* colorspace of input image */
+ 	/* # of color components per pixel */
+ 	switch (colorMode) {
+ 		case JCS_GRAYSCALE:
+@@ -77,7 +80,6 @@ bool JpegWriter::init(FILE *f, int width
+ 		default:
+ 			return false;
+ 	}
+-	jpeg_set_defaults(&cinfo);
+ 	if (cinfo.in_color_space == JCS_CMYK) {
+ 		jpeg_set_colorspace(&cinfo, JCS_YCCK);
+ 		cinfo.write_JFIF_header = TRUE;
+--- a/goo/PNGWriter.cc	2011-08-30 19:00:31.000000000 +0200
++++ b/goo/PNGWriter.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -6,7 +6,7 @@
+ //
+ // Copyright (C) 2009 Warren Toomey <wkt at tuhs.org>
+ // Copyright (C) 2009 Shen Liang <shenzhuxi at gmail.com>
+-// Copyright (C) 2009 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2009, 2011 Albert Astals Cid <aacid at kde.org>
+ // Copyright (C) 2009 Stefan Thomas <thomas at eload24.com>
+ // Copyright (C) 2010, 2011 Adrian Johnson <ajohnson at redneon.com>
+ // Copyright (C) 2011 Thomas Klausner <wiz at danbala.tuwien.ac.at>
+@@ -19,6 +19,7 @@
+ 
+ #include <zlib.h>
+ #include <stdlib.h>
++#include <string.h>
+ 
+ #include "poppler/Error.h"
+ #include "goo/gmem.h"
+--- a/poppler/CairoFontEngine.cc	2011-06-30 23:41:10.000000000 +0200
++++ b/poppler/CairoFontEngine.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -106,7 +106,7 @@ CairoFont::getGlyph(CharCode code,
+ double
+ CairoFont::getSubstitutionCorrection(GfxFont *gfxFont)
+ {
+-  double w1, w2,w3;
++  double w1, w2;
+   CharCode code;
+   char *name;
+ 
+@@ -134,7 +134,6 @@ CairoFont::getSubstitutionCorrection(Gfx
+ 
+ 	cairo_scaled_font_destroy(scaled_font);
+ 	cairo_font_options_destroy(options);
+-	w3 = extents.width;
+ 	w2 = extents.x_advance;
+       }
+       if (!gfxFont->isSymbolic()) {
+--- a/poppler/CairoOutputDev.cc	2012-02-29 17:53:31.000000000 +0100
++++ b/poppler/CairoOutputDev.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -434,7 +434,7 @@ void CairoOutputDev::updateLineWidth(Gfx
+ 
+       /* find out line width in device units */
+       cairo_user_to_device_distance(cairo, &x, &y);
+-      if (x <= 1.0 && y <= 1.0) {
++      if (fabs(x) <= 1.0 && fabs(y) <= 1.0) {
+ 	/* adjust width to at least one device pixel */
+ 	x = y = 1.0;
+ 	cairo_device_to_user_distance(cairo, &x, &y);
+--- a/poppler/CairoRescaleBox.cc	2011-08-21 23:41:12.000000000 +0200
++++ b/poppler/CairoRescaleBox.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -347,5 +347,5 @@ cleanup:
+     free (y_coverage);
+     free (temp_buf);
+ 
+-    return gTrue;
++    return retval;
+ }
+--- a/poppler/Gfx.cc	2011-09-27 00:15:13.000000000 +0200
++++ b/poppler/Gfx.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -33,6 +33,7 @@
+ // Copyright (C) 2009, 2010 David Benjamin <davidben at mit.edu>
+ // Copyright (C) 2010 Nils Höglund <nils.hoglund at gmail.com>
+ // Copyright (C) 2010 Christian Feuersänger <cfeuersaenger at googlemail.com>
++// Copyright (C) 2011 Axel Strübing <axel.struebing at freenet.de>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -1319,7 +1320,7 @@ void Gfx::opSetRenderingIntent(Object ar
+ 
+ void Gfx::opSetFillGray(Object args[], int numArgs) {
+   GfxColor color;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   Object obj;
+ 
+   if (textHaveCSPattern && drawText) {
+@@ -1332,11 +1333,12 @@ void Gfx::opSetFillGray(Object args[], i
+   }
+   state->setFillPattern(NULL);
+   res->lookupColorSpace("DefaultGray", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceGrayColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceGrayColorSpace();
++  }
+   obj.free();
+   state->setFillColorSpace(colorSpace);
+   out->updateFillColorSpace(state);
+@@ -1354,16 +1356,17 @@ void Gfx::opSetFillGray(Object args[], i
+ 
+ void Gfx::opSetStrokeGray(Object args[], int numArgs) {
+   GfxColor color;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   Object obj;
+ 
+   state->setStrokePattern(NULL);
+   res->lookupColorSpace("DefaultGray", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceGrayColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceGrayColorSpace();
++  }
+   obj.free();
+   state->setStrokeColorSpace(colorSpace);
+   out->updateStrokeColorSpace(state);
+@@ -1374,7 +1377,7 @@ void Gfx::opSetStrokeGray(Object args[],
+ 
+ void Gfx::opSetFillCMYKColor(Object args[], int numArgs) {
+   GfxColor color;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   Object obj;
+   int i;
+ 
+@@ -1387,11 +1390,12 @@ void Gfx::opSetFillCMYKColor(Object args
+     out->restoreState(state);
+   }
+   res->lookupColorSpace("DefaultCMYK", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceCMYKColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceCMYKColorSpace();
++  }
+   obj.free();
+   state->setFillPattern(NULL);
+   state->setFillColorSpace(colorSpace);
+@@ -1412,17 +1416,18 @@ void Gfx::opSetFillCMYKColor(Object args
+ 
+ void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) {
+   GfxColor color;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   Object obj;
+   int i;
+ 
+   state->setStrokePattern(NULL);
+   res->lookupColorSpace("DefaultCMYK", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceCMYKColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceCMYKColorSpace();
++  }
+   obj.free();
+   state->setStrokeColorSpace(colorSpace);
+   out->updateStrokeColorSpace(state);
+@@ -1435,7 +1440,7 @@ void Gfx::opSetStrokeCMYKColor(Object ar
+ 
+ void Gfx::opSetFillRGBColor(Object args[], int numArgs) {
+   Object obj;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   GfxColor color;
+   int i;
+ 
+@@ -1449,11 +1454,12 @@ void Gfx::opSetFillRGBColor(Object args[
+   }
+   state->setFillPattern(NULL);
+   res->lookupColorSpace("DefaultRGB", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceRGBColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceRGBColorSpace();
++  }
+   obj.free();
+   state->setFillColorSpace(colorSpace);
+   out->updateFillColorSpace(state);
+@@ -1473,17 +1479,18 @@ void Gfx::opSetFillRGBColor(Object args[
+ 
+ void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) {
+   Object obj;
+-  GfxColorSpace *colorSpace;
++  GfxColorSpace *colorSpace = NULL;
+   GfxColor color;
+   int i;
+ 
+   state->setStrokePattern(NULL);
+   res->lookupColorSpace("DefaultRGB", &obj);
+-  if (obj.isNull()) {
+-    colorSpace = new GfxDeviceRGBColorSpace();
+-  } else {
++  if (!obj.isNull()) {
+     colorSpace = GfxColorSpace::parse(&obj, this);
+   }
++  if (colorSpace == NULL) {
++    colorSpace = new GfxDeviceRGBColorSpace();
++  }
+   obj.free();
+   state->setStrokeColorSpace(colorSpace);
+   out->updateStrokeColorSpace(state);
+--- a/poppler/GfxFont.cc	2011-08-29 22:06:43.000000000 +0200
++++ b/poppler/GfxFont.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -449,7 +449,7 @@ CharCodeToUnicode *GfxFont::readToUnicod
+ 
+ void GfxFont::findExtFontFile() {
+   static char *type1Exts[] = { ".pfa", ".pfb", ".ps", "", NULL };
+-  static char *ttExts[] = { ".ttf", ".ttc", NULL };
++  static char *ttExts[] = { ".ttf", ".ttc", ".otf", NULL };
+ 
+   if (name) {
+     if (type == fontType1) {
+--- a/poppler/GfxState.cc	2011-07-28 12:58:37.000000000 +0200
++++ b/poppler/GfxState.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -257,8 +257,20 @@ GfxColorSpace *GfxColorSpace::parse(Obje
+       error(-1, "Bad color space");
+     }
+     obj1.free();
++  } else if (csObj->isDict()) {
++    csObj->dictLookup("ColorSpace", &obj1);
++    if (obj1.isName("DeviceGray")) {
++      cs = new GfxDeviceGrayColorSpace();
++    } else if (obj1.isName("DeviceRGB")) {
++      cs = new GfxDeviceRGBColorSpace();
++    } else if (obj1.isName("DeviceCMYK")) {
++      cs = new GfxDeviceCMYKColorSpace();
++    } else {
++      error(-1, "Bad color space '%s'", csObj->getName());
++    }
++    obj1.free();
+   } else {
+-    error(-1, "Bad color space - expected name or array");
++    error(-1, "Bad color space - expected name, array or dict");
+   }
+   return cs;
+ }
+--- a/poppler/GlobalParams.cc	2011-07-28 12:43:53.000000000 +0200
++++ b/poppler/GlobalParams.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -1247,7 +1247,7 @@ DisplayFontParam *GlobalParams::getDispl
+         ext = strrchr((char*)s,'.');
+         if (!ext)
+           continue;
+-        if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4))
++        if (!strncasecmp(ext,".ttf",4) || !strncasecmp(ext, ".ttc", 4) || !strncasecmp(ext, ".otf", 4))
+         {
+           dfp = new DisplayFontParam(fontName->copy(), displayFontTT);  
+           dfp->tt.fileName = new GooString((char*)s);
+--- a/poppler/Lexer.cc	2010-07-16 00:43:51.000000000 +0200
++++ b/poppler/Lexer.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -228,11 +228,13 @@ Object *Lexer::getObj(Object *obj, int o
+ 	break;
+       }
+     }
+-    if (neg)
++    if (neg) {
+       xi = -xi;
++      xf = -xf;
++    }
+     if (unlikely(overflownInteger)) {
+       if (overflownUnsignedInteger) {
+-        obj->initError();
++        obj->initReal(xf);
+       } else {
+         obj->initUint(xui);
+       }
+--- a/poppler/PDFDoc.cc	2011-08-29 22:20:01.000000000 +0200
++++ b/poppler/PDFDoc.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -26,7 +26,7 @@
+ // Copyright (C) 2010 Ilya Gorenbein <igorenbein at finjan.com>
+ // Copyright (C) 2010 Srinivas Adicherla <srinivas.adicherla at geodesic.com>
+ // Copyright (C) 2010 Philip Lorenz <lorenzph+freedesktop at gmail.com>
+-// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag at alfa.de>
++// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -707,35 +707,44 @@ int PDFDoc::saveAs(GooString *name, PDFW
+ 
+ int PDFDoc::saveAs(OutStream *outStr, PDFWriteMode mode) {
+ 
+-  // we don't support files with Encrypt at the moment
++  // find if we have updated objects
++  GBool updated = gFalse;
++  for(int i=0; i<xref->getNumObjects(); i++) {
++    if (xref->getEntry(i)->updated) {
++      updated = gTrue;
++      break;
++    }
++  }
++
++  // we don't support rewriting files with Encrypt at the moment
+   Object obj;
+   xref->getTrailerDict()->getDict()->lookupNF("Encrypt", &obj);
+   if (!obj.isNull())
+   {
+     obj.free();
+-    return errEncrypted;
++    if (!updated && mode == writeStandard) {
++      // simply copy the original file
++      saveWithoutChangesAs (outStr);
++    } else {
++      return errEncrypted;
++    }
+   }
+-  obj.free();
++  else
++  {
++    obj.free();
+ 
+-  if (mode == writeForceRewrite) {
+-    saveCompleteRewrite(outStr);
+-  } else if (mode == writeForceIncremental) {
+-    saveIncrementalUpdate(outStr); 
+-  } else { // let poppler decide
+-    // find if we have updated objects
+-    GBool updated = gFalse;
+-    for(int i=0; i<xref->getNumObjects(); i++) {
+-      if (xref->getEntry(i)->updated) {
+-        updated = gTrue;
+-        break;
++    if (mode == writeForceRewrite) {
++      saveCompleteRewrite(outStr);
++    } else if (mode == writeForceIncremental) {
++      saveIncrementalUpdate(outStr); 
++    } else { // let poppler decide
++      if(updated) { 
++        saveIncrementalUpdate(outStr);
++      } else {
++        // simply copy the original file
++        saveWithoutChangesAs (outStr);
+       }
+     }
+-    if(updated) { 
+-      saveIncrementalUpdate(outStr);
+-    } else {
+-      // simply copy the original file
+-      saveWithoutChangesAs (outStr);
+-    }
+   }
+ 
+   return errNone;
+@@ -1225,6 +1234,8 @@ void PDFDoc::markObject (Object* obj, XR
+         } else {
+           XRefEntry *entry = countRef->getEntry(obj->getRef().num + numOffset);
+           entry->gen++;
++          if (entry->gen > 9)
++            break;
+         } 
+         Object obj1;
+         getXRef()->fetch(obj->getRef().num, obj->getRef().gen, &obj1);
+--- a/poppler/PSOutputDev.cc	2011-08-21 23:22:54.000000000 +0200
++++ b/poppler/PSOutputDev.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -15,7 +15,7 @@
+ //
+ // Copyright (C) 2005 Martin Kretzschmar <martink at gnome.org>
+ // Copyright (C) 2005, 2006 Kristian Høgsberg <krh at redhat.com>
+-// Copyright (C) 2006-2009 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2006-2009, 2011 Albert Astals Cid <aacid at kde.org>
+ // Copyright (C) 2006 Jeff Muizelaar <jeff at infidigm.net>
+ // Copyright (C) 2007, 2008 Brad Hards <bradh at kde.org>
+ // Copyright (C) 2008, 2009 Koji Otani <sho at bbr.jp>
+@@ -1315,7 +1315,7 @@ void PSOutputDev::writeHeader(int firstP
+     writePS("%!PS-Adobe-3.0 Resource-Form\n");
+     break;
+   }
+-  writePSFmt("% Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION);
++  writePSFmt("%Produced by poppler pdftops version: {0:s} (http://poppler.freedesktop.org)\n", PACKAGE_VERSION);
+   xref->getDocInfo(&info);
+   if (info.isDict() && info.dictLookup("Creator", &obj1)->isString()) {
+     writePS("%%Creator: ");
+@@ -4080,7 +4080,6 @@ GBool PSOutputDev::tilingPatternFillL2(G
+ 				       double xStep, double yStep) {
+   PDFRectangle box;
+   Gfx *gfx;
+-  double cxMin, cyMin, cxMax, cyMax;
+ 
+   writePS("<<\n  /PatternType 1\n");
+   writePSFmt("  /PaintType {0:d}\n", paintType);
+@@ -4100,10 +4099,9 @@ GBool PSOutputDev::tilingPatternFillL2(G
+   delete gfx;
+   writePS("  }\n");
+   writePS(">>\n");
+-  writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}]\n", pmat[0], pmat[1], pmat[2], pmat[3], pmat[4], pmat[5]);
++  writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}]\n", mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
+   writePS("makepattern setpattern\n");
+-  state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax);
+-  writePSFmt("{0:.6g} {1:.6g} {2:.6g} {3:.6g} rectfill\n", cxMin, cyMin, cxMax - cxMin, cyMax - cyMin);
++  writePS("clippath fill\n"); // Gfx sets up a clip before calling out->tilingPatternFill()
+ 
+   return gTrue;
+ }
+@@ -4113,8 +4111,28 @@ GBool PSOutputDev::tilingPatternFill(Gfx
+ 				     double *mat, double *bbox,
+ 				     int x0, int y0, int x1, int y1,
+ 				     double xStep, double yStep) {
+-  if (x1 - x0 == 1 && y1 - y0 == 1)
+-    return gFalse; // Don't need to use patterns if only one instance of the pattern is used
++  if (x1 - x0 == 1 && y1 - y0 == 1) {
++    // Don't need to use patterns if only one instance of the pattern is used
++    PDFRectangle box;
++    Gfx *gfx;
++    double x, y, tx, ty;
++
++    x = x0 * xStep;
++    y = y0 * yStep;
++    tx = x * mat[0] + y * mat[2] + mat[4];
++    ty = x * mat[1] + y * mat[3] + mat[5];
++    box.x1 = bbox[0];
++    box.y1 = bbox[1];
++    box.x2 = bbox[2];
++    box.y2 = bbox[3];
++    gfx = new Gfx(xref, this, resDict, m_catalog, &box, NULL);
++    writePSFmt("[{0:.6g} {1:.6g} {2:.6g} {3:.6g} {4:.6g} {5:.6g}] cm\n", mat[0], mat[1], mat[2], mat[3], tx, ty);
++    inType3Char = gTrue;
++    gfx->display(str);
++    inType3Char = gFalse;
++    delete gfx;
++    return gTrue;
++  }
+ 
+   if (level == psLevel1 || level == psLevel1Sep) {
+     return tilingPatternFillL1(state, cat, str, pmat, paintType, tilingType, resDict,
+--- a/splash/SplashXPath.cc	2011-06-30 23:41:10.000000000 +0200
++++ b/splash/SplashXPath.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -281,9 +281,9 @@ void SplashXPath::addCurve(SplashCoord x
+ 			   SplashCoord x3, SplashCoord y3,
+ 			   SplashCoord flatness,
+ 			   GBool first, GBool last, GBool end0, GBool end1) {
+-  SplashCoord cx[splashMaxCurveSplits + 1][3];
+-  SplashCoord cy[splashMaxCurveSplits + 1][3];
+-  int cNext[splashMaxCurveSplits + 1];
++  SplashCoord *cx = new SplashCoord[(splashMaxCurveSplits + 1) * 3];
++  SplashCoord *cy = new SplashCoord[(splashMaxCurveSplits + 1) * 3];
++  int *cNext = new int[splashMaxCurveSplits + 1];
+   SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh;
+   SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh;
+   SplashCoord dx, dy, mx, my, d1, d2, flatness2;
+@@ -294,20 +294,34 @@ void SplashXPath::addCurve(SplashCoord x
+   // initial segment
+   p1 = 0;
+   p2 = splashMaxCurveSplits;
+-  cx[p1][0] = x0;  cy[p1][0] = y0;
+-  cx[p1][1] = x1;  cy[p1][1] = y1;
+-  cx[p1][2] = x2;  cy[p1][2] = y2;
+-  cx[p2][0] = x3;  cy[p2][0] = y3;
+-  cNext[p1] = p2;
++
++  *(cx + p1 * 3 + 0) = x0;
++  *(cx + p1 * 3 + 1) = x1;
++  *(cx + p1 * 3 + 2) = x2;
++  *(cx + p2 * 3 + 0) = x3;
++
++  *(cy + p1 * 3 + 0) = y0;
++  *(cy + p1 * 3 + 1) = y1;
++  *(cy + p1 * 3 + 2) = y2;
++  *(cy + p2 * 3 + 0) = y3;
++
++  *(cNext + p1) = p2;
+ 
+   while (p1 < splashMaxCurveSplits) {
+ 
+     // get the next segment
+-    xl0 = cx[p1][0];  yl0 = cy[p1][0];
+-    xx1 = cx[p1][1];  yy1 = cy[p1][1];
+-    xx2 = cx[p1][2];  yy2 = cy[p1][2];
+-    p2 = cNext[p1];
+-    xr3 = cx[p2][0];  yr3 = cy[p2][0];
++    xl0 = *(cx + p1 * 3 + 0);
++    xx1 = *(cx + p1 * 3 + 1);
++    xx2 = *(cx + p1 * 3 + 2);
++
++    yl0 = *(cy + p1 * 3 + 0);
++    yy1 = *(cy + p1 * 3 + 1);
++    yy2 = *(cy + p1 * 3 + 2);
++
++    p2 = *(cNext + p1);
++
++    xr3 = *(cx + p2 * 3 + 0);
++    yr3 = *(cy + p2 * 3 + 0);
+ 
+     // compute the distances from the control points to the
+     // midpoint of the straight line (this is a bit of a hack, but
+@@ -348,15 +362,30 @@ void SplashXPath::addCurve(SplashCoord x
+       yr0 = (yl2 + yr1) * 0.5;
+       // add the new subdivision points
+       p3 = (p1 + p2) / 2;
+-      cx[p1][1] = xl1;  cy[p1][1] = yl1;
+-      cx[p1][2] = xl2;  cy[p1][2] = yl2;
+-      cNext[p1] = p3;
+-      cx[p3][0] = xr0;  cy[p3][0] = yr0;
+-      cx[p3][1] = xr1;  cy[p3][1] = yr1;
+-      cx[p3][2] = xr2;  cy[p3][2] = yr2;
+-      cNext[p3] = p2;
++
++      *(cx + p1 * 3 + 1) = xl1;
++      *(cx + p1 * 3 + 2) = xl2;
++
++      *(cy + p1 * 3 + 1) = yl1;
++      *(cy + p1 * 3 + 2) = yl2;
++
++      *(cNext + p1) = p3;
++
++      *(cx + p3 * 3 + 0) = xr0;
++      *(cx + p3 * 3 + 1) = xr1;
++      *(cx + p3 * 3 + 2) = xr2;
++
++      *(cy + p3 * 3 + 0) = yr0;
++      *(cy + p3 * 3 + 1) = yr1;
++      *(cy + p3 * 3 + 2) = yr2;
++
++      *(cNext + p3) = p2;
+     }
+   }
++
++  delete [] cx;
++  delete [] cy;
++  delete [] cNext;
+ }
+ 
+ void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0,
+--- a/utils/HtmlOutputDev.cc	2011-09-26 15:49:55.000000000 +0200
++++ b/utils/HtmlOutputDev.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -17,7 +17,7 @@
+ // All changes made under the Poppler project to this file are licensed
+ // under GPL version 2 or later
+ //
+-// Copyright (C) 2005-2011 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2005-2012 Albert Astals Cid <aacid at kde.org>
+ // Copyright (C) 2008 Kjartan Maraas <kmaraas at gnome.org>
+ // Copyright (C) 2008 Boris Toloknov <tlknv at yandex.ru>
+ // Copyright (C) 2008 Haruyuki Kawabe <Haruyuki.Kawabe at unisys.co.jp>
+@@ -30,6 +30,7 @@
+ // Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac at cdacmumbai.in) and Onkar Potdar (onkar at cdacmumbai.in)
+ // Copyright (C) 2011 Joshua Richardson <jric at chegg.com>
+ // Copyright (C) 2011 Stephen Reichling <sreichling at chegg.com>
++// Copyright (C) 2012 Igor Slepchin <igor.redhat at gmail.com>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -61,6 +62,8 @@
+ #include "HtmlOutputDev.h"
+ #include "HtmlFonts.h"
+ #include "HtmlUtils.h"
++#include "Outline.h"
++#include "PDFDoc.h"
+ 
+ #define DEBUG __FILE__ << ": " << __LINE__ << ": DEBUG: "
+ 
+@@ -739,7 +742,6 @@ void HtmlPage::dumpAsXML(FILE* f,int pag
+ 
+ int HtmlPage::dumpComplexHeaders(FILE * const file, FILE *& pageFile, int page) {
+   GooString* tmp;
+-  char* htmlEncoding;
+ 
+   if( !noframes )
+   {
+@@ -766,11 +768,12 @@ int HtmlPage::dumpComplexHeaders(FILE *
+ 
+       delete tmp;
+ 
+-      htmlEncoding = HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName());
++      GooString *htmlEncoding = HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName());
+       if (!singleHtml)
+-        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding);
++        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+       else
+-        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n <br/>\n", htmlEncoding);
++        fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n <br/>\n", htmlEncoding->getCString());
++      delete htmlEncoding;
+   }
+   else 
+   {
+@@ -956,23 +959,23 @@ static char* HtmlEncodings[][2] = {
+     {NULL, NULL}
+ };
+ 
+-
+-char* HtmlOutputDev::mapEncodingToHtml(GooString* encoding)
++GooString* HtmlOutputDev::mapEncodingToHtml(GooString* encoding)
+ {
+-    char* enc = encoding->getCString();
+-    for(int i = 0; HtmlEncodings[i][0] != NULL; i++)
++  GooString* enc = encoding;
++  for(int i = 0; HtmlEncodings[i][0] != NULL; i++)
++  {
++    if( enc->cmp(HtmlEncodings[i][0]) == 0 )
+     {
+-	if( strcmp(enc, HtmlEncodings[i][0]) == 0 )
+-	{
+-	    return HtmlEncodings[i][1];
+-	}
++      delete enc;
++      return new GooString(HtmlEncodings[i][1]);
+     }
+-    return enc; 
++  }
++  return enc; 
+ }
+ 
+ void HtmlOutputDev::doFrame(int firstPage){
+   GooString* fName=new GooString(Docname);
+-  char* htmlEncoding;
++  GooString* htmlEncoding;
+   fName->append(".html");
+ 
+   if (!(fContentsFrame = fopen(fName->getCString(), "w"))){
+@@ -989,7 +992,7 @@ void HtmlOutputDev::doFrame(int firstPag
+   fputs("\n<HEAD>",fContentsFrame);
+   fprintf(fContentsFrame,"\n<TITLE>%s</TITLE>",docTitle->getCString());
+   htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName());
+-  fprintf(fContentsFrame, "\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding);
++  fprintf(fContentsFrame, "\n<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+   dumpMetaVars(fContentsFrame);
+   fprintf(fContentsFrame, "</HEAD>\n");
+   fputs("<FRAMESET cols=\"100,*\">\n",fContentsFrame);
+@@ -1003,6 +1006,7 @@ void HtmlOutputDev::doFrame(int firstPag
+   fputs(">\n</FRAMESET>\n</HTML>\n",fContentsFrame);
+  
+   delete fName;
++  delete htmlEncoding;
+   fclose(fContentsFrame);  
+ }
+ 
+@@ -1011,8 +1015,6 @@ HtmlOutputDev::HtmlOutputDev(char *fileN
+ 	char *extension,
+ 	GBool rawOrder, int firstPage, GBool outline) 
+ {
+-  char *htmlEncoding;
+-  
+   fContentsFrame = NULL;
+   docTitle = new GooString(title);
+   pages = NULL;
+@@ -1099,10 +1101,10 @@ HtmlOutputDev::HtmlOutputDev(char *fileN
+       delete right;
+     }
+ 
+-    htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); 
++    GooString *htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); 
+     if (xml) 
+     {
+-      fprintf(page, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", htmlEncoding);
++      fprintf(page, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", htmlEncoding->getCString());
+       fputs("<!DOCTYPE pdf2xml SYSTEM \"pdf2xml.dtd\">\n\n", page);
+       fputs("<pdf2xml>\n",page);
+     } 
+@@ -1110,12 +1112,13 @@ HtmlOutputDev::HtmlOutputDev(char *fileN
+     {
+       fprintf(page,"%s\n<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE>%s</TITLE>\n", DOCTYPE, docTitle->getCString());
+       
+-      fprintf(page, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding);
++      fprintf(page, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\"/>\n", htmlEncoding->getCString());
+       
+       dumpMetaVars(page);
+       fprintf(page,"</HEAD>\n");
+       fprintf(page,"<BODY bgcolor=\"#A0A0A0\" vlink=\"blue\" link=\"blue\">\n");
+     }
++    delete htmlEncoding;
+   }
+   ok = gTrue; 
+ }
+@@ -1551,17 +1554,25 @@ void HtmlOutputDev::dumpMetaVars(FILE *f
+   }
+ }
+ 
+-GBool HtmlOutputDev::dumpDocOutline(Catalog* catalog)
++GBool HtmlOutputDev::dumpDocOutline(PDFDoc* doc)
+ { 
++#ifdef DISABLE_OUTLINE
++	return gFalse;
++#else
+ 	FILE * output = NULL;
+ 	GBool bClose = gFalse;
++	Catalog *catalog = doc->getCatalog();
+ 
+ 	if (!ok || xml)
+-    	return gFalse;
++                return gFalse;
+   
+-	Object *outlines = catalog->getOutline();
+-  	if (!outlines->isDict())
+-    	return gFalse;
++	Outline *outline = doc->getOutline();
++	if (!outline)
++		return gFalse;
++
++	GooList *outlines = outline->getItems();
++	if (!outlines)
++		return gFalse;
+   
+ 	if (!complexMode && !xml)
+   	{
+@@ -1583,7 +1594,18 @@ GBool HtmlOutputDev::dumpDocOutline(Cata
+ 				return gFalse;
+ 			delete str;
+ 			bClose = gTrue;
+-     		fputs("<HTML xmlns=\"http://www.w3.org/1999/xhtml\" lang=\"\" xml:lang=\"\">\n<HEAD>\n<TITLE>Document Outline</TITLE>\n</HEAD>\n<BODY>\n", output);
++
++			GooString *htmlEncoding =
++				HtmlOutputDev::mapEncodingToHtml(globalParams->getTextEncodingName());
++
++			fprintf(output, "<HTML xmlns=\"http://www.w3.org/1999/xhtml\" " \
++                                "lang=\"\" xml:lang=\"\">\n"            \
++                                "<HEAD>\n"                              \
++                                "<TITLE>Document Outline</TITLE>\n"     \
++                                "<META http-equiv=\"Content-Type\" content=\"text/html; " \
++                                "charset=%s\"/>\n"                      \
++                                "</HEAD>\n<BODY>\n", htmlEncoding->getCString());
++			delete htmlEncoding;
+ 		}
+ 	}
+  
+@@ -1597,97 +1619,95 @@ GBool HtmlOutputDev::dumpDocOutline(Cata
+ 		fclose(output);
+ 	}
+   	return done;
++#endif
+ }
+ 
+-GBool HtmlOutputDev::newOutlineLevel(FILE *output, Object *node, Catalog* catalog, int level)
++GBool HtmlOutputDev::newOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level)
+ {
+-  Object curr, next;
+-  GBool atLeastOne = gFalse;
+-  
+-  if (node->dictLookup("First", &curr)->isDict()) {
+-    if (level == 1)
++	GBool atLeastOne = gFalse;
++
++	if (level == 1)
+ 	{
+ 		fputs("<A name=\"outline\"></a>", output);
+ 		fputs("<h1>Document Outline</h1>\n", output);
+ 	}
+-    fputs("<ul>",output);
+-    do {
+-      // get title, give up if not found
+-      Object title;
+-      if (curr.dictLookup("Title", &title)->isNull()) {
+-		title.free();
+-		break;
+-      }
+-      GooString *titleStr = new GooString(title.getString());
+-      title.free();
++	fputs("<ul>\n",output);
+ 
+-      // get corresponding link
+-      // Note: some code duplicated from HtmlOutputDev::getLinkDest().
+-      GooString *linkName = NULL;;
+-      Object dest;
+-      if (!curr.dictLookup("Dest", &dest)->isNull()) {
+-		LinkGoTo *link = new LinkGoTo(&dest);
+-		LinkDest *linkdest=NULL;
+-		if (link->getDest()!=NULL)
+-			linkdest=link->getDest()->copy();
+-		else if (link->getNamedDest()!=NULL)
+-			linkdest=catalog->findDest(link->getNamedDest());
+-			
+-		delete link;
+-		if (linkdest) { 
+-	  		int page;
+-	  		if (linkdest->isPageRef()) {
+-	    		Ref pageref=linkdest->getPageRef();
+-	    		page=catalog->findPage(pageref.num,pageref.gen);
+-	  		} else {
+-	    		page=linkdest->getPageNum();
+-	  		}
+-	  		delete linkdest;
+-
+-			/* 			complex 	simple
+-			frames		file-4.html	files.html#4
+-			noframes	file.html#4	file.html#4
+-	   		*/
+-	  		linkName=basename(Docname);
+-	  		GooString *str=GooString::fromInt(page);
+-	  		if (noframes) {
+-	    		linkName->append(".html#");
+-				linkName->append(str);
+-	  		} else {
+-    			if( complexMode ) {
+-	   		   		linkName->append("-");
+-	      			linkName->append(str);
+-	      			linkName->append(".html");
+-	    		} else {
+-	      			linkName->append("s.html#");
+-	      			linkName->append(str);
+-	    		}
+-	  		}
+-			delete str;
++	for (int i = 0; i < outlines->getLength(); i++)
++	{
++		OutlineItem *item = (OutlineItem*)outlines->get(i);
++		GooString *titleStr = HtmlFont::HtmlFilter(item->getTitle(),
++							   item->getTitleLength());
++
++		// get corresponding link
++		GooString *linkName = NULL;;
++		LinkAction *action = item->getAction();
++		LinkGoTo *link = NULL;
++		Object dest;
++		if (action && action->getKind() == actionGoTo)
++			link = dynamic_cast<LinkGoTo*>(action);
++		if (link && link->isOk()) {
++			LinkDest *linkdest=NULL;
++			if (link->getDest()!=NULL)
++				linkdest=link->getDest()->copy();
++			else if (link->getNamedDest()!=NULL)
++				linkdest=catalog->findDest(link->getNamedDest());
++
++			if (linkdest) {
++				int page;
++				if (linkdest->isPageRef()) {
++					Ref pageref=linkdest->getPageRef();
++					page=catalog->findPage(pageref.num,pageref.gen);
++				} else {
++					page=linkdest->getPageNum();
++				}
++				delete linkdest;
++
++				/*		complex		simple
++				frames		file-4.html	files.html#4
++				noframes	file.html#4	file.html#4
++				*/
++				linkName=basename(Docname);
++				GooString *str=GooString::fromInt(page);
++				if (noframes) {
++					linkName->append(".html#");
++					linkName->append(str);
++				} else {
++					if( complexMode ) {
++						linkName->append("-");
++						linkName->append(str);
++						linkName->append(".html");
++					} else {
++						linkName->append("s.html#");
++						linkName->append(str);
++					}
++				}
++				delete str;
++			}
+ 		}
+-      }
+-      dest.free();
++		dest.free();
+ 
+-      fputs("<li>",output);
+-      if (linkName)
+-		fprintf(output,"<A href=\"%s\">", linkName->getCString());
+-      fputs(titleStr->getCString(),output);
+-      if (linkName) {
+-		fputs("</A>",output);
+-		delete linkName;
+-      }
+-      fputs("\n",output);
+-      delete titleStr;
+-      atLeastOne = gTrue;
+-
+-      newOutlineLevel(output, &curr, catalog, level+1);
+-      curr.dictLookup("Next", &next);
+-      curr.free();
+-      curr = next;
+-    } while(curr.isDict());
+-    fputs("</ul>",output);
+-  }
+-  curr.free();
++		fputs("<li>",output);
++		if (linkName)
++			fprintf(output,"<A href=\"%s\">", linkName->getCString());
++		fputs(titleStr->getCString(),output);
++		if (linkName) {
++			fputs("</A>",output);
++			delete linkName;
++		}
++		delete titleStr;
++		atLeastOne = gTrue;
++
++		item->open();
++		if (item->hasKids())
++		{
++			fputs("\n",output);
++			newOutlineLevel(output, item->getKids(), catalog, level+1);
++		}
++		item->close();
++		fputs("</li>\n",output);
++	}
++	fputs("</ul>\n",output);
+ 
+-  return atLeastOne;
++	return atLeastOne;
+ }
+--- a/utils/HtmlOutputDev.h	2011-08-18 18:11:13.000000000 +0200
++++ b/utils/HtmlOutputDev.h	2012-02-29 18:16:00.000000000 +0100
+@@ -14,13 +14,14 @@
+ // All changes made under the Poppler project to this file are licensed
+ // under GPL version 2 or later
+ //
+-// Copyright (C) 2006, 2007, 2009 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2006, 2007, 2009, 2012 Albert Astals Cid <aacid at kde.org>
+ // Copyright (C) 2008, 2009 Warren Toomey <wkt at tuhs.org>
+ // Copyright (C) 2009, 2011 Carlos Garcia Campos <carlosgc at gnome.org>
+ // Copyright (C) 2009 Kovid Goyal <kovid at kovidgoyal.net>
+ // Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
+ // Copyright (C) 2011 Joshua Richardson <jric at chegg.com>
+ // Copyright (C) 2011 Stephen Reichling <sreichling at chegg.com>
++// Copyright (C) 2012 Igor Slepchin <igor.redhat at gmail.com>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -58,6 +59,7 @@
+ 
+ class GfxState;
+ class GooString;
++class PDFDoc;
+ //------------------------------------------------------------------------
+ // HtmlString
+ //------------------------------------------------------------------------
+@@ -298,17 +300,18 @@ public:
+   int getPageWidth() { return maxPageWidth; }
+   int getPageHeight() { return maxPageHeight; }
+ 
+-  GBool dumpDocOutline(Catalog* catalog);
++  GBool dumpDocOutline(PDFDoc* catalog);
+ 
+ private:
+   // convert encoding into a HTML standard, or encoding->getCString if not
+-  // recognized
+-  static char* mapEncodingToHtml(GooString* encoding);
++  // recognized. Will delete encoding for you and return a new one
++  // that you have to delete
++  static GooString* mapEncodingToHtml(GooString* encoding);
+   void doProcessLink(AnnotLink *link);
+   GooString* getLinkDest(AnnotLink *link,Catalog *catalog);
+   void dumpMetaVars(FILE *);
+   void doFrame(int firstPage);
+-  GBool newOutlineLevel(FILE *output, Object *node, Catalog* catalog, int level = 1);
++  GBool newOutlineLevel(FILE *output, GooList *outlines, Catalog* catalog, int level = 1);
+ 
+   FILE *fContentsFrame;
+   FILE *page;                   // html file
+--- a/utils/parseargs.cc	2011-01-15 12:43:25.000000000 +0100
++++ b/utils/parseargs.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -30,6 +30,7 @@
+ #include "parseargs.h"
+ 
+ #include "goo/gstrtod.h"
++#include "goo/GooString.h"
+ 
+ static const ArgDesc *findArg(const ArgDesc *args, char *arg);
+ static GBool grabArg(const ArgDesc *arg, int i, int *argc, char *argv[]);
+@@ -87,6 +88,7 @@ void printUsage(char *program, char *oth
+       break;
+     case argString:
+     case argStringDummy:
++    case argGooString:
+       typ = " <string>";
+       break;
+     case argFlag:
+@@ -149,6 +151,15 @@ static GBool grabArg(const ArgDesc *arg,
+       n = 2;
+     } else {
+       ok = gFalse;
++      n = 1;
++    }
++    break;
++  case argGooString:
++    if (i + 1 < *argc) {
++      ((GooString*)arg->val)->Set(argv[i+1]);
++      n = 2;
++    } else {
++      ok = gFalse;
+       n = 1;
+     }
+     break;
+--- a/utils/parseargs.h	2009-10-09 00:26:36.000000000 +0200
++++ b/utils/parseargs.h	2012-02-29 18:16:00.000000000 +0100
+@@ -41,6 +41,8 @@ typedef enum {
+ 				/*   [val: double *]  */
+   argString,			/* string arg      */
+ 				/*   [val: char *] */
++  argGooString,			/* string arg      */
++				/*   [val: GooString *] */
+   /* dummy entries -- these show up in the usage listing only; */
+   /* useful for X args, for example                            */
+   argFlagDummy,
+--- a/utils/pdfseparate.cc	2011-09-27 00:08:36.000000000 +0200
++++ b/utils/pdfseparate.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -4,7 +4,7 @@
+ //
+ // This file is licensed under the GPLv2 or later
+ //
+-// Copyright (C) 2011 Thomas Freitag <Thomas.Freitag at alfa.de>
++// Copyright (C) 2011, 2012 Thomas Freitag <Thomas.Freitag at alfa.de>
+ //
+ //========================================================================
+ #include "config.h"
+@@ -17,6 +17,7 @@
+ #include "goo/GooString.h"
+ #include "PDFDoc.h"
+ #include "ErrorCodes.h"
++#include "GlobalParams.h"
+ 
+ static int firstPage = 0;
+ static int lastPage = 0;
+@@ -107,7 +108,9 @@ main (int argc, char *argv[])
+ 	exitCode = 0;
+       goto err0;
+     }
++  globalParams = new GlobalParams();
+   extractPages (argv[1], argv[2]);
++  delete globalParams;
+ 
+ err0:
+ 
+--- a/utils/pdftocairo.cc	2011-08-21 23:39:36.000000000 +0200
++++ b/utils/pdftocairo.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -32,7 +32,6 @@
+ 
+ #include "config.h"
+ #include <poppler-config.h>
+-#include <sys/param.h> // for MAXPATHLEN
+ #include <stdio.h>
+ #include <math.h>
+ #include <string.h>
+@@ -91,7 +90,7 @@ static GBool useCropBox = gFalse;
+ static GBool mono = gFalse;
+ static GBool gray = gFalse;
+ static GBool transp = gFalse;
+-static char icc[MAXPATHLEN] = "";
++static GooString icc;
+ 
+ static GBool level2 = gFalse;
+ static GBool level3 = gFalse;
+@@ -179,7 +178,7 @@ static const ArgDesc argDesc[] = {
+   {"-transp",   argFlag,     &transp,          0,
+    "use a transparent background instead of white (PNG)"},
+ #if USE_CMS
+-  {"-icc",   argString,     &icc,          sizeof(icc),
++  {"-icc",   argGooString,     &icc,          0,
+    "ICC color profile to use"},
+ #endif
+ 
+@@ -336,6 +335,8 @@ void writePageImage(GooString *filename)
+   gfree(row);
+   writer->close();
+   delete writer;
++  if (file == stdout) fflush(file);
++  else fclose(file);
+ }
+ 
+ static void getCropSize(double page_w, double page_h, double *width, double *height)
+@@ -754,7 +755,7 @@ int main(int argc, char *argv[]) {
+     checkInvalidPrintOption(mono, "-mono");
+     checkInvalidPrintOption(gray, "-gray");
+     checkInvalidPrintOption(transp, "-transp");
+-    checkInvalidPrintOption(icc[0], "-icc");
++    checkInvalidPrintOption(icc.getCString()[0], "-icc");
+     checkInvalidPrintOption(singleFile, "-singlefile");
+   } else {
+     checkInvalidImageOption(level2, "-level2");
+@@ -770,7 +771,7 @@ int main(int argc, char *argv[]) {
+     checkInvalidImageOption(duplex, "-duplex");
+   }
+ 
+-  if (icc[0] && !png) {
++  if (icc.getCString()[0] && !png) {
+     fprintf(stderr, "Error: -icc may only be used with png output.\n");
+     exit(99);
+   }
+@@ -840,10 +841,10 @@ int main(int argc, char *argv[]) {
+ 
+ #if USE_CMS
+   icc_data = NULL;
+-  if (icc[0]) {
+-    FILE *file = fopen(icc, "rb");
++  if (icc.getCString()[0]) {
++    FILE *file = fopen(icc.getCString(), "rb");
+     if (!file) {
+-      fprintf(stderr, "Error: unable to open icc profile %s\n", icc);
++      fprintf(stderr, "Error: unable to open icc profile %s\n", icc.getCString());
+       exit(4);
+     }
+     fseek (file, 0, SEEK_END);
+@@ -851,7 +852,7 @@ int main(int argc, char *argv[]) {
+     fseek (file, 0, SEEK_SET);
+     icc_data = (unsigned char*)gmalloc(icc_data_size);
+     if (fread(icc_data, icc_data_size, 1, file) != 1) {
+-      fprintf(stderr, "Error: unable to read icc profile %s\n", icc);
++      fprintf(stderr, "Error: unable to read icc profile %s\n", icc.getCString());
+       exit(4);
+     }
+     fclose(file);
+@@ -902,6 +903,10 @@ int main(int argc, char *argv[]) {
+     lastPage = firstPage;
+   }
+ 
++  // Make sure firstPage is always used so that beginDocument() is called
++  if ((printOnlyEven && firstPage % 2 == 0) || (printOnlyOdd && firstPage % 2 == 1))
++    firstPage++;
++
+   cairoOut = new CairoOutputDev();
+   cairoOut->startDoc(doc->getXRef(), doc->getCatalog());
+   if (sz != 0)
+--- a/utils/pdftohtml.cc	2011-08-18 18:25:53.000000000 +0200
++++ b/utils/pdftohtml.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -13,12 +13,13 @@
+ // All changes made under the Poppler project to this file are licensed
+ // under GPL version 2 or later
+ //
+-// Copyright (C) 2007-2008, 2010 Albert Astals Cid <aacid at kde.org>
++// Copyright (C) 2007-2008, 2010, 2012 Albert Astals Cid <aacid at kde.org>
+ // Copyright (C) 2010 Hib Eris <hib at hiberis.nl>
+ // Copyright (C) 2010 Mike Slegeir <tehpola at yahoo.com>
+ // Copyright (C) 2010 Suzuki Toshiya <mpsuzuki at hiroshima-u.ac.jp>
+ // Copyright (C) 2010 OSSD CDAC Mumbai by Leena Chourey (leenac at cdacmumbai.in) and Onkar Potdar (onkar at cdacmumbai.in)
+ // Copyright (C) 2011 Steven Murdoch <Steven.Murdoch at cl.cam.ac.uk>
++// Copyright (C) 2012 Igor Slepchin <igor.redhat at gmail.com>
+ //
+ // To see a description of the changes please see the Changelog file that
+ // came with your tarball or type make ChangeLog if you are building from git
+@@ -404,7 +405,7 @@ int main(int argc, char *argv[]) {
+ 		      gTrue, gFalse, gFalse);
+   	if (!xml)
+ 	{
+-		htmlOut->dumpDocOutline(doc->getCatalog());
++		htmlOut->dumpDocOutline(doc);
+ 	}
+   }
+   
+@@ -527,7 +528,6 @@ static GooString* getInfoString(Dict *in
+     rawString = obj.getString();
+ 
+     // Convert rawString to unicode
+-    encodedString = new GooString();
+     if (rawString->hasUnicodeMarker()) {
+       isUnicode = gTrue;
+       unicodeLength = (obj.getString()->getLength() - 2) / 2;
+--- a/utils/pdfunite.cc	2011-09-27 00:06:17.000000000 +0200
++++ b/utils/pdfunite.cc	2012-02-29 18:16:00.000000000 +0100
+@@ -5,9 +5,11 @@
+ // This file is licensed under the GPLv2 or later
+ //
+ // Copyright (C) 2011 Thomas Freitag <Thomas.Freitag at alfa.de>
++// Copyright (C) 2012 Arseny Solokha <asolokha at gmx.com>
+ //
+ //========================================================================
+ #include <PDFDoc.h>
++#include <GlobalParams.h>
+ #include "parseargs.h"
+ #include "config.h"
+ #include <poppler-config.h>
+@@ -66,6 +68,7 @@ int main (int argc, char *argv[])
+     return exitCode;
+   }
+   exitCode = 0;
++  globalParams = new GlobalParams();
+ 
+   for (i = 1; i < argc - 1; i++) {
+     GooString *gfileName = new GooString(argv[i]);
+@@ -172,5 +175,6 @@ int main (int argc, char *argv[])
+   delete countRef;
+   for (j = 0; j < (int) pages.size (); j++) pages[j].free();
+   for (i = 0; i < (int) docs.size (); i++) delete docs[i];
++  delete globalParams;
+   return exitCode;
+ }
diff --git a/poppler.spec b/poppler.spec
index c5d3e79..9b6465a 100644
--- a/poppler.spec
+++ b/poppler.spec
@@ -2,7 +2,7 @@
 Summary: PDF rendering library
 Name: poppler
 Version: 0.18.0
-Release: 2%{?dist}
+Release: 3%{?dist}
 License: GPLv2
 Group: Development/Libraries
 URL:     http://poppler.freedesktop.org/
@@ -16,6 +16,7 @@ Patch1: poppler-0.12.4-annot-appearance.patch
 # http://bugzilla.redhat.com/show_bug.cgi?id=751599
 Patch2: poppler-0.18.0-cairo-check.patch
 
+Patch3: poppler-0.18.4.patch
 
 Requires: poppler-data >= 0.4.0
 BuildRequires: automake libtool
@@ -124,6 +125,7 @@ converting PDF files to a number of other formats.
 
 #%patch1 -p1 -b .annot
 %patch2 -p1 -b .cairo-check
+%patch3 -p1 -b .poppler-0.18.4
 
 chmod -x goo/GooTimer.h
 
@@ -223,6 +225,9 @@ rm -fv $RPM_BUILD_ROOT%{_libdir}/lib*.la
 
 
 %changelog
+* Thu Apr 26 2012 Marek Kasik <mkasik at redhat.com> - 0.18.0-3
+- Backport of the most important changes from 0.18.1 - 0.18.4
+
 * Fri Nov 11 2011 Marek Kasik <mkasik at redhat.com> - 0.18.0-2
 - Check "cairo" for NULL in clipToStrokePath()
 - Resolves: #751599


More information about the scm-commits mailing list