diff options
author | Daniel Gryniewicz <dang@gentoo.org> | 2005-12-28 19:04:03 +0000 |
---|---|---|
committer | Daniel Gryniewicz <dang@gentoo.org> | 2005-12-28 19:04:03 +0000 |
commit | b193048c6766686c0eafd1382e28b16f2737c50f (patch) | |
tree | 0cb48a89462bc8cd0f3690930c09bb7b09e54dda /app-text/poppler/files | |
parent | Fix joystick.h issue on SPARC. (diff) | |
download | gentoo-2-b193048c6766686c0eafd1382e28b16f2737c50f.tar.gz gentoo-2-b193048c6766686c0eafd1382e28b16f2737c50f.tar.bz2 gentoo-2-b193048c6766686c0eafd1382e28b16f2737c50f.zip |
Oops. Patch is too big for files; move to distdir
(Portage version: 2.1_pre2)
Diffstat (limited to 'app-text/poppler/files')
-rw-r--r-- | app-text/poppler/files/digest-poppler-0.4.3-r1 | 1 | ||||
-rw-r--r-- | app-text/poppler/files/poppler-0.4.3-utils.patch | 7859 |
2 files changed, 1 insertions, 7859 deletions
diff --git a/app-text/poppler/files/digest-poppler-0.4.3-r1 b/app-text/poppler/files/digest-poppler-0.4.3-r1 index 737819686e59..101e5bbaf715 100644 --- a/app-text/poppler/files/digest-poppler-0.4.3-r1 +++ b/app-text/poppler/files/digest-poppler-0.4.3-r1 @@ -1 +1,2 @@ +MD5 7952d78e9dece4f6f04a96af8185e197 poppler-0.4.3-utils.patch.gz 46235 MD5 791dc78d8366eb05580183fe85174555 poppler-0.4.3.tar.gz 779582 diff --git a/app-text/poppler/files/poppler-0.4.3-utils.patch b/app-text/poppler/files/poppler-0.4.3-utils.patch deleted file mode 100644 index a3e5fcff92a6..000000000000 --- a/app-text/poppler/files/poppler-0.4.3-utils.patch +++ /dev/null @@ -1,7859 +0,0 @@ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/configure.ac poppler-0.4.3/configure.ac ---- poppler-0.4.3.orig/configure.ac 2005-12-12 17:46:00.000000000 -0500 -+++ poppler-0.4.3/configure.ac 2005-12-26 21:28:15.000000000 -0500 -@@ -437,6 +437,7 @@ - fofi/Makefile - splash/Makefile - poppler/Makefile -+utils/Makefile - glib/Makefile - test/Makefile - qt/Makefile -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/Makefile.am poppler-0.4.3/Makefile.am ---- poppler-0.4.3.orig/Makefile.am 2005-06-28 06:00:09.000000000 -0400 -+++ poppler-0.4.3/Makefile.am 2005-12-26 21:28:15.000000000 -0500 -@@ -22,7 +22,7 @@ - qt4_pc_file = poppler-qt4.pc - endif - --SUBDIRS = goo fofi $(splash_subdir) poppler $(glib_subdir) $(qt_subdir) test $(qt4_subdir) -+SUBDIRS = goo fofi $(splash_subdir) poppler utils $(glib_subdir) $(qt_subdir) test $(qt4_subdir) - - EXTRA_DIST = \ - README-XPDF \ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/GVector.h poppler-0.4.3/utils/GVector.h ---- poppler-0.4.3.orig/utils/GVector.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/GVector.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,101 @@ -+#ifndef _VECTOR_H -+#define _VECTOR_H -+#include "goo/gtypes.h" -+ -+ -+template<class T> -+class GVector{ -+private: -+ -+ int _size; -+ T* last; -+ T* storage; -+ -+ void resize(){ -+ if (_size==0) _size=2;else _size=2*_size; -+ T *tmp=new T[_size]; -+ if (storage){ -+ last=copy(storage,last,tmp); -+ delete [] storage; -+ } -+ else last=tmp; -+ storage=tmp; -+ } -+ -+ T* copy(T* src1,T* scr2,T* dest){ -+ T* tmp=src1; -+ T* d=dest; -+ while(tmp!=scr2){ -+ *d=*tmp; -+ d++;tmp++; -+ } -+ return d; -+ } -+ -+public: -+ typedef T* iterator; -+ -+ GVector(){ -+ _size=0; -+ last=0; -+ storage=0; -+} -+ -+ -+ -+virtual ~GVector(){ -+ delete[] storage ; -+} -+ -+void reset(){ -+ last=storage; -+} -+ -+int size(){ -+ return (last-storage); -+} -+void push_back(const T& elem){ -+ if (!storage||(size() >=_size)) resize(); -+ *last=elem; -+ last++; -+ -+ -+} -+ -+ -+T pop_back() { -+ if (last!=storage) last--; -+ -+ return *last; -+} -+ -+ -+T operator[](unsigned int i){ -+ return *(storage+i); -+} -+ -+ -+GBool isEmpty() const{ -+ return !_size || (last==storage) ; -+} -+ -+ -+ -+iterator begin() const{ -+ return storage; -+} -+ -+iterator end() const { -+ return last; -+} -+}; -+#endif -+ -+ -+ -+ -+ -+ -+ -+ -+ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlFonts.cc poppler-0.4.3/utils/HtmlFonts.cc ---- poppler-0.4.3.orig/utils/HtmlFonts.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlFonts.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,326 @@ -+#include "HtmlFonts.h" -+#include "GlobalParams.h" -+#include "UnicodeMap.h" -+#include <stdio.h> -+ -+ struct Fonts{ -+ char *Fontname; -+ char *name; -+ }; -+ -+const int font_num=13; -+ -+static Fonts fonts[font_num+1]={ -+ {"Courier", "Courier" }, -+ {"Courier-Bold", "Courier"}, -+ {"Courier-BoldOblique", "Courier"}, -+ {"Courier-Oblique", "Courier"}, -+ {"Helvetica", "Helvetica"}, -+ {"Helvetica-Bold", "Helvetica"}, -+ {"Helvetica-BoldOblique", "Helvetica"}, -+ {"Helvetica-Oblique", "Helvetica"}, -+ {"Symbol", "Symbol" }, -+ {"Times-Bold", "Times" }, -+ {"Times-BoldItalic", "Times" }, -+ {"Times-Italic", "Times" }, -+ {"Times-Roman", "Times" }, -+ {" " , "Times" }, -+}; -+ -+#define xoutRound(x) ((int)(x + 0.5)) -+extern GBool xml; -+ -+GooString* HtmlFont::DefaultFont=new GooString("Times"); // Arial,Helvetica,sans-serif -+ -+HtmlFontColor::HtmlFontColor(GfxRGB rgb){ -+ r=static_cast<int>(255*rgb.r); -+ g=static_cast<int>(255*rgb.g); -+ b=static_cast<int>(255*rgb.b); -+ if (!(Ok(r)&&Ok(b)&&Ok(g))) {printf("Error : Bad color \n");r=0;g=0;b=0;} -+} -+ -+GooString *HtmlFontColor::convtoX(unsigned int xcol) const{ -+ GooString *xret=new GooString(); -+ char tmp; -+ unsigned int k; -+ k = (xcol/16); -+ if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); -+ xret->append(tmp); -+ k = (xcol%16); -+ if ((k>=0)&&(k<10)) tmp=(char) ('0'+k); else tmp=(char)('a'+k-10); -+ xret->append(tmp); -+ return xret; -+} -+ -+GooString *HtmlFontColor::toString() const{ -+ GooString *tmp=new GooString("#"); -+ GooString *tmpr=convtoX(r); -+ GooString *tmpg=convtoX(g); -+ GooString *tmpb=convtoX(b); -+ tmp->append(tmpr); -+ tmp->append(tmpg); -+ tmp->append(tmpb); -+ delete tmpr; -+ delete tmpg; -+ delete tmpb; -+ return tmp; -+} -+ -+HtmlFont::HtmlFont(GooString* ftname,int _size, GfxRGB rgb){ -+ //if (col) color=HtmlFontColor(col); -+ //else color=HtmlFontColor(); -+ color=HtmlFontColor(rgb); -+ -+ GooString *fontname = NULL; -+ -+ if( ftname ){ -+ fontname = new GooString(ftname); -+ FontName=new GooString(ftname); -+ } -+ else { -+ fontname = NULL; -+ FontName = NULL; -+ } -+ -+ lineSize = -1; -+ -+ size=(_size-1); -+ italic = gFalse; -+ bold = gFalse; -+ -+ if (fontname){ -+ if (strstr(fontname->lowerCase()->getCString(),"bold")) bold=gTrue; -+ -+ if (strstr(fontname->lowerCase()->getCString(),"italic")|| -+ strstr(fontname->lowerCase()->getCString(),"oblique")) italic=gTrue; -+ -+ int i=0; -+ while (strcmp(ftname->getCString(),fonts[i].Fontname)&&(i<font_num)) -+ { -+ i++; -+ } -+ pos=i; -+ delete fontname; -+ } -+ if (!DefaultFont) DefaultFont=new GooString(fonts[font_num].name); -+ -+} -+ -+HtmlFont::HtmlFont(const HtmlFont& x){ -+ size=x.size; -+ lineSize=x.lineSize; -+ italic=x.italic; -+ bold=x.bold; -+ pos=x.pos; -+ color=x.color; -+ if (x.FontName) FontName=new GooString(x.FontName); -+ } -+ -+ -+HtmlFont::~HtmlFont(){ -+ if (FontName) delete FontName; -+} -+ -+HtmlFont& HtmlFont::operator=(const HtmlFont& x){ -+ if (this==&x) return *this; -+ size=x.size; -+ lineSize=x.lineSize; -+ italic=x.italic; -+ bold=x.bold; -+ pos=x.pos; -+ color=x.color; -+ if (FontName) delete FontName; -+ if (x.FontName) FontName=new GooString(x.FontName); -+ return *this; -+} -+ -+void HtmlFont::clear(){ -+ if(DefaultFont) delete DefaultFont; -+ DefaultFont = NULL; -+} -+ -+ -+ -+/* -+ This function is used to compare font uniquily for insertion into -+ the list of all encountered fonts -+*/ -+GBool HtmlFont::isEqual(const HtmlFont& x) const{ -+ return ((size==x.size) && -+ (lineSize==x.lineSize) && -+ (pos==x.pos) && (bold==x.bold) && (italic==x.italic) && -+ (color.isEqual(x.getColor()))); -+} -+ -+/* -+ This one is used to decide whether two pieces of text can be joined together -+ and therefore we don't care about bold/italics properties -+*/ -+GBool HtmlFont::isEqualIgnoreBold(const HtmlFont& x) const{ -+ return ((size==x.size) && -+ (!strcmp(fonts[pos].name, fonts[x.pos].name)) && -+ (color.isEqual(x.getColor()))); -+} -+ -+GooString* HtmlFont::getFontName(){ -+ if (pos!=font_num) return new GooString(fonts[pos].name); -+ else return new GooString(DefaultFont); -+} -+ -+GooString* HtmlFont::getFullName(){ -+ if (FontName) -+ return new GooString(FontName); -+ else return new GooString(DefaultFont); -+} -+ -+void HtmlFont::setDefaultFont(GooString* defaultFont){ -+ if (DefaultFont) delete DefaultFont; -+ DefaultFont=new GooString(defaultFont); -+} -+ -+ -+GooString* HtmlFont::getDefaultFont(){ -+ return DefaultFont; -+} -+ -+// this method if plain wrong todo -+GooString* HtmlFont::HtmlFilter(Unicode* u, int uLen) { -+ GooString *tmp = new GooString(); -+ UnicodeMap *uMap; -+ char buf[8]; -+ int n; -+ -+ // get the output encoding -+ if (!(uMap = globalParams->getTextEncoding())) { -+ return tmp; -+ } -+ -+ for (int i = 0; i < uLen; ++i) { -+ switch (u[i]) -+ { -+ case '"': tmp->append("""); break; -+ case '&': tmp->append("&"); break; -+ case '<': tmp->append("<"); break; -+ case '>': tmp->append(">"); break; -+ default: -+ { -+ // convert unicode to string -+ if ((n = uMap->mapUnicode(u[i], buf, sizeof(buf))) > 0) { -+ tmp->append(buf, n); -+ } -+ } -+ } -+ } -+ -+ uMap->decRefCnt(); -+ return tmp; -+} -+ -+GooString* HtmlFont::simple(HtmlFont* font, Unicode* content, int uLen){ -+ GooString *cont=HtmlFilter (content, uLen); -+ -+ /*if (font.isBold()) { -+ cont->insert(0,"<b>",3); -+ cont->append("</b>",4); -+ } -+ if (font.isItalic()) { -+ cont->insert(0,"<i>",3); -+ cont->append("</i>",4); -+ } */ -+ -+ return cont; -+} -+ -+HtmlFontAccu::HtmlFontAccu(){ -+ accu=new GVector<HtmlFont>(); -+} -+ -+HtmlFontAccu::~HtmlFontAccu(){ -+ if (accu) delete accu; -+} -+ -+int HtmlFontAccu::AddFont(const HtmlFont& font){ -+ GVector<HtmlFont>::iterator i; -+ for (i=accu->begin();i!=accu->end();i++) -+ { -+ if (font.isEqual(*i)) -+ { -+ return (int)(i-(accu->begin())); -+ } -+ } -+ -+ accu->push_back(font); -+ return (accu->size()-1); -+} -+ -+// get CSS font name for font #i -+GooString* HtmlFontAccu::getCSStyle(int i, GooString* content){ -+ GooString *tmp; -+ GooString *iStr=GooString::fromInt(i); -+ -+ if (!xml) { -+ tmp = new GooString("<span class=\"ft"); -+ tmp->append(iStr); -+ tmp->append("\">"); -+ tmp->append(content); -+ tmp->append("</span>"); -+ } else { -+ tmp = new GooString(""); -+ tmp->append(content); -+ } -+ -+ delete iStr; -+ return tmp; -+} -+ -+// get CSS font definition for font #i -+GooString* HtmlFontAccu::CSStyle(int i){ -+ GooString *tmp=new GooString(); -+ GooString *iStr=GooString::fromInt(i); -+ -+ GVector<HtmlFont>::iterator g=accu->begin(); -+ g+=i; -+ HtmlFont font=*g; -+ GooString *Size=GooString::fromInt(font.getSize()); -+ GooString *colorStr=font.getColor().toString(); -+ GooString *fontName=font.getFontName(); -+ GooString *lSize; -+ -+ if(!xml){ -+ tmp->append(".ft"); -+ tmp->append(iStr); -+ tmp->append("{font-size:"); -+ tmp->append(Size); -+ if( font.getLineSize() != -1 ) -+ { -+ lSize = GooString::fromInt(font.getLineSize()); -+ tmp->append("px;line-height:"); -+ tmp->append(lSize); -+ delete lSize; -+ } -+ tmp->append("px;font-family:"); -+ tmp->append(fontName); //font.getFontName()); -+ tmp->append(";color:"); -+ tmp->append(colorStr); -+ tmp->append(";}"); -+ } -+ if (xml) { -+ tmp->append("<fontspec id=\""); -+ tmp->append(iStr); -+ tmp->append("\" size=\""); -+ tmp->append(Size); -+ tmp->append("\" family=\""); -+ tmp->append(fontName); //font.getFontName()); -+ tmp->append("\" color=\""); -+ tmp->append(colorStr); -+ tmp->append("\"/>"); -+ } -+ -+ delete fontName; -+ delete colorStr; -+ delete iStr; -+ delete Size; -+ return tmp; -+} -+ -+ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlFonts.h poppler-0.4.3/utils/HtmlFonts.h ---- poppler-0.4.3.orig/utils/HtmlFonts.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlFonts.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,85 @@ -+#ifndef _HTML_FONTS_H -+#define _HTML_FONTS_H -+#include "GVector.h" -+#include "goo/GooString.h" -+#include "GfxState.h" -+#include "CharTypes.h" -+ -+ -+class HtmlFontColor{ -+ private: -+ unsigned int r; -+ unsigned int g; -+ unsigned int b; -+ GBool Ok(unsigned int xcol){ return ((xcol<=255)&&(xcol>=0));} -+ GooString *convtoX(unsigned int xcol) const; -+ public: -+ HtmlFontColor():r(0),g(0),b(0){} -+ HtmlFontColor(GfxRGB rgb); -+ HtmlFontColor(const HtmlFontColor& x){r=x.r;g=x.g;b=x.b;} -+ HtmlFontColor& operator=(const HtmlFontColor &x){ -+ r=x.r;g=x.g;b=x.b; -+ return *this; -+ } -+ ~HtmlFontColor(){}; -+ GooString* toString() const; -+ GBool isEqual(const HtmlFontColor& col) const{ -+ return ((r==col.r)&&(g==col.g)&&(b==col.b)); -+ } -+} ; -+ -+ -+class HtmlFont{ -+ private: -+ unsigned int size; -+ int lineSize; -+ GBool italic; -+ GBool bold; -+ int pos; // position of the font name in the fonts array -+ static GooString *DefaultFont; -+ GooString *FontName; -+ HtmlFontColor color; -+ static GooString* HtmlFilter(Unicode* u, int uLen); //char* s); -+public: -+ -+ HtmlFont(){FontName=NULL;}; -+ HtmlFont(GooString* fontname,int _size, GfxRGB rgb); -+ HtmlFont(const HtmlFont& x); -+ HtmlFont& operator=(const HtmlFont& x); -+ HtmlFontColor getColor() const {return color;} -+ ~HtmlFont(); -+ static void clear(); -+ GooString* getFullName(); -+ GBool isItalic() const {return italic;} -+ GBool isBold() const {return bold;} -+ unsigned int getSize() const {return size;} -+ int getLineSize() const {return lineSize;} -+ void setLineSize(int _lineSize) { lineSize = _lineSize; } -+ GooString* getFontName(); -+ static GooString* getDefaultFont(); -+ static void setDefaultFont(GooString* defaultFont); -+ GBool isEqual(const HtmlFont& x) const; -+ GBool isEqualIgnoreBold(const HtmlFont& x) const; -+ static GooString* simple(HtmlFont *font, Unicode *content, int uLen); -+ void print() const {printf("font: %s %d %s%spos: %d\n", FontName->getCString(), size, bold ? "bold " : "", italic ? "italic " : "", pos);}; -+}; -+ -+class HtmlFontAccu{ -+private: -+ GVector<HtmlFont> *accu; -+ -+public: -+ HtmlFontAccu(); -+ ~HtmlFontAccu(); -+ int AddFont(const HtmlFont& font); -+ HtmlFont* Get(int i){ -+ GVector<HtmlFont>::iterator g=accu->begin(); -+ g+=i; -+ return g; -+ } -+ GooString* getCSStyle (int i, GooString* content); -+ GooString* CSStyle(int i); -+ int size() const {return accu->size();} -+ -+}; -+#endif -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlLinks.cc poppler-0.4.3/utils/HtmlLinks.cc ---- poppler-0.4.3.orig/utils/HtmlLinks.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlLinks.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,101 @@ -+#include "HtmlLinks.h" -+ -+HtmlLink::HtmlLink(const HtmlLink& x){ -+ Xmin=x.Xmin; -+ Ymin=x.Ymin; -+ Xmax=x.Xmax; -+ Ymax=x.Ymax; -+ dest=new GooString(x.dest); -+} -+ -+HtmlLink::HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString * _dest) -+{ -+ if (xmin < xmax) { -+ Xmin=xmin; -+ Xmax=xmax; -+ } else { -+ Xmin=xmax; -+ Xmax=xmin; -+ } -+ if (ymin < ymax) { -+ Ymin=ymin; -+ Ymax=ymax; -+ } else { -+ Ymin=ymax; -+ Ymax=ymin; -+ } -+ dest=new GooString(_dest); -+} -+ -+HtmlLink::~HtmlLink(){ -+ if (dest) delete dest; -+} -+ -+GBool HtmlLink::isEqualDest(const HtmlLink& x) const{ -+ return (!strcmp(dest->getCString(), x.dest->getCString())); -+} -+ -+GBool HtmlLink::inLink(double xmin,double ymin,double xmax,double ymax) const { -+ double y=(ymin+ymax)/2; -+ if (y>Ymax) return gFalse; -+ return (y>Ymin)&&(xmin<Xmax)&&(xmax>Xmin); -+ } -+ -+ -+HtmlLink& HtmlLink::operator=(const HtmlLink& x){ -+ if (this==&x) return *this; -+ if (dest) {delete dest;dest=NULL;} -+ Xmin=x.Xmin; -+ Ymin=x.Ymin; -+ Xmax=x.Xmax; -+ Ymax=x.Ymax; -+ dest=new GooString(x.dest); -+ return *this; -+} -+ -+GooString* HtmlLink::getLinkStart() { -+ GooString *res = new GooString("<A href=\""); -+ res->append(dest); -+ res->append("\">"); -+ return res; -+} -+ -+/*GooString* HtmlLink::Link(GooString* content){ -+ //GooString* _dest=new GooString(dest); -+ GooString *tmp=new GooString("<a href=\""); -+ tmp->append(dest); -+ tmp->append("\">"); -+ tmp->append(content); -+ tmp->append("</a>"); -+ //delete _dest; -+ return tmp; -+ }*/ -+ -+ -+ -+HtmlLinks::HtmlLinks(){ -+ accu=new GVector<HtmlLink>(); -+} -+ -+HtmlLinks::~HtmlLinks(){ -+ delete accu; -+ accu=NULL; -+} -+ -+GBool HtmlLinks::inLink(double xmin,double ymin,double xmax,double ymax,int& p)const { -+ -+ for(GVector<HtmlLink>::iterator i=accu->begin();i!=accu->end();i++){ -+ if (i->inLink(xmin,ymin,xmax,ymax)) { -+ p=(i - accu->begin()); -+ return 1; -+ } -+ } -+ return 0; -+} -+ -+HtmlLink* HtmlLinks::getLink(int i) const{ -+ GVector<HtmlLink>::iterator g=accu->begin(); -+ g+=i; -+ return g; -+} -+ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlLinks.h poppler-0.4.3/utils/HtmlLinks.h ---- poppler-0.4.3.orig/utils/HtmlLinks.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlLinks.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,47 @@ -+#ifndef _HTML_LINKS -+#define _HTML_LINKS -+ -+#include "GVector.h" -+#include "goo/GooString.h" -+ -+class HtmlLink{ -+ -+private: -+ double Xmin; -+ double Ymin; -+ double Xmax; -+ double Ymax; -+ GooString* dest; -+ -+public: -+ HtmlLink(){dest=NULL;} -+ HtmlLink(const HtmlLink& x); -+ HtmlLink& operator=(const HtmlLink& x); -+ HtmlLink(double xmin,double ymin,double xmax,double ymax,GooString *_dest); -+ ~HtmlLink(); -+ GBool HtmlLink::isEqualDest(const HtmlLink& x) const; -+ GooString *getDest(){return new GooString(dest);} -+ double getX1() const {return Xmin;} -+ double getX2() const {return Xmax;} -+ double getY1() const {return Ymin;} -+ double getY2() const {return Ymax;} -+ GBool inLink(double xmin,double ymin,double xmax,double ymax) const ; -+ //GooString *Link(GooString *content); -+ GooString* getLinkStart(); -+ -+}; -+ -+class HtmlLinks{ -+private: -+ GVector<HtmlLink> *accu; -+public: -+ HtmlLinks(); -+ ~HtmlLinks(); -+ void AddLink(const HtmlLink& x) {accu->push_back(x);} -+ GBool inLink(double xmin,double ymin,double xmax,double ymax,int& p) const; -+ HtmlLink* getLink(int i) const; -+ -+}; -+ -+#endif -+ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlOutputDev.cc poppler-0.4.3/utils/HtmlOutputDev.cc ---- poppler-0.4.3.orig/utils/HtmlOutputDev.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlOutputDev.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,1569 @@ -+//======================================================================== -+// -+// HtmlOutputDev.cc -+// -+// Copyright 1997-2002 Glyph & Cog, LLC -+// -+// Changed 1999-2000 by G.Ovtcharov -+// -+// Changed 2002 by Mikhail Kruk -+// -+//======================================================================== -+ -+#ifdef __GNUC__ -+#pragma implementation -+#endif -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <stdarg.h> -+#include <stddef.h> -+#include <ctype.h> -+#include <math.h> -+#include "goo/GooString.h" -+#include "goo/GooList.h" -+#include "UnicodeMap.h" -+#include "goo/gmem.h" -+#include "config.h" -+#include "Error.h" -+#include "GfxState.h" -+#include "DCTStream.h" -+#include "GlobalParams.h" -+#include "HtmlOutputDev.h" -+#include "HtmlFonts.h" -+ -+int HtmlPage::pgNum=0; -+int HtmlOutputDev::imgNum=1; -+ -+extern double scale; -+extern GBool complexMode; -+extern GBool ignore; -+extern GBool printCommands; -+extern GBool printHtml; -+extern GBool noframes; -+extern GBool stout; -+extern GBool xml; -+extern GBool showHidden; -+extern GBool noMerge; -+ -+static GooString* basename(GooString* str){ -+ -+ char *p=str->getCString(); -+ int len=str->getLength(); -+ for (int i=len-1;i>=0;i--) -+ if (*(p+i)==SLASH) -+ return new GooString((p+i+1),len-i-1); -+ return new GooString(str); -+} -+ -+static GooString* Dirname(GooString* str){ -+ -+ char *p=str->getCString(); -+ int len=str->getLength(); -+ for (int i=len-1;i>=0;i--) -+ if (*(p+i)==SLASH) -+ return new GooString(p,i+1); -+ return new GooString(); -+} -+ -+//------------------------------------------------------------------------ -+// HtmlString -+//------------------------------------------------------------------------ -+ -+HtmlString::HtmlString(GfxState *state, double fontSize, HtmlFontAccu* fonts) { -+ GfxFont *font; -+ double x, y; -+ -+ state->transform(state->getCurX(), state->getCurY(), &x, &y); -+ if ((font = state->getFont())) { -+ yMin = y - font->getAscent() * fontSize; -+ yMax = y - font->getDescent() * fontSize; -+ GfxRGB rgb; -+ state->getFillRGB(&rgb); -+ GooString *name = state->getFont()->getName(); -+ if (!name) name = HtmlFont::getDefaultFont(); //new GooString("default"); -+ HtmlFont hfont=HtmlFont(name, static_cast<int>(fontSize-1), rgb); -+ fontpos = fonts->AddFont(hfont); -+ } else { -+ // this means that the PDF file draws text without a current font, -+ // which should never happen -+ yMin = y - 0.95 * fontSize; -+ yMax = y + 0.35 * fontSize; -+ fontpos=0; -+ } -+ if (yMin == yMax) { -+ // this is a sanity check for a case that shouldn't happen -- but -+ // if it does happen, we want to avoid dividing by zero later -+ yMin = y; -+ yMax = y + 1; -+ } -+ col = 0; -+ text = NULL; -+ xRight = NULL; -+ link = NULL; -+ len = size = 0; -+ yxNext = NULL; -+ xyNext = NULL; -+ htext=new GooString(); -+ dir = textDirUnknown; -+} -+ -+ -+HtmlString::~HtmlString() { -+ delete text; -+ delete htext; -+ gfree(xRight); -+} -+ -+void HtmlString::addChar(GfxState *state, double x, double y, -+ double dx, double dy, Unicode u) { -+ if (dir == textDirUnknown) { -+ //dir = UnicodeMap::getDirection(u); -+ dir = textDirLeftRight; -+ } -+ -+ if (len == size) { -+ size += 16; -+ text = (Unicode *)grealloc(text, size * sizeof(Unicode)); -+ xRight = (double *)grealloc(xRight, size * sizeof(double)); -+ } -+ text[len] = u; -+ if (len == 0) { -+ xMin = x; -+ } -+ xMax = xRight[len] = x + dx; -+//printf("added char: %f %f xright = %f\n", x, dx, x+dx); -+ ++len; -+} -+ -+void HtmlString::endString() -+{ -+ if( dir == textDirRightLeft && len > 1 ) -+ { -+ //printf("will reverse!\n"); -+ for (int i = 0; i < len / 2; i++) -+ { -+ Unicode ch = text[i]; -+ text[i] = text[len - i - 1]; -+ text[len - i - 1] = ch; -+ } -+ } -+} -+ -+//------------------------------------------------------------------------ -+// HtmlPage -+//------------------------------------------------------------------------ -+ -+HtmlPage::HtmlPage(GBool rawOrder, char *imgExtVal) { -+ this->rawOrder = rawOrder; -+ curStr = NULL; -+ yxStrings = NULL; -+ xyStrings = NULL; -+ yxCur1 = yxCur2 = NULL; -+ fonts=new HtmlFontAccu(); -+ links=new HtmlLinks(); -+ pageWidth=0; -+ pageHeight=0; -+ fontsPageMarker = 0; -+ DocName=NULL; -+ firstPage = -1; -+ imgExt = new GooString(imgExtVal); -+} -+ -+HtmlPage::~HtmlPage() { -+ clear(); -+ if (DocName) delete DocName; -+ if (fonts) delete fonts; -+ if (links) delete links; -+ if (imgExt) delete imgExt; -+} -+ -+void HtmlPage::updateFont(GfxState *state) { -+ GfxFont *font; -+ double *fm; -+ char *name; -+ int code; -+ double w; -+ -+ // adjust the font size -+ fontSize = state->getTransformedFontSize(); -+ if ((font = state->getFont()) && font->getType() == fontType3) { -+ // This is a hack which makes it possible to deal with some Type 3 -+ // fonts. The problem is that it's impossible to know what the -+ // base coordinate system used in the font is without actually -+ // rendering the font. This code tries to guess by looking at the -+ // width of the character 'm' (which breaks if the font is a -+ // subset that doesn't contain 'm'). -+ for (code = 0; code < 256; ++code) { -+ if ((name = ((Gfx8BitFont *)font)->getCharName(code)) && -+ name[0] == 'm' && name[1] == '\0') { -+ break; -+ } -+ } -+ if (code < 256) { -+ w = ((Gfx8BitFont *)font)->getWidth(code); -+ if (w != 0) { -+ // 600 is a generic average 'm' width -- yes, this is a hack -+ fontSize *= w / 0.6; -+ } -+ } -+ fm = font->getFontMatrix(); -+ if (fm[0] != 0) { -+ fontSize *= fabs(fm[3] / fm[0]); -+ } -+ } -+} -+ -+void HtmlPage::beginString(GfxState *state, GooString *s) { -+ curStr = new HtmlString(state, fontSize, fonts); -+} -+ -+ -+void HtmlPage::conv(){ -+ HtmlString *tmp; -+ -+ int linkIndex = 0; -+ HtmlFont* h; -+ for(tmp=yxStrings;tmp;tmp=tmp->yxNext){ -+ int pos=tmp->fontpos; -+ // printf("%d\n",pos); -+ h=fonts->Get(pos); -+ -+ if (tmp->htext) delete tmp->htext; -+ tmp->htext=HtmlFont::simple(h,tmp->text,tmp->len); -+ -+ if (links->inLink(tmp->xMin,tmp->yMin,tmp->xMax,tmp->yMax, linkIndex)){ -+ tmp->link = links->getLink(linkIndex); -+ /*GooString *t=tmp->htext; -+ tmp->htext=links->getLink(k)->Link(tmp->htext); -+ delete t;*/ -+ } -+ } -+ -+} -+ -+ -+void HtmlPage::addChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double ox, double oy, Unicode *u, int uLen) { -+ double x1, y1, w1, h1, dx2, dy2; -+ int n, i; -+ state->transform(x, y, &x1, &y1); -+ n = curStr->len; -+ -+ // check that new character is in the same direction as current string -+ // and is not too far away from it before adding -+ //if ((UnicodeMap::getDirection(u[0]) != curStr->dir) || -+ // XXX -+ if ( -+ (n > 0 && -+ fabs(x1 - curStr->xRight[n-1]) > 0.1 * (curStr->yMax - curStr->yMin))) { -+ endString(); -+ beginString(state, NULL); -+ } -+ state->textTransformDelta(state->getCharSpace() * state->getHorizScaling(), -+ 0, &dx2, &dy2); -+ dx -= dx2; -+ dy -= dy2; -+ state->transformDelta(dx, dy, &w1, &h1); -+ if (uLen != 0) { -+ w1 /= uLen; -+ h1 /= uLen; -+ } -+ for (i = 0; i < uLen; ++i) { -+ curStr->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u[i]); -+ } -+} -+ -+void HtmlPage::endString() { -+ HtmlString *p1, *p2; -+ double h, y1, y2; -+ -+ // throw away zero-length strings -- they don't have valid xMin/xMax -+ // values, and they're useless anyway -+ if (curStr->len == 0) { -+ delete curStr; -+ curStr = NULL; -+ return; -+ } -+ -+ curStr->endString(); -+ -+#if 0 //~tmp -+ if (curStr->yMax - curStr->yMin > 20) { -+ delete curStr; -+ curStr = NULL; -+ return; -+ } -+#endif -+ -+ // insert string in y-major list -+ h = curStr->yMax - curStr->yMin; -+ y1 = curStr->yMin + 0.5 * h; -+ y2 = curStr->yMin + 0.8 * h; -+ if (rawOrder) { -+ p1 = yxCur1; -+ p2 = NULL; -+ } else if ((!yxCur1 || -+ (y1 >= yxCur1->yMin && -+ (y2 >= yxCur1->yMax || curStr->xMax >= yxCur1->xMin))) && -+ (!yxCur2 || -+ (y1 < yxCur2->yMin || -+ (y2 < yxCur2->yMax && curStr->xMax < yxCur2->xMin)))) { -+ p1 = yxCur1; -+ p2 = yxCur2; -+ } else { -+ for (p1 = NULL, p2 = yxStrings; p2; p1 = p2, p2 = p2->yxNext) { -+ if (y1 < p2->yMin || (y2 < p2->yMax && curStr->xMax < p2->xMin)) -+ break; -+ } -+ yxCur2 = p2; -+ } -+ yxCur1 = curStr; -+ if (p1) -+ p1->yxNext = curStr; -+ else -+ yxStrings = curStr; -+ curStr->yxNext = p2; -+ curStr = NULL; -+} -+ -+void HtmlPage::coalesce() { -+ HtmlString *str1, *str2; -+ HtmlFont *hfont1, *hfont2; -+ double space, horSpace, vertSpace, vertOverlap; -+ GBool addSpace, addLineBreak; -+ int n, i; -+ double curX, curY; -+ -+#if 0 //~ for debugging -+ for (str1 = yxStrings; str1; str1 = str1->yxNext) { -+ printf("x=%f..%f y=%f..%f size=%2d '", -+ str1->xMin, str1->xMax, str1->yMin, str1->yMax, -+ (int)(str1->yMax - str1->yMin)); -+ for (i = 0; i < str1->len; ++i) { -+ fputc(str1->text[i] & 0xff, stdout); -+ } -+ printf("'\n"); -+ } -+ printf("\n------------------------------------------------------------\n\n"); -+#endif -+ str1 = yxStrings; -+ -+ if( !str1 ) return; -+ -+ //----- discard duplicated text (fake boldface, drop shadows) -+ if( !complexMode ) -+ { /* if not in complex mode get rid of duplicate strings */ -+ HtmlString *str3; -+ GBool found; -+ while (str1) -+ { -+ double size = str1->yMax - str1->yMin; -+ double xLimit = str1->xMin + size * 0.2; -+ found = gFalse; -+ for (str2 = str1, str3 = str1->yxNext; -+ str3 && str3->xMin < xLimit; -+ str2 = str3, str3 = str2->yxNext) -+ { -+ if (str3->len == str1->len && -+ !memcmp(str3->text, str1->text, str1->len * sizeof(Unicode)) && -+ fabs(str3->yMin - str1->yMin) < size * 0.2 && -+ fabs(str3->yMax - str1->yMax) < size * 0.2 && -+ fabs(str3->xMax - str1->xMax) < size * 0.2) -+ { -+ found = gTrue; -+ //printf("found duplicate!\n"); -+ break; -+ } -+ } -+ if (found) -+ { -+ str2->xyNext = str3->xyNext; -+ str2->yxNext = str3->yxNext; -+ delete str3; -+ } -+ else -+ { -+ str1 = str1->yxNext; -+ } -+ } -+ } /*- !complexMode */ -+ -+ str1 = yxStrings; -+ -+ hfont1 = getFont(str1); -+ if( hfont1->isBold() ) -+ str1->htext->insert(0,"<b>",3); -+ if( hfont1->isItalic() ) -+ str1->htext->insert(0,"<i>",3); -+ if( str1->getLink() != NULL ) { -+ GooString *ls = str1->getLink()->getLinkStart(); -+ str1->htext->insert(0, ls); -+ delete ls; -+ } -+ curX = str1->xMin; curY = str1->yMin; -+ -+ while (str1 && (str2 = str1->yxNext)) { -+ hfont2 = getFont(str2); -+ space = str1->yMax - str1->yMin; -+ horSpace = str2->xMin - str1->xMax; -+ addLineBreak = !noMerge && (fabs(str1->xMin - str2->xMin) < 0.4); -+ vertSpace = str2->yMin - str1->yMax; -+ -+//printf("coalesce %d %d %f? ", str1->dir, str2->dir, d); -+ -+ if (str2->yMin >= str1->yMin && str2->yMin <= str1->yMax) -+ { -+ vertOverlap = str1->yMax - str2->yMin; -+ } else -+ if (str2->yMax >= str1->yMin && str2->yMax <= str1->yMax) -+ { -+ vertOverlap = str2->yMax - str1->yMin; -+ } else -+ { -+ vertOverlap = 0; -+ } -+ -+ if ( -+ ( -+ ( -+ ( -+ (rawOrder && vertOverlap > 0.5 * space) -+ || -+ (!rawOrder && str2->yMin < str1->yMax) -+ ) && -+ (horSpace > -0.5 * space && horSpace < space) -+ ) || -+ (vertSpace >= 0 && vertSpace < 0.5 * space && addLineBreak) -+ ) && -+ (!complexMode || (hfont1->isEqualIgnoreBold(*hfont2))) && // in complex mode fonts must be the same, in other modes fonts do not metter -+ str1->dir == str2->dir // text direction the same -+ ) -+ { -+// printf("yes\n"); -+ n = str1->len + str2->len; -+ if ((addSpace = horSpace > 0.1 * space)) { -+ ++n; -+ } -+ if (addLineBreak) { -+ ++n; -+ } -+ -+ str1->size = (n + 15) & ~15; -+ str1->text = (Unicode *)grealloc(str1->text, -+ str1->size * sizeof(Unicode)); -+ str1->xRight = (double *)grealloc(str1->xRight, -+ str1->size * sizeof(double)); -+ if (addSpace) { -+ str1->text[str1->len] = 0x20; -+ str1->htext->append(" "); -+ str1->xRight[str1->len] = str2->xMin; -+ ++str1->len; -+ } -+ if (addLineBreak) { -+ str1->text[str1->len] = '\n'; -+ str1->htext->append("<br>"); -+ str1->xRight[str1->len] = str2->xMin; -+ ++str1->len; -+ str1->yMin = str2->yMin; -+ str1->yMax = str2->yMax; -+ str1->xMax = str2->xMax; -+ int fontLineSize = hfont1->getLineSize(); -+ int curLineSize = (int)(vertSpace + space); -+ if( curLineSize != fontLineSize ) -+ { -+ HtmlFont *newfnt = new HtmlFont(*hfont1); -+ newfnt->setLineSize(curLineSize); -+ str1->fontpos = fonts->AddFont(*newfnt); -+ delete newfnt; -+ hfont1 = getFont(str1); -+ // we have to reget hfont2 because it's location could have -+ // changed on resize -+ hfont2 = getFont(str2); -+ } -+ } -+ for (i = 0; i < str2->len; ++i) { -+ str1->text[str1->len] = str2->text[i]; -+ str1->xRight[str1->len] = str2->xRight[i]; -+ ++str1->len; -+ } -+ -+ /* fix <i> and <b> if str1 and str2 differ */ -+ if( hfont1->isBold() && !hfont2->isBold() ) -+ str1->htext->append("</b>", 4); -+ if( hfont1->isItalic() && !hfont2->isItalic() ) -+ str1->htext->append("</i>", 4); -+ if( !hfont1->isBold() && hfont2->isBold() ) -+ str1->htext->append("<b>", 3); -+ if( !hfont1->isItalic() && hfont2->isItalic() ) -+ str1->htext->append("<i>", 3); -+ -+ /* now handle switch of links */ -+ HtmlLink *hlink1 = str1->getLink(); -+ HtmlLink *hlink2 = str2->getLink(); -+ if( !hlink1 || !hlink2 || !hlink1->isEqualDest(*hlink2) ) { -+ if(hlink1 != NULL ) -+ str1->htext->append("</a>"); -+ if(hlink2 != NULL ) { -+ GooString *ls = hlink2->getLinkStart(); -+ str1->htext->append(ls); -+ delete ls; -+ } -+ } -+ -+ str1->htext->append(str2->htext); -+ // str1 now contains href for link of str2 (if it is defined) -+ str1->link = str2->link; -+ hfont1 = hfont2; -+ if (str2->xMax > str1->xMax) { -+ str1->xMax = str2->xMax; -+ } -+ if (str2->yMax > str1->yMax) { -+ str1->yMax = str2->yMax; -+ } -+ str1->yxNext = str2->yxNext; -+ delete str2; -+ } else { // keep strings separate -+// printf("no\n"); -+ if( hfont1->isBold() ) -+ str1->htext->append("</b>",4); -+ if( hfont1->isItalic() ) -+ str1->htext->append("</i>",4); -+ if(str1->getLink() != NULL ) -+ str1->htext->append("</a>"); -+ -+ str1->xMin = curX; str1->yMin = curY; -+ str1 = str2; -+ curX = str1->xMin; curY = str1->yMin; -+ hfont1 = hfont2; -+ if( hfont1->isBold() ) -+ str1->htext->insert(0,"<b>",3); -+ if( hfont1->isItalic() ) -+ str1->htext->insert(0,"<i>",3); -+ if( str1->getLink() != NULL ) { -+ GooString *ls = str1->getLink()->getLinkStart(); -+ str1->htext->insert(0, ls); -+ delete ls; -+ } -+ } -+ } -+ str1->xMin = curX; str1->yMin = curY; -+ if( hfont1->isBold() ) -+ str1->htext->append("</b>",4); -+ if( hfont1->isItalic() ) -+ str1->htext->append("</i>",4); -+ if(str1->getLink() != NULL ) -+ str1->htext->append("</a>"); -+ -+#if 0 //~ for debugging -+ for (str1 = yxStrings; str1; str1 = str1->yxNext) { -+ printf("x=%3d..%3d y=%3d..%3d size=%2d ", -+ (int)str1->xMin, (int)str1->xMax, (int)str1->yMin, (int)str1->yMax, -+ (int)(str1->yMax - str1->yMin)); -+ printf("'%s'\n", str1->htext->getCString()); -+ } -+ printf("\n------------------------------------------------------------\n\n"); -+#endif -+ -+} -+ -+void HtmlPage::dumpAsXML(FILE* f,int page){ -+ fprintf(f, "<page number=\"%d\" position=\"absolute\"", page); -+ fprintf(f," top=\"0\" left=\"0\" height=\"%d\" width=\"%d\">\n", pageHeight,pageWidth); -+ -+ for(int i=fontsPageMarker;i < fonts->size();i++) { -+ GooString *fontCSStyle = fonts->CSStyle(i); -+ fprintf(f,"\t%s\n",fontCSStyle->getCString()); -+ delete fontCSStyle; -+ } -+ -+ GooString *str, *str1; -+ for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){ -+ if (tmp->htext){ -+ str=new GooString(tmp->htext); -+ fprintf(f,"<text top=\"%d\" left=\"%d\" ",xoutRound(tmp->yMin),xoutRound(tmp->xMin)); -+ fprintf(f,"width=\"%d\" height=\"%d\" ",xoutRound(tmp->xMax-tmp->xMin),xoutRound(tmp->yMax-tmp->yMin)); -+ fprintf(f,"font=\"%d\">", tmp->fontpos); -+ if (tmp->fontpos!=-1){ -+ str1=fonts->getCSStyle(tmp->fontpos, str); -+ } -+ fputs(str1->getCString(),f); -+ delete str; -+ delete str1; -+ fputs("</text>\n",f); -+ } -+ } -+ fputs("</page>\n",f); -+} -+ -+ -+void HtmlPage::dumpComplex(FILE *file, int page){ -+ FILE* pageFile; -+ GooString* tmp; -+ char* htmlEncoding; -+ -+ if( firstPage == -1 ) firstPage = page; -+ -+ if( !noframes ) -+ { -+ GooString* pgNum=GooString::fromInt(page); -+ tmp = new GooString(DocName); -+ tmp->append('-')->append(pgNum)->append(".html"); -+ delete pgNum; -+ -+ if (!(pageFile = fopen(getFileNameFromPath(tmp->getCString(),tmp->getLength()), "w"))) { -+ error(-1, "Couldn't open html file '%s'", tmp->getCString()); -+ delete tmp; -+ return; -+ } -+ delete tmp; -+ -+ fprintf(pageFile,"%s\n<HTML>\n<HEAD>\n<TITLE>Page %d</TITLE>\n\n", -+ DOCTYPE, page); -+ -+ htmlEncoding = HtmlOutputDev::mapEncodingToHtml -+ (globalParams->getTextEncodingName()); -+ fprintf(pageFile, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n", htmlEncoding); -+ } -+ else -+ { -+ pageFile = file; -+ fprintf(pageFile,"<!-- Page %d -->\n", page); -+ fprintf(pageFile,"<a name=\"%d\"></a>\n", page); -+ } -+ -+ fprintf(pageFile,"<DIV style=\"position:relative;width:%d;height:%d;\">\n", -+ pageWidth, pageHeight); -+ -+ tmp=basename(DocName); -+ -+ fputs("<STYLE type=\"text/css\">\n<!--\n",pageFile); -+ for(int i=fontsPageMarker;i!=fonts->size();i++) { -+ GooString *fontCSStyle = fonts->CSStyle(i); -+ fprintf(pageFile,"\t%s\n",fontCSStyle->getCString()); -+ delete fontCSStyle; -+ } -+ -+ fputs("-->\n</STYLE>\n",pageFile); -+ -+ if( !noframes ) -+ { -+ fputs("</HEAD>\n<BODY bgcolor=\"#A0A0A0\" vlink=\"blue\" link=\"blue\">\n",pageFile); -+ } -+ -+ if( !ignore ) -+ { -+ fprintf(pageFile, -+ "<IMG width=\"%d\" height=\"%d\" src=\"%s%03d.%s\" alt=\"background image\">\n", -+ pageWidth, pageHeight, tmp->getCString(), -+ (page-firstPage+1), imgExt->getCString()); -+ } -+ -+ delete tmp; -+ -+ GooString *str, *str1; -+ for(HtmlString *tmp1=yxStrings;tmp1;tmp1=tmp1->yxNext){ -+ if (tmp1->htext){ -+ str=new GooString(tmp1->htext); -+ fprintf(pageFile, -+ "<DIV style=\"position:absolute;top:%d;left:%d\">", -+ xoutRound(tmp1->yMin), -+ xoutRound(tmp1->xMin)); -+ fputs("<nobr>",pageFile); -+ if (tmp1->fontpos!=-1){ -+ str1=fonts->getCSStyle(tmp1->fontpos, str); -+ } -+ //printf("%s\n", str1->getCString()); -+ fputs(str1->getCString(),pageFile); -+ -+ delete str; -+ delete str1; -+ fputs("</nobr></DIV>\n",pageFile); -+ } -+ } -+ -+ fputs("</DIV>\n", pageFile); -+ -+ if( !noframes ) -+ { -+ fputs("</BODY>\n</HTML>\n",pageFile); -+ fclose(pageFile); -+ } -+} -+ -+ -+void HtmlPage::dump(FILE *f, int pageNum) -+{ -+ if (complexMode) -+ { -+ if (xml) dumpAsXML(f, pageNum); -+ if (!xml) dumpComplex(f, pageNum); -+ } -+ else -+ { -+ fprintf(f,"<A name=%d></a>",pageNum); -+ GooString* fName=basename(DocName); -+ for (int i=1;i<HtmlOutputDev::imgNum;i++) -+ fprintf(f,"<IMG src=\"%s-%d_%d.jpg\"><br>\n",fName->getCString(),pageNum,i); -+ HtmlOutputDev::imgNum=1; -+ delete fName; -+ -+ GooString* str; -+ for(HtmlString *tmp=yxStrings;tmp;tmp=tmp->yxNext){ -+ if (tmp->htext){ -+ str=new GooString(tmp->htext); -+ fputs(str->getCString(),f); -+ delete str; -+ fputs("<br>\n",f); -+ } -+ } -+ fputs("<hr>\n",f); -+ } -+} -+ -+ -+ -+void HtmlPage::clear() { -+ HtmlString *p1, *p2; -+ -+ if (curStr) { -+ delete curStr; -+ curStr = NULL; -+ } -+ for (p1 = yxStrings; p1; p1 = p2) { -+ p2 = p1->yxNext; -+ delete p1; -+ } -+ yxStrings = NULL; -+ xyStrings = NULL; -+ yxCur1 = yxCur2 = NULL; -+ -+ if( !noframes ) -+ { -+ delete fonts; -+ fonts=new HtmlFontAccu(); -+ fontsPageMarker = 0; -+ } -+ else -+ { -+ fontsPageMarker = fonts->size(); -+ } -+ -+ delete links; -+ links=new HtmlLinks(); -+ -+ -+} -+ -+void HtmlPage::setDocName(char *fname){ -+ DocName=new GooString(fname); -+} -+ -+//------------------------------------------------------------------------ -+// HtmlMetaVar -+//------------------------------------------------------------------------ -+ -+HtmlMetaVar::HtmlMetaVar(char *_name, char *_content) -+{ -+ name = new GooString(_name); -+ content = new GooString(_content); -+} -+ -+HtmlMetaVar::~HtmlMetaVar() -+{ -+ delete name; -+ delete content; -+} -+ -+GooString* HtmlMetaVar::toString() -+{ -+ GooString *result = new GooString("<META name=\""); -+ result->append(name); -+ result->append("\" content=\""); -+ result->append(content); -+ result->append("\">"); -+ return result; -+} -+ -+//------------------------------------------------------------------------ -+// HtmlOutputDev -+//------------------------------------------------------------------------ -+ -+static char* HtmlEncodings[][2] = { -+ {"Latin1", "ISO-8859-1"}, -+ {NULL, NULL} -+}; -+ -+ -+char* HtmlOutputDev::mapEncodingToHtml(GooString* encoding) -+{ -+ char* enc = encoding->getCString(); -+ for(int i = 0; HtmlEncodings[i][0] != NULL; i++) -+ { -+ if( strcmp(enc, HtmlEncodings[i][0]) == 0 ) -+ { -+ return HtmlEncodings[i][1]; -+ } -+ } -+ return enc; -+} -+ -+void HtmlOutputDev::doFrame(int firstPage){ -+ GooString* fName=new GooString(Docname); -+ char* htmlEncoding; -+ fName->append(".html"); -+ -+ if (!(fContentsFrame = fopen(getFileNameFromPath(fName->getCString(),fName->getLength()), "w"))){ -+ delete fName; -+ error(-1, "Couldn't open html file '%s'", fName->getCString()); -+ return; -+ } -+ -+ delete fName; -+ -+ fName=basename(Docname); -+ fputs(DOCTYPE_FRAMES, fContentsFrame); -+ fputs("\n<HTML>",fContentsFrame); -+ 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); -+ dumpMetaVars(fContentsFrame); -+ fprintf(fContentsFrame, "</HEAD>\n"); -+ fputs("<FRAMESET cols=\"100,*\">\n",fContentsFrame); -+ fprintf(fContentsFrame,"<FRAME name=\"links\" src=\"%s_ind.html\">\n",fName->getCString()); -+ fputs("<FRAME name=\"contents\" src=",fContentsFrame); -+ if (complexMode) -+ fprintf(fContentsFrame,"\"%s-%d.html\"",fName->getCString(), firstPage); -+ else -+ fprintf(fContentsFrame,"\"%ss.html\"",fName->getCString()); -+ -+ fputs(">\n</FRAMESET>\n</HTML>\n",fContentsFrame); -+ -+ delete fName; -+ fclose(fContentsFrame); -+} -+ -+HtmlOutputDev::HtmlOutputDev(char *fileName, char *title, -+ char *author, char *keywords, char *subject, char *date, -+ char *extension, -+ GBool rawOrder, int firstPage, GBool outline) -+{ -+ char *htmlEncoding; -+ -+ fContentsFrame = NULL; -+ docTitle = new GooString(title); -+ pages = NULL; -+ dumpJPEG=gTrue; -+ //write = gTrue; -+ this->rawOrder = rawOrder; -+ this->doOutline = outline; -+ ok = gFalse; -+ imgNum=1; -+ //this->firstPage = firstPage; -+ //pageNum=firstPage; -+ // open file -+ needClose = gFalse; -+ pages = new HtmlPage(rawOrder, extension); -+ -+ glMetaVars = new GooList(); -+ glMetaVars->append(new HtmlMetaVar("generator", "pdftohtml 0.36")); -+ if( author ) glMetaVars->append(new HtmlMetaVar("author", author)); -+ if( keywords ) glMetaVars->append(new HtmlMetaVar("keywords", keywords)); -+ if( date ) glMetaVars->append(new HtmlMetaVar("date", date)); -+ if( subject ) glMetaVars->append(new HtmlMetaVar("subject", subject)); -+ -+ maxPageWidth = 0; -+ maxPageHeight = 0; -+ -+ pages->setDocName(fileName); -+ Docname=new GooString (fileName); -+ -+ // for non-xml output (complex or simple) with frames generate the left frame -+ if(!xml && !noframes) -+ { -+ GooString* left=new GooString(fileName); -+ left->append("_ind.html"); -+ -+ doFrame(firstPage); -+ -+ if (!(fContentsFrame = fopen(getFileNameFromPath(left->getCString(),left->getLength()), "w"))) -+ { -+ error(-1, "Couldn't open html file '%s'", left->getCString()); -+ delete left; -+ return; -+ } -+ delete left; -+ fputs(DOCTYPE, fContentsFrame); -+ fputs("<HTML>\n<HEAD>\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n",fContentsFrame); -+ -+ if (doOutline) -+ { -+ GooString *str = basename(Docname); -+ fprintf(fContentsFrame, "<A href=\"%s%s\" target=\"contents\">Outline</a><br>", str->getCString(), complexMode ? "-outline.html" : "s.html#outline"); -+ delete str; -+ } -+ -+ if (!complexMode) -+ { /* not in complex mode */ -+ -+ GooString* right=new GooString(fileName); -+ right->append("s.html"); -+ -+ if (!(page=fopen(getFileNameFromPath(right->getCString(),right->getLength()),"w"))){ -+ error(-1, "Couldn't open html file '%s'", right->getCString()); -+ delete right; -+ return; -+ } -+ delete right; -+ fputs(DOCTYPE, page); -+ fputs("<HTML>\n<HEAD>\n<TITLE></TITLE>\n</HEAD>\n<BODY>\n",page); -+ } -+ } -+ -+ if (noframes) { -+ if (stout) page=stdout; -+ else { -+ GooString* right=new GooString(fileName); -+ if (!xml) right->append(".html"); -+ if (xml) right->append(".xml"); -+ if (!(page=fopen(getFileNameFromPath(right->getCString(),right->getLength()),"w"))){ -+ delete right; -+ error(-1, "Couldn't open html file '%s'", right->getCString()); -+ return; -+ } -+ delete right; -+ } -+ -+ htmlEncoding = mapEncodingToHtml(globalParams->getTextEncodingName()); -+ if (xml) -+ { -+ fprintf(page, "<?xml version=\"1.0\" encoding=\"%s\"?>\n", htmlEncoding); -+ fputs("<!DOCTYPE pdf2xml SYSTEM \"pdf2xml.dtd\">\n\n", page); -+ fputs("<pdf2xml>\n",page); -+ } -+ else -+ { -+ fprintf(page,"%s\n<HTML>\n<HEAD>\n<TITLE>%s</TITLE>\n", -+ DOCTYPE, docTitle->getCString()); -+ -+ fprintf(page, "<META http-equiv=\"Content-Type\" content=\"text/html; charset=%s\">\n", htmlEncoding); -+ -+ dumpMetaVars(page); -+ fprintf(page,"</HEAD>\n"); -+ fprintf(page,"<BODY bgcolor=\"#A0A0A0\" vlink=\"blue\" link=\"blue\">\n"); -+ } -+ } -+ ok = gTrue; -+} -+ -+HtmlOutputDev::~HtmlOutputDev() { -+ /*if (mode&&!xml){ -+ int h=xoutRound(pages->pageHeight/scale); -+ int w=xoutRound(pages->pageWidth/scale); -+ fprintf(tin,"%s=%03d\n","PAPER_WIDTH",w); -+ fprintf(tin,"%s=%03d\n","PAPER_HEIGHT",h); -+ fclose(tin); -+ }*/ -+ -+ HtmlFont::clear(); -+ -+ delete Docname; -+ delete docTitle; -+ -+ deleteGooList(glMetaVars, HtmlMetaVar); -+ -+ if (fContentsFrame){ -+ fputs("</BODY>\n</HTML>\n",fContentsFrame); -+ fclose(fContentsFrame); -+ } -+ if (xml) { -+ fputs("</pdf2xml>\n",page); -+ fclose(page); -+ } else -+ if ( !complexMode || xml || noframes ) -+ { -+ fputs("</BODY>\n</HTML>\n",page); -+ fclose(page); -+ } -+ if (pages) -+ delete pages; -+} -+ -+ -+ -+void HtmlOutputDev::startPage(int pageNum, GfxState *state) { -+ /*if (mode&&!xml){ -+ if (write){ -+ write=gFalse; -+ GooString* fname=Dirname(Docname); -+ fname->append("image.log"); -+ if((tin=fopen(getFileNameFromPath(fname->getCString(),fname->getLength()),"w"))==NULL){ -+ printf("Error : can not open %s",fname); -+ exit(1); -+ } -+ delete fname; -+ // if(state->getRotation()!=0) -+ // fprintf(tin,"ROTATE=%d rotate %d neg %d neg translate\n",state->getRotation(),state->getX1(),-state->getY1()); -+ // else -+ fprintf(tin,"ROTATE=%d neg %d neg translate\n",state->getX1(),state->getY1()); -+ } -+ }*/ -+ -+ this->pageNum = pageNum; -+ GooString *str=basename(Docname); -+ pages->clear(); -+ if(!noframes) -+ { -+ if (fContentsFrame) -+ { -+ if (complexMode) -+ fprintf(fContentsFrame,"<A href=\"%s-%d.html\"",str->getCString(),pageNum); -+ else -+ fprintf(fContentsFrame,"<A href=\"%ss.html#%d\"",str->getCString(),pageNum); -+ fprintf(fContentsFrame," target=\"contents\" >Page %d</a><br>\n",pageNum); -+ } -+ } -+ -+ pages->pageWidth=static_cast<int>(state->getPageWidth()); -+ pages->pageHeight=static_cast<int>(state->getPageHeight()); -+ -+ delete str; -+} -+ -+ -+void HtmlOutputDev::endPage() { -+ pages->conv(); -+ pages->coalesce(); -+ pages->dump(page, pageNum); -+ -+ // I don't yet know what to do in the case when there are pages of different -+ // sizes and we want complex output: running ghostscript many times -+ // seems very inefficient. So for now I'll just use last page's size -+ maxPageWidth = pages->pageWidth; -+ maxPageHeight = pages->pageHeight; -+ -+ //if(!noframes&&!xml) fputs("<br>\n", fContentsFrame); -+ if(!stout && !globalParams->getErrQuiet()) printf("Page-%d\n",(pageNum)); -+} -+ -+void HtmlOutputDev::updateFont(GfxState *state) { -+ pages->updateFont(state); -+} -+ -+void HtmlOutputDev::beginString(GfxState *state, GooString *s) { -+ pages->beginString(state, s); -+} -+ -+void HtmlOutputDev::endString(GfxState *state) { -+ pages->endString(); -+} -+ -+void HtmlOutputDev::drawChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double originX, double originY, -+ CharCode code, Unicode *u, int uLen) -+{ -+ if ( !showHidden && (state->getRender() & 3) == 3) { -+ return; -+ } -+ pages->addChar(state, x, y, dx, dy, originX, originY, u, uLen); -+} -+ -+void HtmlOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg) { -+ -+ int i, j; -+ -+ if (ignore||complexMode) { -+ OutputDev::drawImageMask(state, ref, str, width, height, invert, inlineImg); -+ return; -+ } -+ -+ FILE *f1; -+ int c; -+ -+ int x0, y0; // top left corner of image -+ int w0, h0, w1, h1; // size of image -+ double xt, yt, wt, ht; -+ GBool rotate, xFlip, yFlip; -+ GBool dither; -+ int x, y; -+ int ix, iy; -+ int px1, px2, qx, dx; -+ int py1, py2, qy, dy; -+ Gulong pixel; -+ int nComps, nVals, nBits; -+ double r1, g1, b1; -+ -+ // get image position and size -+ state->transform(0, 0, &xt, &yt); -+ state->transformDelta(1, 1, &wt, &ht); -+ if (wt > 0) { -+ x0 = xoutRound(xt); -+ w0 = xoutRound(wt); -+ } else { -+ x0 = xoutRound(xt + wt); -+ w0 = xoutRound(-wt); -+ } -+ if (ht > 0) { -+ y0 = xoutRound(yt); -+ h0 = xoutRound(ht); -+ } else { -+ y0 = xoutRound(yt + ht); -+ h0 = xoutRound(-ht); -+ } -+ state->transformDelta(1, 0, &xt, &yt); -+ rotate = fabs(xt) < fabs(yt); -+ if (rotate) { -+ w1 = h0; -+ h1 = w0; -+ xFlip = ht < 0; -+ yFlip = wt > 0; -+ } else { -+ w1 = w0; -+ h1 = h0; -+ xFlip = wt < 0; -+ yFlip = ht > 0; -+ } -+ -+ // dump JPEG file -+ if (dumpJPEG && str->getKind() == strDCT) { -+ GooString *fName=new GooString(Docname); -+ fName->append("-"); -+ GooString *pgNum=GooString::fromInt(pageNum); -+ GooString *imgnum=GooString::fromInt(imgNum); -+ // open the image file -+ fName->append(pgNum)->append("_")->append(imgnum)->append(".jpg"); -+ ++imgNum; -+ if (!(f1 = fopen(getFileNameFromPath(fName->getCString(),fName->getLength()), "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fName->getCString()); -+ return; -+ } -+ -+ // initialize stream -+ str = ((DCTStream *)str)->getRawStream(); -+ str->reset(); -+ -+ // copy the stream -+ while ((c = str->getChar()) != EOF) -+ fputc(c, f1); -+ -+ fclose(f1); -+ -+ if (pgNum) delete pgNum; -+ if (imgnum) delete imgnum; -+ if (fName) delete fName; -+ } -+ else { -+ OutputDev::drawImageMask(state, ref, str, width, height, invert, inlineImg); -+ } -+} -+ -+void HtmlOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg) { -+ -+ int i, j; -+ -+ if (ignore||complexMode) { -+ OutputDev::drawImage(state, ref, str, width, height, colorMap, -+ maskColors, inlineImg); -+ return; -+ } -+ -+ FILE *f1; -+ ImageStream *imgStr; -+ Guchar pixBuf[4]; -+ GfxColor color; -+ int c; -+ -+ int x0, y0; // top left corner of image -+ int w0, h0, w1, h1; // size of image -+ double xt, yt, wt, ht; -+ GBool rotate, xFlip, yFlip; -+ GBool dither; -+ int x, y; -+ int ix, iy; -+ int px1, px2, qx, dx; -+ int py1, py2, qy, dy; -+ Gulong pixel; -+ int nComps, nVals, nBits; -+ double r1, g1, b1; -+ -+ // get image position and size -+ state->transform(0, 0, &xt, &yt); -+ state->transformDelta(1, 1, &wt, &ht); -+ if (wt > 0) { -+ x0 = xoutRound(xt); -+ w0 = xoutRound(wt); -+ } else { -+ x0 = xoutRound(xt + wt); -+ w0 = xoutRound(-wt); -+ } -+ if (ht > 0) { -+ y0 = xoutRound(yt); -+ h0 = xoutRound(ht); -+ } else { -+ y0 = xoutRound(yt + ht); -+ h0 = xoutRound(-ht); -+ } -+ state->transformDelta(1, 0, &xt, &yt); -+ rotate = fabs(xt) < fabs(yt); -+ if (rotate) { -+ w1 = h0; -+ h1 = w0; -+ xFlip = ht < 0; -+ yFlip = wt > 0; -+ } else { -+ w1 = w0; -+ h1 = h0; -+ xFlip = wt < 0; -+ yFlip = ht > 0; -+ } -+ -+ -+ /*if( !globalParams->getErrQuiet() ) -+ printf("image stream of kind %d\n", str->getKind());*/ -+ // dump JPEG file -+ if (dumpJPEG && str->getKind() == strDCT) { -+ GooString *fName=new GooString(Docname); -+ fName->append("-"); -+ GooString *pgNum= GooString::fromInt(pageNum); -+ GooString *imgnum= GooString::fromInt(imgNum); -+ -+ // open the image file -+ fName->append(pgNum)->append("_")->append(imgnum)->append(".jpg"); -+ ++imgNum; -+ -+ if (!(f1 = fopen(getFileNameFromPath(fName->getCString(),fName->getLength()), "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fName->getCString()); -+ return; -+ } -+ -+ // initialize stream -+ str = ((DCTStream *)str)->getRawStream(); -+ str->reset(); -+ -+ // copy the stream -+ while ((c = str->getChar()) != EOF) -+ fputc(c, f1); -+ -+ fclose(f1); -+ -+ delete fName; -+ delete pgNum; -+ delete imgnum; -+ } -+ else { -+ OutputDev::drawImage(state, ref, str, width, height, colorMap, -+ maskColors, inlineImg); -+ } -+} -+ -+ -+ -+void HtmlOutputDev::drawLink(Link* link,Catalog *cat){ -+ double _x1,_y1,_x2,_y2,w; -+ int x1,y1,x2,y2; -+ -+ link->getRect(&_x1,&_y1,&_x2,&_y2); -+ w = link->getBorderStyle()->getWidth(); -+ cvtUserToDev(_x1,_y1,&x1,&y1); -+ -+ cvtUserToDev(_x2,_y2,&x2,&y2); -+ -+ -+ GooString* _dest=getLinkDest(link,cat); -+ HtmlLink t((double) x1,(double) y2,(double) x2,(double) y1,_dest); -+ pages->AddLink(t); -+ delete _dest; -+} -+ -+GooString* HtmlOutputDev::getLinkDest(Link *link,Catalog* catalog){ -+ char *p; -+ switch(link->getAction()->getKind()) -+ { -+ case actionGoTo: -+ { -+ GooString* file=basename(Docname); -+ int page=1; -+ LinkGoTo *ha=(LinkGoTo *)link->getAction(); -+ LinkDest *dest=NULL; -+ if (ha->getDest()==NULL) -+ dest=catalog->findDest(ha->getNamedDest()); -+ else -+ dest=ha->getDest()->copy(); -+ if (dest){ -+ if (dest->isPageRef()){ -+ Ref pageref=dest->getPageRef(); -+ page=catalog->findPage(pageref.num,pageref.gen); -+ } -+ else { -+ page=dest->getPageNum(); -+ } -+ -+ delete dest; -+ -+ GooString *str=GooString::fromInt(page); -+ /* complex simple -+ frames file-4.html files.html#4 -+ noframes file.html#4 file.html#4 -+ */ -+ if (noframes) -+ { -+ file->append(".html#"); -+ file->append(str); -+ } -+ else -+ { -+ if( complexMode ) -+ { -+ file->append("-"); -+ file->append(str); -+ file->append(".html"); -+ } -+ else -+ { -+ file->append("s.html#"); -+ file->append(str); -+ } -+ } -+ -+ if (printCommands) printf(" link to page %d ",page); -+ delete str; -+ return file; -+ } -+ else -+ { -+ return new GooString(); -+ } -+ } -+ case actionGoToR: -+ { -+ LinkGoToR *ha=(LinkGoToR *) link->getAction(); -+ LinkDest *dest=NULL; -+ int page=1; -+ GooString *file=new GooString(); -+ if (ha->getFileName()){ -+ delete file; -+ file=new GooString(ha->getFileName()->getCString()); -+ } -+ if (ha->getDest()!=NULL) dest=ha->getDest()->copy(); -+ if (dest&&file){ -+ if (!(dest->isPageRef())) page=dest->getPageNum(); -+ delete dest; -+ -+ if (printCommands) printf(" link to page %d ",page); -+ if (printHtml){ -+ p=file->getCString()+file->getLength()-4; -+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){ -+ file->del(file->getLength()-4,4); -+ file->append(".html"); -+ } -+ file->append('#'); -+ file->append(GooString::fromInt(page)); -+ } -+ } -+ if (printCommands) printf("filename %s\n",file->getCString()); -+ return file; -+ } -+ case actionURI: -+ { -+ LinkURI *ha=(LinkURI *) link->getAction(); -+ GooString* file=new GooString(ha->getURI()->getCString()); -+ // printf("uri : %s\n",file->getCString()); -+ return file; -+ } -+ case actionLaunch: -+ { -+ LinkLaunch *ha=(LinkLaunch *) link->getAction(); -+ GooString* file=new GooString(ha->getFileName()->getCString()); -+ if (printHtml) { -+ p=file->getCString()+file->getLength()-4; -+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")){ -+ file->del(file->getLength()-4,4); -+ file->append(".html"); -+ } -+ if (printCommands) printf("filename %s",file->getCString()); -+ -+ return file; -+ -+ } -+ } -+ default: -+ return new GooString(); -+ } -+} -+ -+void HtmlOutputDev::dumpMetaVars(FILE *file) -+{ -+ GooString *var; -+ -+ for(int i = 0; i < glMetaVars->getLength(); i++) -+ { -+ HtmlMetaVar *t = (HtmlMetaVar*)glMetaVars->get(i); -+ var = t->toString(); -+ fprintf(file, "%s\n", var->getCString()); -+ delete var; -+ } -+} -+ -+GBool HtmlOutputDev::dumpDocOutline(Catalog* catalog) -+{ -+ FILE * output; -+ GBool bClose = gFalse; -+ -+ if (!ok || xml) -+ return gFalse; -+ -+ Object *outlines = catalog->getOutline(); -+ if (!outlines->isDict()) -+ return gFalse; -+ -+ if (!complexMode && !xml) -+ { -+ output = page; -+ } -+ else if (complexMode && !xml) -+ { -+ if (noframes) -+ { -+ output = page; -+ fputs("<hr>\n", output); -+ } -+ else -+ { -+ GooString *str = basename(Docname); -+ str->append("-outline.html"); -+ output = fopen(getFileNameFromPath(str->getCString(),str->getLength()), "w"); -+ if (output == NULL) -+ return gFalse; -+ delete str; -+ bClose = gTrue; -+ fputs("<HTML>\n<HEAD>\n<TITLE>Document Outline</TITLE>\n</HEAD>\n<BODY>\n", output); -+ } -+ } -+ -+ GBool done = newOutlineLevel(output, outlines, catalog); -+ if (done && !complexMode) -+ fputs("<hr>\n", output); -+ -+ if (bClose) -+ { -+ fputs("</BODY>\n</HTML>\n", output); -+ fclose(output); -+ } -+ return done; -+} -+ -+GBool HtmlOutputDev::newOutlineLevel(FILE *output, Object *node, Catalog* catalog, int level) -+{ -+ Object curr, next; -+ GBool atLeastOne = gFalse; -+ -+ if (node->dictLookup("First", &curr)->isDict()) { -+ 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(); -+ -+ // 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=catalog->findDest(link->getNamedDest()); -+ else -+ linkdest=link->getDest()->copy(); -+ 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; -+ } -+ } -+ 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(); -+ -+ return atLeastOne; -+} -+ -+char* getFileNameFromPath(char* c, int strlen) { -+ int last_slash_index = 0; -+ int i = 0; -+ char* res; -+ -+ for (i=0;i<strlen;i++) { -+ if (*(c+i)=='/') { -+ /* printf("/ detected\n"); */ -+ last_slash_index = i; -+ } -+ } -+ res = (char *)malloc(sizeof(char)*strlen-last_slash_index+1); -+ strcpy(res,c+last_slash_index+(last_slash_index?1:0)); -+ /* printf("Fil: %s\n",res); */ -+ return res; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/HtmlOutputDev.h poppler-0.4.3/utils/HtmlOutputDev.h ---- poppler-0.4.3.orig/utils/HtmlOutputDev.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/HtmlOutputDev.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,302 @@ -+//======================================================================== -+// -+// HtmlOutputDev.h -+// -+// Copyright 1997 Derek B. Noonburg -+// -+// Changed 1999 by G.Ovtcharov -+//======================================================================== -+ -+#ifndef HTMLOUTPUTDEV_H -+#define HTMLOUTPUTDEV_H -+ -+#ifdef __GNUC__ -+#pragma interface -+#endif -+ -+#include <stdio.h> -+#include "goo/gtypes.h" -+#include "goo/GooList.h" -+#include "GfxFont.h" -+#include "OutputDev.h" -+#include "HtmlLinks.h" -+#include "HtmlFonts.h" -+#include "Link.h" -+#include "Catalog.h" -+#include "UnicodeMap.h" -+ -+ -+#ifdef WIN32 -+# define SLASH '\\' -+#else -+# define SLASH '/' -+#endif -+ -+#define xoutRound(x) ((int)(x + 0.5)) -+ -+#define DOCTYPE "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">" -+#define DOCTYPE_FRAMES "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Frameset//EN\"\n\"http://www.w3.org/TR/html4/frameset.dtd\">" -+ -+class GfxState; -+class GooString; -+//------------------------------------------------------------------------ -+// HtmlString -+//------------------------------------------------------------------------ -+ -+enum UnicodeTextDirection { -+ textDirUnknown, -+ textDirLeftRight, -+ textDirRightLeft, -+ textDirTopBottom -+}; -+ -+ -+class HtmlString { -+public: -+ -+ // Constructor. -+ HtmlString(GfxState *state, double fontSize, HtmlFontAccu* fonts); -+ -+ // Destructor. -+ ~HtmlString(); -+ -+ // Add a character to the string. -+ void addChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ Unicode u); -+ HtmlLink* getLink() { return link; } -+ void endString(); // postprocessing -+ -+private: -+// aender die text variable -+ HtmlLink *link; -+ double xMin, xMax; // bounding box x coordinates -+ double yMin, yMax; // bounding box y coordinates -+ int col; // starting column -+ Unicode *text; // the text -+ double *xRight; // right-hand x coord of each char -+ HtmlString *yxNext; // next string in y-major order -+ HtmlString *xyNext; // next string in x-major order -+ int fontpos; -+ GooString* htext; -+ int len; // length of text and xRight -+ int size; // size of text and xRight arrays -+ UnicodeTextDirection dir; // direction (left to right/right to left) -+ -+ friend class HtmlPage; -+ -+}; -+ -+ -+//------------------------------------------------------------------------ -+// HtmlPage -+//------------------------------------------------------------------------ -+ -+ -+ -+class HtmlPage { -+public: -+ -+ // Constructor. -+ HtmlPage(GBool rawOrder, char *imgExtVal); -+ -+ // Destructor. -+ ~HtmlPage(); -+ -+ // Begin a new string. -+ void beginString(GfxState *state, GooString *s); -+ -+ // Add a character to the current string. -+ void addChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double ox, double oy, -+ Unicode *u, int uLen); //Guchar c); -+ -+ void updateFont(GfxState *state); -+ -+ // End the current string, sorting it into the list of strings. -+ void endString(); -+ -+ // Coalesce strings that look like parts of the same line. -+ void coalesce(); -+ -+ // Find a string. If <top> is true, starts looking at top of page; -+ // otherwise starts looking at <xMin>,<yMin>. If <bottom> is true, -+ // stops looking at bottom of page; otherwise stops looking at -+ // <xMax>,<yMax>. If found, sets the text bounding rectange and -+ // returns true; otherwise returns false. -+ -+ -+ // new functions -+ void AddLink(const HtmlLink& x){ -+ links->AddLink(x); -+ } -+ -+ void dump(FILE *f, int pageNum); -+ -+ // Clear the page. -+ void clear(); -+ -+ void conv(); -+private: -+ HtmlFont* getFont(HtmlString *hStr) { return fonts->Get(hStr->fontpos); } -+ -+ double fontSize; // current font size -+ GBool rawOrder; // keep strings in content stream order -+ -+ HtmlString *curStr; // currently active string -+ -+ HtmlString *yxStrings; // strings in y-major order -+ HtmlString *xyStrings; // strings in x-major order -+ HtmlString *yxCur1, *yxCur2; // cursors for yxStrings list -+ -+ void setDocName(char* fname); -+ void dumpAsXML(FILE* f,int page); -+ void dumpComplex(FILE* f, int page); -+ -+ // marks the position of the fonts that belong to current page (for noframes) -+ int fontsPageMarker; -+ HtmlFontAccu *fonts; -+ HtmlLinks *links; -+ -+ GooString *DocName; -+ GooString *imgExt; -+ int pageWidth; -+ int pageHeight; -+ static int pgNum; -+ int firstPage; // used to begin the numeration of pages -+ -+ friend class HtmlOutputDev; -+}; -+ -+//------------------------------------------------------------------------ -+// HtmlMetaVar -+//------------------------------------------------------------------------ -+class HtmlMetaVar { -+public: -+ HtmlMetaVar(char *_name, char *_content); -+ ~HtmlMetaVar(); -+ -+ GooString* toString(); -+ -+private: -+ -+ GooString *name; -+ GooString *content; -+}; -+ -+//------------------------------------------------------------------------ -+// HtmlOutputDev -+//------------------------------------------------------------------------ -+ -+class HtmlOutputDev: public OutputDev { -+public: -+ -+ // Open a text output file. If <fileName> is NULL, no file is written -+ // (this is useful, e.g., for searching text). If <useASCII7> is true, -+ // text is converted to 7-bit ASCII; otherwise, text is converted to -+ // 8-bit ISO Latin-1. <useASCII7> should also be set for Japanese -+ // (EUC-JP) text. If <rawOrder> is true, the text is kept in content -+ // stream order. -+ HtmlOutputDev(char *fileName, char *title, -+ char *author, -+ char *keywords, -+ char *subject, -+ char *date, -+ char *extension, -+ GBool rawOrder, -+ int firstPage = 1, -+ GBool outline = 0); -+ -+ // Destructor. -+ virtual ~HtmlOutputDev(); -+ -+ // Check if file was successfully created. -+ virtual GBool isOk() { return ok; } -+ -+ //---- get info about output device -+ -+ // Does this device use upside-down coordinates? -+ // (Upside-down means (0,0) is the top left corner of the page.) -+ virtual GBool upsideDown() { return gTrue; } -+ -+ // Does this device use drawChar() or drawString()? -+ virtual GBool useDrawChar() { return gTrue; } -+ -+ // Does this device use beginType3Char/endType3Char? Otherwise, -+ // text in Type 3 fonts will be drawn with drawChar/drawString. -+ virtual GBool interpretType3Chars() { return gFalse; } -+ -+ // Does this device need non-text content? -+ virtual GBool needNonText() { return gFalse; } -+ -+ //----- initialization and control -+ -+ // Start a page. -+ virtual void startPage(int pageNum, GfxState *state); -+ -+ // End a page. -+ virtual void endPage(); -+ -+ //----- update text state -+ virtual void updateFont(GfxState *state); -+ -+ //----- text drawing -+ virtual void beginString(GfxState *state, GooString *s); -+ virtual void endString(GfxState *state); -+ virtual void drawChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double originX, double originY, -+ CharCode code, Unicode *u, int uLen); -+ -+ virtual void drawImageMask(GfxState *state, Object *ref, -+ Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg); -+ virtual void drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg); -+ -+ //new feature -+ virtual int DevType() {return 1234;} -+ virtual void drawLink(Link *link,Catalog *cat); -+ -+ int getPageWidth() { return maxPageWidth; } -+ int getPageHeight() { return maxPageHeight; } -+ -+ GBool dumpDocOutline(Catalog* catalog); -+ -+ /* char* getFileNameFromPath(char* c, int strlen); */ -+ -+private: -+ // convert encoding into a HTML standard, or encoding->getCString if not -+ // recognized -+ static char* mapEncodingToHtml(GooString* encoding); -+ GooString* getLinkDest(Link *link,Catalog *catalog); -+ void dumpMetaVars(FILE *); -+ void doFrame(int firstPage); -+ GBool newOutlineLevel(FILE *output, Object *node, Catalog* catalog, int level = 1); -+ -+ FILE *fContentsFrame; -+ FILE *page; // html file -+ //FILE *tin; // image log file -+ //GBool write; -+ GBool needClose; // need to close the file? -+ HtmlPage *pages; // text for the current page -+ GBool rawOrder; // keep text in content stream order -+ GBool doOutline; // output document outline -+ GBool ok; // set up ok? -+ GBool dumpJPEG; -+ int pageNum; -+ int maxPageWidth; -+ int maxPageHeight; -+ static int imgNum; -+ GooString *Docname; -+ GooString *docTitle; -+ GooList *glMetaVars; -+ friend class HtmlPage; -+}; -+ -+char* getFileNameFromPath(char* c, int strlen); -+ -+#endif -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/ImageOutputDev.cc poppler-0.4.3/utils/ImageOutputDev.cc ---- poppler-0.4.3.orig/utils/ImageOutputDev.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/ImageOutputDev.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,195 @@ -+//======================================================================== -+// -+// ImageOutputDev.cc -+// -+// Copyright 1998-2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+ -+#ifdef USE_GCC_PRAGMAS -+#pragma implementation -+#endif -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <ctype.h> -+#include "goo/gmem.h" -+#include "config.h" -+#include "Error.h" -+#include "GfxState.h" -+#include "Object.h" -+#include "Stream.h" -+#include "DCTStream.h" -+#include "ImageOutputDev.h" -+ -+ImageOutputDev::ImageOutputDev(char *fileRootA, GBool dumpJPEGA) { -+ fileRoot = copyString(fileRootA); -+ fileName = (char *)gmalloc(strlen(fileRoot) + 20); -+ dumpJPEG = dumpJPEGA; -+ imgNum = 0; -+ ok = gTrue; -+} -+ -+ImageOutputDev::~ImageOutputDev() { -+ gfree(fileName); -+ gfree(fileRoot); -+} -+ -+void ImageOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg) { -+ FILE *f; -+ int c; -+ int size, i; -+ -+ // dump JPEG file -+ if (dumpJPEG && str->getKind() == strDCT && !inlineImg) { -+ -+ // open the image file -+ sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); -+ ++imgNum; -+ if (!(f = fopen(fileName, "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fileName); -+ return; -+ } -+ -+ // initialize stream -+ str = ((DCTStream *)str)->getRawStream(); -+ str->reset(); -+ -+ // copy the stream -+ while ((c = str->getChar()) != EOF) -+ fputc(c, f); -+ -+ str->close(); -+ fclose(f); -+ -+ // dump PBM file -+ } else { -+ -+ // open the image file and write the PBM header -+ sprintf(fileName, "%s-%03d.pbm", fileRoot, imgNum); -+ ++imgNum; -+ if (!(f = fopen(fileName, "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fileName); -+ return; -+ } -+ fprintf(f, "P4\n"); -+ fprintf(f, "%d %d\n", width, height); -+ -+ // initialize stream -+ str->reset(); -+ -+ // copy the stream -+ size = height * ((width + 7) / 8); -+ for (i = 0; i < size; ++i) { -+ fputc(str->getChar(), f); -+ } -+ -+ str->close(); -+ fclose(f); -+ } -+} -+ -+void ImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, -+ GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg) { -+ FILE *f; -+ ImageStream *imgStr; -+ Guchar *p; -+ GfxRGB rgb; -+ int x, y; -+ int c; -+ int size, i; -+ -+ // dump JPEG file -+ if (dumpJPEG && str->getKind() == strDCT && -+ colorMap->getNumPixelComps() == 3 && -+ !inlineImg) { -+ -+ // open the image file -+ sprintf(fileName, "%s-%03d.jpg", fileRoot, imgNum); -+ ++imgNum; -+ if (!(f = fopen(fileName, "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fileName); -+ return; -+ } -+ -+ // initialize stream -+ str = ((DCTStream *)str)->getRawStream(); -+ str->reset(); -+ -+ // copy the stream -+ while ((c = str->getChar()) != EOF) -+ fputc(c, f); -+ -+ str->close(); -+ fclose(f); -+ -+ // dump PBM file -+ } else if (colorMap->getNumPixelComps() == 1 && -+ colorMap->getBits() == 1) { -+ -+ // open the image file and write the PBM header -+ sprintf(fileName, "%s-%03d.pbm", fileRoot, imgNum); -+ ++imgNum; -+ if (!(f = fopen(fileName, "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fileName); -+ return; -+ } -+ fprintf(f, "P4\n"); -+ fprintf(f, "%d %d\n", width, height); -+ -+ // initialize stream -+ str->reset(); -+ -+ // copy the stream -+ size = height * ((width + 7) / 8); -+ for (i = 0; i < size; ++i) { -+ fputc(str->getChar() ^ 0xff, f); -+ } -+ -+ str->close(); -+ fclose(f); -+ -+ // dump PPM file -+ } else { -+ -+ // open the image file and write the PPM header -+ sprintf(fileName, "%s-%03d.ppm", fileRoot, imgNum); -+ ++imgNum; -+ if (!(f = fopen(fileName, "wb"))) { -+ error(-1, "Couldn't open image file '%s'", fileName); -+ return; -+ } -+ fprintf(f, "P6\n"); -+ fprintf(f, "%d %d\n", width, height); -+ fprintf(f, "255\n"); -+ -+ // initialize stream -+ imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(), -+ colorMap->getBits()); -+ imgStr->reset(); -+ -+ // for each line... -+ for (y = 0; y < height; ++y) { -+ -+ // write the line -+ p = imgStr->getLine(); -+ for (x = 0; x < width; ++x) { -+ colorMap->getRGB(p, &rgb); -+ fputc((int)(rgb.r * 255 + 0.5), f); -+ fputc((int)(rgb.g * 255 + 0.5), f); -+ fputc((int)(rgb.b * 255 + 0.5), f); -+ p += colorMap->getNumPixelComps(); -+ } -+ } -+ delete imgStr; -+ -+ fclose(f); -+ } -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/ImageOutputDev.h poppler-0.4.3/utils/ImageOutputDev.h ---- poppler-0.4.3.orig/utils/ImageOutputDev.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/ImageOutputDev.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,76 @@ -+//======================================================================== -+// -+// ImageOutputDev.h -+// -+// Copyright 1998-2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#ifndef IMAGEOUTPUTDEV_H -+#define IMAGEOUTPUTDEV_H -+ -+#include <poppler-config.h> -+ -+#ifdef USE_GCC_PRAGMAS -+#pragma interface -+#endif -+ -+#include <stdio.h> -+#include "goo/gtypes.h" -+#include "OutputDev.h" -+ -+class GfxState; -+ -+//------------------------------------------------------------------------ -+// ImageOutputDev -+//------------------------------------------------------------------------ -+ -+class ImageOutputDev: public OutputDev { -+public: -+ -+ // Create an OutputDev which will write images to files named -+ // <fileRoot>-NNN.<type>. Normally, all images are written as PBM -+ // (.pbm) or PPM (.ppm) files. If <dumpJPEG> is set, JPEG images are -+ // written as JPEG (.jpg) files. -+ ImageOutputDev(char *fileRootA, GBool dumpJPEGA); -+ -+ // Destructor. -+ virtual ~ImageOutputDev(); -+ -+ // Check if file was successfully created. -+ virtual GBool isOk() { return ok; } -+ -+ // Does this device use beginType3Char/endType3Char? Otherwise, -+ // text in Type 3 fonts will be drawn with drawChar/drawString. -+ virtual GBool interpretType3Chars() { return gFalse; } -+ -+ // Does this device need non-text content? -+ virtual GBool needNonText() { return gFalse; } -+ -+ //---- get info about output device -+ -+ // Does this device use upside-down coordinates? -+ // (Upside-down means (0,0) is the top left corner of the page.) -+ virtual GBool upsideDown() { return gTrue; } -+ -+ // Does this device use drawChar() or drawString()? -+ virtual GBool useDrawChar() { return gFalse; } -+ -+ //----- image drawing -+ virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg); -+ virtual void drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg); -+ -+private: -+ -+ char *fileRoot; // root of output file names -+ char *fileName; // buffer for output file names -+ GBool dumpJPEG; // set to dump native JPEG files -+ int imgNum; // current image number -+ GBool ok; // set up ok? -+}; -+ -+#endif -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/Makefile.am poppler-0.4.3/utils/Makefile.am ---- poppler-0.4.3.orig/utils/Makefile.am 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/Makefile.am 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,26 @@ -+ -+INCLUDES = \ -+ -I$(top_srcdir) -+ -+LDADD = \ -+ $(top_builddir)/poppler/libpoppler.la -+ -+#pdftoppm_LDADD = \ -+# $(top_builddir)/splash/libsplash.la -+ -+poppler_includedir = $(includedir)/poppler -+ -+bin_PROGRAMS = pdffonts pdfimages pdfinfo pdftops pdftotext pdftohtml -+ -+man1_MANS = pdffonts.1 pdfimages.1 pdfinfo.1 pdftops.1 pdftotext.1 pdftohtml.1 -+ -+pdffonts_SOURCES = pdffonts.cc parseargs.c -+pdfimages_SOURCES = pdfimages.cc ImageOutputDev.cc parseargs.c -+pdfinfo_SOURCES = pdfinfo.cc parseargs.c -+pdftops_SOURCES = pdftops.cc parseargs.c -+pdftotext_SOURCES = pdftotext.cc parseargs.c -+pdftohtml_SOURCES = pdftohtml.cc parseargs.c \ -+ HtmlFonts.cc HtmlLinks.cc HtmlOutputDev.cc -+ -+#pdftoppm_SOURCES = pdftoppm.cc SplashOutputDev.cc parseargs.c -+#bin_PROGRAMS += pdftoppm -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/parseargs.c poppler-0.4.3/utils/parseargs.c ---- poppler-0.4.3.orig/utils/parseargs.c 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/parseargs.c 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,190 @@ -+/* -+ * parseargs.h -+ * -+ * Command line argument parser. -+ * -+ * Copyright 1996-2003 Glyph & Cog, LLC -+ */ -+ -+#include <stdio.h> -+#include <stddef.h> -+#include <string.h> -+#include <stdlib.h> -+#include <ctype.h> -+#include "parseargs.h" -+ -+static ArgDesc *findArg(ArgDesc *args, char *arg); -+static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]); -+ -+GBool parseArgs(ArgDesc *args, int *argc, char *argv[]) { -+ ArgDesc *arg; -+ int i, j; -+ GBool ok; -+ -+ ok = gTrue; -+ i = 1; -+ while (i < *argc) { -+ if (!strcmp(argv[i], "--")) { -+ --*argc; -+ for (j = i; j < *argc; ++j) -+ argv[j] = argv[j+1]; -+ break; -+ } else if ((arg = findArg(args, argv[i]))) { -+ if (!grabArg(arg, i, argc, argv)) -+ ok = gFalse; -+ } else { -+ ++i; -+ } -+ } -+ return ok; -+} -+ -+void printUsage(char *program, char *otherArgs, ArgDesc *args) { -+ ArgDesc *arg; -+ char *typ; -+ int w, w1; -+ -+ w = 0; -+ for (arg = args; arg->arg; ++arg) { -+ if ((w1 = strlen(arg->arg)) > w) -+ w = w1; -+ } -+ -+ fprintf(stderr, "Usage: %s [options]", program); -+ if (otherArgs) -+ fprintf(stderr, " %s", otherArgs); -+ fprintf(stderr, "\n"); -+ -+ for (arg = args; arg->arg; ++arg) { -+ fprintf(stderr, " %s", arg->arg); -+ w1 = 9 + w - strlen(arg->arg); -+ switch (arg->kind) { -+ case argInt: -+ case argIntDummy: -+ typ = " <int>"; -+ break; -+ case argFP: -+ case argFPDummy: -+ typ = " <fp>"; -+ break; -+ case argString: -+ case argStringDummy: -+ typ = " <string>"; -+ break; -+ case argFlag: -+ case argFlagDummy: -+ default: -+ typ = ""; -+ break; -+ } -+ fprintf(stderr, "%-*s", w1, typ); -+ if (arg->usage) -+ fprintf(stderr, ": %s", arg->usage); -+ fprintf(stderr, "\n"); -+ } -+} -+ -+static ArgDesc *findArg(ArgDesc *args, char *arg) { -+ ArgDesc *p; -+ -+ for (p = args; p->arg; ++p) { -+ if (p->kind < argFlagDummy && !strcmp(p->arg, arg)) -+ return p; -+ } -+ return NULL; -+} -+ -+static GBool grabArg(ArgDesc *arg, int i, int *argc, char *argv[]) { -+ int n; -+ int j; -+ GBool ok; -+ -+ ok = gTrue; -+ n = 0; -+ switch (arg->kind) { -+ case argFlag: -+ *(GBool *)arg->val = gTrue; -+ n = 1; -+ break; -+ case argInt: -+ if (i + 1 < *argc && isInt(argv[i+1])) { -+ *(int *)arg->val = atoi(argv[i+1]); -+ n = 2; -+ } else { -+ ok = gFalse; -+ n = 1; -+ } -+ break; -+ case argFP: -+ if (i + 1 < *argc && isFP(argv[i+1])) { -+ *(double *)arg->val = atof(argv[i+1]); -+ n = 2; -+ } else { -+ ok = gFalse; -+ n = 1; -+ } -+ break; -+ case argString: -+ if (i + 1 < *argc) { -+ strncpy((char *)arg->val, argv[i+1], arg->size - 1); -+ ((char *)arg->val)[arg->size - 1] = '\0'; -+ n = 2; -+ } else { -+ ok = gFalse; -+ n = 1; -+ } -+ break; -+ default: -+ fprintf(stderr, "Internal error in arg table\n"); -+ n = 1; -+ break; -+ } -+ if (n > 0) { -+ *argc -= n; -+ for (j = i; j < *argc; ++j) -+ argv[j] = argv[j+n]; -+ } -+ return ok; -+} -+ -+GBool isInt(char *s) { -+ if (*s == '-' || *s == '+') -+ ++s; -+ while (isdigit(*s)) -+ ++s; -+ if (*s) -+ return gFalse; -+ return gTrue; -+} -+ -+GBool isFP(char *s) { -+ int n; -+ -+ if (*s == '-' || *s == '+') -+ ++s; -+ n = 0; -+ while (isdigit(*s)) { -+ ++s; -+ ++n; -+ } -+ if (*s == '.') -+ ++s; -+ while (isdigit(*s)) { -+ ++s; -+ ++n; -+ } -+ if (n > 0 && (*s == 'e' || *s == 'E')) { -+ ++s; -+ if (*s == '-' || *s == '+') -+ ++s; -+ n = 0; -+ if (!isdigit(*s)) -+ return gFalse; -+ do { -+ ++s; -+ } while (isdigit(*s)); -+ } -+ if (*s) -+ return gFalse; -+ return gTrue; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/parseargs.h poppler-0.4.3/utils/parseargs.h ---- poppler-0.4.3.orig/utils/parseargs.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/parseargs.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,71 @@ -+/* -+ * parseargs.h -+ * -+ * Command line argument parser. -+ * -+ * Copyright 1996-2003 Glyph & Cog, LLC -+ */ -+ -+#ifndef PARSEARGS_H -+#define PARSEARGS_H -+ -+#ifdef __cplusplus -+extern "C" { -+#endif -+ -+#include "goo/gtypes.h" -+ -+/* -+ * Argument kinds. -+ */ -+typedef enum { -+ argFlag, /* flag (present / not-present) */ -+ /* [val: GBool *] */ -+ argInt, /* integer arg */ -+ /* [val: int *] */ -+ argFP, /* floating point arg */ -+ /* [val: double *] */ -+ argString, /* string arg */ -+ /* [val: char *] */ -+ /* dummy entries -- these show up in the usage listing only; */ -+ /* useful for X args, for example */ -+ argFlagDummy, -+ argIntDummy, -+ argFPDummy, -+ argStringDummy -+} ArgKind; -+ -+/* -+ * Argument descriptor. -+ */ -+typedef struct { -+ char *arg; /* the command line switch */ -+ ArgKind kind; /* kind of arg */ -+ void *val; /* place to store value */ -+ int size; /* for argString: size of string */ -+ char *usage; /* usage string */ -+} ArgDesc; -+ -+/* -+ * Parse command line. Removes all args which are found in the arg -+ * descriptor list <args>. Stops parsing if "--" is found (and removes -+ * it). Returns gFalse if there was an error. -+ */ -+extern GBool parseArgs(ArgDesc *args, int *argc, char *argv[]); -+ -+/* -+ * Print usage message, based on arg descriptor list. -+ */ -+extern void printUsage(char *program, char *otherArgs, ArgDesc *args); -+ -+/* -+ * Check if a string is a valid integer or floating point number. -+ */ -+extern GBool isInt(char *s); -+extern GBool isFP(char *s); -+ -+#ifdef __cplusplus -+} -+#endif -+ -+#endif -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdffonts.1 poppler-0.4.3/utils/pdffonts.1 ---- poppler-0.4.3.orig/utils/pdffonts.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdffonts.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,128 @@ -+.\" Copyright 1999-2004 Glyph & Cog, LLC -+.TH pdffonts 1 "22 January 2004" -+.SH NAME -+pdffonts \- Portable Document Format (PDF) font analyzer (version -+3.00) -+.SH SYNOPSIS -+.B pdffonts -+[options] -+.RI [ PDF-file ] -+.SH DESCRIPTION -+.B Pdffonts -+lists the fonts used in a Portable Document Format (PDF) file along -+with various information for each font. -+.PP -+The following information is listed for each font: -+.TP -+.B name -+the font name, exactly as given in the PDF file (potentially including -+a subset prefix) -+.TP -+.B type -+the font type -- see below for details -+.TP -+.B emb -+"yes" if the font is embedded in the PDF file -+.TP -+.B sub -+"yes" if the font is a subset -+.TP -+.B uni -+"yes" if there is an explicit "ToUnicode" map in the PDF file (the -+absence of a ToUnicode map doesn't necessarily mean that the text -+can't be converted to Unicode) -+.TP -+.B object ID -+the font dictionary object ID (number and generation) -+.PP -+PDF files can contain the following types of fonts: -+.PP -+.RS -+Type 1 -+.RE -+.RS -+Type 1C -- aka Compact Font Format (CFF) -+.RE -+.RS -+Type 3 -+.RE -+.RS -+TrueType -+.RE -+.RS -+CID Type 0 -- 16-bit font with no specified type -+.RE -+.RS -+CID Type 0C -- 16-bit PostScript CFF font -+.RE -+.RS -+CID TrueType -- 16-bit TrueType font -+.RE -+.SH CONFIGURATION FILE -+Pdffonts reads a configuration file at startup. It first tries to -+find the user's private config file, ~/.xpdfrc. If that doesn't -+exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to analyze. -+.TP -+.BI \-l " number" -+Specifies the last page to analyze. -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.BI \-cfg " config-file" -+Read -+.I config-file -+in place of ~/.xpdfrc or the system-wide config file. -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdffonts software and documentation are copyright 1996-2004 Glyph -+& Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftops (1), -+.BR pdftotext (1), -+.BR pdfinfo (1), -+.BR pdftoppm (1), -+.BR pdfimages (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdffonts.cc poppler-0.4.3/utils/pdffonts.cc ---- poppler-0.4.3.orig/utils/pdffonts.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdffonts.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,292 @@ -+//======================================================================== -+// -+// pdffonts.cc -+// -+// Copyright 2001-2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include <math.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "GlobalParams.h" -+#include "Error.h" -+#include "Object.h" -+#include "Dict.h" -+#include "GfxFont.h" -+#include "Annot.h" -+#include "PDFDoc.h" -+#include "config.h" -+ -+static char *fontTypeNames[] = { -+ "unknown", -+ "Type 1", -+ "Type 1C", -+ "Type 3", -+ "TrueType", -+ "CID Type 0", -+ "CID Type 0C", -+ "CID TrueType" -+}; -+ -+static void scanFonts(Dict *resDict, PDFDoc *doc); -+static void scanFont(GfxFont *font, PDFDoc *doc); -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static char ownerPassword[33] = "\001"; -+static char userPassword[33] = "\001"; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to examine"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to examine"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+static Ref *fonts; -+static int fontsLen; -+static int fontsSize; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ GooString *ownerPW, *userPW; -+ GBool ok; -+ Page *page; -+ Dict *resDict; -+ Annots *annots; -+ Object obj1, obj2; -+ int pg, i; -+ int exitCode; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc != 2 || printVersion || printHelp) { -+ fprintf(stderr, "pdffonts version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdffonts", "<PDF-file>", argDesc); -+ } -+ goto err0; -+ } -+ fileName = new GooString(argv[1]); -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ -+ // open PDF file -+ if (ownerPassword[0] != '\001') { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0] != '\001') { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err1; -+ } -+ -+ // get page range -+ if (firstPage < 1) { -+ firstPage = 1; -+ } -+ if (lastPage < 1 || lastPage > doc->getNumPages()) { -+ lastPage = doc->getNumPages(); -+ } -+ -+ // scan the fonts -+ printf("name type emb sub uni object ID\n"); -+ printf("------------------------------------ ------------ --- --- --- ---------\n"); -+ fonts = NULL; -+ fontsLen = fontsSize = 0; -+ for (pg = firstPage; pg <= lastPage; ++pg) { -+ page = doc->getCatalog()->getPage(pg); -+ if ((resDict = page->getResourceDict())) { -+ scanFonts(resDict, doc); -+ } -+ annots = new Annots(doc->getXRef(), page->getAnnots(&obj1)); -+ obj1.free(); -+ for (i = 0; i < annots->getNumAnnots(); ++i) { -+ if (annots->getAnnot(i)->getAppearance(&obj1)->isStream()) { -+ obj1.streamGetDict()->lookup("Resources", &obj2); -+ if (obj2.isDict()) { -+ scanFonts(obj2.getDict(), doc); -+ } -+ obj2.free(); -+ } -+ obj1.free(); -+ } -+ delete annots; -+ } -+ -+ exitCode = 0; -+ -+ // clean up -+ gfree(fonts); -+ err1: -+ delete doc; -+ delete globalParams; -+ err0: -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -+ -+static void scanFonts(Dict *resDict, PDFDoc *doc) { -+ Object obj1, obj2, xObjDict, xObj, resObj; -+ Ref r; -+ GfxFontDict *gfxFontDict; -+ GfxFont *font; -+ int i; -+ -+ // scan the fonts in this resource dictionary -+ gfxFontDict = NULL; -+ resDict->lookupNF("Font", &obj1); -+ if (obj1.isRef()) { -+ obj1.fetch(doc->getXRef(), &obj2); -+ if (obj2.isDict()) { -+ r = obj1.getRef(); -+ gfxFontDict = new GfxFontDict(doc->getXRef(), &r, obj2.getDict()); -+ } -+ obj2.free(); -+ } else if (obj1.isDict()) { -+ gfxFontDict = new GfxFontDict(doc->getXRef(), NULL, obj1.getDict()); -+ } -+ if (gfxFontDict) { -+ for (i = 0; i < gfxFontDict->getNumFonts(); ++i) { -+ if ((font = gfxFontDict->getFont(i))) { -+ scanFont(font, doc); -+ } -+ } -+ delete gfxFontDict; -+ } -+ obj1.free(); -+ -+ // recursively scan any resource dictionaries in objects in this -+ // resource dictionary -+ resDict->lookup("XObject", &xObjDict); -+ if (xObjDict.isDict()) { -+ for (i = 0; i < xObjDict.dictGetLength(); ++i) { -+ xObjDict.dictGetVal(i, &xObj); -+ if (xObj.isStream()) { -+ xObj.streamGetDict()->lookup("Resources", &resObj); -+ if (resObj.isDict()) { -+ scanFonts(resObj.getDict(), doc); -+ } -+ resObj.free(); -+ } -+ xObj.free(); -+ } -+ } -+ xObjDict.free(); -+} -+ -+static void scanFont(GfxFont *font, PDFDoc *doc) { -+ Ref fontRef, embRef; -+ Object fontObj, toUnicodeObj; -+ GooString *name; -+ GBool emb, subset, hasToUnicode; -+ int i; -+ -+ fontRef = *font->getID(); -+ -+ // check for an already-seen font -+ for (i = 0; i < fontsLen; ++i) { -+ if (fontRef.num == fonts[i].num && fontRef.gen == fonts[i].gen) { -+ return; -+ } -+ } -+ -+ // font name -+ name = font->getOrigName(); -+ -+ // check for an embedded font -+ if (font->getType() == fontType3) { -+ emb = gTrue; -+ } else { -+ emb = font->getEmbeddedFontID(&embRef); -+ } -+ -+ // look for a ToUnicode map -+ hasToUnicode = gFalse; -+ if (doc->getXRef()->fetch(fontRef.num, fontRef.gen, &fontObj)->isDict()) { -+ hasToUnicode = fontObj.dictLookup("ToUnicode", &toUnicodeObj)->isStream(); -+ toUnicodeObj.free(); -+ } -+ fontObj.free(); -+ -+ // check for a font subset name: capital letters followed by a '+' -+ // sign -+ subset = gFalse; -+ if (name) { -+ for (i = 0; i < name->getLength(); ++i) { -+ if (name->getChar(i) < 'A' || name->getChar(i) > 'Z') { -+ break; -+ } -+ } -+ subset = i > 0 && i < name->getLength() && name->getChar(i) == '+'; -+ } -+ -+ // print the font info -+ printf("%-36s %-12s %-3s %-3s %-3s", -+ name ? name->getCString() : "[none]", -+ fontTypeNames[font->getType()], -+ emb ? "yes" : "no", -+ subset ? "yes" : "no", -+ hasToUnicode ? "yes" : "no"); -+ if (fontRef.gen >= 100000) { -+ printf(" [none]\n"); -+ } else { -+ printf(" %6d %2d\n", fontRef.num, fontRef.gen); -+ } -+ -+ // add this font to the list -+ if (fontsLen == fontsSize) { -+ fontsSize += 32; -+ fonts = (Ref *)grealloc(fonts, fontsSize * sizeof(Ref)); -+ } -+ fonts[fontsLen++] = *font->getID(); -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdfimages.1 poppler-0.4.3/utils/pdfimages.1 ---- poppler-0.4.3.orig/utils/pdfimages.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdfimages.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,96 @@ -+.\" Copyright 1998-2004 Glyph & Cog, LLC -+.TH pdfimages 1 "22 January 2004" -+.SH NAME -+pdfimages \- Portable Document Format (PDF) image extractor -+(version 3.00) -+.SH SYNOPSIS -+.B pdfimages -+[options] -+.I PDF-file image-root -+.SH DESCRIPTION -+.B Pdfimages -+saves images from a Portable Document Format (PDF) file as Portable -+Pixmap (PPM), Portable Bitmap (PBM), or JPEG files. -+.PP -+Pdfimages reads the PDF file -+.IR PDF-file , -+scans one or more pages, and writes one PPM, PBM, or JPEG file for each image, -+.IR image-root - nnn . xxx , -+where -+.I nnn -+is the image number and -+.I xxx -+is the image type (.ppm, .pbm, .jpg). -+.SH CONFIGURATION FILE -+Pdfimages reads a configuration file at startup. It first tries to -+find the user's private config file, ~/.xpdfrc. If that doesn't -+exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to scan. -+.TP -+.BI \-l " number" -+Specifies the last page to scan. -+.TP -+.B \-j -+Normally, all images are written as PBM (for monochrome images) or PPM -+(for non-monochrome images) files. With this option, images in DCT -+format are saved as JPEG files. All non-DCT images are saved in -+PBM/PPM format as usual. -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.B \-q -+Don't print any messages or errors. -+.RB "[config file: " errQuiet ] -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdfimages software and documentation are copyright 1998-2004 Glyph -+& Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftops (1), -+.BR pdftotext (1), -+.BR pdfinfo (1), -+.BR pdffonts (1), -+.BR pdftoppm (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdfimages.cc poppler-0.4.3/utils/pdfimages.cc ---- poppler-0.4.3.orig/utils/pdfimages.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdfimages.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,158 @@ -+//======================================================================== -+// -+// pdfimages.cc -+// -+// Copyright 1998-2003 Glyph & Cog, LLC -+// -+// Modified for Debian by Hamish Moffatt, 22 May 2002. -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "GlobalParams.h" -+#include "Object.h" -+#include "Stream.h" -+#include "Array.h" -+#include "Dict.h" -+#include "XRef.h" -+#include "Catalog.h" -+#include "Page.h" -+#include "PDFDoc.h" -+#include "ImageOutputDev.h" -+#include "Error.h" -+#include "config.h" -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static GBool dumpJPEG = gFalse; -+static char ownerPassword[33] = "\001"; -+static char userPassword[33] = "\001"; -+static GBool quiet = gFalse; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to convert"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to convert"}, -+ {"-j", argFlag, &dumpJPEG, 0, -+ "write JPEG images as JPEG files"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-q", argFlag, &quiet, 0, -+ "don't print any messages or errors"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ char *imgRoot; -+ GooString *ownerPW, *userPW; -+ ImageOutputDev *imgOut; -+ GBool ok; -+ int exitCode; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc != 3 || printVersion || printHelp) { -+ fprintf(stderr, "pdfimages version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdfimages", "<PDF-file> <image-root>", argDesc); -+ } -+ goto err0; -+ } -+ fileName = new GooString(argv[1]); -+ imgRoot = argv[2]; -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ if (quiet) { -+ globalParams->setErrQuiet(quiet); -+ } -+ -+ // open PDF file -+ if (ownerPassword[0] != '\001') { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0] != '\001') { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err1; -+ } -+ -+ // check for copy permission -+#ifdef ENFORCE_PERMISSIONS -+ if (!doc->okToCopy()) { -+ error(-1, "Copying of images from this document is not allowed."); -+ exitCode = 3; -+ goto err1; -+ } -+#endif -+ -+ // get page range -+ if (firstPage < 1) -+ firstPage = 1; -+ if (lastPage < 1 || lastPage > doc->getNumPages()) -+ lastPage = doc->getNumPages(); -+ -+ // write image files -+ imgOut = new ImageOutputDev(imgRoot, dumpJPEG); -+ if (imgOut->isOk()) { -+ doc->displayPages(imgOut, firstPage, lastPage, 72, 72, 0, gTrue, gFalse); -+ } -+ delete imgOut; -+ -+ exitCode = 0; -+ -+ // clean up -+ err1: -+ delete doc; -+ delete globalParams; -+ err0: -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdfinfo.1 poppler-0.4.3/utils/pdfinfo.1 ---- poppler-0.4.3.orig/utils/pdfinfo.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdfinfo.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,157 @@ -+.\" Copyright 1999-2004 Glyph & Cog, LLC -+.TH pdfinfo 1 "22 January 2004" -+.SH NAME -+pdfinfo \- Portable Document Format (PDF) document information -+extractor (version 3.00) -+.SH SYNOPSIS -+.B pdfinfo -+[options] -+.RI [ PDF-file ] -+.SH DESCRIPTION -+.B Pdfinfo -+prints the contents of the \'Info' dictionary (plus some other useful -+information) from a Portable Document Format (PDF) file. -+.PP -+The \'Info' dictionary contains the following values: -+.PP -+.RS -+title -+.RE -+.RS -+subject -+.RE -+.RS -+keywords -+.RE -+.RS -+author -+.RE -+.RS -+creator -+.RE -+.RS -+producer -+.RE -+.RS -+creation date -+.RE -+.RS -+modification date -+.RE -+.PP -+In addition, the following information is printed: -+.PP -+.RS -+tagged (yes/no) -+.RE -+.RS -+page count -+.RE -+.RS -+encrypted flag (yes/no) -+.RE -+.RS -+print and copy permissions (if encrypted) -+.RE -+.RS -+page size -+.RE -+.RS -+file size -+.RE -+.RS -+linearized (yes/no) -+.RE -+.RS -+PDF version -+.RE -+.RS -+metadata (only if requested) -+.RE -+.SH CONFIGURATION FILE -+Pdfinfo reads a configuration file at startup. It first tries to find -+the user's private config file, ~/.xpdfrc. If that doesn't exist, it -+looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to examine. If multiple pages are requested -+using the "-f" and "-l" options, the size of each requested page (and, -+optionally, the bounding boxes for each requested page) are printed. -+Otherwise, only page one is examined. -+.TP -+.BI \-l " number" -+Specifies the last page to examine. -+.TP -+.B \-box -+Prints the page box bounding boxes: MediaBox, CropBox, BleedBox, -+TrimBox, and ArtBox. -+.TP -+.B \-meta -+Prints document-level metadata. (This is the "Metadata" stream from -+the PDF file's Catalog object.) -+.TP -+.BI \-enc " encoding-name" -+Sets the encoding to use for text output. The -+.I encoding\-name -+must be defined with the unicodeMap command (see -+.BR xpdfrc (5)). -+This defaults to "Latin1" (which is a built-in encoding). -+.RB "[config file: " textEncoding ] -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.BI \-cfg " config-file" -+Read -+.I config-file -+in place of ~/.xpdfrc or the system-wide config file. -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdfinfo software and documentation are copyright 1996-2004 Glyph & -+Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftops (1), -+.BR pdftotext (1), -+.BR pdffonts (1), -+.BR pdftoppm (1), -+.BR pdfimages (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdfinfo.cc poppler-0.4.3/utils/pdfinfo.cc ---- poppler-0.4.3.orig/utils/pdfinfo.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdfinfo.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,376 @@ -+//======================================================================== -+// -+// pdfinfo.cc -+// -+// Copyright 1998-2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include <time.h> -+#include <math.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "GlobalParams.h" -+#include "Object.h" -+#include "Stream.h" -+#include "Array.h" -+#include "Dict.h" -+#include "XRef.h" -+#include "Catalog.h" -+#include "Page.h" -+#include "PDFDoc.h" -+#include "CharTypes.h" -+#include "UnicodeMap.h" -+#include "Error.h" -+#include "config.h" -+ -+static void printInfoString(Dict *infoDict, char *key, char *text, -+ UnicodeMap *uMap); -+static void printInfoDate(Dict *infoDict, char *key, char *text); -+static void printBox(char *text, PDFRectangle *box); -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static GBool printBoxes = gFalse; -+static GBool printMetadata = gFalse; -+static char textEncName[128] = ""; -+static char ownerPassword[33] = "\001"; -+static char userPassword[33] = "\001"; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to convert"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to convert"}, -+ {"-box", argFlag, &printBoxes, 0, -+ "print the page bounding boxes"}, -+ {"-meta", argFlag, &printMetadata, 0, -+ "print the document metadata (XML)"}, -+ {"-enc", argString, textEncName, sizeof(textEncName), -+ "output text encoding name"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ GooString *ownerPW, *userPW; -+ UnicodeMap *uMap; -+ Page *page; -+ Object info; -+ char buf[256]; -+ double w, h, wISO, hISO; -+ FILE *f; -+ GooString *metadata; -+ GBool ok; -+ int exitCode; -+ int pg, i; -+ GBool multiPage; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc != 2 || printVersion || printHelp) { -+ fprintf(stderr, "pdfinfo version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdfinfo", "<PDF-file>", argDesc); -+ } -+ goto err0; -+ } -+ fileName = new GooString(argv[1]); -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ if (textEncName[0]) { -+ globalParams->setTextEncoding(textEncName); -+ } -+ -+ // get mapping to output encoding -+ if (!(uMap = globalParams->getTextEncoding())) { -+ error(-1, "Couldn't get text encoding"); -+ delete fileName; -+ goto err1; -+ } -+ -+ // open PDF file -+ if (ownerPassword[0] != '\001') { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0] != '\001') { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err2; -+ } -+ -+ // get page range -+ if (firstPage < 1) { -+ firstPage = 1; -+ } -+ if (lastPage == 0) { -+ multiPage = gFalse; -+ lastPage = 1; -+ } else { -+ multiPage = gTrue; -+ } -+ if (lastPage < 1 || lastPage > doc->getNumPages()) { -+ lastPage = doc->getNumPages(); -+ } -+ -+ // print doc info -+ doc->getDocInfo(&info); -+ if (info.isDict()) { -+ printInfoString(info.getDict(), "Title", "Title: ", uMap); -+ printInfoString(info.getDict(), "Subject", "Subject: ", uMap); -+ printInfoString(info.getDict(), "Keywords", "Keywords: ", uMap); -+ printInfoString(info.getDict(), "Author", "Author: ", uMap); -+ printInfoString(info.getDict(), "Creator", "Creator: ", uMap); -+ printInfoString(info.getDict(), "Producer", "Producer: ", uMap); -+ printInfoDate(info.getDict(), "CreationDate", "CreationDate: "); -+ printInfoDate(info.getDict(), "ModDate", "ModDate: "); -+ } -+ info.free(); -+ -+ // print tagging info -+ printf("Tagged: %s\n", -+ doc->getStructTreeRoot()->isDict() ? "yes" : "no"); -+ -+ // print page count -+ printf("Pages: %d\n", doc->getNumPages()); -+ -+ // print encryption info -+ printf("Encrypted: "); -+ if (doc->isEncrypted()) { -+ printf("yes (print:%s copy:%s change:%s addNotes:%s)\n", -+ doc->okToPrint(gTrue) ? "yes" : "no", -+ doc->okToCopy(gTrue) ? "yes" : "no", -+ doc->okToChange(gTrue) ? "yes" : "no", -+ doc->okToAddNotes(gTrue) ? "yes" : "no"); -+ } else { -+ printf("no\n"); -+ } -+ -+ // print page size -+ for (pg = firstPage; pg <= lastPage; ++pg) { -+ w = doc->getPageWidth(pg); -+ h = doc->getPageHeight(pg); -+ if (multiPage) { -+ printf("Page %4d size: %g x %g pts", pg, w, h); -+ } else { -+ printf("Page size: %g x %g pts", w, h); -+ } -+ if ((fabs(w - 612) < 0.1 && fabs(h - 792) < 0.1) || -+ (fabs(w - 792) < 0.1 && fabs(h - 612) < 0.1)) { -+ printf(" (letter)"); -+ } else { -+ hISO = sqrt(sqrt(2.0)) * 7200 / 2.54; -+ wISO = hISO / sqrt(2.0); -+ for (i = 0; i <= 6; ++i) { -+ if ((fabs(w - wISO) < 1 && fabs(h - hISO) < 1) || -+ (fabs(w - hISO) < 1 && fabs(h - wISO) < 1)) { -+ printf(" (A%d)", i); -+ break; -+ } -+ hISO = wISO; -+ wISO /= sqrt(2.0); -+ } -+ } -+ printf("\n"); -+ } -+ -+ // print the boxes -+ if (printBoxes) { -+ if (multiPage) { -+ for (pg = firstPage; pg <= lastPage; ++pg) { -+ page = doc->getCatalog()->getPage(pg); -+ sprintf(buf, "Page %4d MediaBox: ", pg); -+ printBox(buf, page->getMediaBox()); -+ sprintf(buf, "Page %4d CropBox: ", pg); -+ printBox(buf, page->getCropBox()); -+ sprintf(buf, "Page %4d BleedBox: ", pg); -+ printBox(buf, page->getBleedBox()); -+ sprintf(buf, "Page %4d TrimBox: ", pg); -+ printBox(buf, page->getTrimBox()); -+ sprintf(buf, "Page %4d ArtBox: ", pg); -+ printBox(buf, page->getArtBox()); -+ } -+ } else { -+ page = doc->getCatalog()->getPage(firstPage); -+ printBox("MediaBox: ", page->getMediaBox()); -+ printBox("CropBox: ", page->getCropBox()); -+ printBox("BleedBox: ", page->getBleedBox()); -+ printBox("TrimBox: ", page->getTrimBox()); -+ printBox("ArtBox: ", page->getArtBox()); -+ } -+ } -+ -+ // print file size -+#ifdef VMS -+ f = fopen(fileName->getCString(), "rb", "ctx=stm"); -+#else -+ f = fopen(fileName->getCString(), "rb"); -+#endif -+ if (f) { -+#if HAVE_FSEEKO -+ fseeko(f, 0, SEEK_END); -+ printf("File size: %u bytes\n", (Guint)ftello(f)); -+#elif HAVE_FSEEK64 -+ fseek64(f, 0, SEEK_END); -+ printf("File size: %u bytes\n", (Guint)ftell64(f)); -+#else -+ fseek(f, 0, SEEK_END); -+ printf("File size: %d bytes\n", (int)ftell(f)); -+#endif -+ fclose(f); -+ } -+ -+ // print linearization info -+ printf("Optimized: %s\n", doc->isLinearized() ? "yes" : "no"); -+ -+ // print PDF version -+ printf("PDF version: %.1f\n", doc->getPDFVersion()); -+ -+ // print the metadata -+ if (printMetadata && (metadata = doc->readMetadata())) { -+ fputs("Metadata:\n", stdout); -+ fputs(metadata->getCString(), stdout); -+ fputc('\n', stdout); -+ delete metadata; -+ } -+ -+ exitCode = 0; -+ -+ // clean up -+ err2: -+ uMap->decRefCnt(); -+ delete doc; -+ err1: -+ delete globalParams; -+ err0: -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -+ -+static void printInfoString(Dict *infoDict, char *key, char *text, -+ UnicodeMap *uMap) { -+ Object obj; -+ GooString *s1; -+ GBool isUnicode; -+ Unicode u; -+ char buf[8]; -+ int i, n; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ fputs(text, stdout); -+ s1 = obj.getString(); -+ if ((s1->getChar(0) & 0xff) == 0xfe && -+ (s1->getChar(1) & 0xff) == 0xff) { -+ isUnicode = gTrue; -+ i = 2; -+ } else { -+ isUnicode = gFalse; -+ i = 0; -+ } -+ while (i < obj.getString()->getLength()) { -+ if (isUnicode) { -+ u = ((s1->getChar(i) & 0xff) << 8) | -+ (s1->getChar(i+1) & 0xff); -+ i += 2; -+ } else { -+ u = s1->getChar(i) & 0xff; -+ ++i; -+ } -+ n = uMap->mapUnicode(u, buf, sizeof(buf)); -+ fwrite(buf, 1, n, stdout); -+ } -+ fputc('\n', stdout); -+ } -+ obj.free(); -+} -+ -+static void printInfoDate(Dict *infoDict, char *key, char *text) { -+ Object obj; -+ char *s; -+ int year, mon, day, hour, min, sec; -+ struct tm tmStruct; -+ char buf[256]; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ fputs(text, stdout); -+ s = obj.getString()->getCString(); -+ if (s[0] == 'D' && s[1] == ':') { -+ s += 2; -+ } -+ if (sscanf(s, "%4d%2d%2d%2d%2d%2d", -+ &year, &mon, &day, &hour, &min, &sec) == 6) { -+ tmStruct.tm_year = year - 1900; -+ tmStruct.tm_mon = mon - 1; -+ tmStruct.tm_mday = day; -+ tmStruct.tm_hour = hour; -+ tmStruct.tm_min = min; -+ tmStruct.tm_sec = sec; -+ tmStruct.tm_wday = -1; -+ tmStruct.tm_yday = -1; -+ tmStruct.tm_isdst = -1; -+ // compute the tm_wday and tm_yday fields -+ if (mktime(&tmStruct) != (time_t)-1 && -+ strftime(buf, sizeof(buf), "%c", &tmStruct)) { -+ fputs(buf, stdout); -+ } else { -+ fputs(s, stdout); -+ } -+ } else { -+ fputs(s, stdout); -+ } -+ fputc('\n', stdout); -+ } -+ obj.free(); -+} -+ -+static void printBox(char *text, PDFRectangle *box) { -+ printf("%s%8.2f %8.2f %8.2f %8.2f\n", -+ text, box->x1, box->y1, box->x2, box->y2); -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftohtml.1 poppler-0.4.3/utils/pdftohtml.1 ---- poppler-0.4.3.orig/utils/pdftohtml.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftohtml.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,85 @@ -+.TH PDFTOHTML 1 -+.\" NAME should be all caps, SECTION should be 1-8, maybe w/ subsection -+.\" other parms are allowed: see man(7), man(1) -+.SH NAME -+pdftohtml \- program to convert pdf files into html, xml and png images -+.SH SYNOPSIS -+.B pdftohtml -+.I "[options] <PDF-file> [<html-file> <xml-file>]" -+.SH "DESCRIPTION" -+This manual page documents briefly the -+.BR pdftohtml -+command. -+This manual page was written for the Debian GNU/Linux distribution -+because the original program does not have a manual page. -+.PP -+.B pdftohtml -+is a program that converts pdf documents into html. It generates its output in -+the current working directory. -+.SH OPTIONS -+A summary of options are included below. -+.TP -+.B \-h, \-help -+Show summary of options. -+.TP -+.B \-f <int> -+first page to print -+.TP -+.B \-l <int> -+last page to print -+.TP -+.B \-q -+dont print any messages or errors -+.TP -+.B \-v -+print copyright and version info -+.TP -+.B \-p -+exchange .pdf links with .html -+.TP -+.B \-c -+generate complex output -+.TP -+.B \-i -+ignore images -+.TP -+.B \-noframes -+generate no frames. Not supported in complex output mode. -+.TP -+.B \-stdout -+use standard output -+.TP -+.B \-zoom <fp> -+zoom the pdf document (default 1.5) -+.TP -+.B \-xml -+output for XML post-processing -+.TP -+.B \-enc <string> -+output text encoding name -+.TP -+.B \-opw <string> -+owner password (for encrypted files) -+.TP -+.B \-upw <string> -+user password (for encrypted files) -+.TP -+.B \-hidden -+force hidden text extraction -+.TP -+.B \-dev -+output device name for Ghostscript (png16m, jpeg etc) -+.TP -+.B \-nomerge -+do not merge paragraphs -+.TP -+.B \-nodrm -+override document DRM settings -+ -+.SH AUTHOR -+ -+Pdftohtml was developed by Gueorgui Ovtcharov and Rainer Dorsch. It is -+based and benefits a lot from Derek Noonburg's xpdf package. -+ -+This manual page was written by Søren Boll Overgaard <boll@debian.org>, -+for the Debian GNU/Linux system (but may be used by others). -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftohtml.cc poppler-0.4.3/utils/pdftohtml.cc ---- poppler-0.4.3.orig/utils/pdftohtml.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftohtml.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,428 @@ -+//======================================================================== -+// -+// pdftohtml.cc -+// -+// -+// Copyright 1999-2000 G. Ovtcharov -+//======================================================================== -+ -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include <dirent.h> -+#include <poppler-config.h> -+#include <time.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "Object.h" -+#include "Stream.h" -+#include "Array.h" -+#include "Dict.h" -+#include "XRef.h" -+#include "Catalog.h" -+#include "Page.h" -+#include "PDFDoc.h" -+#include "HtmlOutputDev.h" -+#include "PSOutputDev.h" -+#include "GlobalParams.h" -+#include "Error.h" -+#include "config.h" -+#include "goo/gfile.h" -+ -+#ifndef GHOSTSCRIPT -+# define GHOSTSCRIPT "gs" -+#endif -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static GBool rawOrder = gTrue; -+GBool printCommands = gTrue; -+static GBool printHelp = gFalse; -+GBool printHtml = gFalse; -+GBool complexMode=gFalse; -+GBool ignore=gFalse; -+//char extension[5]=".png"; -+double scale=1.5; -+GBool noframes=gFalse; -+GBool stout=gFalse; -+GBool xml=gFalse; -+GBool errQuiet=gFalse; -+GBool noDrm=gFalse; -+ -+GBool showHidden = gFalse; -+GBool noMerge = gFalse; -+static char ownerPassword[33] = ""; -+static char userPassword[33] = ""; -+static char gsDevice[33] = "png16m"; -+static GBool printVersion = gFalse; -+ -+static GooString* getInfoString(Dict *infoDict, char *key); -+static GooString* getInfoDate(Dict *infoDict, char *key); -+ -+static char textEncName[128] = ""; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to convert"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to convert"}, -+ /*{"-raw", argFlag, &rawOrder, 0, -+ "keep strings in content stream order"},*/ -+ {"-q", argFlag, &errQuiet, 0, -+ "don't print any messages or errors"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-p", argFlag, &printHtml, 0, -+ "exchange .pdf links by .html"}, -+ {"-c", argFlag, &complexMode, 0, -+ "generate complex document"}, -+ {"-i", argFlag, &ignore, 0, -+ "ignore images"}, -+ {"-noframes", argFlag, &noframes, 0, -+ "generate no frames"}, -+ {"-stdout" ,argFlag, &stout, 0, -+ "use standard output"}, -+ {"-zoom", argFP, &scale, 0, -+ "zoom the pdf document (default 1.5)"}, -+ {"-xml", argFlag, &xml, 0, -+ "output for XML post-processing"}, -+ {"-hidden", argFlag, &showHidden, 0, -+ "output hidden text"}, -+ {"-nomerge", argFlag, &noMerge, 0, -+ "do not merge paragraphs"}, -+ {"-enc", argString, textEncName, sizeof(textEncName), -+ "output text encoding name"}, -+ {"-dev", argString, gsDevice, sizeof(gsDevice), -+ "output device name for Ghostscript (png16m, jpeg etc)"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-nodrm", argFlag, &noDrm, 0, -+ "override document DRM settings"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc = NULL; -+ GooString *fileName = NULL; -+ GooString *docTitle = NULL; -+ GooString *author = NULL, *keywords = NULL, *subject = NULL, *date = NULL; -+ GooString *htmlFileName = NULL; -+ GooString *psFileName = NULL; -+ HtmlOutputDev *htmlOut = NULL; -+ PSOutputDev *psOut = NULL; -+ GBool ok; -+ char *p; -+ char extension[16] = "png"; -+ GooString *ownerPW, *userPW; -+ Object info; -+ char * extsList[] = {"png", "jpeg", "bmp", "pcx", "tiff", "pbm", NULL}; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc < 2 || argc > 3 || printHelp || printVersion) { -+ fprintf(stderr, "pdftohtml version %s http://pdftohtml.sourceforge.net/, based on Xpdf version %s\n", "0.36", xpdfVersion); -+ fprintf(stderr, "%s\n", "Copyright 1999-2003 Gueorgui Ovtcharov and Rainer Dorsch"); -+ fprintf(stderr, "%s\n\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdftohtml", "<PDF-file> [<html-file> <xml-file>]", argDesc); -+ } -+ exit(1); -+ } -+ -+ // init error file -+ //errorInit(); -+ -+ // read config file -+ globalParams = new GlobalParams(""); -+ -+ if (errQuiet) { -+ globalParams->setErrQuiet(errQuiet); -+ printCommands = gFalse; // I'm not 100% what is the differecne between them -+ } -+ -+ if (textEncName[0]) { -+ globalParams->setTextEncoding(textEncName); -+ if( !globalParams->getTextEncoding() ) { -+ goto error; -+ } -+ } -+ -+ // open PDF file -+ if (ownerPassword[0]) { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0]) { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ -+ fileName = new GooString(argv[1]); -+ -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ goto error; -+ } -+ -+ // check for copy permission -+ if (!doc->okToCopy()) { -+ if (!noDrm) { -+ error(-1, "Copying of text from this document is not allowed."); -+ goto error; -+ } -+ fprintf(stderr, "Document has copy-protection bit set.\n"); -+ } -+ -+ // construct text file name -+ if (argc == 3) { -+ GooString* tmp = new GooString(argv[2]); -+ p=tmp->getCString()+tmp->getLength()-5; -+ if (!xml) -+ if (!strcmp(p, ".html") || !strcmp(p, ".HTML")) -+ htmlFileName = new GooString(tmp->getCString(), -+ tmp->getLength() - 5); -+ else htmlFileName =new GooString(tmp); -+ else -+ if (!strcmp(p, ".xml") || !strcmp(p, ".XML")) -+ htmlFileName = new GooString(tmp->getCString(), -+ tmp->getLength() - 5); -+ else htmlFileName =new GooString(tmp); -+ -+ delete tmp; -+ } else { -+ p = fileName->getCString() + fileName->getLength() - 4; -+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) -+ htmlFileName = new GooString(fileName->getCString(), -+ fileName->getLength() - 4); -+ else -+ htmlFileName = fileName->copy(); -+ // htmlFileName->append(".html"); -+ } -+ -+ if (scale>3.0) scale=3.0; -+ if (scale<0.5) scale=0.5; -+ -+ if (complexMode) { -+ //noframes=gFalse; -+ stout=gFalse; -+ } -+ -+ if (stout) { -+ noframes=gTrue; -+ complexMode=gFalse; -+ } -+ -+ if (xml) -+ { -+ complexMode = gTrue; -+ noframes = gTrue; -+ noMerge = gTrue; -+ } -+ -+ // get page range -+ if (firstPage < 1) -+ firstPage = 1; -+ if (lastPage < 1 || lastPage > doc->getNumPages()) -+ lastPage = doc->getNumPages(); -+ -+ doc->getDocInfo(&info); -+ if (info.isDict()) { -+ docTitle = getInfoString(info.getDict(), "Title"); -+ author = getInfoString(info.getDict(), "Author"); -+ keywords = getInfoString(info.getDict(), "Keywords"); -+ subject = getInfoString(info.getDict(), "Subject"); -+ date = getInfoDate(info.getDict(), "ModDate"); -+ if( !date ) -+ date = getInfoDate(info.getDict(), "CreationDate"); -+ } -+ info.free(); -+ if( !docTitle ) docTitle = new GooString(htmlFileName); -+ -+ /* determine extensions of output backgroun images */ -+ {int i; -+ for(i = 0; extsList[i]; i++) -+ { -+ if( strstr(gsDevice, extsList[i]) != (char *) NULL ) -+ { -+ strncpy(extension, extsList[i], sizeof(extension)); -+ break; -+ } -+ }} -+ -+ rawOrder = complexMode; // todo: figure out what exactly rawOrder do :) -+ -+ // write text file -+ htmlOut = new HtmlOutputDev(htmlFileName->getCString(), -+ docTitle->getCString(), -+ author ? author->getCString() : NULL, -+ keywords ? keywords->getCString() : NULL, -+ subject ? subject->getCString() : NULL, -+ date ? date->getCString() : NULL, -+ extension, -+ rawOrder, -+ firstPage, -+ doc->getCatalog()->getOutline()->isDict()); -+ delete docTitle; -+ if( author ) -+ { -+ delete author; -+ } -+ if( keywords ) -+ { -+ delete keywords; -+ } -+ if( subject ) -+ { -+ delete subject; -+ } -+ if( date ) -+ { -+ delete date; -+ } -+ -+ if (htmlOut->isOk()) -+ { -+ doc->displayPages(htmlOut, firstPage, lastPage, 72, 72, static_cast<int>(72*scale), 0, gTrue); -+ if (!xml) -+ { -+ htmlOut->dumpDocOutline(doc->getCatalog()); -+ } -+ } -+ -+ if( complexMode && !xml && !ignore ) { -+ int h=xoutRound(htmlOut->getPageHeight()/scale); -+ int w=xoutRound(htmlOut->getPageWidth()/scale); -+ //int h=xoutRound(doc->getPageHeight(1)/scale); -+ //int w=xoutRound(doc->getPageWidth(1)/scale); -+ -+ psFileName = new GooString(htmlFileName->getCString()); -+ psFileName->append(".ps"); -+ -+ globalParams->setPSPaperWidth(w); -+ globalParams->setPSPaperHeight(h); -+ // XXX -+ // globalParams->setPSNoText(gTrue); -+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(), -+ doc->getCatalog(), firstPage, lastPage, psModePS); -+ doc->displayPages(psOut, firstPage, lastPage, 72, 72, -+ static_cast<int>(72*scale), 0, gFalse); -+ delete psOut; -+ -+ /*sprintf(buf, "%s -sDEVICE=png16m -dBATCH -dNOPROMPT -dNOPAUSE -r72 -sOutputFile=%s%%03d.png -g%dx%d -q %s", GHOSTSCRIPT, htmlFileName->getCString(), w, h, -+ psFileName->getCString());*/ -+ -+ GooString *gsCmd = new GooString(GHOSTSCRIPT); -+ GooString *tw, *th, *sc; -+ gsCmd->append(" -sDEVICE="); -+ gsCmd->append(gsDevice); -+ gsCmd->append(" -dBATCH -dNOPROMPT -dNOPAUSE -r"); -+ sc = GooString::fromInt(static_cast<int>(72*scale)); -+ gsCmd->append(sc); -+ gsCmd->append(" -sOutputFile="); -+ gsCmd->append("\""); -+ gsCmd->append(htmlFileName); -+ gsCmd->append("%03d."); -+ gsCmd->append(extension); -+ gsCmd->append("\" -g"); -+ tw = GooString::fromInt(static_cast<int>(scale*w)); -+ gsCmd->append(tw); -+ gsCmd->append("x"); -+ th = GooString::fromInt(static_cast<int>(scale*h)); -+ gsCmd->append(th); -+ gsCmd->append(" -q \""); -+ gsCmd->append(psFileName); -+ gsCmd->append("\""); -+// printf("running: %s\n", gsCmd->getCString()); -+ if( !executeCommand(gsCmd->getCString()) && !errQuiet) { -+ error(-1, "Failed to launch Ghostscript!\n"); -+ } -+ unlink(psFileName->getCString()); -+ delete tw; -+ delete th; -+ delete sc; -+ delete gsCmd; -+ delete psFileName; -+ } -+ -+ delete htmlOut; -+ -+ // clean up -+ error: -+ if(doc) delete doc; -+ if(globalParams) delete globalParams; -+ -+ if(htmlFileName) delete htmlFileName; -+ HtmlFont::clear(); -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return 0; -+} -+ -+static GooString* getInfoString(Dict *infoDict, char *key) { -+ Object obj; -+ GooString *s1 = NULL; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ s1 = new GooString(obj.getString()); -+ } -+ obj.free(); -+ return s1; -+} -+ -+static GooString* getInfoDate(Dict *infoDict, char *key) { -+ Object obj; -+ char *s; -+ int year, mon, day, hour, min, sec; -+ struct tm tmStruct; -+ GooString *result = NULL; -+ char buf[256]; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ s = obj.getString()->getCString(); -+ if (s[0] == 'D' && s[1] == ':') { -+ s += 2; -+ } -+ if (sscanf(s, "%4d%2d%2d%2d%2d%2d", -+ &year, &mon, &day, &hour, &min, &sec) == 6) { -+ tmStruct.tm_year = year - 1900; -+ tmStruct.tm_mon = mon - 1; -+ tmStruct.tm_mday = day; -+ tmStruct.tm_hour = hour; -+ tmStruct.tm_min = min; -+ tmStruct.tm_sec = sec; -+ tmStruct.tm_wday = -1; -+ tmStruct.tm_yday = -1; -+ tmStruct.tm_isdst = -1; -+ mktime(&tmStruct); // compute the tm_wday and tm_yday fields -+ if (strftime(buf, sizeof(buf), "%Y-%m-%dT%H:%M:%S+00:00", &tmStruct)) { -+ result = new GooString(buf); -+ } else { -+ result = new GooString(s); -+ } -+ } else { -+ result = new GooString(s); -+ } -+ } -+ obj.free(); -+ return result; -+} -+ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftoppm.1 poppler-0.4.3/utils/pdftoppm.1 ---- poppler-0.4.3.orig/utils/pdftoppm.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftoppm.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,113 @@ -+.\" Copyright 2004 Glyph & Cog, LLC -+.TH pdftoppm 1 "22 January 2004" -+.SH NAME -+pdftoppm \- Portable Document Format (PDF) to Portable Pixmap (PPM) -+converter (version 3.00) -+.SH SYNOPSIS -+.B pdftoppm -+[options] -+.I PDF-file PPM-root -+.SH DESCRIPTION -+.B Pdftoppm -+converts Portable Document Format (PDF) files to color image files in -+Portable Pixmap (PPM) format, grayscale image files in Portable -+Graymap (PGM) format, or monochrome image files in Portable Bitmap -+(PBM) format. -+.PP -+Pdftoppm reads the PDF file, -+.IR PDF-file , -+and writes one PPM file for each page, -+.IR PPM-root - nnnnnn .ppm, -+where -+.I nnnnnn -+is the page number. -+.SH CONFIGURATION FILE -+Pdftoppm reads a configuration file at startup. It first tries to -+find the user's private config file, ~/.xpdfrc. If that doesn't -+exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to convert. -+.TP -+.BI \-l " number" -+Specifies the last page to convert. -+.TP -+.BI \-r " number" -+Specifies the resolution, in DPI. The default is 150 DPI. -+.TP -+.B \-mono -+Generate a monochrome PBM file (instead of a color PPM file). -+.TP -+.B \-gray -+Generate a grayscale PGM file (instead of a color PPM file). -+.TP -+.BI \-t1lib " yes | no" -+Enable or disable t1lib (a Type 1 font rasterizer). This defaults to -+"yes". -+.RB "[config file: " enableT1lib ] -+.TP -+.BI \-freetype " yes | no" -+Enable or disable FreeType (a TrueType / Type 1 font rasterizer). -+This defaults to "yes". -+.RB "[config file: " enableFreeType ] -+.TP -+.BI \-aa " yes | no" -+Enable or disable font anti-aliasing. This defaults to "yes". -+.RB "[config file: " antialias ] -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.B \-q -+Don't print any messages or errors. -+.RB "[config file: " errQuiet ] -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdftoppm software and documentation are copyright 1996-2004 Glyph -+& Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftops (1), -+.BR pdftotext (1), -+.BR pdfinfo (1), -+.BR pdffonts (1), -+.BR pdfimages (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftoppm.cc poppler-0.4.3/utils/pdftoppm.cc ---- poppler-0.4.3.orig/utils/pdftoppm.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftoppm.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,189 @@ -+//======================================================================== -+// -+// pdftoppm.cc -+// -+// Copyright 2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include "parseargs.h" -+#include "goo/gmem.h" -+#include "goo/GooString.h" -+#include "GlobalParams.h" -+#include "Object.h" -+#include "PDFDoc.h" -+#include "splash/SplashBitmap.h" -+#include "splash/Splash.h" -+#include "SplashOutputDev.h" -+#include "config.h" -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static int resolution = 150; -+static GBool mono = gFalse; -+static GBool gray = gFalse; -+static char enableT1libStr[16] = ""; -+static char enableFreeTypeStr[16] = ""; -+static char antialiasStr[16] = ""; -+static char ownerPassword[33] = ""; -+static char userPassword[33] = ""; -+static GBool quiet = gFalse; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to print"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to print"}, -+ {"-r", argInt, &resolution, 0, -+ "resolution, in DPI (default is 150)"}, -+ {"-mono", argFlag, &mono, 0, -+ "generate a monochrome PBM file"}, -+ {"-gray", argFlag, &gray, 0, -+ "generate a grayscale PGM file"}, -+#if HAVE_T1LIB_H -+ {"-t1lib", argString, enableT1libStr, sizeof(enableT1libStr), -+ "enable t1lib font rasterizer: yes, no"}, -+#endif -+#if HAVE_FREETYPE_FREETYPE_H | HAVE_FREETYPE_H -+ {"-freetype", argString, enableFreeTypeStr, sizeof(enableFreeTypeStr), -+ "enable FreeType font rasterizer: yes, no"}, -+#endif -+ {"-aa", argString, antialiasStr, sizeof(antialiasStr), -+ "enable font anti-aliasing: yes, no"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-q", argFlag, &quiet, 0, -+ "don't print any messages or errors"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ char *ppmRoot; -+ char ppmFile[512]; -+ GooString *ownerPW, *userPW; -+ SplashColor paperColor; -+ SplashOutputDev *splashOut; -+ GBool ok; -+ int exitCode; -+ int pg; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (mono && gray) { -+ ok = gFalse; -+ } -+ if (!ok || argc != 3 || printVersion || printHelp) { -+ fprintf(stderr, "pdftoppm version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdftoppm", "<PDF-file> <PPM-root>", argDesc); -+ } -+ goto err0; -+ } -+ fileName = new GooString(argv[1]); -+ ppmRoot = argv[2]; -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ globalParams->setupBaseFonts(NULL); -+ if (enableT1libStr[0]) { -+ if (!globalParams->setEnableT1lib(enableT1libStr)) { -+ fprintf(stderr, "Bad '-t1lib' value on command line\n"); -+ } -+ } -+ if (enableFreeTypeStr[0]) { -+ if (!globalParams->setEnableFreeType(enableFreeTypeStr)) { -+ fprintf(stderr, "Bad '-freetype' value on command line\n"); -+ } -+ } -+ if (antialiasStr[0]) { -+ if (!globalParams->setAntialias(antialiasStr)) { -+ fprintf(stderr, "Bad '-aa' value on command line\n"); -+ } -+ } -+ if (quiet) { -+ globalParams->setErrQuiet(quiet); -+ } -+ -+ // open PDF file -+ if (ownerPassword[0]) { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0]) { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err1; -+ } -+ -+ // get page range -+ if (firstPage < 1) -+ firstPage = 1; -+ if (lastPage < 1 || lastPage > doc->getNumPages()) -+ lastPage = doc->getNumPages(); -+ -+ // write PPM files -+ paperColor.rgb8 = splashMakeRGB8(255, 255, 255); -+ splashOut = new SplashOutputDev(mono ? splashModeMono1 : -+ gray ? splashModeMono8 : -+ splashModeRGB8, -+ gFalse, paperColor); -+ splashOut->startDoc(doc->getXRef()); -+ for (pg = firstPage; pg <= lastPage; ++pg) { -+ doc->displayPage(splashOut, pg, resolution, resolution, 0, gTrue, gFalse); -+ sprintf(ppmFile, "%.*s-%06d.%s", -+ (int)sizeof(ppmFile) - 32, ppmRoot, pg, -+ mono ? "pbm" : gray ? "pgm" : "ppm"); -+ splashOut->getBitmap()->writePNMFile(ppmFile); -+ } -+ delete splashOut; -+ -+ exitCode = 0; -+ -+ // clean up -+ err1: -+ delete doc; -+ delete globalParams; -+ err0: -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftops.1 poppler-0.4.3/utils/pdftops.1 ---- poppler-0.4.3.orig/utils/pdftops.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftops.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,224 @@ -+.\" Copyright 1996-2004 Glyph & Cog, LLC -+.TH pdftops 1 "22 January 2004" -+.SH NAME -+pdftops \- Portable Document Format (PDF) to PostScript converter -+(version 3.00) -+.SH SYNOPSIS -+.B pdftops -+[options] -+.RI [ PDF-file -+.RI [ PS-file ]] -+.SH DESCRIPTION -+.B Pdftops -+converts Portable Document Format (PDF) files to PostScript so they -+can be printed. -+.PP -+Pdftops reads the PDF file, -+.IR PDF-file , -+and writes a PostScript file, -+.IR PS-file . -+If -+.I PS-file -+is not specified, pdftops converts -+.I file.pdf -+to -+.I file.ps -+(or -+.I file.eps -+with the -eps option). If -+.I PS-file -+is \'-', the PostScript is sent to stdout. -+.SH CONFIGURATION FILE -+Pdftops reads a configuration file at startup. It first tries to find -+the user's private config file, ~/.xpdfrc. If that doesn't exist, it -+looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to print. -+.TP -+.BI \-l " number" -+Specifies the last page to print. -+.TP -+.B \-level1 -+Generate Level 1 PostScript. The resulting PostScript files will be -+significantly larger (if they contain images), but will print on Level -+1 printers. This also converts all images to black and white. No -+more than one of the PostScript level options (-level1, -level1sep, -+-level2, -level2sep, -level3, -level3Sep) may be given. -+.RB "[config file: " psLevel ] -+.TP -+.B \-level1sep -+Generate Level 1 separable PostScript. All colors are converted to -+CMYK. Images are written with separate stream data for the four -+components. -+.RB "[config file: " psLevel ] -+.TP -+.B \-level2 -+Generate Level 2 PostScript. Level 2 supports color images and image -+compression. This is the default setting. -+.RB "[config file: " psLevel ] -+.TP -+.B \-level2sep -+Generate Level 2 separable PostScript. All colors are converted to -+CMYK. The PostScript separation convention operators are used to -+handle custom (spot) colors. -+.RB "[config file: " psLevel ] -+.TP -+.B \-level3 -+Generate Level 3 PostScript. This enables all Level 2 features plus -+CID font embedding. -+.RB "[config file: " psLevel ] -+.TP -+.B \-level3Sep -+Generate Level 3 separable PostScript. The separation handling is the -+same as for -level2Sep. -+.RB "[config file: " psLevel ] -+.TP -+.B \-eps -+Generate an Encapsulated PostScript (EPS) file. An EPS file contains -+a single image, so if you use this option with a multi-page PDF file, -+you must use -f and -l to specify a single page. No more than one of -+the mode options (-eps, -form) may be given. -+.TP -+.B \-form -+Generate a PostScript form which can be imported by software that -+understands forms. A form contains a single page, so if you use this -+option with a multi-page PDF file, you must use -f and -l to specify a -+single page. The -level1 option cannot be used with -form. -+.TP -+.B \-opi -+Generate OPI comments for all images and forms which have OPI -+information. (This option is only available if pdftops was compiled -+with OPI support.) -+.RB "[config file: " psOPI ] -+.TP -+.B \-noembt1 -+By default, any Type 1 fonts which are embedded in the PDF file are -+copied into the PostScript file. This option causes pdftops to -+substitute base fonts instead. Embedded fonts make PostScript files -+larger, but may be necessary for readable output. -+.RB "[config file: " psEmbedType1Fonts ] -+.TP -+.B \-noembtt -+By default, any TrueType fonts which are embedded in the PDF file are -+copied into the PostScript file. This option causes pdftops to -+substitute base fonts instead. Embedded fonts make PostScript files -+larger, but may be necessary for readable output. Also, some -+PostScript interpreters do not have TrueType rasterizers. -+.RB "[config file: " psEmbedTrueTypeFonts ] -+.TP -+.B \-noembcidps -+By default, any CID PostScript fonts which are embedded in the PDF -+file are copied into the PostScript file. This option disables that -+embedding. No attempt is made to substitute for non-embedded CID -+PostScript fonts. -+.RB "[config file: " psEmbedCIDPostScriptFonts ] -+.TP -+.B \-noembcidtt -+By default, any CID TrueType fonts which are embedded in the PDF file -+are copied into the PostScript file. This option disables that -+embedding. No attempt is made to substitute for non-embedded CID -+TrueType fonts. -+.RB "[config file: " psEmbedCIDTrueTypeFonts ] -+.TP -+.BI \-paper " size" -+Set the paper size to one of "letter", "legal", "A4", or "A3". This -+can also be set to "match", which will set the paper size to match the -+size specified in the PDF file. -+.RB "[config file: " psPaperSize ] -+.TP -+.BI \-paperw " size" -+Set the paper width, in points. -+.RB "[config file: " psPaperSize ] -+.TP -+.BI \-paperh " size" -+Set the paper height, in points. -+.RB "[config file: " psPaperSize ] -+.TP -+.B \-nocrop -+By default, output is cropped to the CropBox specified in the PDF -+file. This option disables cropping. -+.RB "[config file: " psCrop ] -+.TP -+.B \-expand -+Expand PDF pages smaller than the paper to fill the paper. By -+default, these pages are not scaled. -+.RB "[config file: " psExpandSmaller ] -+.TP -+.B \-noshrink -+Don't scale PDF pages which are larger than the paper. By default, -+pages larger than the paper are shrunk to fit. -+.RB "[config file: " psShrinkLarger ] -+.TP -+.B \-nocenter -+By default, PDF pages smaller than the paper (after any scaling) are -+centered on the paper. This option causes them to be aligned to the -+lower-left corner of the paper instead. -+.RB "[config file: " psCenter ] -+.TP -+.B \-duplex -+Set the Duplex pagedevice entry in the PostScript file. This tells -+duplex-capable printers to enable duplexing. -+.RB "[config file: " psDuplex ] -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.B \-q -+Don't print any messages or errors. -+.RB "[config file: " errQuiet ] -+.TP -+.BI \-cfg " config-file" -+Read -+.I config-file -+in place of ~/.xpdfrc or the system-wide config file. -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdftops software and documentation are copyright 1996-2004 Glyph & -+Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftotext (1), -+.BR pdfinfo (1), -+.BR pdffonts (1), -+.BR pdftoppm (1), -+.BR pdfimages (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftops.cc poppler-0.4.3/utils/pdftops.cc ---- poppler-0.4.3.orig/utils/pdftops.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftops.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,336 @@ -+//======================================================================== -+// -+// pdftops.cc -+// -+// Copyright 1996-2003 Glyph & Cog, LLC -+// -+// Modified for Debian by Hamish Moffatt, 22 May 2002. -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "GlobalParams.h" -+#include "Object.h" -+#include "Stream.h" -+#include "Array.h" -+#include "Dict.h" -+#include "XRef.h" -+#include "Catalog.h" -+#include "Page.h" -+#include "PDFDoc.h" -+#include "PSOutputDev.h" -+#include "Error.h" -+#include "config.h" -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static GBool level1 = gFalse; -+static GBool level1Sep = gFalse; -+static GBool level2 = gFalse; -+static GBool level2Sep = gFalse; -+static GBool level3 = gFalse; -+static GBool level3Sep = gFalse; -+static GBool doEPS = gFalse; -+static GBool doForm = gFalse; -+#if OPI_SUPPORT -+static GBool doOPI = gFalse; -+#endif -+static GBool noEmbedT1Fonts = gFalse; -+static GBool noEmbedTTFonts = gFalse; -+static GBool noEmbedCIDPSFonts = gFalse; -+static GBool noEmbedCIDTTFonts = gFalse; -+static char paperSize[15] = ""; -+static int paperWidth = 0; -+static int paperHeight = 0; -+static GBool noCrop = gFalse; -+static GBool expand = gFalse; -+static GBool noShrink = gFalse; -+static GBool noCenter = gFalse; -+static GBool duplex = gFalse; -+static char ownerPassword[33] = "\001"; -+static char userPassword[33] = "\001"; -+static GBool quiet = gFalse; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to print"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to print"}, -+ {"-level1", argFlag, &level1, 0, -+ "generate Level 1 PostScript"}, -+ {"-level1sep", argFlag, &level1Sep, 0, -+ "generate Level 1 separable PostScript"}, -+ {"-level2", argFlag, &level2, 0, -+ "generate Level 2 PostScript"}, -+ {"-level2sep", argFlag, &level2Sep, 0, -+ "generate Level 2 separable PostScript"}, -+ {"-level3", argFlag, &level3, 0, -+ "generate Level 3 PostScript"}, -+ {"-level3sep", argFlag, &level3Sep, 0, -+ "generate Level 3 separable PostScript"}, -+ {"-eps", argFlag, &doEPS, 0, -+ "generate Encapsulated PostScript (EPS)"}, -+ {"-form", argFlag, &doForm, 0, -+ "generate a PostScript form"}, -+#if OPI_SUPPORT -+ {"-opi", argFlag, &doOPI, 0, -+ "generate OPI comments"}, -+#endif -+ {"-noembt1", argFlag, &noEmbedT1Fonts, 0, -+ "don't embed Type 1 fonts"}, -+ {"-noembtt", argFlag, &noEmbedTTFonts, 0, -+ "don't embed TrueType fonts"}, -+ {"-noembcidps", argFlag, &noEmbedCIDPSFonts, 0, -+ "don't embed CID PostScript fonts"}, -+ {"-noembcidtt", argFlag, &noEmbedCIDTTFonts, 0, -+ "don't embed CID TrueType fonts"}, -+ {"-paper", argString, paperSize, sizeof(paperSize), -+ "paper size (letter, legal, A4, A3, match)"}, -+ {"-paperw", argInt, &paperWidth, 0, -+ "paper width, in points"}, -+ {"-paperh", argInt, &paperHeight, 0, -+ "paper height, in points"}, -+ {"-nocrop", argFlag, &noCrop, 0, -+ "don't crop pages to CropBox"}, -+ {"-expand", argFlag, &expand, 0, -+ "expand pages smaller than the paper size"}, -+ {"-noshrink", argFlag, &noShrink, 0, -+ "don't shrink pages larger than the paper size"}, -+ {"-nocenter", argFlag, &noCenter, 0, -+ "don't center pages smaller than the paper size"}, -+ {"-duplex", argFlag, &duplex, 0, -+ "enable duplex printing"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-q", argFlag, &quiet, 0, -+ "don't print any messages or errors"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ GooString *psFileName; -+ PSLevel level; -+ PSOutMode mode; -+ GooString *ownerPW, *userPW; -+ PSOutputDev *psOut; -+ GBool ok; -+ char *p; -+ int exitCode; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc < 2 || argc > 3 || printVersion || printHelp) { -+ fprintf(stderr, "pdftops version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdftops", "<PDF-file> [<PS-file>]", argDesc); -+ } -+ exit(1); -+ } -+ if ((level1 ? 1 : 0) + -+ (level1Sep ? 1 : 0) + -+ (level2 ? 1 : 0) + -+ (level2Sep ? 1 : 0) + -+ (level3 ? 1 : 0) + -+ (level3Sep ? 1 : 0) > 1) { -+ fprintf(stderr, "Error: use only one of the 'level' options.\n"); -+ exit(1); -+ } -+ if (doEPS && doForm) { -+ fprintf(stderr, "Error: use only one of -eps and -form\n"); -+ exit(1); -+ } -+ if (level1) { -+ level = psLevel1; -+ } else if (level1Sep) { -+ level = psLevel1Sep; -+ } else if (level2Sep) { -+ level = psLevel2Sep; -+ } else if (level3) { -+ level = psLevel3; -+ } else if (level3Sep) { -+ level = psLevel3Sep; -+ } else { -+ level = psLevel2; -+ } -+ if (doForm && level < psLevel2) { -+ fprintf(stderr, "Error: forms are only available with Level 2 output.\n"); -+ exit(1); -+ } -+ mode = doEPS ? psModeEPS -+ : doForm ? psModeForm -+ : psModePS; -+ fileName = new GooString(argv[1]); -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ if (paperSize[0]) { -+ if (!globalParams->setPSPaperSize(paperSize)) { -+ fprintf(stderr, "Invalid paper size\n"); -+ delete fileName; -+ goto err0; -+ } -+ } else { -+ if (paperWidth) { -+ globalParams->setPSPaperWidth(paperWidth); -+ } -+ if (paperHeight) { -+ globalParams->setPSPaperHeight(paperHeight); -+ } -+ } -+ if (noCrop) { -+ globalParams->setPSCrop(gFalse); -+ } -+ if (expand) { -+ globalParams->setPSExpandSmaller(gTrue); -+ } -+ if (noShrink) { -+ globalParams->setPSShrinkLarger(gFalse); -+ } -+ if (noCenter) { -+ globalParams->setPSCenter(gFalse); -+ } -+ if (duplex) { -+ globalParams->setPSDuplex(duplex); -+ } -+ if (level1 || level1Sep || level2 || level2Sep || level3 || level3Sep) { -+ globalParams->setPSLevel(level); -+ } -+ if (noEmbedT1Fonts) { -+ globalParams->setPSEmbedType1(!noEmbedT1Fonts); -+ } -+ if (noEmbedTTFonts) { -+ globalParams->setPSEmbedTrueType(!noEmbedTTFonts); -+ } -+ if (noEmbedCIDPSFonts) { -+ globalParams->setPSEmbedCIDPostScript(!noEmbedCIDPSFonts); -+ } -+ if (noEmbedCIDTTFonts) { -+ globalParams->setPSEmbedCIDTrueType(!noEmbedCIDTTFonts); -+ } -+#if OPI_SUPPORT -+ if (doOPI) { -+ globalParams->setPSOPI(doOPI); -+ } -+#endif -+ if (quiet) { -+ globalParams->setErrQuiet(quiet); -+ } -+ -+ // open PDF file -+ if (ownerPassword[0] != '\001') { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0] != '\001') { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err1; -+ } -+ -+#ifdef ENFORCE_PERMISSIONS -+ // check for print permission -+ if (!doc->okToPrint()) { -+ error(-1, "Printing this document is not allowed."); -+ exitCode = 3; -+ goto err1; -+ } -+#endif -+ -+ // construct PostScript file name -+ if (argc == 3) { -+ psFileName = new GooString(argv[2]); -+ } else { -+ p = fileName->getCString() + fileName->getLength() - 4; -+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { -+ psFileName = new GooString(fileName->getCString(), -+ fileName->getLength() - 4); -+ } else { -+ psFileName = fileName->copy(); -+ } -+ psFileName->append(doEPS ? ".eps" : ".ps"); -+ } -+ -+ // get page range -+ if (firstPage < 1) { -+ firstPage = 1; -+ } -+ if (lastPage < 1 || lastPage > doc->getNumPages()) { -+ lastPage = doc->getNumPages(); -+ } -+ -+ // check for multi-page EPS or form -+ if ((doEPS || doForm) && firstPage != lastPage) { -+ error(-1, "EPS and form files can only contain one page."); -+ goto err2; -+ } -+ -+ // write PostScript file -+ psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(), -+ doc->getCatalog(), firstPage, lastPage, mode); -+ if (psOut->isOk()) { -+ doc->displayPages(psOut, firstPage, lastPage, 72, 72, -+ 0, globalParams->getPSCrop(), gFalse); -+ } else { -+ delete psOut; -+ exitCode = 2; -+ goto err2; -+ } -+ delete psOut; -+ -+ exitCode = 0; -+ -+ // clean up -+ err2: -+ delete psFileName; -+ err1: -+ delete doc; -+ err0: -+ delete globalParams; -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftotext.1 poppler-0.4.3/utils/pdftotext.1 ---- poppler-0.4.3.orig/utils/pdftotext.1 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftotext.1 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,135 @@ -+.\" Copyright 1997-2004 Glyph & Cog, LLC -+.TH pdftotext 1 "22 January 2004" -+.SH NAME -+pdftotext \- Portable Document Format (PDF) to text converter -+(version 3.00) -+.SH SYNOPSIS -+.B pdftotext -+[options] -+.RI [ PDF-file -+.RI [ text-file ]] -+.SH DESCRIPTION -+.B Pdftotext -+converts Portable Document Format (PDF) files to plain text. -+.PP -+Pdftotext reads the PDF file, -+.IR PDF-file , -+and writes a text file, -+.IR text-file . -+If -+.I text-file -+is not specified, pdftotext converts -+.I file.pdf -+to -+.IR file.txt . -+If -+.I text-file -+is \'-', the text is sent to stdout. -+.SH CONFIGURATION FILE -+Pdftotext reads a configuration file at startup. It first tries to -+find the user's private config file, ~/.xpdfrc. If that doesn't -+exist, it looks for a system-wide config file, /etc/xpdf/xpdfrc. See the -+.BR xpdfrc (5) -+man page for details. -+.SH OPTIONS -+Many of the following options can be set with configuration file -+commands. These are listed in square brackets with the description of -+the corresponding command line option. -+.TP -+.BI \-f " number" -+Specifies the first page to convert. -+.TP -+.BI \-l " number" -+Specifies the last page to convert. -+.TP -+.B \-layout -+Maintain (as best as possible) the original physical layout of the -+text. The default is to \'undo' physical layout (columns, -+hyphenation, etc.) and output the text in reading order. -+.TP -+.B \-raw -+Keep the text in content stream order. This is a hack which often -+"undoes" column formatting, etc. Use of raw mode is no longer -+recommended. -+.TP -+.B \-htmlmeta -+Generate a simple HTML file, including the meta information. This -+simply wraps the text in <pre> and </pre> and prepends the meta -+headers. -+.TP -+.BI \-enc " encoding-name" -+Sets the encoding to use for text output. The -+.I encoding\-name -+must be defined with the unicodeMap command (see -+.BR xpdfrc (5)). -+The encoding name is case-sensitive. This defaults to "Latin1" (which -+is a built-in encoding). -+.RB "[config file: " textEncoding ] -+.TP -+.BI \-eol " unix | dos | mac" -+Sets the end-of-line convention to use for text output. -+.RB "[config file: " textEOL ] -+.TP -+.B \-nopgbrk -+Don't insert page breaks (form feed characters) between pages. -+.RB "[config file: " textPageBreaks ] -+.TP -+.BI \-opw " password" -+Specify the owner password for the PDF file. Providing this will -+bypass all security restrictions. -+.TP -+.BI \-upw " password" -+Specify the user password for the PDF file. -+.TP -+.B \-q -+Don't print any messages or errors. -+.RB "[config file: " errQuiet ] -+.TP -+.BI \-cfg " config-file" -+Read -+.I config-file -+in place of ~/.xpdfrc or the system-wide config file. -+.TP -+.B \-v -+Print copyright and version information. -+.TP -+.B \-h -+Print usage information. -+.RB ( \-help -+and -+.B \-\-help -+are equivalent.) -+.SH BUGS -+Some PDF files contain fonts whose encodings have been mangled beyond -+recognition. There is no way (short of OCR) to extract text from -+these files. -+.SH EXIT CODES -+The Xpdf tools use the following exit codes: -+.TP -+0 -+No error. -+.TP -+1 -+Error opening a PDF file. -+.TP -+2 -+Error opening an output file. -+.TP -+3 -+Error related to PDF permissions. -+.TP -+99 -+Other error. -+.SH AUTHOR -+The pdftotext software and documentation are copyright 1996-2004 Glyph -+& Cog, LLC. -+.SH "SEE ALSO" -+.BR xpdf (1), -+.BR pdftops (1), -+.BR pdfinfo (1), -+.BR pdffonts (1), -+.BR pdftoppm (1), -+.BR pdfimages (1), -+.BR xpdfrc (5) -+.br -+.B http://www.foolabs.com/xpdf/ -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/pdftotext.cc poppler-0.4.3/utils/pdftotext.cc ---- poppler-0.4.3.orig/utils/pdftotext.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/pdftotext.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,336 @@ -+//======================================================================== -+// -+// pdftotext.cc -+// -+// Copyright 1997-2003 Glyph & Cog, LLC -+// -+// Modified for Debian by Hamish Moffatt, 22 May 2002. -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+#include <stdio.h> -+#include <stdlib.h> -+#include <stddef.h> -+#include <string.h> -+#include "parseargs.h" -+#include "goo/GooString.h" -+#include "goo/gmem.h" -+#include "GlobalParams.h" -+#include "Object.h" -+#include "Stream.h" -+#include "Array.h" -+#include "Dict.h" -+#include "XRef.h" -+#include "Catalog.h" -+#include "Page.h" -+#include "PDFDoc.h" -+#include "TextOutputDev.h" -+#include "CharTypes.h" -+#include "UnicodeMap.h" -+#include "Error.h" -+#include "config.h" -+ -+static void printInfoString(FILE *f, Dict *infoDict, char *key, -+ char *text1, char *text2, UnicodeMap *uMap); -+static void printInfoDate(FILE *f, Dict *infoDict, char *key, char *fmt); -+ -+static int firstPage = 1; -+static int lastPage = 0; -+static GBool physLayout = gFalse; -+static GBool rawOrder = gFalse; -+static GBool htmlMeta = gFalse; -+static char textEncName[128] = ""; -+static char textEOL[16] = ""; -+static GBool noPageBreaks = gFalse; -+static char ownerPassword[33] = "\001"; -+static char userPassword[33] = "\001"; -+static GBool quiet = gFalse; -+static char cfgFileName[256] = ""; -+static GBool printVersion = gFalse; -+static GBool printHelp = gFalse; -+ -+static ArgDesc argDesc[] = { -+ {"-f", argInt, &firstPage, 0, -+ "first page to convert"}, -+ {"-l", argInt, &lastPage, 0, -+ "last page to convert"}, -+ {"-layout", argFlag, &physLayout, 0, -+ "maintain original physical layout"}, -+ {"-raw", argFlag, &rawOrder, 0, -+ "keep strings in content stream order"}, -+ {"-htmlmeta", argFlag, &htmlMeta, 0, -+ "generate a simple HTML file, including the meta information"}, -+ {"-enc", argString, textEncName, sizeof(textEncName), -+ "output text encoding name"}, -+ {"-eol", argString, textEOL, sizeof(textEOL), -+ "output end-of-line convention (unix, dos, or mac)"}, -+ {"-nopgbrk", argFlag, &noPageBreaks, 0, -+ "don't insert page breaks between pages"}, -+ {"-opw", argString, ownerPassword, sizeof(ownerPassword), -+ "owner password (for encrypted files)"}, -+ {"-upw", argString, userPassword, sizeof(userPassword), -+ "user password (for encrypted files)"}, -+ {"-q", argFlag, &quiet, 0, -+ "don't print any messages or errors"}, -+ {"-cfg", argString, cfgFileName, sizeof(cfgFileName), -+ "configuration file to use in place of .xpdfrc"}, -+ {"-v", argFlag, &printVersion, 0, -+ "print copyright and version info"}, -+ {"-h", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"--help", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {"-?", argFlag, &printHelp, 0, -+ "print usage information"}, -+ {NULL} -+}; -+ -+int main(int argc, char *argv[]) { -+ PDFDoc *doc; -+ GooString *fileName; -+ GooString *textFileName; -+ GooString *ownerPW, *userPW; -+ TextOutputDev *textOut; -+ FILE *f; -+ UnicodeMap *uMap; -+ Object info; -+ GBool ok; -+ char *p; -+ int exitCode; -+ -+ exitCode = 99; -+ -+ // parse args -+ ok = parseArgs(argDesc, &argc, argv); -+ if (!ok || argc < 2 || argc > 3 || printVersion || printHelp) { -+ fprintf(stderr, "pdftotext version %s\n", xpdfVersion); -+ fprintf(stderr, "%s\n", xpdfCopyright); -+ if (!printVersion) { -+ printUsage("pdftotext", "<PDF-file> [<text-file>]", argDesc); -+ } -+ goto err0; -+ } -+ fileName = new GooString(argv[1]); -+ -+ // read config file -+ globalParams = new GlobalParams(cfgFileName); -+ if (textEncName[0]) { -+ globalParams->setTextEncoding(textEncName); -+ } -+ if (textEOL[0]) { -+ if (!globalParams->setTextEOL(textEOL)) { -+ fprintf(stderr, "Bad '-eol' value on command line\n"); -+ } -+ } -+ if (noPageBreaks) { -+ globalParams->setTextPageBreaks(gFalse); -+ } -+ if (quiet) { -+ globalParams->setErrQuiet(quiet); -+ } -+ -+ // get mapping to output encoding -+ if (!(uMap = globalParams->getTextEncoding())) { -+ error(-1, "Couldn't get text encoding"); -+ delete fileName; -+ goto err1; -+ } -+ -+ // open PDF file -+ if (ownerPassword[0] != '\001') { -+ ownerPW = new GooString(ownerPassword); -+ } else { -+ ownerPW = NULL; -+ } -+ if (userPassword[0] != '\001') { -+ userPW = new GooString(userPassword); -+ } else { -+ userPW = NULL; -+ } -+ doc = new PDFDoc(fileName, ownerPW, userPW); -+ if (userPW) { -+ delete userPW; -+ } -+ if (ownerPW) { -+ delete ownerPW; -+ } -+ if (!doc->isOk()) { -+ exitCode = 1; -+ goto err2; -+ } -+ -+#ifdef ENFORCE_PERMISSIONS -+ // check for copy permission -+ if (!doc->okToCopy()) { -+ error(-1, "Copying of text from this document is not allowed."); -+ exitCode = 3; -+ goto err2; -+ } -+#endif -+ -+ // construct text file name -+ if (argc == 3) { -+ textFileName = new GooString(argv[2]); -+ } else { -+ p = fileName->getCString() + fileName->getLength() - 4; -+ if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) { -+ textFileName = new GooString(fileName->getCString(), -+ fileName->getLength() - 4); -+ } else { -+ textFileName = fileName->copy(); -+ } -+ textFileName->append(htmlMeta ? ".html" : ".txt"); -+ } -+ -+ // get page range -+ if (firstPage < 1) { -+ firstPage = 1; -+ } -+ if (lastPage < 1 || lastPage > doc->getNumPages()) { -+ lastPage = doc->getNumPages(); -+ } -+ -+ // write HTML header -+ if (htmlMeta) { -+ if (!textFileName->cmp("-")) { -+ f = stdout; -+ } else { -+ if (!(f = fopen(textFileName->getCString(), "wb"))) { -+ error(-1, "Couldn't open text file '%s'", textFileName->getCString()); -+ exitCode = 2; -+ goto err3; -+ } -+ } -+ fputs("<html>\n", f); -+ fputs("<head>\n", f); -+ doc->getDocInfo(&info); -+ if (info.isDict()) { -+ printInfoString(f, info.getDict(), "Title", "<title>", "</title>\n", -+ uMap); -+ printInfoString(f, info.getDict(), "Subject", -+ "<meta name=\"Subject\" content=\"", "\">\n", uMap); -+ printInfoString(f, info.getDict(), "Keywords", -+ "<meta name=\"Keywords\" content=\"", "\">\n", uMap); -+ printInfoString(f, info.getDict(), "Author", -+ "<meta name=\"Author\" content=\"", "\">\n", uMap); -+ printInfoString(f, info.getDict(), "Creator", -+ "<meta name=\"Creator\" content=\"", "\">\n", uMap); -+ printInfoString(f, info.getDict(), "Producer", -+ "<meta name=\"Producer\" content=\"", "\">\n", uMap); -+ printInfoDate(f, info.getDict(), "CreationDate", -+ "<meta name=\"CreationDate\" content=\"\">\n"); -+ printInfoDate(f, info.getDict(), "LastModifiedDate", -+ "<meta name=\"ModDate\" content=\"\">\n"); -+ } -+ info.free(); -+ fputs("</head>\n", f); -+ fputs("<body>\n", f); -+ fputs("<pre>\n", f); -+ if (f != stdout) { -+ fclose(f); -+ } -+ } -+ -+ // write text file -+ textOut = new TextOutputDev(textFileName->getCString(), -+ physLayout, rawOrder, htmlMeta); -+ if (textOut->isOk()) { -+ doc->displayPages(textOut, firstPage, lastPage, 72, 72, 0, gTrue, gFalse); -+ } else { -+ delete textOut; -+ exitCode = 2; -+ goto err3; -+ } -+ delete textOut; -+ -+ // write end of HTML file -+ if (htmlMeta) { -+ if (!textFileName->cmp("-")) { -+ f = stdout; -+ } else { -+ if (!(f = fopen(textFileName->getCString(), "ab"))) { -+ error(-1, "Couldn't open text file '%s'", textFileName->getCString()); -+ exitCode = 2; -+ goto err3; -+ } -+ } -+ fputs("</pre>\n", f); -+ fputs("</body>\n", f); -+ fputs("</html>\n", f); -+ if (f != stdout) { -+ fclose(f); -+ } -+ } -+ -+ exitCode = 0; -+ -+ // clean up -+ err3: -+ delete textFileName; -+ err2: -+ delete doc; -+ uMap->decRefCnt(); -+ err1: -+ delete globalParams; -+ err0: -+ -+ // check for memory leaks -+ Object::memCheck(stderr); -+ gMemReport(stderr); -+ -+ return exitCode; -+} -+ -+static void printInfoString(FILE *f, Dict *infoDict, char *key, -+ char *text1, char *text2, UnicodeMap *uMap) { -+ Object obj; -+ GooString *s1; -+ GBool isUnicode; -+ Unicode u; -+ char buf[8]; -+ int i, n; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ fputs(text1, f); -+ s1 = obj.getString(); -+ if ((s1->getChar(0) & 0xff) == 0xfe && -+ (s1->getChar(1) & 0xff) == 0xff) { -+ isUnicode = gTrue; -+ i = 2; -+ } else { -+ isUnicode = gFalse; -+ i = 0; -+ } -+ while (i < obj.getString()->getLength()) { -+ if (isUnicode) { -+ u = ((s1->getChar(i) & 0xff) << 8) | -+ (s1->getChar(i+1) & 0xff); -+ i += 2; -+ } else { -+ u = s1->getChar(i) & 0xff; -+ ++i; -+ } -+ n = uMap->mapUnicode(u, buf, sizeof(buf)); -+ fwrite(buf, 1, n, f); -+ } -+ fputs(text2, f); -+ } -+ obj.free(); -+} -+ -+static void printInfoDate(FILE *f, Dict *infoDict, char *key, char *fmt) { -+ Object obj; -+ char *s; -+ -+ if (infoDict->lookup(key, &obj)->isString()) { -+ s = obj.getString()->getCString(); -+ if (s[0] == 'D' && s[1] == ':') { -+ s += 2; -+ } -+ fprintf(f, fmt, s); -+ } -+ obj.free(); -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/SplashOutputDev.cc poppler-0.4.3/utils/SplashOutputDev.cc ---- poppler-0.4.3.orig/utils/SplashOutputDev.cc 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/SplashOutputDev.cc 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,1387 @@ -+//======================================================================== -+// -+// SplashOutputDev.cc -+// -+// Copyright 2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#include <poppler-config.h> -+ -+#ifdef USE_GCC_PRAGMAS -+#pragma implementation -+#endif -+ -+#include <string.h> -+#include <math.h> -+#include <dirent.h> -+#include "goo/gtypes.h" -+#include "goo/gfile.h" -+#include "GlobalParams.h" -+#include "Error.h" -+#include "Object.h" -+#include "GfxState.h" -+#include "GfxFont.h" -+#include "Link.h" -+#include "CharCodeToUnicode.h" -+#include "FontEncodingTables.h" -+#include "fofi/FoFiTrueType.h" -+#include "splash/SplashBitmap.h" -+#include "splash/SplashGlyphBitmap.h" -+#include "splash/SplashPattern.h" -+#include "splash/SplashScreen.h" -+#include "splash/SplashPath.h" -+#include "splash/SplashState.h" -+#include "splash/SplashErrorCodes.h" -+#include "splash/SplashFontEngine.h" -+#include "splash/SplashFont.h" -+#include "splash/SplashFontFile.h" -+#include "splash/SplashFontFileID.h" -+#include "splash/Splash.h" -+#include "SplashOutputDev.h" -+ -+//------------------------------------------------------------------------ -+// Font substitutions -+//------------------------------------------------------------------------ -+ -+struct SplashOutFontSubst { -+ char *name; -+ double mWidth; -+}; -+ -+// index: {symbolic:12, fixed:8, serif:4, sans-serif:0} + bold*2 + italic -+static SplashOutFontSubst splashOutSubstFonts[16] = { -+ {"Helvetica", 0.833}, -+ {"Helvetica-Oblique", 0.833}, -+ {"Helvetica-Bold", 0.889}, -+ {"Helvetica-BoldOblique", 0.889}, -+ {"Times-Roman", 0.788}, -+ {"Times-Italic", 0.722}, -+ {"Times-Bold", 0.833}, -+ {"Times-BoldItalic", 0.778}, -+ {"Courier", 0.600}, -+ {"Courier-Oblique", 0.600}, -+ {"Courier-Bold", 0.600}, -+ {"Courier-BoldOblique", 0.600}, -+ {"Symbol", 0.576}, -+ {"Symbol", 0.576}, -+ {"Symbol", 0.576}, -+ {"Symbol", 0.576} -+}; -+ -+//------------------------------------------------------------------------ -+ -+#define soutRound(x) ((int)(x + 0.5)) -+ -+//------------------------------------------------------------------------ -+// SplashOutFontFileID -+//------------------------------------------------------------------------ -+ -+class SplashOutFontFileID: public SplashFontFileID { -+public: -+ -+ SplashOutFontFileID(Ref *rA) { r = *rA; substIdx = -1; } -+ -+ ~SplashOutFontFileID() {} -+ -+ GBool matches(SplashFontFileID *id) { -+ return ((SplashOutFontFileID *)id)->r.num == r.num && -+ ((SplashOutFontFileID *)id)->r.gen == r.gen; -+ } -+ -+ void setSubstIdx(int substIdxA) { substIdx = substIdxA; } -+ int getSubstIdx() { return substIdx; } -+ -+private: -+ -+ Ref r; -+ int substIdx; -+}; -+ -+//------------------------------------------------------------------------ -+// T3FontCache -+//------------------------------------------------------------------------ -+ -+struct T3FontCacheTag { -+ Gushort code; -+ Gushort mru; // valid bit (0x8000) and MRU index -+}; -+ -+class T3FontCache { -+public: -+ -+ T3FontCache(Ref *fontID, double m11A, double m12A, -+ double m21A, double m22A, -+ int glyphXA, int glyphYA, int glyphWA, int glyphHA, -+ GBool aa); -+ ~T3FontCache(); -+ GBool matches(Ref *idA, double m11A, double m12A, -+ double m21A, double m22A) -+ { return fontID.num == idA->num && fontID.gen == idA->gen && -+ m11 == m11A && m12 == m12A && m21 == m21A && m22 == m22A; } -+ -+ Ref fontID; // PDF font ID -+ double m11, m12, m21, m22; // transform matrix -+ int glyphX, glyphY; // pixel offset of glyph bitmaps -+ int glyphW, glyphH; // size of glyph bitmaps, in pixels -+ int glyphSize; // size of glyph bitmaps, in bytes -+ int cacheSets; // number of sets in cache -+ int cacheAssoc; // cache associativity (glyphs per set) -+ Guchar *cacheData; // glyph pixmap cache -+ T3FontCacheTag *cacheTags; // cache tags, i.e., char codes -+}; -+ -+T3FontCache::T3FontCache(Ref *fontIDA, double m11A, double m12A, -+ double m21A, double m22A, -+ int glyphXA, int glyphYA, int glyphWA, int glyphHA, -+ GBool aa) { -+ int i; -+ -+ fontID = *fontIDA; -+ m11 = m11A; -+ m12 = m12A; -+ m21 = m21A; -+ m22 = m22A; -+ glyphX = glyphXA; -+ glyphY = glyphYA; -+ glyphW = glyphWA; -+ glyphH = glyphHA; -+ if (aa) { -+ glyphSize = glyphW * glyphH; -+ } else { -+ glyphSize = ((glyphW + 7) >> 3) * glyphH; -+ } -+ cacheAssoc = 8; -+ if (glyphSize <= 256) { -+ cacheSets = 8; -+ } else if (glyphSize <= 512) { -+ cacheSets = 4; -+ } else if (glyphSize <= 1024) { -+ cacheSets = 2; -+ } else { -+ cacheSets = 1; -+ } -+ cacheData = (Guchar *)gmalloc(cacheSets * cacheAssoc * glyphSize); -+ cacheTags = (T3FontCacheTag *)gmalloc(cacheSets * cacheAssoc * -+ sizeof(T3FontCacheTag)); -+ for (i = 0; i < cacheSets * cacheAssoc; ++i) { -+ cacheTags[i].mru = i & (cacheAssoc - 1); -+ } -+} -+ -+T3FontCache::~T3FontCache() { -+ gfree(cacheData); -+ gfree(cacheTags); -+} -+ -+struct T3GlyphStack { -+ Gushort code; // character code -+ double x, y; // position to draw the glyph -+ -+ //----- cache info -+ T3FontCache *cache; // font cache for the current font -+ T3FontCacheTag *cacheTag; // pointer to cache tag for the glyph -+ Guchar *cacheData; // pointer to cache data for the glyph -+ -+ //----- saved state -+ SplashBitmap *origBitmap; -+ Splash *origSplash; -+ double origCTM4, origCTM5; -+ -+ T3GlyphStack *next; // next object on stack -+}; -+ -+//------------------------------------------------------------------------ -+// SplashOutputDev -+//------------------------------------------------------------------------ -+ -+SplashOutputDev::SplashOutputDev(SplashColorMode colorModeA, -+ GBool reverseVideoA, -+ SplashColor paperColorA) { -+ colorMode = colorModeA; -+ reverseVideo = reverseVideoA; -+ paperColor = paperColorA; -+ -+ xref = NULL; -+ -+ bitmap = new SplashBitmap(1, 1, colorMode); -+ splash = new Splash(bitmap); -+ splash->clear(paperColor); -+ -+ fontEngine = NULL; -+ -+ nT3Fonts = 0; -+ t3GlyphStack = NULL; -+ -+ font = NULL; -+ needFontUpdate = gFalse; -+ textClipPath = NULL; -+ -+ underlayCbk = NULL; -+ underlayCbkData = NULL; -+} -+ -+SplashOutputDev::~SplashOutputDev() { -+ int i; -+ -+ for (i = 0; i < nT3Fonts; ++i) { -+ delete t3FontCache[i]; -+ } -+ if (fontEngine) { -+ delete fontEngine; -+ } -+ if (splash) { -+ delete splash; -+ } -+ if (bitmap) { -+ delete bitmap; -+ } -+} -+ -+void SplashOutputDev::startDoc(XRef *xrefA) { -+ int i; -+ -+ xref = xrefA; -+ if (fontEngine) { -+ delete fontEngine; -+ } -+ fontEngine = new SplashFontEngine( -+#if HAVE_T1LIB_H -+ globalParams->getEnableT1lib(), -+#endif -+#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H -+ globalParams->getEnableFreeType(), -+#endif -+ globalParams->getAntialias()); -+ for (i = 0; i < nT3Fonts; ++i) { -+ delete t3FontCache[i]; -+ } -+ nT3Fonts = 0; -+} -+ -+void SplashOutputDev::startPage(int pageNum, GfxState *state) { -+ int w, h; -+ SplashColor color; -+ -+ w = state ? (int)(state->getPageWidth() + 0.5) : 1; -+ h = state ? (int)(state->getPageHeight() + 0.5) : 1; -+ if (splash) { -+ delete splash; -+ } -+ if (!bitmap || w != bitmap->getWidth() || h != bitmap->getHeight()) { -+ if (bitmap) { -+ delete bitmap; -+ } -+ bitmap = new SplashBitmap(w, h, colorMode); -+ } -+ splash = new Splash(bitmap); -+ switch (colorMode) { -+ case splashModeMono1: color.mono1 = 0; break; -+ case splashModeMono8: color.mono8 = 0; break; -+ case splashModeRGB8: color.rgb8 = splashMakeRGB8(0, 0, 0); break; -+ case splashModeBGR8Packed: color.bgr8 = splashMakeBGR8(0, 0, 0); break; -+ } -+ splash->setStrokePattern(new SplashSolidColor(color)); -+ splash->setFillPattern(new SplashSolidColor(color)); -+ splash->setLineCap(splashLineCapButt); -+ splash->setLineJoin(splashLineJoinMiter); -+ splash->setLineDash(NULL, 0, 0); -+ splash->setMiterLimit(10); -+ splash->setFlatness(1); -+ splash->clear(paperColor); -+ -+ if (underlayCbk) { -+ (*underlayCbk)(underlayCbkData); -+ } -+} -+ -+void SplashOutputDev::endPage() { -+} -+ -+void SplashOutputDev::drawLink(Link *link, Catalog *catalog) { -+ double x1, y1, x2, y2; -+ LinkBorderStyle *borderStyle; -+ GfxRGB rgb; -+ double gray; -+ double *dash; -+ int dashLength; -+ SplashCoord dashList[20]; -+ SplashPath *path; -+ int x, y, i; -+ -+ link->getRect(&x1, &y1, &x2, &y2); -+ borderStyle = link->getBorderStyle(); -+ if (borderStyle->getWidth() > 0) { -+ borderStyle->getColor(&rgb.r, &rgb.g, &rgb.b); -+ gray = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.b; -+ if (gray > 1) { -+ gray = 1; -+ } -+ splash->setStrokePattern(getColor(gray, &rgb)); -+ splash->setLineWidth((SplashCoord)borderStyle->getWidth()); -+ borderStyle->getDash(&dash, &dashLength); -+ if (borderStyle->getType() == linkBorderDashed && dashLength > 0) { -+ if (dashLength > 20) { -+ dashLength = 20; -+ } -+ for (i = 0; i < dashLength; ++i) { -+ dashList[i] = (SplashCoord)dash[i]; -+ } -+ splash->setLineDash(dashList, dashLength, 0); -+ } -+ path = new SplashPath(); -+ if (borderStyle->getType() == linkBorderUnderlined) { -+ cvtUserToDev(x1, y1, &x, &y); -+ path->moveTo((SplashCoord)x, (SplashCoord)y); -+ cvtUserToDev(x2, y1, &x, &y); -+ path->lineTo((SplashCoord)x, (SplashCoord)y); -+ } else { -+ cvtUserToDev(x1, y1, &x, &y); -+ path->moveTo((SplashCoord)x, (SplashCoord)y); -+ cvtUserToDev(x2, y1, &x, &y); -+ path->lineTo((SplashCoord)x, (SplashCoord)y); -+ cvtUserToDev(x2, y2, &x, &y); -+ path->lineTo((SplashCoord)x, (SplashCoord)y); -+ cvtUserToDev(x1, y2, &x, &y); -+ path->lineTo((SplashCoord)x, (SplashCoord)y); -+ path->close(); -+ } -+ splash->stroke(path); -+ delete path; -+ } -+} -+ -+void SplashOutputDev::saveState(GfxState *state) { -+ splash->saveState(); -+} -+ -+void SplashOutputDev::restoreState(GfxState *state) { -+ splash->restoreState(); -+ needFontUpdate = gTrue; -+} -+ -+void SplashOutputDev::updateAll(GfxState *state) { -+ updateLineDash(state); -+ updateLineJoin(state); -+ updateLineCap(state); -+ updateLineWidth(state); -+ updateFlatness(state); -+ updateMiterLimit(state); -+ updateFillColor(state); -+ updateStrokeColor(state); -+ needFontUpdate = gTrue; -+} -+ -+void SplashOutputDev::updateCTM(GfxState *state, double m11, double m12, -+ double m21, double m22, -+ double m31, double m32) { -+ updateLineDash(state); -+ updateLineJoin(state); -+ updateLineCap(state); -+ updateLineWidth(state); -+} -+ -+void SplashOutputDev::updateLineDash(GfxState *state) { -+ double *dashPattern; -+ int dashLength; -+ double dashStart; -+ SplashCoord dash[20]; -+ SplashCoord phase; -+ int i; -+ -+ state->getLineDash(&dashPattern, &dashLength, &dashStart); -+ if (dashLength > 20) { -+ dashLength = 20; -+ } -+ for (i = 0; i < dashLength; ++i) { -+ dash[i] = (SplashCoord)state->transformWidth(dashPattern[i]); -+ if (dash[i] < 1) { -+ dash[i] = 1; -+ } -+ } -+ phase = (SplashCoord)state->transformWidth(dashStart); -+ splash->setLineDash(dash, dashLength, phase); -+} -+ -+void SplashOutputDev::updateFlatness(GfxState *state) { -+ splash->setFlatness(state->getFlatness()); -+} -+ -+void SplashOutputDev::updateLineJoin(GfxState *state) { -+ splash->setLineJoin(state->getLineJoin()); -+} -+ -+void SplashOutputDev::updateLineCap(GfxState *state) { -+ splash->setLineCap(state->getLineCap()); -+} -+ -+void SplashOutputDev::updateMiterLimit(GfxState *state) { -+ splash->setMiterLimit(state->getMiterLimit()); -+} -+ -+void SplashOutputDev::updateLineWidth(GfxState *state) { -+ splash->setLineWidth(state->getTransformedLineWidth()); -+} -+ -+void SplashOutputDev::updateFillColor(GfxState *state) { -+ double gray; -+ GfxRGB rgb; -+ -+ state->getFillGray(&gray); -+ state->getFillRGB(&rgb); -+ splash->setFillPattern(getColor(gray, &rgb)); -+} -+ -+void SplashOutputDev::updateStrokeColor(GfxState *state) { -+ double gray; -+ GfxRGB rgb; -+ -+ state->getStrokeGray(&gray); -+ state->getStrokeRGB(&rgb); -+ splash->setStrokePattern(getColor(gray, &rgb)); -+} -+ -+SplashPattern *SplashOutputDev::getColor(double gray, GfxRGB *rgb) { -+ SplashPattern *pattern; -+ SplashColor color0, color1; -+ double r, g, b; -+ -+ if (reverseVideo) { -+ gray = 1 - gray; -+ r = 1 - rgb->r; -+ g = 1 - rgb->g; -+ b = 1 - rgb->b; -+ } else { -+ r = rgb->r; -+ g = rgb->g; -+ b = rgb->b; -+ } -+ -+ pattern = NULL; // make gcc happy -+ switch (colorMode) { -+ case splashModeMono1: -+ color0.mono1 = 0; -+ color1.mono1 = 1; -+ pattern = new SplashHalftone(color0, color1, -+ splash->getScreen()->copy(), -+ (SplashCoord)gray); -+ break; -+ case splashModeMono8: -+ color1.mono8 = soutRound(255 * gray); -+ pattern = new SplashSolidColor(color1); -+ break; -+ case splashModeRGB8: -+ color1.rgb8 = splashMakeRGB8(soutRound(255 * r), -+ soutRound(255 * g), -+ soutRound(255 * b)); -+ pattern = new SplashSolidColor(color1); -+ break; -+ case splashModeBGR8Packed: -+ color1.bgr8 = splashMakeBGR8(soutRound(255 * r), -+ soutRound(255 * g), -+ soutRound(255 * b)); -+ pattern = new SplashSolidColor(color1); -+ break; -+ } -+ -+ return pattern; -+} -+ -+void SplashOutputDev::updateFont(GfxState *state) { -+ GfxFont *gfxFont; -+ GfxFontType fontType; -+ SplashOutFontFileID *id; -+ SplashFontFile *fontFile; -+ FoFiTrueType *ff; -+ Ref embRef; -+ Object refObj, strObj; -+ GooString *tmpFileName, *fileName, *substName; -+ FILE *tmpFile; -+ Gushort *codeToGID; -+ DisplayFontParam *dfp; -+ CharCodeToUnicode *ctu; -+ double m11, m12, m21, m22, w1, w2; -+ SplashCoord mat[4]; -+ char *name; -+ Unicode uBuf[8]; -+ int c, substIdx, n, code, cmap; -+ -+ needFontUpdate = gFalse; -+ font = NULL; -+ tmpFileName = NULL; -+ substIdx = -1; -+ dfp = NULL; -+ -+ if (!(gfxFont = state->getFont())) { -+ goto err1; -+ } -+ fontType = gfxFont->getType(); -+ if (fontType == fontType3) { -+ goto err1; -+ } -+ -+ // check the font file cache -+ id = new SplashOutFontFileID(gfxFont->getID()); -+ if ((fontFile = fontEngine->getFontFile(id))) { -+ delete id; -+ -+ } else { -+ -+ // if there is an embedded font, write it to disk -+ if (gfxFont->getEmbeddedFontID(&embRef)) { -+ if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) { -+ error(-1, "Couldn't create temporary font file"); -+ goto err2; -+ } -+ refObj.initRef(embRef.num, embRef.gen); -+ refObj.fetch(xref, &strObj); -+ refObj.free(); -+ strObj.streamReset(); -+ while ((c = strObj.streamGetChar()) != EOF) { -+ fputc(c, tmpFile); -+ } -+ strObj.streamClose(); -+ strObj.free(); -+ fclose(tmpFile); -+ fileName = tmpFileName; -+ -+ // if there is an external font file, use it -+ } else if (!(fileName = gfxFont->getExtFontFile())) { -+ -+ // look for a display font mapping or a substitute font -+ if (gfxFont->isCIDFont()) { -+ if (((GfxCIDFont *)gfxFont)->getCollection()) { -+ dfp = globalParams-> -+ getDisplayCIDFont(gfxFont->getName(), -+ ((GfxCIDFont *)gfxFont)->getCollection()); -+ } -+ } else { -+ if (gfxFont->getName()) { -+ dfp = globalParams->getDisplayFont(gfxFont->getName()); -+ } -+ if (!dfp) { -+ // 8-bit font substitution -+ if (gfxFont->isFixedWidth()) { -+ substIdx = 8; -+ } else if (gfxFont->isSerif()) { -+ substIdx = 4; -+ } else { -+ substIdx = 0; -+ } -+ if (gfxFont->isBold()) { -+ substIdx += 2; -+ } -+ if (gfxFont->isItalic()) { -+ substIdx += 1; -+ } -+ substName = new GooString(splashOutSubstFonts[substIdx].name); -+ dfp = globalParams->getDisplayFont(substName); -+ delete substName; -+ id->setSubstIdx(substIdx); -+ } -+ } -+ if (!dfp) { -+ error(-1, "Couldn't find a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ switch (dfp->kind) { -+ case displayFontT1: -+ fileName = dfp->t1.fileName; -+ fontType = gfxFont->isCIDFont() ? fontCIDType0 : fontType1; -+ break; -+ case displayFontTT: -+ fileName = dfp->tt.fileName; -+ fontType = gfxFont->isCIDFont() ? fontCIDType2 : fontTrueType; -+ break; -+ } -+ } -+ -+ // load the font file -+ switch (fontType) { -+ case fontType1: -+ if (!(fontFile = fontEngine->loadType1Font( -+ id, -+ fileName->getCString(), -+ fileName == tmpFileName, -+ ((Gfx8BitFont *)gfxFont)->getEncoding()))) { -+ error(-1, "Couldn't create a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ break; -+ case fontType1C: -+ if (!(fontFile = fontEngine->loadType1CFont( -+ id, -+ fileName->getCString(), -+ fileName == tmpFileName, -+ ((Gfx8BitFont *)gfxFont)->getEncoding()))) { -+ error(-1, "Couldn't create a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ break; -+ case fontTrueType: -+ if (!(ff = FoFiTrueType::load(fileName->getCString()))) { -+ goto err2; -+ } -+ codeToGID = ((Gfx8BitFont *)gfxFont)->getCodeToGIDMap(ff); -+ delete ff; -+ if (!(fontFile = fontEngine->loadTrueTypeFont( -+ id, -+ fileName->getCString(), -+ fileName == tmpFileName, -+ codeToGID, 256))) { -+ error(-1, "Couldn't create a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ break; -+ case fontCIDType0: -+ case fontCIDType0C: -+ if (!(fontFile = fontEngine->loadCIDFont( -+ id, -+ fileName->getCString(), -+ fileName == tmpFileName))) { -+ error(-1, "Couldn't create a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ break; -+ case fontCIDType2: -+ codeToGID = NULL; -+ n = 0; -+ if (dfp) { -+ // create a CID-to-GID mapping, via Unicode -+ if ((ctu = ((GfxCIDFont *)gfxFont)->getToUnicode())) { -+ if ((ff = FoFiTrueType::load(fileName->getCString()))) { -+ // look for a Unicode cmap -+ for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { -+ if ((ff->getCmapPlatform(cmap) == 3 && -+ ff->getCmapEncoding(cmap) == 1) || -+ ff->getCmapPlatform(cmap) == 0) { -+ break; -+ } -+ } -+ if (cmap < ff->getNumCmaps()) { -+ // map CID -> Unicode -> GID -+ n = ctu->getLength(); -+ codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort)); -+ for (code = 0; code < n; ++code) { -+ if (ctu->mapToUnicode(code, uBuf, 8) > 0) { -+ codeToGID[code] = ff->mapCodeToGID(cmap, uBuf[0]); -+ } else { -+ codeToGID[code] = 0; -+ } -+ } -+ } -+ delete ff; -+ } -+ ctu->decRefCnt(); -+ } else { -+ error(-1, "Couldn't find a mapping to Unicode for font '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ } -+ } else { -+ if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { -+ n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); -+ codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort)); -+ memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), -+ n * sizeof(Gushort)); -+ } -+ } -+ if (!(fontFile = fontEngine->loadTrueTypeFont( -+ id, -+ fileName->getCString(), -+ fileName == tmpFileName, -+ codeToGID, n))) { -+ error(-1, "Couldn't create a font for '%s'", -+ gfxFont->getName() ? gfxFont->getName()->getCString() -+ : "(unnamed)"); -+ goto err2; -+ } -+ break; -+ default: -+ // this shouldn't happen -+ goto err2; -+ } -+ } -+ -+ // get the font matrix -+ state->getFontTransMat(&m11, &m12, &m21, &m22); -+ m11 *= state->getHorizScaling(); -+ m12 *= state->getHorizScaling(); -+ -+ // for substituted fonts: adjust the font matrix -- compare the -+ // width of 'm' in the original font and the substituted font -+ substIdx = ((SplashOutFontFileID *)fontFile->getID())->getSubstIdx(); -+ if (substIdx >= 0) { -+ for (code = 0; code < 256; ++code) { -+ if ((name = ((Gfx8BitFont *)gfxFont)->getCharName(code)) && -+ name[0] == 'm' && name[1] == '\0') { -+ break; -+ } -+ } -+ if (code < 256) { -+ w1 = ((Gfx8BitFont *)gfxFont)->getWidth(code); -+ w2 = splashOutSubstFonts[substIdx].mWidth; -+ if (!gfxFont->isSymbolic()) { -+ // if real font is substantially narrower than substituted -+ // font, reduce the font size accordingly -+ if (w1 > 0.01 && w1 < 0.9 * w2) { -+ w1 /= w2; -+ m11 *= w1; -+ m21 *= w1; -+ } -+ } -+ } -+ } -+ -+ // create the scaled font -+ mat[0] = m11; mat[1] = -m12; -+ mat[2] = m21; mat[3] = -m22; -+ font = fontEngine->getFont(fontFile, mat); -+ -+ if (tmpFileName) { -+ delete tmpFileName; -+ } -+ return; -+ -+ err2: -+ delete id; -+ err1: -+ if (tmpFileName) { -+ delete tmpFileName; -+ } -+ return; -+} -+ -+void SplashOutputDev::stroke(GfxState *state) { -+ SplashPath *path; -+ -+ path = convertPath(state, state->getPath()); -+ splash->stroke(path); -+ delete path; -+} -+ -+void SplashOutputDev::fill(GfxState *state) { -+ SplashPath *path; -+ -+ path = convertPath(state, state->getPath()); -+ splash->fill(path, gFalse); -+ delete path; -+} -+ -+void SplashOutputDev::eoFill(GfxState *state) { -+ SplashPath *path; -+ -+ path = convertPath(state, state->getPath()); -+ splash->fill(path, gTrue); -+ delete path; -+} -+ -+void SplashOutputDev::clip(GfxState *state) { -+ SplashPath *path; -+ -+ path = convertPath(state, state->getPath()); -+ splash->clipToPath(path, gFalse); -+ delete path; -+} -+ -+void SplashOutputDev::eoClip(GfxState *state) { -+ SplashPath *path; -+ -+ path = convertPath(state, state->getPath()); -+ splash->clipToPath(path, gTrue); -+ delete path; -+} -+ -+SplashPath *SplashOutputDev::convertPath(GfxState *state, GfxPath *path) { -+ SplashPath *sPath; -+ GfxSubpath *subpath; -+ double x1, y1, x2, y2, x3, y3; -+ int i, j; -+ -+ sPath = new SplashPath(); -+ for (i = 0; i < path->getNumSubpaths(); ++i) { -+ subpath = path->getSubpath(i); -+ if (subpath->getNumPoints() > 0) { -+ state->transform(subpath->getX(0), subpath->getY(0), &x1, &y1); -+ sPath->moveTo((SplashCoord)x1, (SplashCoord)y1); -+ j = 1; -+ while (j < subpath->getNumPoints()) { -+ if (subpath->getCurve(j)) { -+ state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1); -+ state->transform(subpath->getX(j+1), subpath->getY(j+1), &x2, &y2); -+ state->transform(subpath->getX(j+2), subpath->getY(j+2), &x3, &y3); -+ sPath->curveTo((SplashCoord)x1, (SplashCoord)y1, -+ (SplashCoord)x2, (SplashCoord)y2, -+ (SplashCoord)x3, (SplashCoord)y3); -+ j += 3; -+ } else { -+ state->transform(subpath->getX(j), subpath->getY(j), &x1, &y1); -+ sPath->lineTo((SplashCoord)x1, (SplashCoord)y1); -+ ++j; -+ } -+ } -+ if (subpath->isClosed()) { -+ sPath->close(); -+ } -+ } -+ } -+ return sPath; -+} -+ -+void SplashOutputDev::drawChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double originX, double originY, -+ CharCode code, Unicode *u, int uLen) { -+ double x1, y1; -+ SplashPath *path; -+ int render; -+ -+ if (needFontUpdate) { -+ updateFont(state); -+ } -+ if (!font) { -+ return; -+ } -+ -+ // check for invisible text -- this is used by Acrobat Capture -+ render = state->getRender(); -+ if (render == 3) { -+ return; -+ } -+ -+ x -= originX; -+ y -= originY; -+ state->transform(x, y, &x1, &y1); -+ -+ // fill -+ if (!(render & 1)) { -+ splash->fillChar((SplashCoord)x1, (SplashCoord)y1, code, font); -+ } -+ -+ // stroke -+ if ((render & 3) == 1 || (render & 3) == 2) { -+ if ((path = font->getGlyphPath(code))) { -+ path->offset((SplashCoord)x1, (SplashCoord)y1); -+ splash->stroke(path); -+ delete path; -+ } -+ } -+ -+ // clip -+ if (render & 4) { -+ path = font->getGlyphPath(code); -+ path->offset((SplashCoord)x1, (SplashCoord)y1); -+ if (textClipPath) { -+ textClipPath->append(path); -+ delete path; -+ } else { -+ textClipPath = path; -+ } -+ } -+} -+ -+GBool SplashOutputDev::beginType3Char(GfxState *state, double x, double y, -+ double dx, double dy, -+ CharCode code, Unicode *u, int uLen) { -+ GfxFont *gfxFont; -+ Ref *fontID; -+ double *ctm, *bbox; -+ T3FontCache *t3Font; -+ T3GlyphStack *t3gs; -+ double x1, y1, xMin, yMin, xMax, yMax, xt, yt; -+ int i, j; -+ -+ if (!(gfxFont = state->getFont())) { -+ return gFalse; -+ } -+ fontID = gfxFont->getID(); -+ ctm = state->getCTM(); -+ state->transform(0, 0, &xt, &yt); -+ -+ // is it the first (MRU) font in the cache? -+ if (!(nT3Fonts > 0 && -+ t3FontCache[0]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3]))) { -+ -+ // is the font elsewhere in the cache? -+ for (i = 1; i < nT3Fonts; ++i) { -+ if (t3FontCache[i]->matches(fontID, ctm[0], ctm[1], ctm[2], ctm[3])) { -+ t3Font = t3FontCache[i]; -+ for (j = i; j > 0; --j) { -+ t3FontCache[j] = t3FontCache[j - 1]; -+ } -+ t3FontCache[0] = t3Font; -+ break; -+ } -+ } -+ if (i >= nT3Fonts) { -+ -+ // create new entry in the font cache -+ if (nT3Fonts == splashOutT3FontCacheSize) { -+ delete t3FontCache[nT3Fonts - 1]; -+ --nT3Fonts; -+ } -+ for (j = nT3Fonts; j > 0; --j) { -+ t3FontCache[j] = t3FontCache[j - 1]; -+ } -+ ++nT3Fonts; -+ bbox = gfxFont->getFontBBox(); -+ if (bbox[0] == 0 && bbox[1] == 0 && bbox[2] == 0 && bbox[3] == 0) { -+ // broken bounding box -- just take a guess -+ xMin = xt - 5; -+ xMax = xMin + 30; -+ yMax = yt + 15; -+ yMin = yMax - 45; -+ } else { -+ state->transform(bbox[0], bbox[1], &x1, &y1); -+ xMin = xMax = x1; -+ yMin = yMax = y1; -+ state->transform(bbox[0], bbox[3], &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ state->transform(bbox[2], bbox[1], &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ state->transform(bbox[2], bbox[3], &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ } -+ t3FontCache[0] = new T3FontCache(fontID, ctm[0], ctm[1], ctm[2], ctm[3], -+ (int)floor(xMin - xt), -+ (int)floor(yMin - yt), -+ (int)ceil(xMax) - (int)floor(xMin) + 3, -+ (int)ceil(yMax) - (int)floor(yMin) + 3, -+ colorMode != splashModeMono1); -+ } -+ } -+ t3Font = t3FontCache[0]; -+ -+ // is the glyph in the cache? -+ i = (code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; -+ for (j = 0; j < t3Font->cacheAssoc; ++j) { -+ if ((t3Font->cacheTags[i+j].mru & 0x8000) && -+ t3Font->cacheTags[i+j].code == code) { -+ drawType3Glyph(t3Font, &t3Font->cacheTags[i+j], -+ t3Font->cacheData + (i+j) * t3Font->glyphSize, -+ xt, yt); -+ return gTrue; -+ } -+ } -+ -+ // push a new Type 3 glyph record -+ t3gs = new T3GlyphStack(); -+ t3gs->next = t3GlyphStack; -+ t3GlyphStack = t3gs; -+ t3GlyphStack->code = code; -+ t3GlyphStack->x = xt; -+ t3GlyphStack->y = yt; -+ t3GlyphStack->cache = t3Font; -+ t3GlyphStack->cacheTag = NULL; -+ t3GlyphStack->cacheData = NULL; -+ -+ return gFalse; -+} -+ -+void SplashOutputDev::endType3Char(GfxState *state) { -+ T3GlyphStack *t3gs; -+ double *ctm; -+ -+ if (t3GlyphStack->cacheTag) { -+ memcpy(t3GlyphStack->cacheData, bitmap->getDataPtr().mono8, -+ t3GlyphStack->cache->glyphSize); -+ delete bitmap; -+ delete splash; -+ bitmap = t3GlyphStack->origBitmap; -+ splash = t3GlyphStack->origSplash; -+ ctm = state->getCTM(); -+ state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], -+ t3GlyphStack->origCTM4, t3GlyphStack->origCTM5); -+ drawType3Glyph(t3GlyphStack->cache, -+ t3GlyphStack->cacheTag, t3GlyphStack->cacheData, -+ t3GlyphStack->x, t3GlyphStack->y); -+ } -+ t3gs = t3GlyphStack; -+ t3GlyphStack = t3gs->next; -+ delete t3gs; -+} -+ -+void SplashOutputDev::type3D0(GfxState *state, double wx, double wy) { -+} -+ -+void SplashOutputDev::type3D1(GfxState *state, double wx, double wy, -+ double llx, double lly, double urx, double ury) { -+ double *ctm; -+ T3FontCache *t3Font; -+ SplashColor color; -+ double xt, yt, xMin, xMax, yMin, yMax, x1, y1; -+ int i, j; -+ -+ t3Font = t3GlyphStack->cache; -+ -+ // check for a valid bbox -+ state->transform(0, 0, &xt, &yt); -+ state->transform(llx, lly, &x1, &y1); -+ xMin = xMax = x1; -+ yMin = yMax = y1; -+ state->transform(llx, ury, &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ state->transform(urx, lly, &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ state->transform(urx, ury, &x1, &y1); -+ if (x1 < xMin) { -+ xMin = x1; -+ } else if (x1 > xMax) { -+ xMax = x1; -+ } -+ if (y1 < yMin) { -+ yMin = y1; -+ } else if (y1 > yMax) { -+ yMax = y1; -+ } -+ if (xMin - xt < t3Font->glyphX || -+ yMin - yt < t3Font->glyphY || -+ xMax - xt > t3Font->glyphX + t3Font->glyphW || -+ yMax - yt > t3Font->glyphY + t3Font->glyphH) { -+ error(-1, "Bad bounding box in Type 3 glyph"); -+ return; -+ } -+ -+ // allocate a cache entry -+ i = (t3GlyphStack->code & (t3Font->cacheSets - 1)) * t3Font->cacheAssoc; -+ for (j = 0; j < t3Font->cacheAssoc; ++j) { -+ if ((t3Font->cacheTags[i+j].mru & 0x7fff) == t3Font->cacheAssoc - 1) { -+ t3Font->cacheTags[i+j].mru = 0x8000; -+ t3Font->cacheTags[i+j].code = t3GlyphStack->code; -+ t3GlyphStack->cacheTag = &t3Font->cacheTags[i+j]; -+ t3GlyphStack->cacheData = t3Font->cacheData + (i+j) * t3Font->glyphSize; -+ } else { -+ ++t3Font->cacheTags[i+j].mru; -+ } -+ } -+ -+ // save state -+ t3GlyphStack->origBitmap = bitmap; -+ t3GlyphStack->origSplash = splash; -+ ctm = state->getCTM(); -+ t3GlyphStack->origCTM4 = ctm[4]; -+ t3GlyphStack->origCTM5 = ctm[5]; -+ -+ // create the temporary bitmap -+ if (colorMode == splashModeMono1) { -+ bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, splashModeMono1); -+ splash = new Splash(bitmap); -+ color.mono1 = 0; -+ splash->clear(color); -+ color.mono1 = 1; -+ } else { -+ bitmap = new SplashBitmap(t3Font->glyphW, t3Font->glyphH, splashModeMono8); -+ splash = new Splash(bitmap); -+ color.mono8 = 0x00; -+ splash->clear(color); -+ color.mono8 = 0xff; -+ } -+ splash->setFillPattern(new SplashSolidColor(color)); -+ splash->setStrokePattern(new SplashSolidColor(color)); -+ //~ this should copy other state from t3GlyphStack->origSplash? -+ state->setCTM(ctm[0], ctm[1], ctm[2], ctm[3], -+ -t3Font->glyphX, -t3Font->glyphY); -+} -+ -+void SplashOutputDev::drawType3Glyph(T3FontCache *t3Font, -+ T3FontCacheTag *tag, Guchar *data, -+ double x, double y) { -+ SplashGlyphBitmap glyph; -+ -+ glyph.x = -t3Font->glyphX; -+ glyph.y = -t3Font->glyphY; -+ glyph.w = t3Font->glyphW; -+ glyph.h = t3Font->glyphH; -+ glyph.aa = colorMode != splashModeMono1; -+ glyph.data = data; -+ glyph.freeData = gFalse; -+ splash->fillGlyph((SplashCoord)x, (SplashCoord)y, &glyph); -+} -+ -+void SplashOutputDev::endTextObject(GfxState *state) { -+ if (textClipPath) { -+ splash->clipToPath(textClipPath, gFalse); -+ delete textClipPath; -+ textClipPath = NULL; -+ } -+} -+ -+struct SplashOutImageMaskData { -+ ImageStream *imgStr; -+ int nPixels, idx; -+ GBool invert; -+}; -+ -+GBool SplashOutputDev::imageMaskSrc(void *data, SplashMono1 *pixel) { -+ SplashOutImageMaskData *imgMaskData = (SplashOutImageMaskData *)data; -+ Guchar pix; -+ -+ if (imgMaskData->idx >= imgMaskData->nPixels) { -+ return gFalse; -+ } -+ //~ use getLine -+ imgMaskData->imgStr->getPixel(&pix); -+ if (!imgMaskData->invert) { -+ pix ^= 1; -+ } -+ *pixel = pix; -+ ++imgMaskData->idx; -+ return gTrue; -+} -+ -+void SplashOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg) { -+ double *ctm; -+ SplashCoord mat[6]; -+ SplashOutImageMaskData imgMaskData; -+ Guchar pix; -+ -+ ctm = state->getCTM(); -+ mat[0] = ctm[0]; -+ mat[1] = ctm[1]; -+ mat[2] = -ctm[2]; -+ mat[3] = -ctm[3]; -+ mat[4] = ctm[2] + ctm[4]; -+ mat[5] = ctm[3] + ctm[5]; -+ -+ imgMaskData.imgStr = new ImageStream(str, width, 1, 1); -+ imgMaskData.imgStr->reset(); -+ imgMaskData.nPixels = width * height; -+ imgMaskData.idx = 0; -+ imgMaskData.invert = invert; -+ -+ splash->fillImageMask(&imageMaskSrc, &imgMaskData, width, height, mat); -+ if (inlineImg) { -+ while (imageMaskSrc(&imgMaskData, &pix)) ; -+ } -+ -+ delete imgMaskData.imgStr; -+} -+ -+struct SplashOutImageData { -+ ImageStream *imgStr; -+ GfxImageColorMap *colorMap; -+ int *maskColors; -+ SplashOutputDev *out; -+ int nPixels, idx; -+}; -+ -+GBool SplashOutputDev::imageSrc(void *data, SplashColor *pixel, -+ Guchar *alpha) { -+ SplashOutImageData *imgData = (SplashOutImageData *)data; -+ Guchar pix[gfxColorMaxComps]; -+ GfxRGB rgb; -+ double gray; -+ int i; -+ -+ if (imgData->idx >= imgData->nPixels) { -+ return gFalse; -+ } -+ -+ //~ use getLine -+ imgData->imgStr->getPixel(pix); -+ switch (imgData->out->colorMode) { -+ case splashModeMono1: -+ case splashModeMono8: -+ imgData->colorMap->getGray(pix, &gray); -+ pixel->mono8 = soutRound(255 * gray); -+ break; -+ case splashModeRGB8: -+ imgData->colorMap->getRGB(pix, &rgb); -+ pixel->rgb8 = splashMakeRGB8(soutRound(255 * rgb.r), -+ soutRound(255 * rgb.g), -+ soutRound(255 * rgb.b)); -+ break; -+ case splashModeBGR8Packed: -+ imgData->colorMap->getRGB(pix, &rgb); -+ pixel->bgr8 = splashMakeBGR8(soutRound(255 * rgb.r), -+ soutRound(255 * rgb.g), -+ soutRound(255 * rgb.b)); -+ break; -+ } -+ -+ if (imgData->maskColors) { -+ *alpha = 0; -+ for (i = 0; i < imgData->colorMap->getNumPixelComps(); ++i) { -+ if (pix[i] < imgData->maskColors[2*i] || -+ pix[i] > imgData->maskColors[2*i+1]) { -+ *alpha = 1; -+ break; -+ } -+ } -+ } else { -+ *alpha = 1; -+ } -+ -+ ++imgData->idx; -+ return gTrue; -+} -+ -+void SplashOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, -+ GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg) { -+ double *ctm; -+ SplashCoord mat[6]; -+ SplashOutImageData imgData; -+ SplashColor pix; -+ Guchar alpha; -+ -+ ctm = state->getCTM(); -+ mat[0] = ctm[0]; -+ mat[1] = ctm[1]; -+ mat[2] = -ctm[2]; -+ mat[3] = -ctm[3]; -+ mat[4] = ctm[2] + ctm[4]; -+ mat[5] = ctm[3] + ctm[5]; -+ -+ imgData.imgStr = new ImageStream(str, width, -+ colorMap->getNumPixelComps(), -+ colorMap->getBits()); -+ imgData.imgStr->reset(); -+ imgData.colorMap = colorMap; -+ imgData.maskColors = maskColors; -+ imgData.out = this; -+ imgData.nPixels = width * height; -+ imgData.idx = 0; -+ -+ splash->drawImage(&imageSrc, &imgData, -+ (colorMode == splashModeMono1) ? splashModeMono8 -+ : colorMode, -+ width, height, mat); -+ if (inlineImg) { -+ while (imageSrc(&imgData, &pix, &alpha)) ; -+ } -+ -+ delete imgData.imgStr; -+} -+ -+int SplashOutputDev::getBitmapWidth() { -+ return bitmap->getWidth(); -+} -+ -+int SplashOutputDev::getBitmapHeight() { -+ return bitmap->getHeight(); -+} -+ -+void SplashOutputDev::xorRectangle(int x0, int y0, int x1, int y1, -+ SplashPattern *pattern) { -+ SplashPath *path; -+ -+ path = new SplashPath(); -+ path->moveTo((SplashCoord)x0, (SplashCoord)y0); -+ path->lineTo((SplashCoord)x1, (SplashCoord)y0); -+ path->lineTo((SplashCoord)x1, (SplashCoord)y1); -+ path->lineTo((SplashCoord)x0, (SplashCoord)y1); -+ path->close(); -+ splash->setFillPattern(pattern); -+ splash->xorFill(path, gTrue); -+ delete path; -+} -+ -+void SplashOutputDev::setFillColor(int r, int g, int b) { -+ GfxRGB rgb; -+ double gray; -+ -+ rgb.r = r / 255.0; -+ rgb.g = g / 255.0; -+ rgb.b = b / 255.0; -+ gray = 0.299 * rgb.r + 0.587 * rgb.g + 0.114 * rgb.g; -+ splash->setFillPattern(getColor(gray, &rgb)); -+} -+ -+SplashFont *SplashOutputDev::getFont(GooString *name, double *mat) { -+ DisplayFontParam *dfp; -+ Ref ref; -+ SplashOutFontFileID *id; -+ SplashFontFile *fontFile; -+ SplashFont *fontObj; -+ int i; -+ -+ for (i = 0; i < 16; ++i) { -+ if (!name->cmp(splashOutSubstFonts[i].name)) { -+ break; -+ } -+ } -+ if (i == 16) { -+ return NULL; -+ } -+ ref.num = i; -+ ref.gen = -1; -+ id = new SplashOutFontFileID(&ref); -+ -+ // check the font file cache -+ if ((fontFile = fontEngine->getFontFile(id))) { -+ delete id; -+ -+ // load the font file -+ } else { -+ dfp = globalParams->getDisplayFont(name); -+ if (dfp->kind != displayFontT1) { -+ return NULL; -+ } -+ fontFile = fontEngine->loadType1Font(id, dfp->t1.fileName->getCString(), -+ gFalse, winAnsiEncoding); -+ } -+ -+ // create the scaled font -+ fontObj = fontEngine->getFont(fontFile, (SplashCoord *)mat); -+ -+ return fontObj; -+} -diff --exclude-from=/home/dang/.diffrc -u -ruN poppler-0.4.3.orig/utils/SplashOutputDev.h poppler-0.4.3/utils/SplashOutputDev.h ---- poppler-0.4.3.orig/utils/SplashOutputDev.h 1969-12-31 19:00:00.000000000 -0500 -+++ poppler-0.4.3/utils/SplashOutputDev.h 2005-12-26 21:28:15.000000000 -0500 -@@ -0,0 +1,195 @@ -+//======================================================================== -+// -+// SplashOutputDev.h -+// -+// Copyright 2003 Glyph & Cog, LLC -+// -+//======================================================================== -+ -+#ifndef SPLASHOUTPUTDEV_H -+#define SPLASHOUTPUTDEV_H -+ -+#include <poppler-config.h> -+ -+#ifdef USE_GCC_PRAGMAS -+#pragma interface -+#endif -+ -+#include "goo/gtypes.h" -+#include "splash/SplashTypes.h" -+#include "config.h" -+#include "OutputDev.h" -+ -+class GfxState; -+class GfxPath; -+class Gfx8BitFont; -+class SplashBitmap; -+class Splash; -+class SplashPath; -+class SplashPattern; -+class SplashFontEngine; -+class SplashFont; -+class T3FontCache; -+struct T3FontCacheTag; -+struct T3GlyphStack; -+struct GfxRGB; -+ -+//------------------------------------------------------------------------ -+ -+// number of Type 3 fonts to cache -+#define splashOutT3FontCacheSize 8 -+ -+//------------------------------------------------------------------------ -+// SplashOutputDev -+//------------------------------------------------------------------------ -+ -+class SplashOutputDev: public OutputDev { -+public: -+ -+ // Constructor. -+ SplashOutputDev(SplashColorMode colorModeA, GBool reverseVideoA, -+ SplashColor paperColorA); -+ -+ // Destructor. -+ virtual ~SplashOutputDev(); -+ -+ //----- get info about output device -+ -+ // Does this device use upside-down coordinates? -+ // (Upside-down means (0,0) is the top left corner of the page.) -+ virtual GBool upsideDown() { return gTrue; } -+ -+ // Does this device use drawChar() or drawString()? -+ virtual GBool useDrawChar() { return gTrue; } -+ -+ // Does this device use beginType3Char/endType3Char? Otherwise, -+ // text in Type 3 fonts will be drawn with drawChar/drawString. -+ virtual GBool interpretType3Chars() { return gTrue; } -+ -+ //----- initialization and control -+ -+ // Start a page. -+ virtual void startPage(int pageNum, GfxState *state); -+ -+ // End a page. -+ virtual void endPage(); -+ -+ //----- link borders -+ virtual void drawLink(Link *link, Catalog *catalog); -+ -+ //----- save/restore graphics state -+ virtual void saveState(GfxState *state); -+ virtual void restoreState(GfxState *state); -+ -+ //----- update graphics state -+ virtual void updateAll(GfxState *state); -+ virtual void updateCTM(GfxState *state, double m11, double m12, -+ double m21, double m22, double m31, double m32); -+ virtual void updateLineDash(GfxState *state); -+ virtual void updateFlatness(GfxState *state); -+ virtual void updateLineJoin(GfxState *state); -+ virtual void updateLineCap(GfxState *state); -+ virtual void updateMiterLimit(GfxState *state); -+ virtual void updateLineWidth(GfxState *state); -+ virtual void updateFillColor(GfxState *state); -+ virtual void updateStrokeColor(GfxState *state); -+ -+ //----- update text state -+ virtual void updateFont(GfxState *state); -+ -+ //----- path painting -+ virtual void stroke(GfxState *state); -+ virtual void fill(GfxState *state); -+ virtual void eoFill(GfxState *state); -+ -+ //----- path clipping -+ virtual void clip(GfxState *state); -+ virtual void eoClip(GfxState *state); -+ -+ //----- text drawing -+ virtual void drawChar(GfxState *state, double x, double y, -+ double dx, double dy, -+ double originX, double originY, -+ CharCode code, Unicode *u, int uLen); -+ virtual GBool beginType3Char(GfxState *state, double x, double y, -+ double dx, double dy, -+ CharCode code, Unicode *u, int uLen); -+ virtual void endType3Char(GfxState *state); -+ virtual void endTextObject(GfxState *state); -+ -+ //----- image drawing -+ virtual void drawImageMask(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GBool invert, -+ GBool inlineImg); -+ virtual void drawImage(GfxState *state, Object *ref, Stream *str, -+ int width, int height, GfxImageColorMap *colorMap, -+ int *maskColors, GBool inlineImg); -+ -+ //----- Type 3 font operators -+ virtual void type3D0(GfxState *state, double wx, double wy); -+ virtual void type3D1(GfxState *state, double wx, double wy, -+ double llx, double lly, double urx, double ury); -+ -+ //----- special access -+ -+ // Called to indicate that a new PDF document has been loaded. -+ void startDoc(XRef *xrefA); -+ -+ GBool isReverseVideo() { return reverseVideo; } -+ -+ // Get the bitmap and its size. -+ SplashBitmap *getBitmap() { return bitmap; } -+ int getBitmapWidth(); -+ int getBitmapHeight(); -+ -+ // Get the Splash object. -+ Splash *getSplash() { return splash; } -+ -+ // XOR a rectangular region in the bitmap with <pattern>. <pattern> -+ // is passed to Splash::setFillPattern, so it should not be used -+ // after calling this function. -+ void xorRectangle(int x0, int y0, int x1, int y1, SplashPattern *pattern); -+ -+ // Set the Splash fill color. -+ void setFillColor(int r, int g, int b); -+ -+ // Get a font object for a Base-14 font, using the Latin-1 encoding. -+ SplashFont *getFont(GooString *name, double *mat); -+ -+ void setUnderlayCbk(void (*cbk)(void *data), void *data) -+ { underlayCbk = cbk; underlayCbkData = data; } -+ -+private: -+ -+ SplashPattern *getColor(double gray, GfxRGB *rgb); -+ SplashPath *convertPath(GfxState *state, GfxPath *path); -+ void drawType3Glyph(T3FontCache *t3Font, -+ T3FontCacheTag *tag, Guchar *data, -+ double x, double y); -+ static GBool imageMaskSrc(void *data, SplashMono1 *pixel); -+ static GBool imageSrc(void *data, SplashColor *pixel, Guchar *alpha); -+ -+ SplashColorMode colorMode; -+ GBool reverseVideo; // reverse video mode -+ SplashColor paperColor; // paper color -+ -+ XRef *xref; // xref table for current document -+ -+ SplashBitmap *bitmap; -+ Splash *splash; -+ SplashFontEngine *fontEngine; -+ -+ T3FontCache * // Type 3 font cache -+ t3FontCache[splashOutT3FontCacheSize]; -+ int nT3Fonts; // number of valid entries in t3FontCache -+ T3GlyphStack *t3GlyphStack; // Type 3 glyph context stack -+ -+ SplashFont *font; // current font -+ GBool needFontUpdate; // set when the font needs to be updated -+ SplashPath *textClipPath; // clipping path built with text object -+ -+ void (*underlayCbk)(void *data); -+ void *underlayCbkData; -+}; -+ -+#endif |