fixed type3 memory overflow
[swftools.git] / lib / pdf / xpdf-changes.patch
1 Index: Gfx.cc
2 ===================================================================
3 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/Gfx.cc,v
4 retrieving revision 1.9
5 retrieving revision 1.10
6 diff -u -r1.9 -r1.10
7 --- Gfx.cc      3 Dec 2005 10:11:33 -0000       1.9
8 +++ Gfx.cc      3 Dec 2005 10:30:41 -0000       1.10
9 @@ -439,7 +439,11 @@
10    fontChanged = gFalse;
11    clip = clipNone;
12    ignoreUndef = 0;
13 -  out->startPage(pageNum, state);
14 +  if(cropBox) {
15 +      out->startPage(pageNum, state, cropBox->x1,cropBox->y1,cropBox->x2,cropBox->y2);
16 +  } else {
17 +      out->startPage(pageNum, state, 0,0,0,0);
18 +  }
19    out->setDefaultCTM(state->getCTM());
20    out->updateAll(state);
21    for (i = 0; i < 6; ++i) {
22 @@ -450,7 +450,8 @@
23    abortCheckCbkData = abortCheckCbkDataA;
24  
25    // set crop box
26 -  if (cropBox) {
27 +#ifdef XPDFEXE
28 +  if (cropBox) {
29      state->moveTo(cropBox->x1, cropBox->y1);
30      state->lineTo(cropBox->x2, cropBox->y1);
31      state->lineTo(cropBox->x2, cropBox->y2);
32 @@ -459,7 +460,8 @@
33      state->clip();
34      out->clip(state);
35      state->clearPath();
36 -  }
37 +  }
38 +#endif
39  }
40  
41  Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict,
42 Index: GfxFont.h
43 ===================================================================
44 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/GfxFont.h,v
45 retrieving revision 1.6
46 retrieving revision 1.7
47 diff -u -r1.6 -r1.7
48 --- GfxFont.h   3 Dec 2005 10:11:33 -0000       1.6
49 +++ GfxFont.h   3 Dec 2005 10:30:41 -0000       1.7
50 @@ -207,7 +207,7 @@
51    CharCodeToUnicode *getToUnicode();
52  
53    // Return the character name associated with <code>.
54 -  char *getCharName(int code) { return enc[code]; }
55 +  char *getCharName(int code) { return code>=256?0:enc[code]; }
56  
57    // Returns true if the PDF font specified an encoding.
58    GBool getHasEncoding() { return hasEncoding; }
59 Index: GfxState.cc
60 ===================================================================
61 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/GfxState.cc,v
62 retrieving revision 1.10
63 retrieving revision 1.12
64 diff -u -r1.10 -r1.12
65 --- GfxState.cc 3 Dec 2005 10:11:33 -0000       1.10
66 +++ GfxState.cc 3 Dec 2005 12:41:32 -0000       1.12
67 @@ -21,6 +21,7 @@
68  #include "Array.h"
69  #include "Page.h"
70  #include "GfxState.h"
71 +#include "cmyk.h"
72  
73  //------------------------------------------------------------------------
74  
75 @@ -468,6 +469,18 @@
76                                 - 0.11 * color->c[2] + 0.5));
77  }
78  
79 +/*void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
80 +    unsigned char r,g,b;
81 +    float c = color->c[0];
82 +    float m = color->c[1];
83 +    float y = color->c[2];
84 +    float k = color->c[3];
85 +    convert_cmyk2rgb(c,m,y,k, &r,&g,&b);
86 +    rgb->r = r/255.0;
87 +    rgb->g = g/255.0;
88 +    rgb->b = b/255.0;
89 +}*/
90 +
91  void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
92    double c, m, y, k, c1, m1, y1, k1, r, g, b, x;
93  
94 @@ -3099,6 +3112,7 @@
95    GfxIndexedColorSpace *indexedCS;
96    GfxSeparationColorSpace *sepCS;
97    int maxPixel, indexHigh;
98 +  int maxPixelForAlloc;
99    Guchar *lookup2;
100    Function *sepFunc;
101    Object obj;
102 @@ -3111,6 +3125,7 @@
103    // bits per component and color space
104    bits = bitsA;
105    maxPixel = (1 << bits) - 1;
106 +  maxPixelForAlloc = (1 << (bits>8?bits:8));
107    colorSpace = colorSpaceA;
108  
109    // get decode map
110 @@ -3163,7 +3178,7 @@
111      lookup2 = indexedCS->getLookup();
112      colorSpace2->getDefaultRanges(x, y, indexHigh);
113      for (k = 0; k < nComps2; ++k) {
114 -      lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
115 +      lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1,
116                                            sizeof(GfxColorComp));
117        for (i = 0; i <= maxPixel; ++i) {
118         j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5);
119 @@ -3182,7 +3197,7 @@
120      nComps2 = colorSpace2->getNComps();
121      sepFunc = sepCS->getFunc();
122      for (k = 0; k < nComps2; ++k) {
123 -      lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
124 +      lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1,
125                                            sizeof(GfxColorComp));
126        for (i = 0; i <= maxPixel; ++i) {
127         x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel;
128 @@ -3192,7 +3207,7 @@
129      }
130    } else {
131      for (k = 0; k < nComps; ++k) {
132 -      lookup[k] = (GfxColorComp *)gmallocn(maxPixel + 1,
133 +      lookup[k] = (GfxColorComp *)gmallocn(maxPixelForAlloc + 1,
134                                            sizeof(GfxColorComp));
135        for (i = 0; i <= maxPixel; ++i) {
136         lookup[k][i] = dblToCol(decodeLow[k] +
137 @@ -3754,7 +3769,10 @@
138  }
139  
140  void GfxState::setPath(GfxPath *pathA) {
141 +  if(pathA) {
142 +      if(path)
143    delete path;
144 +  }
145    path = pathA;
146  }
147
148 Index: GlobalParams.cc
149 ===================================================================
150 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/GlobalParams.cc,v
151 retrieving revision 1.4
152 retrieving revision 1.7
153 diff -u -r1.4 -r1.7
154 --- GlobalParams.cc     3 Dec 2005 10:11:33 -0000       1.4
155 +++ GlobalParams.cc     18 Dec 2005 08:31:22 -0000      1.7
156 @@ -498,6 +498,29 @@
157    char buf[512];
158    FILE *f2;
159  
160 +  /* extract path */
161 +  if(fileName) {
162 +    char* cfgFileName = fileName->getCString();
163 +    char* pos1 = strrchr(cfgFileName, '/');
164 +    char* pos2 = strrchr(cfgFileName, '\\');
165 +    char* p = pos1>pos2?pos1:pos2;
166 +    int pos = p ? p-cfgFileName : -1;
167 +    GString*path = new GString(new GString(cfgFileName), 0, (pos < 0 ? strlen(cfgFileName): pos));
168 +    if(pos1>=0)
169 +       path->append('/');
170 +    else if(pos2>=0)
171 +       path->append('\\');
172 +    else
173 +#ifdef WIN32
174 +       path->append('\\');
175 +#else
176 +       path->append('/');
177 +#endif
178 +    this->path = path;
179 +  } else {
180 +    this->path = new GString();
181 +  }
182 +  
183    line = 1;
184    while (getLine(buf, sizeof(buf) - 1, f)) {
185  
186 @@ -1142,6 +1165,42 @@
187    deleteGList(tokens, GString);
188  }
189  
190 +static char is_absolute(char*filename)
191 +{
192 +    int l = strlen(filename);
193 +    if(filename[0] == '/' || filename[0] == '\\') 
194 +       return 1;
195 +    if(l>2 && filename[1]==':' && (filename[2]=='\\' || filename[2]=='/'))
196 +       return 1;
197 +    return 0;
198 +}
199 +
200 +static GString* qualify_filename(GString*path, GString*filename)
201 +{
202 +  GString*fullpath = 0;
203 +  char*prefix = "/usr/local/share/xpdf/";
204 +
205 +  if (!is_absolute(filename->getCString())) {
206 +    /* relative path */
207 +    fullpath = path->copy();
208 +    fullpath->append(filename);
209 +  } else if (!strncmp(filename->getCString(), prefix, strlen(prefix))) {
210 +    /* xpdf default path */
211 +    char*s = strchr(filename->getCString()+strlen(prefix), '/');
212 +    if(s) {
213 +       fullpath = path->copy();
214 +       fullpath->append(s+1);
215 +    } else {
216 +       fullpath = filename->copy();
217 +    }
218 +  } else {
219 +    /* absolute path */
220 +    fullpath = filename->copy();
221 +  }
222 +  //printf("%s -%s-> %s\n", filename->getCString(), path->getCString(), fullpath->getCString());
223 +  return fullpath;
224 +}
225 +
226  void GlobalParams::parseNameToUnicode(GList *tokens, GString *fileName,
227                                          int line) {
228    GString *name;
229 @@ -1156,10 +1215,10 @@
230           fileName->getCString(), line);
231      return;
232    }
233 -  name = (GString *)tokens->get(1);
234 +  name = qualify_filename(this->path, (GString *)tokens->get(1));
235    if (!(f = fopen(name->getCString(), "r"))) {
236 -    error(-1, "Couldn't open 'nameToUnicode' file '%s'",
237 -         name->getCString());
238 +    error(-1, "Couldn't open 'nameToUnicode' file '%s' using path '%s'",
239 +         name->getCString(), path->getCString());
240      return;
241    }
242    line2 = 1;
243 @@ -705,10 +754,12 @@
244    }
245    collection = (GString *)tokens->get(1);
246    name = (GString *)tokens->get(2);
247 +
248    if ((old = (GString *)cidToUnicodes->remove(collection))) {
249      delete old;
250    }
251 -  cidToUnicodes->add(collection->copy(), name->copy());
252 +
253 +  cidToUnicodes->add(collection->copy(), qualify_filename(this->path, name));
254  }
255  
256  void GlobalParams::parseUnicodeToUnicode(GList *tokens, GString *fileName,
257 @@ -725,7 +776,8 @@
258    if ((old = (GString *)unicodeToUnicodes->remove(font))) {
259      delete old;
260    }
261 -  unicodeToUnicodes->add(font->copy(), file->copy());
262 +
263 +  unicodeToUnicodes->add(font->copy(), qualify_filename(this->path, file));
264  }
265  
266  void GlobalParams::parseUnicodeMap(GList *tokens, GString *fileName,
267 @@ -742,7 +794,8 @@
268    if ((old = (GString *)unicodeMaps->remove(encodingName))) {
269      delete old;
270    }
271 -  unicodeMaps->add(encodingName->copy(), name->copy());
272 +
273 +  unicodeMaps->add(encodingName->copy(), qualify_filename(this->path, name));
274  }
275  
276  void GlobalParams::parseCMapDir(GList *tokens, GString *fileName, int line) {
277 @@ -760,23 +813,30 @@
278      list = new GList();
279      cMapDirs->add(collection->copy(), list);
280    }
281 -  list->append(dir->copy());
282 +
283 +  list->append(qualify_filename(this->path, dir));
284  }
285  
286  void GlobalParams::parseToUnicodeDir(GList *tokens, GString *fileName,
287                                      int line) {
288 +  GString *dir;
289 +
290    if (tokens->getLength() != 2) {
291      error(-1, "Bad 'toUnicodeDir' config file command (%s:%d)",
292           fileName->getCString(), line);
293      return;
294    }
295 -  toUnicodeDirs->append(((GString *)tokens->get(1))->copy());
296 +
297 +  dir = (GString *)tokens->get(1);
298 +
299 +  toUnicodeDirs->append(qualify_filename(this->path, dir));
300  }
301  
302  void GlobalParams::parseDisplayFont(GList *tokens, GHash *fontHash,
303                                     DisplayFontParamKind kind,
304                                     GString *fileName, int line) {
305    DisplayFontParam *param, *old;
306 +  GString *file;
307  
308    if (tokens->getLength() < 2) {
309      goto err1;
310 @@ -788,13 +848,15 @@
311      if (tokens->getLength() != 3) {
312        goto err2;
313      }
314 -    param->t1.fileName = ((GString *)tokens->get(2))->copy();
315 +    file = (GString *)tokens->get(2);
316 +    param->t1.fileName = qualify_filename(this->path, file);
317      break;
318    case displayFontTT:
319      if (tokens->getLength() != 3) {
320        goto err2;
321      }
322 -    param->tt.fileName = ((GString *)tokens->get(2))->copy();
323 +    file = (GString *)tokens->get(2);
324 +    param->tt.fileName = qualify_filename(this->path, file);
325      break;
326    }
327  
328 Index: Lexer.cc
329 ===================================================================
330 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/Lexer.cc,v
331 retrieving revision 1.4
332 retrieving revision 1.5
333 diff -u -r1.4 -r1.5
334 --- Lexer.cc    3 Dec 2005 10:11:33 -0000       1.4
335 +++ Lexer.cc    14 Mar 2006 12:43:23 -0000      1.5
336 @@ -74,6 +74,7 @@
337      curStr.streamReset();
338    }
339  }
340 +static int illegalChars = 0;
341  
342  Lexer::~Lexer() {
343    if (!curStr.isNone()) {
344 @@ -83,6 +84,9 @@
345    if (freeArray) {
346      delete streams;
347    }
348 +  if(illegalChars)
349 +      error(0, "Illegal characters in hex string (%d)", illegalChars);
350 +  illegalChars = 0;
351  }
352  
353  int Lexer::getChar() {
354 @@ -330,7 +334,8 @@
355         } else if (c2 >= 'a' && c2 <= 'f') {
356           c += c2 - 'a' + 10;
357         } else {
358 -         error(getPos(), "Illegal digit in hex char in name");
359 +         illegalChars++;
360 +         //error(getPos(), "Illegal digit in hex char in name");
361         }
362        }
363       notEscChar:
364 @@ -384,8 +389,10 @@
365             c2 += c - 'A' + 10;
366           else if (c >= 'a' && c <= 'f')
367             c2 += c - 'a' + 10;
368 -         else
369 -           error(getPos(), "Illegal character <%02x> in hex string", c);
370 +         else {
371 +           illegalChars++;
372 +           //error(getPos(), "Illegal character <%02x> in hex string", c);
373 +         }
374           if (++m == 2) {
375             if (n == tokBufSize) {
376               if (!s)
377 @@ -421,7 +428,8 @@
378        tokBuf[2] = '\0';
379        obj->initCmd(tokBuf);
380      } else {
381 -      error(getPos(), "Illegal character '>'");
382 +      illegalChars++;
383 +      //error(getPos(), "Illegal character '>'");
384        obj->initError();
385      }
386      break;
387 @@ -430,7 +438,8 @@
388    case ')':
389    case '{':
390    case '}':
391 -    error(getPos(), "Illegal character '%c'", c);
392 +    //error(getPos(), "Illegal character '%c'", c);
393 +    illegalChars++;
394      obj->initError();
395      break;
396  
397 @@ -459,7 +468,6 @@
398      }
399      break;
400    }
401 -
402    return obj;
403  }
404  
405 Index: Link.cc
406 ===================================================================
407 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/Link.cc,v
408 retrieving revision 1.5
409 retrieving revision 1.6
410 diff -u -r1.5 -r1.6
411 --- Link.cc     3 Dec 2005 10:11:33 -0000       1.5
412 +++ Link.cc     26 Mar 2006 08:26:59 -0000      1.6
413 @@ -430,10 +430,9 @@
414        delete dest;
415        dest = NULL;
416      }
417 -
418    // error
419    } else {
420 -    error(-1, "Illegal annotation destination");
421 +    error(-1, "Illegal annotation destination %d", destObj->getType());
422    }
423  }
424  
425 @@ -468,10 +467,9 @@
426        delete dest;
427        dest = NULL;
428      }
429 -
430    // error
431    } else {
432 -    error(-1, "Illegal annotation destination");
433 +    error(-1, "Illegal annotation destination %d", destObj->getType());
434    }
435  }
436  
437 Index: OutputDev.h
438 ===================================================================
439 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/OutputDev.h,v
440 retrieving revision 1.7
441 retrieving revision 1.9
442 diff -u -r1.7 -r1.9
443 --- OutputDev.h 3 Dec 2005 10:11:33 -0000       1.7
444 +++ OutputDev.h 3 Dec 2005 10:31:47 -0000       1.9
445 @@ -74,7 +74,7 @@
446    virtual void setDefaultCTM(double *ctm);
447  
448    // Start a page.
449 -  virtual void startPage(int pageNum, GfxState *state) {}
450 +  virtual void startPage(int pageNum, GfxState *state, double x1,double y1,double x2,double y2) {}
451  
452    // End a page.
453    virtual void endPage() {}
454 Index: Stream.cc
455 ===================================================================
456 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/Stream.cc,v
457 retrieving revision 1.7
458 retrieving revision 1.8
459 diff -u -r1.7 -r1.8
460 --- Stream.cc   3 Dec 2005 10:11:33 -0000       1.7
461 +++ Stream.cc   3 Dec 2005 10:30:41 -0000       1.8
462 @@ -17,6 +17,8 @@
463  #include <stddef.h>
464  #ifndef WIN32
465  #include <unistd.h>
466 +#else
467 +extern "C" int unlink(char *filename);
468  #endif
469  #include <string.h>
470  #include <ctype.h>
471 Index: gfile.h
472 ===================================================================
473 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/gfile.h,v
474 retrieving revision 1.9
475 retrieving revision 1.10
476 diff -u -r1.9 -r1.10
477 --- gfile.h     3 Dec 2005 10:11:33 -0000       1.9
478 +++ gfile.h     3 Dec 2005 10:30:41 -0000       1.10
479 @@ -58,6 +58,9 @@
480  // Get current directory.
481  extern GString *getCurrentDir();
482  
483 +/* create a temporary filename */
484 +char* mktmpname(char*ptr);
485 +
486  // Append a file name to a path string.  <path> may be an empty
487  // string, denoting the current directory).  Returns <path>.
488  extern GString *appendToPath(GString *path, char *fileName);
489 Index: GlobalParams.h
490 ===================================================================
491 RCS file: /home/kramm/cvs/swftools.cache.cvsroot/swftools.cache/pdf2swf/xpdf/GlobalParams.h,v
492 retrieving revision 1.5
493 retrieving revision 1.6
494 diff -u -r1.5 -r1.6
495 --- GlobalParams.h      2006-10-10 19:54:29.000000000 +0200
496 +++ GlobalParams.h      2006-11-12 11:19:40.000000000 +0100
497 @@ -213,8 +213,8 @@
498    FILE *getUnicodeMapFile(GString *encodingName);
499    FILE *findCMapFile(GString *collection, GString *cMapName);
500    FILE *findToUnicodeFile(GString *name);
501 -  DisplayFontParam *getDisplayFont(GString *fontName);
502 -  DisplayFontParam *getDisplayCIDFont(GString *fontName, GString *collection);
503 +  virtual DisplayFontParam *getDisplayFont(GString *fontName);
504 +  virtual DisplayFontParam *getDisplayCIDFont(GString *fontName, GString *collection);
505    GString *getPSFile();
506    int getPSPaperWidth();
507    int getPSPaperHeight();
508 @@ -218,1 +218,1 @@
509 -  void parseFile(GString *fileName, FILE *f);
510 +public: void parseFile(GString *fileName, FILE *f); private:
511 @@ -246,6 +246,10 @@
512    GBool loadPlugin(char *type, char *name);
513  #endif
514  
515 +  //----- config file base path
516 +
517 +  GString*path;
518 +
519    //----- static tables
520  
521    NameToCharCode *             // mapping from char name to
522 --- SplashOutputDev.h   2006-11-12 12:07:22.000000000 +0100
523 +++ SplashOutputDev.h   2006-11-12 12:08:48.000000000 +0100
524 @@ -70,7 +70,7 @@
525    //----- initialization and control
526  
527    // Start a page.
528 -  virtual void startPage(int pageNum, GfxState *state);
529 +  virtual void startPage(int pageNum, GfxState *state, double x1,double y1,double x2,double y2);
530  
531    // End a page.
532    virtual void endPage();
533 --- TextOutputDev.cc    2006-11-12 12:22:53.000000000 +0100
534 +++ TextOutputDev.cc    2006-11-12 12:25:03.000000000 +0100
535 @@ -3805,7 +3805,7 @@
536    }
537  }
538  
539 -void TextOutputDev::startPage(int pageNum, GfxState *state) {
540 +void TextOutputDev::startPage(int pageNum, GfxState *state, double x1,double y1,double x2,double y2) {
541    text->startPage(state);
542  }
543  
544 --- CoreOutputDev.cc    2006-11-12 12:21:59.000000000 +0100
545 +++ CoreOutputDev.cc    2006-11-12 12:23:29.000000000 +0100
546 @@ -57,5 +57,5 @@
547  
548  void CoreOutputDev::clear() {
549    startDoc(NULL);
550 -  startPage(0, NULL);
551 +  startPage(0, NULL, 0,0,0,0);
552  }
553 --- SplashFTFontEngine.cc       2006-11-19 22:30:44.000000000 +0100
554 +++ SplashFTFontEngine.cc       2006-11-19 22:30:56.000000000 +0100
555 @@ -13,9 +13,7 @@
556  #endif
557  
558  #include <stdio.h>
559 -#ifndef WIN32
560  #  include <unistd.h>
561 -#endif
562  #include "gmem.h"
563  #include "GString.h"
564  #include "gfile.h"
565 --- SplashOutputDev.cc  2007-09-09 12:29:45.000000000 +0200
566 +++ SplashOutputDev.cc  2007-09-09 12:30:02.000000000 +0200
567 @@ -13,6 +13,7 @@
568  #endif
569  
570  #include <string.h>
571 +#include <unistd.h>
572  #include <math.h>
573  #include "gfile.h"
574  #include "GlobalParams.h"
575 @@ -702,7 +703,7 @@
576    nT3Fonts = 0;
577  }
578  
579 -void SplashOutputDev::startPage(int pageNum, GfxState *state) {
580 +void SplashOutputDev::startPage(int pageNum, GfxState *state, double x1,double y1,double x2,double y2) {
581    int w, h;
582    double *ctm;
583    SplashCoord mat[6];
584 @@ -2646,9 +2647,9 @@
585  
586    softMask = new SplashBitmap(bitmap->getWidth(), bitmap->getHeight(),
587                               1, splashModeMono8, gFalse);
588 -  memset(softMask->getDataPtr(), 0,
589 -        softMask->getRowSize() * softMask->getHeight());
590 +  memset(softMask->getDataPtr(), 0x00, softMask->getRowSize()*softMask->getHeight());
591    p = softMask->getDataPtr() + ty * softMask->getRowSize() + tx;
592 +  if (tx<softMask->getWidth() && ty<softMask->getHeight())
593    for (y = 0; y < tBitmap->getHeight(); ++y) {
594      for (x = 0; x < tBitmap->getWidth(); ++x) {
595        tBitmap->getPixel(x, y, color);
596 --- SplashFontFile.cc   2007-09-09 12:33:00.000000000 +0200
597 +++ SplashFontFile.cc   2007-09-09 12:33:07.000000000 +0200
598 @@ -11,9 +11,7 @@
599  #endif
600  
601  #include <stdio.h>
602 -#ifndef WIN32
603 -#  include <unistd.h>
604 -#endif
605 +#include <unistd.h>
606  #include "GString.h"
607  #include "SplashFontFile.h"
608  #include "SplashFontFileID.h"
609 --- xpdf/SplashFont.h.orig      2008-09-09 21:31:01.000000000 +0200
610 +++ xpdf/SplashFont.h   2008-10-05 17:36:44.000000000 +0200
611 @@ -73,6 +73,9 @@
612    virtual GBool makeGlyph(int c, int xFrac, int yFrac,
613                           SplashGlyphBitmap *bitmap) = 0;
614  
615 +  // return the number of characters in this font
616 +  virtual int getNumChars() = 0;
617 +
618    // Return the path for a glyph.
619    virtual SplashPath *getGlyphPath(int c) = 0;
620  
621 @@ -83,6 +86,9 @@
622    void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
623      { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
624  
625 +  double ascender;
626 +  double descender;
627 +  double last_advance; //set after getGlyphPath()
628  protected:
629  
630    SplashFontFile *fontFile;
631 --- orig/GfxFont.h      2007-07-28 00:11:06.000000000 +0200
632 +++ GfxFont.h   2007-09-09 18:31:31.000000000 +0200
633 @@ -164,6 +164,7 @@
634    virtual int getNextChar(char *s, int len, CharCode *code,
635                           Unicode *u, int uSize, int *uLen,
636                           double *dx, double *dy, double *ox, double *oy) = 0;
637 +  virtual CharCodeToUnicode* getCTU() = 0;
638  
639  protected:
640  
641 @@ -204,6 +205,7 @@
642    virtual int getNextChar(char *s, int len, CharCode *code,
643                           Unicode *u, int uSize, int *uLen,
644                           double *dx, double *dy, double *ox, double *oy);
645 +  virtual CharCodeToUnicode* getCTU();
646  
647    // Return the encoding.
648    char **getEncoding() { return enc; }
649 @@ -266,6 +268,7 @@
650    virtual int getNextChar(char *s, int len, CharCode *code,
651                           Unicode *u, int uSize, int *uLen,
652                           double *dx, double *dy, double *ox, double *oy);
653 +  virtual CharCodeToUnicode* getCTU();
654  
655    // Return the writing mode (0=horizontal, 1=vertical).
656    virtual int getWMode();
657 --- orig/GfxFont.cc     2007-07-28 00:11:06.000000000 +0200
658 +++ GfxFont.cc  2007-09-09 18:33:37.000000000 +0200
659 @@ -925,6 +925,10 @@
660    return 1;
661  }
662  
663 +CharCodeToUnicode* Gfx8BitFont::getCTU() {
664 +    return ctu;
665 +}
666 +
667  CharCodeToUnicode *Gfx8BitFont::getToUnicode() {
668    ctu->incRefCnt();
669    return ctu;
670 @@ -1417,6 +1421,10 @@
671    }
672  }
673  
674 +CharCodeToUnicode* GfxCIDFont::getCTU() {
675 +    return ctu;
676 +}
677 +
678  int GfxCIDFont::getNextChar(char *s, int len, CharCode *code,
679                             Unicode *u, int uSize, int *uLen,
680                             double *dx, double *dy, double *ox, double *oy) {
681 --- OutputDev.h Sat Jul 28 00:11:08 2007
682 +++ OutputDev.h Sun Sep  9 13:50:40 2007
683 @@ -17,6 +17,7 @@
684  
685  #include "gtypes.h"
686  #include "CharTypes.h"
687 +#include "Object.h"
688  
689  class GString;
690  class Gfx;
691 --- SplashOutputDev.h   2007-10-20 13:17:02.000000000 +0200
692 +++ SplashOutputDev.h   2007-10-20 13:17:23.000000000 +0200
693 @@ -206,6 +206,7 @@
694    virtual void setVectorAntialias(GBool vaa);
695  #endif
696  
697 +  void doUpdateFont(GfxState *state);
698  private:
699  
700    void setupScreenParams(double hDPI, double vDPI);
701 @@ -215,7 +216,6 @@
702    SplashPattern *getColor(GfxGray gray, GfxRGB *rgb);
703  #endif
704    SplashPath *convertPath(GfxState *state, GfxPath *path);
705 -  void doUpdateFont(GfxState *state);
706    void drawType3Glyph(T3FontCache *t3Font,
707                       T3FontCacheTag *tag, Guchar *data);
708    static GBool imageMaskSrc(void *data, SplashColorPtr line);
709 --- xpdf/GlobalParams.h 2007-10-20 13:18:03.000000000 +0200
710 +++ xpdf/GlobalParams.h 2007-10-20 13:25:52.000000000 +0200
711 @@ -196,7 +196,7 @@
712    // file.
713    GlobalParams(char *cfgFileName);
714  
715 -  ~GlobalParams();
716 +  virtual ~GlobalParams();
717  
718    void setBaseDir(char *dir);
719    void setupBaseFonts(char *dir);
720 --- xpdf/SplashOutputDev.h.orig 2007-10-21 17:43:29.000000000 +0200
721 +++ xpdf/SplashOutputDev.h      2007-11-19 10:07:27.000000000 +0100
722 @@ -197,6 +197,8 @@
723  #endif
724  
725    void doUpdateFont(GfxState *state);
726 +  
727 +  SplashPath *convertPath(GfxState *state, GfxPath *path);
728  private:
729  
730    void setupScreenParams(double hDPI, double vDPI);
731 @@ -205,7 +207,6 @@
732  #else
733    SplashPattern *getColor(GfxGray gray, GfxRGB *rgb);
734  #endif
735 -  SplashPath *convertPath(GfxState *state, GfxPath *path);
736    void drawType3Glyph(T3FontCache *t3Font,
737                       T3FontCacheTag *tag, Guchar *data);
738    static GBool imageMaskSrc(void *data, SplashColorPtr line);
739 --- xpdf/SplashFont.cc.orig     2008-09-09 21:31:01.000000000 +0200
740 +++ xpdf/SplashFont.cc  2008-10-05 17:37:08.000000000 +0200
741 @@ -48,6 +48,10 @@
742    cacheTags = NULL;
743  
744    xMin = yMin = xMax = yMax = 0;
745 +
746 +  last_advance = -1;
747 +  ascender = -1;
748 +  descender = -1;
749  }
750  
751  void SplashFont::initCache() {
752 --- xpdf/SplashFTFont.cc.orig   2009-03-08 17:19:08.000000000 +0100
753 +++ xpdf/SplashFTFont.cc        2009-03-15 19:18:11.000000000 +0100
754 @@ -46,6 +46,7 @@
755    int x, y;
756  
757    face = fontFileA->face;
758 +  
759    if (FT_New_Size(face, &sizeObj)) {
760      return;
761    }
762 @@ -54,6 +55,10 @@
763    if (FT_Set_Pixel_Sizes(face, 0, (int)size)) {
764      return;
765    }
766
767 +  this->ascender = face->ascender;
768 +  this->descender = face->descender;
769 +
770    // if the textMat values are too small, FreeType's fixed point
771    // arithmetic doesn't work so well
772    textScale = splashSqrt(textMat[2]*textMat[2] + textMat[3]*textMat[3]) / size;
773 @@ -228,6 +233,12 @@
774    GBool needClose;
775  };
776  
777 +int SplashFTFont::getNumChars()
778 +{
779 +  SplashFTFontFile* ff = (SplashFTFontFile *)fontFile;
780 +  return ff->face->num_glyphs;
781 +}
782 +
783  SplashPath *SplashFTFont::getGlyphPath(int c) {
784    static FT_Outline_Funcs outlineFuncs = {
785  #if FREETYPE_MINOR <= 1
786 @@ -249,6 +260,8 @@
787    FT_UInt gid;
788    FT_Glyph glyph;
789  
790 +  this->last_advance = -1;
791 +
792    ff = (SplashFTFontFile *)fontFile;
793    ff->face->size = sizeObj;
794    FT_Set_Transform(ff->face, &textMatrix, NULL);
795 @@ -262,17 +275,24 @@
796      // skip the TrueType notdef glyph
797      return NULL;
798    }
799 -  if (FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP)) {
800 +  int error = 0;
801 +  if ((error=FT_Load_Glyph(ff->face, gid, FT_LOAD_NO_BITMAP|FT_LOAD_NO_HINTING))) {
802 +      fprintf(stderr, "Truetype wasn't able to load glyph %d, error %d\n", gid, error);
803      return NULL;
804    }
805    if (FT_Get_Glyph(slot, &glyph)) {
806      return NULL;
807    }
808 +  this->last_advance = glyph->advance.x/65536.0;
809 +
810    path.path = new SplashPath();
811    path.textScale = textScale;
812    path.needClose = gFalse;
813 -  FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
814 +  error = FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
815                        &outlineFuncs, &path);
816 +  if(error) {
817 +      fprintf(stderr, "Truetype wasn't able to read glyph %d, error %d\n", gid, error);
818 +  }
819    if (path.needClose) {
820      path.path->close();
821    }
822 --- xpdf/SplashFTFont.h.orig    2008-09-09 21:31:01.000000000 +0200
823 +++ xpdf/SplashFTFont.h 2008-10-04 17:39:57.000000000 +0200
824 @@ -42,6 +42,9 @@
825    virtual GBool makeGlyph(int c, int xFrac, int yFrac,
826                           SplashGlyphBitmap *bitmap);
827  
828 +  // return the number of characters in this font
829 +  virtual int getNumChars();
830 +
831    // Return the path for a glyph.
832    virtual SplashPath *getGlyphPath(int c);
833  
834 --- xpdf/SplashScreen.cc.orig   2008-10-06 17:59:44.000000000 +0200
835 +++ xpdf/SplashScreen.cc        2008-10-06 18:20:09.000000000 +0200
836 @@ -363,6 +363,8 @@
837  int SplashScreen::test(int x, int y, Guchar value) {
838    int xx, yy;
839  
840 +  return 1;
841 +
842    if (value < minVal) {
843      return 0;
844    }
845 --- xpdf/gfile.cc.orig  2007-02-27 23:05:51.000000000 +0100
846 +++ xpdf/gfile.cc       2008-10-12 15:15:22.000000000 +0200
847 @@ -439,6 +439,52 @@
848  #endif
849  }
850  
851 +static char* getTempDir()
852 +{
853 +#ifdef WIN32
854 +    char*dir = getenv("TMP");
855 +    if(!dir) dir = getenv("TEMP");
856 +    if(!dir) dir = getenv("tmp");
857 +    if(!dir) dir = getenv("temp");
858 +    if(!dir) dir = "C:\\";
859 +#else
860 +    char* dir = "/tmp/";
861 +#endif
862 +    return dir;
863 +}
864 +
865 +char* mktmpname(char*ptr) {
866 +    static char tmpbuf[128];
867 +    char*dir = getTempDir();
868 +    int l = strlen(dir);
869 +    char*sep = "";
870 +    if(!ptr)
871 +       ptr = tmpbuf;
872 +    if(l && dir[l-1]!='/' && dir[l-1]!='\\') {
873 +#ifdef WIN32
874 +       sep = "\\";
875 +#else
876 +       sep = "/";
877 +#endif
878 +    }
879 +
880 + //   used to be mktemp. This does remove the warnings, but
881 + //   It's not exactly an improvement.
882 +#ifdef HAVE_LRAND48
883 +    sprintf(ptr, "%s%s%08x%08x",dir,sep,(unsigned int)lrand48(),(unsigned int)lrand48());
884 +#else
885 +#   ifdef HAVE_RAND
886 +       sprintf(ptr, "%s%s%08x%08x",dir,sep,rand(),rand());
887 +#   else
888 +       static int count = 1;
889 +       sprintf(ptr, "%s%s%08x%04x%04x",dir,sep,time(0),(unsigned int)tmpbuf^((unsigned int)tmpbuf)>>16,count);
890 +       count ++;
891 +#   endif
892 +#endif
893 +     return ptr;
894 +}
895 +
896 +
897  GBool openTempFile(GString **name, FILE **f, char *mode, char *ext) {
898  #if defined(WIN32)
899    //---------- Win32 ----------
900 @@ -460,7 +506,7 @@
901    s->append("x");
902    t = (int)time(NULL);
903    for (i = 0; i < 1000; ++i) {
904 -    sprintf(buf, "%d", t + i);
905 +    sprintf(buf, "%08x-%08x", t + i, GetCurrentThreadId());
906      s2 = s->copy()->append(buf);
907      if (ext) {
908        s2->append(ext);
909 @@ -468,8 +514,7 @@
910      if (!(f2 = fopen(s2->getCString(), "r"))) {
911        if (!(f2 = fopen(s2->getCString(), mode))) {
912         delete s2;
913 -       delete s;
914 -       return gFalse;
915 +        continue;
916        }
917        *name = s2;
918        *f = f2;
919 @@ -479,6 +524,7 @@
920      fclose(f2);
921      delete s2;
922    }
923 +  fprintf(stderr, "Couldn't create temporary file\n");
924    delete s;
925    return gFalse;
926  #elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS)
927 @@ -489,7 +535,7 @@
928    // with this file name after the tmpnam call and before the fopen
929    // call.  I will happily accept fixes to this function for non-Unix
930    // OSs.
931 -  if (!(s = tmpnam(NULL))) {
932 +  if (!(s = mktmpname(NULL))) {
933      return gFalse;
934    }
935    *name = new GString(s);
936 @@ -516,7 +562,7 @@
937      (*name)->append("/XXXXXX")->append(ext);
938      fd = mkstemps((*name)->getCString(), strlen(ext));
939  #else
940 -    if (!(s = tmpnam(NULL))) {
941 +    if (!(s = mktmpname(NULL))) {
942        return gFalse;
943      }
944      *name = new GString(s);
945 @@ -533,7 +579,7 @@
946      (*name)->append("/XXXXXX");
947      fd = mkstemp((*name)->getCString());
948  #else // HAVE_MKSTEMP
949 -    if (!(s = tmpnam(NULL))) {
950 +    if (!(s = mktmpname(NULL))) {
951        return gFalse;
952      }
953      *name = new GString(s);
954 --- xpdf/Gfx.cc.orig    2009-03-08 17:10:40.000000000 +0100
955 +++ xpdf/Gfx.cc 2009-03-08 17:18:23.000000000 +0100
956 @@ -3188,8 +3188,11 @@
957                             u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
958                             &dx, &dy, &originX, &originY);
959        dx = dx * state->getFontSize() + state->getCharSpace();
960 -      if (n == 1 && *p == ' ') {
961 -       dx += state->getWordSpace();
962 +      if (n == 1 && (*p == ' ' || *p == 0)) {
963 +        double w=state->getWordSpace();
964 +        if (w==0 && dx==0)
965 +          w=state->getFontSize()/3; // workaround for zero word space
966 +        dx += w;
967        }
968        dx *= state->getHorizScaling();
969        dy *= state->getFontSize();
970 @@ -3824,6 +3833,7 @@
971      out->beginTransparencyGroup(state, bbox, blendingColorSpace,
972                                 isolated, knockout, softMask);
973    }
974 +  GfxState*old_state = state;
975  
976    // set new base matrix
977    for (i = 0; i < 6; ++i) {
978 @@ -3835,6 +3845,9 @@
979    display(str, gFalse);
980  
981    if (softMask || transpGroup) {
982 +    // restore graphics state
983 +    while(state != old_state)
984 +       restoreState();
985      out->endTransparencyGroup(state);
986    }
987  
988 --- TextOutputDev.h.orig        2009-10-07 17:00:29.000000000 -0700
989 +++ TextOutputDev.h     2009-10-07 17:01:50.000000000 -0700
990 @@ -170,6 +170,7 @@
991    friend class TextFlow;
992    friend class TextWordList;
993    friend class TextPage;
994 +  friend class XMLOutputDev;
995  };
996  
997  //------------------------------------------------------------------------
998 @@ -578,7 +579,7 @@
999    //----- initialization and control
1000  
1001    // Start a page.
1002 -  virtual void startPage(int pageNum, GfxState *state);
1003 +  virtual void startPage(int pageNum, GfxState *state, double x1,double y1,double x2,double y2);
1004  
1005    // End a page.
1006    virtual void endPage();
1007 --- xpdf/JBIG2Stream.cc.orig    2010-01-08 17:17:18.000000000 -0800
1008 +++ xpdf/JBIG2Stream.cc 2010-01-21 15:28:26.000000000 -0800
1009 @@ -1514,11 +1514,14 @@
1010    }
1011  
1012    // compute symbol code length
1013 -  symCodeLen = 1;
1014 -  i = (numInputSyms + numNewSyms) >> 1;
1015 -  while (i) {
1016 -    ++symCodeLen;
1017 -    i >>= 1;
1018 +  symCodeLen = 0;
1019 +  i = 1;
1020 +  while (i < numInputSyms + numNewSyms) {
1021 +   ++symCodeLen;
1022 +   i <<= 1;
1023 +  }
1024 +  if (huff && symCodeLen == 0) {
1025 +   symCodeLen = 1;
1026    }
1027  
1028    // get the input symbol bitmaps
1029 @@ -1921,6 +1924,9 @@
1030      ++symCodeLen;
1031      i <<= 1;
1032    }
1033 +  if (huff && symCodeLen == 0) {
1034 +    symCodeLen = 1;
1035 +  }
1036  
1037    // get the symbol bitmaps
1038    syms = (JBIG2Bitmap **)gmallocn(numSyms, sizeof(JBIG2Bitmap *));
1039 --- xpdf/SplashXPathScanner.cc.orig     2010-01-21 16:00:38.000000000 -0800
1040 +++ xpdf/SplashXPathScanner.cc  2010-01-21 16:10:31.000000000 -0800
1041 @@ -394,10 +394,10 @@
1042           *p++ &= mask;
1043           xx = (xx & ~7) + 8;
1044         }
1045 -       for (; xx + 7 <= xx0; xx += 8) {
1046 +       for (; xx + 7 < xx0; xx += 8) {
1047           *p++ = 0x00;
1048         }
1049 -       if (xx <= xx0) {
1050 +       if (xx < xx0) {
1051           *p &= 0xff >> (xx0 & 7);
1052         }
1053        }
1054 @@ -417,10 +417,10 @@
1055         *p++ &= mask;
1056         xx = (xx & ~7) + 8;
1057        }
1058 -      for (; xx + 7 <= xx0; xx += 8) {
1059 +      for (; xx + 7 < xx0; xx += 8) {
1060         *p++ = 0x00;
1061        }
1062 -      if (xx <= xx0) {
1063 +      if (xx < xx0) {
1064         *p &= 0xff >> (xx0 & 7);
1065        }
1066      }
1067 --- xpdf/CharCodeToUnicode.cc.orig      2010-01-25 12:43:00.000000000 -0800
1068 +++ xpdf/CharCodeToUnicode.cc   2010-01-28 14:14:53.000000000 -0800
1069 @@ -208,13 +208,13 @@
1070                                    int nBits) {
1071    PSTokenizer *pst;
1072    char tok1[256], tok2[256], tok3[256];
1073 -  int nDigits, n1, n2, n3;
1074 +  int maxCode, n1, n2, n3;
1075    CharCode i;
1076    CharCode code1, code2;
1077    GString *name;
1078    FILE *f;
1079  
1080 -  nDigits = nBits / 4;
1081 +  maxCode = (nBits == 8) ? 0xff : (nBits == 16) ? 0xffff : 0xffffffff;
1082    pst = new PSTokenizer(getCharFunc, data);
1083    pst->getToken(tok1, sizeof(tok1), &n1);
1084    while (pst->getToken(tok2, sizeof(tok2), &n2)) {
1085 @@ -241,9 +241,9 @@
1086           error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
1087           break;
1088         }
1089 -       if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
1090 +       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
1091               tok2[0] == '<' && tok2[n2 - 1] == '>')) {
1092 -         error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
1093 +         error(-1, "Illegal entry in bfchar block in ToUnicode CMap.");
1094           continue;
1095         }
1096         tok1[n1 - 1] = tok2[n2 - 1] = '\0';
1097 @@ -251,6 +251,9 @@
1098           error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
1099           continue;
1100         }
1101 +        if (code1 > maxCode) {
1102 +          error(-1, "Invalid entry in bfchar block in ToUnicode CMap");
1103 +        }
1104         addMapping(code1, tok2 + 1, n2 - 2, 0);
1105        }
1106        pst->getToken(tok1, sizeof(tok1), &n1);
1107 @@ -266,8 +269,8 @@
1108           error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
1109           break;
1110         }
1111 -       if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
1112 -             n2 == 2 + nDigits && tok2[0] == '<' && tok2[n2 - 1] == '>')) {
1113 +       if (!(tok1[0] == '<' && tok1[n1 - 1] == '>' &&
1114 +             tok2[0] == '<' && tok2[n2 - 1] == '>')) {
1115           error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
1116           continue;
1117         }
1118 @@ -277,6 +280,10 @@
1119           error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
1120           continue;
1121         }
1122 +        if (code1 > maxCode || code2 > maxCode) {
1123 +           error(-1, "Invalid entry in bfrange block in ToUnicode CMap");
1124 +       }
1125 +
1126         if (!strcmp(tok3, "[")) {
1127           i = 0;
1128           while (pst->getToken(tok1, sizeof(tok1), &n1) &&
1129 --- xpdf/Decrypt.cc.orig        2010-01-28 14:19:51.000000000 -0800
1130 +++ xpdf/Decrypt.cc     2010-02-02 16:04:53.000000000 -0800
1131 @@ -596,6 +596,7 @@
1132    s->bufIdx = 0;
1133    if (last) {
1134      n = s->buf[15];
1135 +    if(!n || n>16) n=16;
1136      for (i = 15; i >= n; --i) {
1137        s->buf[i] = s->buf[i-n];
1138      }
1139 --- xpdf/Catalog.cc.orig        2010-02-02 16:17:24.000000000 -0800
1140 +++ xpdf/Catalog.cc     2010-02-02 16:18:48.000000000 -0800
1141 @@ -193,7 +193,7 @@
1142    if (!kids.isArray()) {
1143      error(-1, "Kids object (page %d) is wrong type (%s)",
1144           start+1, kids.getTypeName());
1145 -    goto err1;
1146 +    return start;
1147    }
1148    for (i = 0; i < kids.arrayGetLength(); ++i) {
1149      kids.arrayGetNF(i, &kidRef);
1150 --- xpdf/SplashOutputDev.cc.orig        2010-03-25 14:06:37.000000000 -0700
1151 +++ xpdf/SplashOutputDev.cc     2010-03-25 14:07:23.000000000 -0700
1152 @@ -13,6 +13,7 @@
1153 @@ -509,7 +510,14 @@
1154    glyphY = glyphYA;
1155    glyphW = glyphWA;
1156    glyphH = glyphHA;
1157 -  validBBox = validBBoxA;
1158 +
1159 +  if(glyphW<=0 || glyphH<=0 || (double)glyphH*(double)glyphW>536870912) {
1160 +    glyphW = glyphH = 128;
1161 +    validBBox = gFalse;
1162 +  } else {
1163 +    validBBox = validBBoxA;
1164 +  }
1165 +
1166    if (aa) {
1167      glyphSize = glyphW * glyphH;
1168    } else {