summaryrefslogtreecommitdiff
path: root/xpdf
diff options
context:
space:
mode:
authorThorsten Behrens <thb@openoffice.org>2007-12-05 13:16:44 +0000
committerThorsten Behrens <thb@openoffice.org>2007-12-05 13:16:44 +0000
commit2659ded9f4e3590ce673501ff0dd3bb52c319ee5 (patch)
tree427a367b1b761363dc94932c05bdbfc7dbfd7ce1 /xpdf
parentb7171963f301339bc1617a29c0c3c969ea6cb5b2 (diff)
#i80285# Initial import for the xpdf PDF parser
Diffstat (limited to 'xpdf')
-rw-r--r--xpdf/download/xpdf-3.02.tar.gzbin0 -> 674912 bytes
-rw-r--r--xpdf/makefile.mk93
-rw-r--r--xpdf/prj/build.lst4
-rw-r--r--xpdf/prj/d.lst3
-rw-r--r--xpdf/test/binary_0_out.defbin0 -> 83953 bytes
-rw-r--r--xpdf/test/binary_1_out.defbin0 -> 1269003 bytes
-rw-r--r--xpdf/test/book.pdfbin0 -> 198251 bytes
-rw-r--r--xpdf/test/makefile.mk62
-rw-r--r--xpdf/test/testinput.odpbin0 -> 40660 bytes
-rw-r--r--xpdf/test/testinput.pdfbin0 -> 67103 bytes
-rw-r--r--xpdf/wrapper/makefile.mk62
-rw-r--r--xpdf/wrapper/pdfioutdev_gpl.cxx774
-rw-r--r--xpdf/wrapper/pdfioutdev_gpl.hxx285
-rw-r--r--xpdf/wrapper/wrapper_gpl.cxx122
-rw-r--r--xpdf/xpdf-3.02.patch245
15 files changed, 1650 insertions, 0 deletions
diff --git a/xpdf/download/xpdf-3.02.tar.gz b/xpdf/download/xpdf-3.02.tar.gz
new file mode 100644
index 000000000000..1411a877d33d
--- /dev/null
+++ b/xpdf/download/xpdf-3.02.tar.gz
Binary files differ
diff --git a/xpdf/makefile.mk b/xpdf/makefile.mk
new file mode 100644
index 000000000000..07c021923423
--- /dev/null
+++ b/xpdf/makefile.mk
@@ -0,0 +1,93 @@
+#*************************************************************************
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.1 $
+#
+# last change: $Author: thb $ $Date: 2007-12-05 14:16:39 $
+#
+# The Contents of this file are made available subject to
+# the terms of GNU Lesser General Public License Version 2.1.
+#
+#
+# GNU Lesser General Public License Version 2.1
+# =============================================
+# Copyright 2005 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#*************************************************************************
+
+# dmake create_clean -- just unpacks
+# dmake patch -- unpacks and applies patch file
+# dmake create_patch -- creates a patch file
+
+PRJ=.
+
+PRJNAME=xpdf
+TARGET=xpdflib
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+# --- Files --------------------------------------------------------
+
+TARFILE_NAME=xpdf-3.02
+PATCH_FILE_NAME=$(TARFILE_NAME).patch
+
+CONFIGURE_DIR=
+BUILD_DIR=$(CONFIGURE_DIR)
+
+.IF "$(GUI)"=="UNX"
+#CONFIGURE_ACTION=./configure
+#CONFIGURE_ACTION=./configure --without-x --enable-multithreaded --enable-exceptions CFLAGS="-g -O0" CXXFLAGS="-g -O0"
+CONFIGURE_ACTION=./configure --without-x --enable-multithreaded --enable-exceptions
+BUILD_ACTION=$(GNUMAKE) -j$(EXTMAXPROCESS)
+.ELSE
+CONFIGURE_ACTION=
+BUILD_ACTION=ms_make
+.ENDIF
+
+CONVERTFILES=ms_make.bat
+BUILD_FLAGS=
+
+OUT2INC= \
+ fofi$/*.h \
+ goo$/*.h \
+ xpdf$/*.h \
+ aconf.h \
+ aconf2.h
+
+.IF "$(GUI)"=="UNX"
+OUT2LIB= \
+ fofi$/lib*.a \
+ goo$/lib*.a \
+ xpdf$/lib*.a
+.ELSE
+OUT2LIB= \
+ fofi$/*.lib \
+ goo$/*.lib \
+ xpdf$/*.lib
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : set_ext.mk
+.INCLUDE : target.mk
+.INCLUDE : tg_ext.mk
diff --git a/xpdf/prj/build.lst b/xpdf/prj/build.lst
new file mode 100644
index 000000000000..259101481ff2
--- /dev/null
+++ b/xpdf/prj/build.lst
@@ -0,0 +1,4 @@
+xp xpdf : solenv NULL
+xp xpdf nmake - all xp_xpdf NULL
+xp xpdf\wrapper nmake - all xp_xpdfwrap xp_xpdf NULL
+xp xpdf\test nmake - all xp_parsetest xp_xpdfwrap NULL
diff --git a/xpdf/prj/d.lst b/xpdf/prj/d.lst
new file mode 100644
index 000000000000..016d34fba890
--- /dev/null
+++ b/xpdf/prj/d.lst
@@ -0,0 +1,3 @@
+mkdir: %_DEST%\inc%_EXT%\xpdf
+..\%__SRC%\bin\xpdfimport.* %_DEST%\bin%_EXT%\xpdfimport.*
+..\%__SRC%\bin\xpdfimport %_DEST%\bin%_EXT%\xpdfimport
diff --git a/xpdf/test/binary_0_out.def b/xpdf/test/binary_0_out.def
new file mode 100644
index 000000000000..85e55ee03a66
--- /dev/null
+++ b/xpdf/test/binary_0_out.def
Binary files differ
diff --git a/xpdf/test/binary_1_out.def b/xpdf/test/binary_1_out.def
new file mode 100644
index 000000000000..1c6a10b5ca22
--- /dev/null
+++ b/xpdf/test/binary_1_out.def
Binary files differ
diff --git a/xpdf/test/book.pdf b/xpdf/test/book.pdf
new file mode 100644
index 000000000000..4e11b19517b9
--- /dev/null
+++ b/xpdf/test/book.pdf
Binary files differ
diff --git a/xpdf/test/makefile.mk b/xpdf/test/makefile.mk
new file mode 100644
index 000000000000..6fcd7b8007df
--- /dev/null
+++ b/xpdf/test/makefile.mk
@@ -0,0 +1,62 @@
+#*************************************************************************
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.1 $
+#
+# last change: $Author: thb $ $Date: 2007-12-05 14:16:42 $
+#
+# The Contents of this file are made available subject to
+# the terms of GNU Lesser General Public License Version 2.1.
+#
+#
+# GNU Lesser General Public License Version 2.1
+# =============================================
+# Copyright 2005 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#*************************************************************************
+
+PRJ=..
+PRJNAME=xpdf
+TARGET=test
+TARGETTYPE=CUI
+ENABLE_EXCEPTIONS=TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
+
+ALLTAR : $(MISC)$/test_0_succeeded $(MISC)$/test_1_succeeded
+
+$(MISC)$/test_0_succeeded: $(BIN)$/xpdfimport$(EXECPOST) binary_0_out.def text_0_out.def testinput.pdf
+ $(BIN)$/xpdfimport -f $(MISC)$/binary_0_out testinput.pdf > $(MISC)$/text_0_out
+ diff $(MISC)$/binary_0_out binary_0_out.def
+ diff $(MISC)$/text_0_out text_0_out.def
+ $(TOUCH) $@
+
+$(MISC)$/test_1_succeeded: $(BIN)$/xpdfimport$(EXECPOST) binary_1_out.def text_1_out.def book.pdf
+ $(BIN)$/xpdfimport -f $(MISC)$/binary_1_out book.pdf > $(MISC)$/text_1_out
+ diff $(MISC)$/binary_1_out binary_1_out.def
+ diff $(MISC)$/text_1_out text_1_out.def
+ $(TOUCH) $@
diff --git a/xpdf/test/testinput.odp b/xpdf/test/testinput.odp
new file mode 100644
index 000000000000..fe1ac44e8b87
--- /dev/null
+++ b/xpdf/test/testinput.odp
Binary files differ
diff --git a/xpdf/test/testinput.pdf b/xpdf/test/testinput.pdf
new file mode 100644
index 000000000000..4c44ac469b3f
--- /dev/null
+++ b/xpdf/test/testinput.pdf
Binary files differ
diff --git a/xpdf/wrapper/makefile.mk b/xpdf/wrapper/makefile.mk
new file mode 100644
index 000000000000..1d487a1adf8e
--- /dev/null
+++ b/xpdf/wrapper/makefile.mk
@@ -0,0 +1,62 @@
+#*************************************************************************
+#
+# OpenOffice.org - a multi-platform office productivity suite
+#
+# $RCSfile: makefile.mk,v $
+#
+# $Revision: 1.1 $
+#
+# last change: $Author: thb $ $Date: 2007-12-05 14:16:44 $
+#
+# The Contents of this file are made available subject to
+# the terms of GNU Lesser General Public License Version 2.1.
+#
+#
+# GNU Lesser General Public License Version 2.1
+# =============================================
+# Copyright 2005 by Sun Microsystems, Inc.
+# 901 San Antonio Road, Palo Alto, CA 94303, USA
+#
+# This library is free software; you can redistribute it and/or
+# modify it under the terms of the GNU Lesser General Public
+# License version 2.1, as published by the Free Software Foundation.
+#
+# This library is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+# Lesser General Public License for more details.
+#
+# You should have received a copy of the GNU Lesser General Public
+# License along with this library; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place, Suite 330, Boston,
+# MA 02111-1307 USA
+#
+#*************************************************************************
+
+PRJ=..
+
+PRJNAME=xpdf
+TARGET=xpdfimport
+TARGETTYPE=CUI
+ENABLE_EXCEPTIONS=TRUE
+EXTERNAL_WARNINGS_NOT_ERRORS := TRUE
+
+# --- Settings -----------------------------------------------------
+
+.INCLUDE: settings.mk
+
+# --- Files --------------------------------------------------------
+
+APP1TARGET=$(TARGET)
+APP1LIBSALCPPRT=
+APP1OBJS= \
+ $(OBJ)$/wrapper_gpl.obj $(OBJ)/pdfioutdev_gpl.obj
+.IF "$(GUI)" == "WNT"
+APP1STDLIBS+=xpdf.lib fofi.lib Goo.lib gdi32.lib advapi32.lib
+.ELSE
+APP1STDLIBS+=-lxpdf -lfofi -lGoo
+.ENDIF
+
+# --- Targets ------------------------------------------------------
+
+.INCLUDE : target.mk
diff --git a/xpdf/wrapper/pdfioutdev_gpl.cxx b/xpdf/wrapper/pdfioutdev_gpl.cxx
new file mode 100644
index 000000000000..eccfd17de13f
--- /dev/null
+++ b/xpdf/wrapper/pdfioutdev_gpl.cxx
@@ -0,0 +1,774 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: pdfioutdev_gpl.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: thb $ $Date: 2007-12-05 14:16:44 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU General Public License Version 2.
+ *
+ *
+ * GNU General Public License, version 2
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ ************************************************************************/
+
+#include "pdfioutdev_gpl.hxx"
+
+#include <stdio.h>
+#include <assert.h>
+#include <math.h>
+#include <vector>
+
+#if defined __SUNPRO_CC
+#pragma disable_warn
+#elif defined _MSC_VER
+#pragma warning(push, 1)
+#endif
+
+#include "UTF8.h"
+
+#if defined __SUNPRO_CC
+#pragma enable_warn
+#elif defined _MSC_VER
+#pragma warning(pop)
+#endif
+
+#ifdef WNT
+# define snprintf _snprintf
+#endif
+
+
+/* SYNC STREAMS
+ ============
+
+ We stream human-readble tokens to stdout, and binary data (fonts,
+ bitmaps) to g_binary_out. Another process reads from those pipes, and
+ there lies the rub: things can deadlock, if the two involved
+ processes access the pipes in different order. At any point in
+ time, both processes must access the same pipe. To ensure this,
+ data must be flushed to the OS before writing to a different pipe,
+ otherwise not-yet-written data will leave the reading process
+ waiting on the wrong pipe.
+ */
+
+namespace pdfi
+{
+
+/// cut off very small numbers & clamp value to zero
+inline double normalize( double val )
+{
+ return fabs(val) < 0.0000001 ? 0.0 : val;
+}
+
+const char* escapeLineFeed( const char* pStr )
+{
+ // TODO(Q3): Escape linefeeds
+ return pStr;
+}
+
+/// for the temp char buffer the header gets snprintfed in
+#define WRITE_BUFFER_SIZE 1024
+
+/// for the initial std::vector capacity when copying stream from xpdf
+#define WRITE_BUFFER_INITIAL_CAPACITY (1024*100)
+
+typedef std::vector<char> OutputBuffer;
+
+void initBuf(OutputBuffer& io_rBuffer)
+{
+ io_rBuffer.reserve(WRITE_BUFFER_INITIAL_CAPACITY);
+}
+
+void writeBinaryBuffer( const OutputBuffer& rBuffer )
+{
+ // ---sync point--- see SYNC STREAMS above
+ fflush(stdout);
+
+ // put buffer to stderr
+ if( !rBuffer.empty() )
+ if( fwrite(&rBuffer[0], sizeof(char),
+ rBuffer.size(), g_binary_out) != (size_t)rBuffer.size() )
+ exit(1); // error
+
+ // ---sync point--- see SYNC STREAMS above
+ fflush(g_binary_out);
+}
+
+void writeJpeg_( OutputBuffer& o_rOutputBuf, Stream* str, bool bWithLinefeed )
+{
+ // dump JPEG file as-is
+ str = ((DCTStream *)str)->getRawStream();
+ str->reset();
+
+ int c;
+ o_rOutputBuf.clear();
+ while((c=str->getChar()) != EOF)
+ o_rOutputBuf.push_back(static_cast<char>(c));
+
+ printf( " JPEG %d", o_rOutputBuf.size() );
+ if( bWithLinefeed )
+ printf("\n");
+
+ str->close();
+}
+
+void writePbm_(OutputBuffer& o_rOutputBuf, Stream* str, int width, int height, bool bWithLinefeed)
+{
+ // write as PBM (char by char, to avoid stdlib lineend messing)
+ o_rOutputBuf.clear();
+ o_rOutputBuf.resize(WRITE_BUFFER_SIZE);
+ o_rOutputBuf[0] = 'P';
+ o_rOutputBuf[1] = '4';
+ o_rOutputBuf[2] = 0x0A;
+ int nOutLen = snprintf(&o_rOutputBuf[3], WRITE_BUFFER_SIZE-10, "%d %d", width, height);
+ if( nOutLen < 0 )
+ nOutLen = WRITE_BUFFER_SIZE-10;
+ o_rOutputBuf[3+nOutLen] =0x0A;
+ o_rOutputBuf[3+nOutLen+1]=0;
+
+ const int header_size = 3+nOutLen+1;
+ const int size = height * ((width + 7) / 8);
+
+ printf( " PBM %d", size + header_size );
+ if( bWithLinefeed )
+ printf("\n");
+
+ // trim buffer to exact header length
+ o_rOutputBuf.resize(header_size);
+
+ // initialize stream
+ str->reset();
+
+ // copy the raw stream
+ for( int i=0; i<size; ++i)
+ o_rOutputBuf.push_back(static_cast<char>(str->getChar()));
+
+ str->close();
+}
+
+// stolen from ImageOutputDev.cc
+void writeMask_( OutputBuffer& o_rOutputBuf, Stream* str, int width, int height, bool bWithLinefeed )
+{
+ if( str->getKind() == strDCT )
+ writeJpeg_(o_rOutputBuf, str, bWithLinefeed);
+ else
+ writePbm_(o_rOutputBuf, str, width, height, bWithLinefeed);
+}
+
+void writeImage_( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap,
+ bool bWithLinefeed )
+{
+ // dump JPEG file
+ if( str->getKind() == strDCT &&
+ (colorMap->getNumPixelComps() == 1 ||
+ colorMap->getNumPixelComps() == 3) )
+ {
+ writeJpeg_(o_rOutputBuf, str, bWithLinefeed);
+ }
+ else if (colorMap->getNumPixelComps() == 1 &&
+ colorMap->getBits() == 1)
+ {
+ writePbm_(o_rOutputBuf, str, width, height, bWithLinefeed);
+ }
+ else
+ {
+ // write as PPM (char by char, to avoid stdlib lineend messing)
+ o_rOutputBuf.clear();
+ o_rOutputBuf.resize(WRITE_BUFFER_SIZE);
+ o_rOutputBuf[0] = 'P';
+ o_rOutputBuf[1] = '6';
+ o_rOutputBuf[2] = '\n';
+ int nOutLen = snprintf(&o_rOutputBuf[3], WRITE_BUFFER_SIZE-10, "%d %d", width, height);
+ if( nOutLen < 0 )
+ nOutLen = WRITE_BUFFER_SIZE-10;
+ o_rOutputBuf[3+nOutLen] ='\n';
+ o_rOutputBuf[3+nOutLen+1]='2';
+ o_rOutputBuf[3+nOutLen+2]='5';
+ o_rOutputBuf[3+nOutLen+3]='5';
+ o_rOutputBuf[3+nOutLen+4]='\n';
+ o_rOutputBuf[3+nOutLen+5]=0;
+
+ const int header_size = 3+nOutLen+5;
+ const int size = width*height*3 + header_size;
+
+ printf( " PPM %d", size );
+ if( bWithLinefeed )
+ printf("\n");
+
+ // trim buffer to exact header size
+ o_rOutputBuf.resize(header_size);
+
+ // initialize stream
+ Guchar *p;
+ GfxRGB rgb;
+ ImageStream* imgStr =
+ new ImageStream(str,
+ width,
+ colorMap->getNumPixelComps(),
+ colorMap->getBits());
+ imgStr->reset();
+
+ for( int y=0; y<height; ++y)
+ {
+ p = imgStr->getLine();
+ for( int x=0; x<width; ++x)
+ {
+ colorMap->getRGB(p, &rgb);
+ o_rOutputBuf.push_back(colToByte(rgb.r));
+ o_rOutputBuf.push_back(colToByte(rgb.g));
+ o_rOutputBuf.push_back(colToByte(rgb.b));
+
+ p +=colorMap->getNumPixelComps();
+ }
+ }
+
+ delete imgStr;
+ }
+}
+
+// forwarders
+// ------------------------------------------------------------------
+
+inline void writeImage( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap ) { writeImage_(o_rOutputBuf,str,width,height,colorMap,false); }
+inline void writeImageLF( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height,
+ GfxImageColorMap* colorMap ) { writeImage_(o_rOutputBuf,str,width,height,colorMap,true); }
+inline void writeMask( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height ) { writeMask_(o_rOutputBuf,str,width,height,false); }
+inline void writeMaskLF( OutputBuffer& o_rOutputBuf,
+ Stream* str,
+ int width,
+ int height ) { writeMask_(o_rOutputBuf,str,width,height,true); }
+
+// ------------------------------------------------------------------
+
+
+int PDFOutDev::parseFont( long long nNewId, GfxFont* gfxFont, GfxState* state ) const
+{
+ FontAttributes aNewFont;
+ int nSize = 0;
+
+ GString* pFamily = gfxFont->getName();
+ if( ! pFamily )
+ pFamily = gfxFont->getOrigName();
+ if( pFamily )
+ {
+ aNewFont.familyName.clear();
+ aNewFont.familyName.append( gfxFont->getName() );
+ }
+ else
+ {
+ aNewFont.familyName.clear();
+ aNewFont.familyName.append( "Arial" );
+ }
+
+ aNewFont.isBold = gfxFont->isBold();
+ aNewFont.isItalic = gfxFont->isItalic();
+ aNewFont.size = state->getTransformedFontSize();
+ aNewFont.isUnderline = false;
+
+ if( gfxFont->getType() == fontTrueType || gfxFont->getType() == fontType1 )
+ {
+ // TODO(P3): Unfortunately, need to read stream twice, since
+ // we must write byte count to stdout before
+ char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize );
+ if( pBuf )
+ aNewFont.isEmbedded = true;
+ }
+
+ m_aFontMap[ nNewId ] = aNewFont;
+ return nSize;
+}
+
+void PDFOutDev::writeFontFile( GfxFont* gfxFont ) const
+{
+ if( gfxFont->getType() != fontTrueType && gfxFont->getType() != fontType1 )
+ return;
+
+ int nSize = 0;
+ char* pBuf = gfxFont->readEmbFontFile( m_pDoc->getXRef(), &nSize );
+ if( !pBuf )
+ return;
+
+ // ---sync point--- see SYNC STREAMS above
+ fflush(stdout);
+
+ if( fwrite(pBuf, sizeof(char), nSize, g_binary_out) != (size_t)nSize )
+ exit(1); // error
+
+ // ---sync point--- see SYNC STREAMS above
+ fflush(g_binary_out);
+}
+
+void PDFOutDev::printPath( GfxPath* pPath ) const
+{
+ int nSubPaths = pPath ? pPath->getNumSubpaths() : 0;
+ for( int i=0; i<nSubPaths; i++ )
+ {
+ GfxSubpath* pSub = pPath->getSubpath( i );
+ const int nPoints = pSub->getNumPoints();
+
+ printf( " subpath %d", pSub->isClosed() );
+
+ for( int n=0; n<nPoints; ++n )
+ {
+ printf( " %f %f %d",
+ normalize(pSub->getX(n)),
+ normalize(pSub->getY(n)),
+ pSub->getCurve(n) );
+ }
+ }
+}
+
+PDFOutDev::PDFOutDev( PDFDoc* pDoc ) :
+ m_pDoc( pDoc ),
+ m_aFontMap(),
+ m_pUtf8Map( new UnicodeMap("UTF-8", gTrue, &mapUTF8) )
+{
+}
+
+void PDFOutDev::startPage(int /*pageNum*/, GfxState* state)
+{
+ assert(state);
+ printf("startPage %f %f\n",
+ normalize(state->getPageWidth()),
+ normalize(state->getPageHeight()));
+}
+
+void PDFOutDev::endPage()
+{
+ printf("endPage\n");
+}
+
+void PDFOutDev::processLink(Link* link, Catalog*)
+{
+ assert(link);
+
+ double x1,x2,y1,y2;
+ link->getRect( &x1, &y1, &x2, &y2 );
+
+ LinkAction* pAction = link->getAction();
+ if( pAction->getKind() == actionURI )
+ {
+ const char* pURI = static_cast<LinkURI*>(pAction)->getURI()->getCString();
+
+ printf( "drawLink %f %f %f %f %s\n",
+ normalize(x1),
+ normalize(y1),
+ normalize(x2),
+ normalize(y2),
+ escapeLineFeed(pURI) );
+ }
+}
+
+void PDFOutDev::saveState(GfxState*)
+{
+ printf( "saveState\n" );
+}
+
+void PDFOutDev::restoreState(GfxState*)
+{
+ printf( "restoreState\n" );
+}
+
+void PDFOutDev::setDefaultCTM(double *pMat)
+{
+ assert(pMat);
+
+ OutputDev::setDefaultCTM(pMat);
+
+ printf( "updateCtm %f %f %f %f %f %f\n",
+ normalize(pMat[0]),
+ normalize(pMat[2]),
+ normalize(pMat[1]),
+ normalize(pMat[3]),
+ normalize(pMat[4]),
+ normalize(pMat[5]) );
+}
+
+void PDFOutDev::updateCTM(GfxState* state,
+ double, double,
+ double, double,
+ double, double)
+{
+ assert(state);
+
+ const double* const pMat = state->getCTM();
+ assert(pMat);
+
+ printf( "updateCtm %f %f %f %f %f %f\n",
+ normalize(pMat[0]),
+ normalize(pMat[2]),
+ normalize(pMat[1]),
+ normalize(pMat[3]),
+ normalize(pMat[4]),
+ normalize(pMat[5]) );
+}
+
+void PDFOutDev::updateLineDash(GfxState *state)
+{
+ assert(state);
+
+ double* dashArray; int arrayLen; double startOffset;
+ state->getLineDash(&dashArray, &arrayLen, &startOffset);
+
+ printf( "updateLineDash" );
+ if( arrayLen && dashArray )
+ {
+ printf( " %f %d", normalize(startOffset), arrayLen );
+ for( int i=0; i<arrayLen; ++i )
+ printf( " %f", normalize(*dashArray++) );
+ }
+ printf( "\n" );
+}
+
+void PDFOutDev::updateFlatness(GfxState *state)
+{
+ assert(state);
+ printf( "updateFlatness %d\n", state->getFlatness() );
+}
+
+void PDFOutDev::updateLineJoin(GfxState *state)
+{
+ assert(state);
+ printf( "updateLineJoin %d\n", state->getLineJoin() );
+}
+
+void PDFOutDev::updateLineCap(GfxState *state)
+{
+ assert(state);
+ printf( "updateLineCap %d\n", state->getLineCap() );
+}
+
+void PDFOutDev::updateMiterLimit(GfxState *state)
+{
+ assert(state);
+ printf( "updateMiterLimit %f\n", normalize(state->getMiterLimit()) );
+}
+
+void PDFOutDev::updateLineWidth(GfxState *state)
+{
+ assert(state);
+ printf( "updateLineWidth %f\n", normalize(state->getLineWidth()) );
+}
+
+void PDFOutDev::updateFillColor(GfxState *state)
+{
+ assert(state);
+
+ GfxRGB aRGB;
+ state->getFillRGB( &aRGB );
+
+ printf( "updateFillColor %f %f %f %f\n",
+ normalize(colToDbl(aRGB.r)),
+ normalize(colToDbl(aRGB.g)),
+ normalize(colToDbl(aRGB.b)),
+ normalize(state->getFillOpacity()) );
+}
+
+void PDFOutDev::updateStrokeColor(GfxState *state)
+{
+ assert(state);
+
+ GfxRGB aRGB;
+ state->getStrokeRGB( &aRGB );
+
+ printf( "updateStrokeColor %f %f %f %f\n",
+ normalize(colToDbl(aRGB.r)),
+ normalize(colToDbl(aRGB.g)),
+ normalize(colToDbl(aRGB.b)),
+ normalize(state->getFillOpacity()) );
+}
+
+void PDFOutDev::updateFillOpacity(GfxState *state)
+{
+ updateFillColor(state);
+}
+
+void PDFOutDev::updateStrokeOpacity(GfxState *state)
+{
+ updateStrokeColor(state);
+}
+
+void PDFOutDev::updateBlendMode(GfxState*)
+{
+}
+
+void PDFOutDev::updateFont(GfxState *state)
+{
+ assert(state);
+
+ GfxFont *gfxFont = state->getFont();
+ if( gfxFont )
+ {
+ FontAttributes aFont;
+ int nEmbedSize=0;
+
+ Ref* pID = gfxFont->getID();
+ // TODO(Q3): Portability problem
+ long long fontID = (long long)pID->gen << 32 | (long long)pID->num;
+ std::hash_map< long long, FontAttributes >::const_iterator it =
+ m_aFontMap.find( fontID );
+ if( it == m_aFontMap.end() )
+ {
+ nEmbedSize = parseFont( fontID, gfxFont, state );
+ it = m_aFontMap.find( fontID );
+ }
+
+ printf( "updateFont" );
+ if( it != m_aFontMap.end() )
+ {
+ // conflating this with printf below crashes under Windoze
+ printf( " %lld", fontID );
+
+ aFont = it->second;
+ printf( " %d %d %d %d %f %d %s",
+ aFont.isEmbedded,
+ aFont.isBold,
+ aFont.isItalic,
+ aFont.isUnderline,
+ normalize(aFont.size),
+ nEmbedSize,
+ escapeLineFeed(aFont.familyName.getCString()) );
+ }
+ printf( "\n" );
+
+ if( nEmbedSize )
+ writeFontFile(gfxFont);
+ }
+}
+
+void PDFOutDev::stroke(GfxState *state)
+{
+ assert(state);
+
+ printf( "strokePath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::fill(GfxState *state)
+{
+ assert(state);
+
+ printf( "fillPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::eoFill(GfxState *state)
+{
+ assert(state);
+
+ printf( "eoFillPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::clip(GfxState *state)
+{
+ assert(state);
+
+ printf( "clipPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::eoClip(GfxState *state)
+{
+ assert(state);
+
+ printf( "eoClipPath" );
+ printPath( state->getPath() );
+ printf( "\n" );
+}
+
+void PDFOutDev::drawChar(GfxState *state, double x, double y,
+ double dx, double /*dy*/,
+ double originX, double originY,
+ CharCode, int /*nBytes*/, Unicode *u, int uLen)
+{
+ assert(state);
+
+ if( u == NULL )
+ return;
+
+ // normalize coordinates
+ // correct from baseline to upper left corner
+ double x2(0.0), y2(0.0);
+ state->textTransformDelta( 0.0,
+ state->getFontSize()*state->getFont()->getAscent(),
+ &x2, &y2 );
+ x -= x2;
+ y += y2;
+
+ const double aPositionX(x-originX);
+ const double aPositionY(y-originY);
+ const double nWidth(dx);
+ const double nHeight(state->getFontSize());
+
+ const double* pTextMat=state->getTextMat();
+ printf( "drawChar %f %f %f %f %f %f %f %f ",
+ normalize(aPositionX),
+ normalize(aPositionY),
+ normalize(aPositionX+nWidth),
+ normalize(aPositionY+nHeight),
+ normalize(pTextMat[0]),
+ normalize(pTextMat[2]),
+ normalize(pTextMat[1]),
+ normalize(pTextMat[3]) );
+
+ // silence spurious warning
+ (void)&mapUCS2;
+
+ char buf[9];
+ for( int i=0; i<uLen; ++i )
+ {
+ buf[ m_pUtf8Map->mapUnicode(u[i], buf, sizeof(buf)-1) ] = 0;
+ printf( "%s", escapeLineFeed(buf) );
+ }
+
+ printf( "\n" );
+}
+
+void PDFOutDev::drawString(GfxState*, GString* /*s*/)
+{
+ // TODO(F3): NYI
+}
+
+void PDFOutDev::endTextObject(GfxState*)
+{
+ printf( "endTextObject\n" );
+}
+
+void PDFOutDev::drawImageMask(GfxState*, Object*, Stream* str,
+ int width, int height, GBool invert,
+ GBool /*inlineImg*/ )
+{
+ OutputBuffer aBuf; initBuf(aBuf);
+
+ printf( "drawMask %d %d %d", width, height, invert );
+ writeMaskLF(aBuf, str, width, height);
+ writeBinaryBuffer(aBuf);
+}
+
+void PDFOutDev::drawImage(GfxState*, Object*, Stream* str,
+ int width, int height, GfxImageColorMap* colorMap,
+ int* maskColors, GBool /*inlineImg*/ )
+{
+ OutputBuffer aBuf; initBuf(aBuf);
+ OutputBuffer aMaskBuf;
+
+ printf( "drawImage %d %d", width, height );
+
+ if( maskColors )
+ {
+ // write mask colors. nBytes must be even - first half is
+ // lower bound values, second half upper bound values
+ if( colorMap->getColorSpace()->getMode() == csIndexed )
+ {
+ aMaskBuf.push_back( (char)maskColors[0] );
+ aMaskBuf.push_back( (char)maskColors[gfxColorMaxComps] );
+ }
+ else
+ {
+ GfxRGB aMinRGB;
+ colorMap->getColorSpace()->getRGB(
+ (GfxColor*)maskColors,
+ &aMinRGB );
+
+ GfxRGB aMaxRGB;
+ colorMap->getColorSpace()->getRGB(
+ (GfxColor*)maskColors+gfxColorMaxComps,
+ &aMaxRGB );
+
+ aMaskBuf.push_back( colToByte(aMinRGB.r) );
+ aMaskBuf.push_back( colToByte(aMinRGB.g) );
+ aMaskBuf.push_back( colToByte(aMinRGB.b) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.r) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.g) );
+ aMaskBuf.push_back( colToByte(aMaxRGB.b) );
+ }
+ }
+
+ printf( " %d", aMaskBuf.size() );
+ writeImageLF( aBuf, str, width, height, colorMap );
+ writeBinaryBuffer(aBuf);
+ writeBinaryBuffer(aMaskBuf);
+}
+
+void PDFOutDev::drawMaskedImage(GfxState*, Object*, Stream* str,
+ int width, int height,
+ GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight,
+ GBool maskInvert)
+{
+ OutputBuffer aBuf; initBuf(aBuf);
+ OutputBuffer aMaskBuf; initBuf(aMaskBuf);
+
+ printf( "drawMaskedImage %d %d %d %d %d", width, height, maskWidth, maskHeight, maskInvert );
+ writeImage( aBuf, str, width, height, colorMap );
+ writeMaskLF( aMaskBuf, maskStr, width, height );
+ writeBinaryBuffer(aBuf);
+ writeBinaryBuffer(aMaskBuf);
+}
+
+void PDFOutDev::drawSoftMaskedImage(GfxState*, Object*, Stream* str,
+ int width, int height,
+ GfxImageColorMap* colorMap,
+ Stream* maskStr,
+ int maskWidth, int maskHeight,
+ GfxImageColorMap* maskColorMap )
+{
+ OutputBuffer aBuf; initBuf(aBuf);
+ OutputBuffer aMaskBuf; initBuf(aMaskBuf);
+
+ printf( "drawSoftMaskedImage %d %d %d %d", width, height, maskWidth, maskHeight );
+ writeImage( aBuf, str, width, height, colorMap );
+ writeImageLF( aMaskBuf, maskStr, maskWidth, maskHeight, maskColorMap );
+ writeBinaryBuffer(aBuf);
+ writeBinaryBuffer(aMaskBuf);
+}
+
+void PDFOutDev::setPageNum( int nNumPages )
+{
+ // TODO(F3): printf might format int locale-dependent!
+ printf("setPageNum %d\n", nNumPages);
+}
+
+}
diff --git a/xpdf/wrapper/pdfioutdev_gpl.hxx b/xpdf/wrapper/pdfioutdev_gpl.hxx
new file mode 100644
index 000000000000..fd37a28dca29
--- /dev/null
+++ b/xpdf/wrapper/pdfioutdev_gpl.hxx
@@ -0,0 +1,285 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: pdfioutdev_gpl.hxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: thb $ $Date: 2007-12-05 14:16:44 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU General Public License Version 2.
+ *
+ *
+ * GNU General Public License, version 2
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_PDFI_OUTDEV_HXX
+#define INCLUDED_PDFI_OUTDEV_HXX
+
+#if defined __GNUC__
+#pragma GCC system_header
+#elif defined __SUNPRO_CC
+#pragma disable_warn
+#elif defined _MSC_VER
+#pragma warning(push, 1)
+#endif
+
+#include "GfxState.h"
+#include "GfxFont.h"
+#include "UnicodeMap.h"
+#include "Link.h"
+#include "Object.h"
+#include "OutputDev.h"
+#include "parseargs.h"
+#include "GlobalParams.h"
+#include "PDFDoc.h"
+
+#if defined __SUNPRO_CC
+#pragma enable_warn
+#elif defined _MSC_VER
+#pragma warning(pop)
+#endif
+
+#include <hash_map>
+
+class GfxPath;
+class GfxFont;
+class PDFDoc;
+
+namespace pdfi
+{
+ struct FontAttributes
+ {
+ FontAttributes( const GString& familyName_,
+ bool isEmbedded_,
+ bool isBold_,
+ bool isItalic_,
+ bool isUnderline_,
+ double size_ ) :
+ familyName(),
+ isEmbedded(isEmbedded_),
+ isBold(isBold_),
+ isItalic(isItalic_),
+ isUnderline(isUnderline_),
+ size(size_)
+ {
+ familyName.append(const_cast<GString*>(&familyName_));
+ }
+
+ FontAttributes() :
+ familyName(),
+ isEmbedded(false),
+ isBold(false),
+ isItalic(false),
+ isUnderline(false),
+ size(0.0)
+ {}
+
+ // xdpf goo stuff is so totally borked...
+ // ...need to hand-code assignment
+ FontAttributes( const FontAttributes& rSrc ) :
+ familyName(),
+ isEmbedded(rSrc.isEmbedded),
+ isBold(rSrc.isBold),
+ isItalic(rSrc.isItalic),
+ isUnderline(rSrc.isUnderline),
+ size(rSrc.size)
+ {
+ familyName.append(const_cast<GString*>(&rSrc.familyName));
+ }
+
+ FontAttributes& operator=( const FontAttributes& rSrc )
+ {
+ familyName.clear();
+ familyName.append(const_cast<GString*>(&rSrc.familyName));
+
+ isEmbedded = rSrc.isEmbedded;
+ isBold = rSrc.isBold;
+ isItalic = rSrc.isItalic;
+ isUnderline = rSrc.isUnderline;
+ size = rSrc.size;
+
+ return *this;
+ }
+
+ bool operator==(const FontAttributes& rFont) const
+ {
+ return const_cast<GString*>(&familyName)->cmp(
+ const_cast<GString*>(&rFont.familyName))==0 &&
+ isEmbedded == rFont.isEmbedded &&
+ isBold == rFont.isBold &&
+ isItalic == rFont.isItalic &&
+ isUnderline == rFont.isUnderline &&
+ size == rFont.size;
+ }
+
+ GString familyName;
+ bool isEmbedded;
+ bool isBold;
+ bool isItalic;
+ bool isUnderline;
+ double size;
+ };
+
+ class PDFOutDev : public OutputDev
+ {
+ // not owned by this class
+ PDFDoc* m_pDoc;
+ mutable std::hash_map< long long,
+ FontAttributes > m_aFontMap;
+ UnicodeMap* m_pUtf8Map;
+
+ int parseFont( long long nNewId, GfxFont* pFont, GfxState* state ) const;
+ void writeFontFile( GfxFont* gfxFont ) const;
+ void printPath( GfxPath* pPath ) const;
+
+ public:
+ explicit PDFOutDev( PDFDoc* pDoc );
+
+ //----- 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 gTrue; }
+
+ //----- initialization and control
+
+ // Set default transform matrix.
+ virtual void setDefaultCTM(double *ctm);
+
+ // Start a page.
+ virtual void startPage(int pageNum, GfxState *state);
+
+ // End a page.
+ virtual void endPage();
+
+ // Dump page contents to display.
+ // virtual void dump() {}
+
+ //----- coordinate conversion
+
+ // Convert between device and user coordinates.
+ // virtual void cvtDevToUser(double dx, double dy, double *ux, double *uy);
+ // virtual void cvtUserToDev(double ux, double uy, int *dx, int *dy);
+
+ //----- link borders
+ virtual void processLink(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);
+ virtual void updateFillOpacity(GfxState *state);
+ virtual void updateStrokeOpacity(GfxState *state);
+ virtual void updateBlendMode(GfxState *state);
+
+ //----- update text state
+ virtual void updateFont(GfxState *state);
+ // virtual void updateTextMat(GfxState *state);
+ // virtual void updateCharSpace(GfxState *state) {}
+ // virtual void updateRender(GfxState *state) {}
+ // virtual void updateRise(GfxState *state) {}
+ // virtual void updateWordSpace(GfxState *state) {}
+ // virtual void updateHorizScaling(GfxState *state) {}
+ // virtual void updateTextPos(GfxState *state) {}
+ // virtual void updateTextShift(GfxState *state, double shift) {}
+
+ //----- 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, int nBytes, Unicode *u, int uLen);
+ virtual void drawString(GfxState *state, GString *s);
+ 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);
+ virtual void drawMaskedImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height,
+ GfxImageColorMap *colorMap,
+ Stream *maskStr, int maskWidth, int maskHeight,
+ GBool maskInvert);
+ virtual void drawSoftMaskedImage(GfxState *state, Object *ref, Stream *str,
+ int width, int height,
+ GfxImageColorMap *colorMap,
+ Stream *maskStr,
+ int maskWidth, int maskHeight,
+ GfxImageColorMap *maskColorMap);
+
+ //----- OPI functions
+ // virtual void opiBegin(GfxState *state, Dict *opiDict);
+ // virtual void opiEnd(GfxState *state, Dict *opiDict);
+
+ //----- 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) {}
+
+ //----- PostScript XObjects
+ // virtual void psXObject(Stream *psStream, Stream *level1Stream) {}
+
+ void setPageNum( int nNumPages );
+ };
+}
+
+extern FILE* g_binary_out;
+
+#endif /* INCLUDED_PDFI_OUTDEV_HXX */
+
diff --git a/xpdf/wrapper/wrapper_gpl.cxx b/xpdf/wrapper/wrapper_gpl.cxx
new file mode 100644
index 000000000000..c3b1c5c4dbe2
--- /dev/null
+++ b/xpdf/wrapper/wrapper_gpl.cxx
@@ -0,0 +1,122 @@
+/*************************************************************************
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: wrapper_gpl.cxx,v $
+ *
+ * $Revision: 1.1 $
+ *
+ * last change: $Author: thb $ $Date: 2007-12-05 14:16:44 $
+ *
+ * The Contents of this file are made available subject to
+ * the terms of GNU General Public License Version 2.
+ *
+ *
+ * GNU General Public License, version 2
+ * =============================================
+ * Copyright 2005 by Sun Microsystems, Inc.
+ * 901 San Antonio Road, Palo Alto, CA 94303, USA
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of
+ * the License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the Free
+ * Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
+ * Boston, MA 02110-1301, USA.
+ *
+ ************************************************************************/
+
+#include "pdfioutdev_gpl.hxx"
+#ifdef WNT
+# include <io.h>
+# include <fcntl.h> /*_O_BINARY*/
+#endif
+
+static char ownerPassword[33] = "\001";
+static char userPassword[33] = "\001";
+static char outputFile[256] = "\001";
+static char cfgFileName[256] = "";
+
+FILE* g_binary_out=stderr;
+
+static ArgDesc argDesc[] = {
+ {"-f", argString, outputFile, sizeof(outputFile),
+ "output file for binary streams"},
+ {"-opw", argString, ownerPassword, sizeof(ownerPassword),
+ "owner password (for encrypted files)"},
+ {"-upw", argString, userPassword, sizeof(userPassword),
+ "user password (for encrypted files)"},
+ {NULL, argString, NULL, 0, NULL }
+};
+
+int main(int argc, char **argv)
+{
+ // parse args; initialize to defaults
+ if( !parseArgs(argDesc, &argc, argv) )
+ return 1;
+
+ if( argc < 2 )
+ return 1;
+
+ // read config file
+ globalParams = new GlobalParams(cfgFileName);
+ globalParams->setErrQuiet(gTrue);
+ globalParams->setupBaseFonts(NULL);
+
+ // PDFDoc takes over ownership for all strings below
+ GString* pFileName = new GString(argv[1]);
+
+ // check for password string(s)
+ GString* pOwnerPasswordStr(
+ ownerPassword[0] != '\001' ? new GString(ownerPassword)
+ : (GString *)NULL );
+ GString* pUserPasswordStr(
+ userPassword[0] != '\001' ? new GString(userPassword)
+ : (GString *)NULL );
+ if( outputFile[0] != '\001' )
+ g_binary_out = fopen(outputFile,"wb");
+
+#ifdef WNT
+ // Win actually modifies output for O_TEXT file mode, so need to
+ // revert to binary here
+ _setmode( _fileno( g_binary_out ), _O_BINARY );
+#endif
+
+ PDFDoc aDoc( pFileName,
+ pOwnerPasswordStr,
+ pUserPasswordStr );
+
+ if( !aDoc.isOk() )
+ return 1;
+
+ pdfi::PDFOutDev* pOutDev( new pdfi::PDFOutDev(&aDoc) );
+
+ // tell receiver early - needed for proper progress calculation
+ pOutDev->setPageNum( aDoc.getNumPages() );
+
+ // virtual resolution of the PDF OutputDev in dpi
+ static const int PDFI_OUTDEV_RESOLUTION=7200;
+
+ // do the conversion
+ const int nPages = aDoc.getNumPages();
+ for( int i=1; i<=nPages; ++i )
+ {
+ aDoc.displayPage( pOutDev,
+ i,
+ PDFI_OUTDEV_RESOLUTION,
+ PDFI_OUTDEV_RESOLUTION,
+ 0, gTrue, gTrue, gTrue );
+ aDoc.processLinks( pOutDev, i );
+ }
+
+ return 0;
+}
+
diff --git a/xpdf/xpdf-3.02.patch b/xpdf/xpdf-3.02.patch
new file mode 100644
index 000000000000..d7118f752318
--- /dev/null
+++ b/xpdf/xpdf-3.02.patch
@@ -0,0 +1,245 @@
+--- misc/patch/xpdf-3.02/aconf.h 1970-01-01 01:00:00.000000000 +0100
++++ misc/build/xpdf-3.02/aconf.h 2007-08-07 15:44:36.000000000 +0200
+@@ -0,0 +1,104 @@
++/* aconf.h. Generated by configure. */
++/*
++ * aconf.h
++ *
++ * Copyright 2002-2003 Glyph & Cog, LLC
++ */
++
++#ifndef ACONF_H
++#define ACONF_H
++
++#include <aconf2.h>
++
++/*
++ * Use A4 paper size instead of Letter for PostScript output.
++ */
++/* #undef A4_PAPER */
++
++/*
++ * Do not allow text selection.
++ */
++/* #undef NO_TEXT_SELECT */
++
++/*
++ * Include support for OPI comments.
++ */
++/* #undef OPI_SUPPORT */
++
++/*
++ * Enable multithreading support.
++ */
++/* #undef MULTITHREADED */
++
++/*
++ * Enable word list support.
++ */
++/* #undef TEXTOUT_WORD_LIST */
++
++/*
++ * Directory with the Xpdf app-defaults file.
++ */
++/* #undef APPDEFDIR */
++
++/*
++ * Full path for the system-wide xpdfrc file.
++ */
++#define SYSTEM_XPDFRC "/usr/local/etc/xpdfrc"
++
++/*
++ * Various include files and functions.
++ */
++#define HAVE_DIRENT_H 1
++/* #undef HAVE_SYS_NDIR_H */
++/* #undef HAVE_SYS_DIR_H */
++/* #undef HAVE_NDIR_H */
++/* #undef HAVE_SYS_SELECT_H */
++/* #undef HAVE_SYS_BSDTYPES_H */
++#define HAVE_STRINGS_H 1
++/* #undef HAVE_BSTRING_H */
++#define HAVE_POPEN 1
++#define HAVE_MKSTEMP 1
++/* #undef HAVE_MKSTEMPS */
++/* #undef SELECT_TAKES_INT */
++#if ! defined WNT
++#define HAVE_FSEEKO 1
++#endif
++/* #undef HAVE_FSEEK64 */
++#define _FILE_OFFSET_BITS 64
++/* #undef _LARGE_FILES */
++#define _LARGEFILE_SOURCE 1
++/* #undef HAVE_XTAPPSETEXITFLAG 1 */
++
++/*
++ * This is defined if using libXpm.
++ */
++/* #undef HAVE_X11_XPM_H 1 */
++
++/*
++ * This is defined if using t1lib.
++ */
++/* #undef HAVE_T1LIB_H 1 */
++
++/*
++ * One of these is defined if using FreeType 2.
++ */
++/* #undef HAVE_FREETYPE_H */
++/* #undef HAVE_FREETYPE_FREETYPE_H 1 */
++
++/*
++ * This is defined if using libpaper.
++ */
++/* #undef HAVE_PAPER_H */
++
++/*
++ * Enable support for loading plugins.
++ */
++/* #undef ENABLE_PLUGINS */
++
++/*
++ * Enable support for CMYK output.
++ */
++/* #undef SPLASH_CMYK */
++
++
++#endif
+*** misc/xpdf-3.02/ms_make.bat Tue Feb 27 23:05:51 2007
+--- misc/build/xpdf-3.02/ms_make.bat Fri Sep 14 20:08:02 2007
+***************
+*** 1,5 ****
+ set CC=cl
+! set CFLAGS=/DWIN32 /I.. /I..\goo /I..\fofi /O2 /nologo
+ set CXX=cl
+ set CXXFLAGS=%CFLAGS% /TP
+ set LIBPROG=lib
+--- 1,5 ----
+ set CC=cl
+! set CFLAGS=/DWIN32 /D_MT /I.. /I..\goo /I..\fofi /O2 /nologo
+ set CXX=cl
+ set CXXFLAGS=%CFLAGS% /TP
+ set LIBPROG=lib
+***************
+*** 70,75 ****
+--- 70,77 ----
+ %CXX% %CXXFLAGS% /c pdffonts.cc
+ %CXX% %CXXFLAGS% /c pdfimages.cc
+
++ %LIBPROG% /nologo /out:xpdf.lib Annot.obj Array.obj BuiltinFont.obj BuiltinFontTables.obj Catalog.obj CharCodeToUnicode.obj CMap.obj Decrypt.obj Dict.obj Error.obj FontEncodingTables.obj Function.obj Gfx.obj GfxFont.obj GfxState.obj GlobalParams.obj JArithmeticDecoder.obj JBIG2Stream.obj JPXStream.obj Lexer.obj Link.obj NameToCharCode.obj Object.obj Outline.obj OutputDev.obj Page.obj Parser.obj PDFDoc.obj PDFDocEncoding.obj PSTokenizer.obj SecurityHandler.obj Stream.obj UnicodeMap.obj XRef.obj
++
+ %CXX% %LINKFLAGS% /Fepdftops.exe Annot.obj Array.obj BuiltinFont.obj BuiltinFontTables.obj Catalog.obj CharCodeToUnicode.obj CMap.obj Decrypt.obj Dict.obj Error.obj FontEncodingTables.obj Function.obj Gfx.obj GfxFont.obj GfxState.obj GlobalParams.obj JArithmeticDecoder.obj JBIG2Stream.obj JPXStream.obj Lexer.obj Link.obj NameToCharCode.obj Object.obj Outline.obj OutputDev.obj Page.obj Parser.obj PDFDoc.obj PDFDocEncoding.obj PSOutputDev.obj PSTokenizer.obj SecurityHandler.obj Stream.obj UnicodeMap.obj XRef.obj pdftops.obj ..\fofi\fofi.lib ..\goo\Goo.lib shell32.lib user32.lib gdi32.lib advapi32.lib
+
+ %CXX% %LINKFLAGS% /Fepdftotext.exe Annot.obj Array.obj BuiltinFont.obj BuiltinFontTables.obj Catalog.obj CharCodeToUnicode.obj CMap.obj Decrypt.obj Dict.obj Error.obj FontEncodingTables.obj Function.obj Gfx.obj GfxFont.obj GfxState.obj GlobalParams.obj JArithmeticDecoder.obj JBIG2Stream.obj JPXStream.obj Lexer.obj Link.obj NameToCharCode.obj Object.obj Outline.obj OutputDev.obj Page.obj Parser.obj PDFDoc.obj PDFDocEncoding.obj PSTokenizer.obj SecurityHandler.obj Stream.obj TextOutputDev.obj UnicodeMap.obj UnicodeTypeTable.obj XRef.obj pdftotext.obj ..\fofi\fofi.lib ..\goo\Goo.lib shell32.lib user32.lib gdi32.lib advapi32.lib
+***************
+*** 82,118 ****
+
+ cd ..
+
+- rem --- This part will only work if you have FreeType installed ---
+-
+- set FT2DIR=..\freetype-2.3.1
+- set CXXFLAGS=%CXXFLAGS% /I..\splash /I%FT2DIR%\include
+-
+- cd splash
+- %CXX% %CXXFLAGS% /c Splash.cc
+- %CXX% %CXXFLAGS% /c SplashBitmap.cc
+- %CXX% %CXXFLAGS% /c SplashClip.cc
+- %CXX% %CXXFLAGS% /c SplashFTFont.cc
+- %CXX% %CXXFLAGS% /c SplashFTFontEngine.cc
+- %CXX% %CXXFLAGS% /c SplashFTFontFile.cc
+- %CXX% %CXXFLAGS% /c SplashFont.cc
+- %CXX% %CXXFLAGS% /c SplashFontEngine.cc
+- %CXX% %CXXFLAGS% /c SplashFontFile.cc
+- %CXX% %CXXFLAGS% /c SplashFontFileID.cc
+- %CXX% %CXXFLAGS% /c SplashPath.cc
+- %CXX% %CXXFLAGS% /c SplashPattern.cc
+- %CXX% %CXXFLAGS% /c SplashScreen.cc
+- %CXX% %CXXFLAGS% /c SplashState.cc
+- %CXX% %CXXFLAGS% /c SplashT1Font.cc
+- %CXX% %CXXFLAGS% /c SplashT1FontEngine.cc
+- %CXX% %CXXFLAGS% /c SplashT1FontFile.cc
+- %CXX% %CXXFLAGS% /c SplashXPath.cc
+- %CXX% %CXXFLAGS% /c SplashXPathScanner.cc
+- %LIBPROG% /nologo /out:splash.lib Splash.obj SplashBitmap.obj SplashClip.obj SplashFTFont.obj SplashFTFontEngine.obj SplashFTFontFile.obj SplashFont.obj SplashFontEngine.obj SplashFontFile.obj SplashFontFileID.obj SplashPath.obj SplashPattern.obj SplashScreen.obj SplashState.obj SplashT1Font.obj SplashT1FontEngine.obj SplashT1FontFile.obj SplashXPath.obj SplashXPathScanner.obj
+-
+- cd ..\xpdf
+- %CXX% %CXXFLAGS% /c SplashOutputDev.cc
+- %CXX% %CXXFLAGS% /c pdftoppm.cc
+-
+- %CXX% %LINKFLAGS% /Fepdftoppm.exe Annot.obj Array.obj BuiltinFont.obj BuiltinFontTables.obj Catalog.obj CharCodeToUnicode.obj CMap.obj Decrypt.obj Dict.obj Error.obj FontEncodingTables.obj Function.obj Gfx.obj GfxFont.obj GfxState.obj GlobalParams.obj JArithmeticDecoder.obj JBIG2Stream.obj JPXStream.obj Lexer.obj Link.obj NameToCharCode.obj Object.obj Outline.obj OutputDev.obj Page.obj Parser.obj PDFDoc.obj PDFDocEncoding.obj PSTokenizer.obj SecurityHandler.obj SplashOutputDev.obj Stream.obj UnicodeMap.obj UnicodeTypeTable.obj XRef.obj pdftoppm.obj ..\splash\splash.lib ..\fofi\fofi.lib ..\goo\Goo.lib %FT2DIR%\freetype2.lib shell32.lib user32.lib gdi32.lib advapi32.lib
+-
+- cd ..
+--- 84,86 ----
+*** misc/xpdf-3.02/xpdf/Makefile.in Tue Feb 27 23:05:52 2007
+--- misc/build/xpdf-3.02/xpdf/Makefile.in Fri Sep 14 20:17:25 2007
+***************
+*** 20,25 ****
+--- 20,27 ----
+ SPLASHLIBDIR = ../splash
+
+ CXXFLAGS = @CXXFLAGS@ @DEFS@ -I.. -I$(GOOSRCDIR) -I$(FOFISRCDIR) -I$(SPLASHSRCDIR) -I$(srcdir) @freetype2_CFLAGS@ @Sgm_CFLAGS@ @Xm_CFLAGS@ @Xt_CFLAGS@ @Xp_CFLAGS@ @Xext_CFLAGS@ @Xpm_CFLAGS@ @t1_CFLAGS@ @libpaper_CFLAGS@ @X_CFLAGS@
++ AR = ar rc
++ RANLIB = ranlib
+
+ LDFLAGS = @LDFLAGS@
+
+***************
+*** 107,116 ****
+ #------------------------------------------------------------------------
+
+ all: xpdf$(EXE) pdftops$(EXE) pdftotext$(EXE) pdfinfo$(EXE) \
+! pdffonts$(EXE) pdftoppm$(EXE) pdfimages$(EXE)
+
+ all-no-x: pdftops$(EXE) pdftotext$(EXE) pdfinfo$(EXE) pdffonts$(EXE) \
+! pdfimages$(EXE)
+
+ #------------------------------------------------------------------------
+
+--- 109,135 ----
+ #------------------------------------------------------------------------
+
+ all: xpdf$(EXE) pdftops$(EXE) pdftotext$(EXE) pdfinfo$(EXE) \
+! pdffonts$(EXE) pdftoppm$(EXE) pdfimages$(EXE) $(LIBPREFIX)xpdf.a
+
+ all-no-x: pdftops$(EXE) pdftotext$(EXE) pdfinfo$(EXE) pdffonts$(EXE) \
+! pdfimages$(EXE) $(LIBPREFIX)xpdf.a
+!
+! #------------------------------------------------------------------------
+!
+! XPDFLIB_OBJS = Annot.o Array.o BuiltinFont.o BuiltinFontTables.o Catalog.o \
+! CharCodeToUnicode.o CMap.o Decrypt.o Dict.o \
+! Error.o FontEncodingTables.o Function.o Gfx.o GfxFont.o \
+! GfxState.o GlobalParams.o JArithmeticDecoder.o JBIG2Stream.o \
+! JPXStream.o Lexer.o Link.o NameToCharCode.o Object.o Outline.o \
+! OutputDev.o Page.o Parser.o PDFCore.o PDFDoc.o PDFDocEncoding.o \
+! PSTokenizer.o SecurityHandler.o \
+! Stream.o UnicodeMap.o \
+! UnicodeTypeTable.o XRef.o
+!
+! $(LIBPREFIX)xpdf.a: $(XPDFLIB_OBJS)
+! rm -f $(LIBPREFIX)xpdf.a
+! $(AR) $(LIBPREFIX)xpdf.a $(XPDFLIB_OBJS)
+! $(RANLIB) $(LIBPREFIX)xpdf.a
+
+ #------------------------------------------------------------------------
+
+*** misc/xpdf-3.02/goo/GString.cc Tue Feb 27 23:05:51 2007
+--- misc/build/xpdf-3.02/goo/GString.cc Wed Sep 26 09:43:50 2007
+***************
+*** 528,534 ****
+ if ((neg = x < 0)) {
+ x = -x;
+ }
+! x = floor(x * pow(10, prec) + 0.5);
+ i = bufSize;
+ started = !trim;
+ for (j = 0; j < prec && i > 1; ++j) {
+--- 528,534 ----
+ if ((neg = x < 0)) {
+ x = -x;
+ }
+! x = floor(x * pow(10.0, prec) + 0.5);
+ i = bufSize;
+ started = !trim;
+ for (j = 0; j < prec && i > 1; ++j) {