Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/pdf
diff options
context:
space:
mode:
authorKristian Høgsberg <krh@redhat.com>2005-03-01 22:24:10 (GMT)
committer Kristian Høgsberg <krh@src.gnome.org>2005-03-01 22:24:10 (GMT)
commit02eb16fef45712a91e24f6471b9e2f31249c888e (patch)
treed5579258f1d7fbd5a280fb2f1b97b74004b1dea9 /pdf
parent332afee84ff4eb7df326d96f07efd6f82a87c0a2 (diff)
Use poppler instead of including xpdf source code. Poppler is a fork of
2005-03-01 Kristian Høgsberg <krh@redhat.com> Use poppler instead of including xpdf source code. Poppler is a fork of xpdf to build it as a shared library. See http://freedesktop.org/wiki/Software/poppler. * pdf/xpdf/*, pdf/goo/*, pdf/splash/*, pdf/fofi/*: Remove included xpdf fork. * pdf/Makefile.am: Build libpdfdocument.a here. * pdf/GDKSplashOutputDev.cc: * pdf/GDKSplashOutputDev.h: * pdf/GnomeVFSStream.cc: * pdf/GnomeVFSStream.h: * pdf-document.cc: * pdf-document.h: * test-gdk-output-dev.cc * Thumb.cc: * Thumb.h: Pull these files out of pdf/xpdf and adjust to compile against poppler.
Diffstat (limited to 'pdf')
-rw-r--r--pdf/GDKSplashOutputDev.cc (renamed from pdf/xpdf/GDKSplashOutputDev.cc)18
-rw-r--r--pdf/GDKSplashOutputDev.h (renamed from pdf/xpdf/GDKSplashOutputDev.h)12
-rw-r--r--pdf/Makefile.am28
-rw-r--r--pdf/Thumb.cc (renamed from pdf/xpdf/Thumb.cc)13
-rw-r--r--pdf/Thumb.h (renamed from pdf/xpdf/Thumb.h)2
-rw-r--r--pdf/aconf.h2
-rw-r--r--pdf/aconf2.h38
-rw-r--r--pdf/fofi/.cvsignore2
-rw-r--r--pdf/fofi/FoFiBase.cc156
-rw-r--r--pdf/fofi/FoFiBase.h57
-rw-r--r--pdf/fofi/FoFiEncodings.cc994
-rw-r--r--pdf/fofi/FoFiEncodings.h36
-rw-r--r--pdf/fofi/FoFiTrueType.cc1438
-rw-r--r--pdf/fofi/FoFiTrueType.h133
-rw-r--r--pdf/fofi/FoFiType1.cc207
-rw-r--r--pdf/fofi/FoFiType1.h59
-rw-r--r--pdf/fofi/FoFiType1C.cc2385
-rw-r--r--pdf/fofi/FoFiType1C.h226
-rw-r--r--pdf/fofi/Makefile.am21
-rw-r--r--pdf/fofi/vms_make.com0
-rw-r--r--pdf/goo/.cvsignore4
-rw-r--r--pdf/goo/GHash.cc356
-rw-r--r--pdf/goo/GHash.h76
-rw-r--r--pdf/goo/GList.cc92
-rw-r--r--pdf/goo/GList.h91
-rw-r--r--pdf/goo/GMutex.h49
-rw-r--r--pdf/goo/GString.cc236
-rw-r--r--pdf/goo/GString.h100
-rw-r--r--pdf/goo/Makefile.am34
-rw-r--r--pdf/goo/gfile.cc705
-rw-r--r--pdf/goo/gfile.h140
-rw-r--r--pdf/goo/gmem.c204
-rw-r--r--pdf/goo/gmem.h53
-rw-r--r--pdf/goo/gmempp.cc32
-rw-r--r--pdf/goo/gtypes.h29
-rw-r--r--pdf/goo/parseargs.c195
-rw-r--r--pdf/goo/parseargs.h71
-rw-r--r--pdf/goo/vms_directory.c214
-rw-r--r--pdf/goo/vms_dirent.h67
-rw-r--r--pdf/goo/vms_make.com82
-rw-r--r--pdf/goo/vms_sys_dirent.h54
-rw-r--r--pdf/goo/vms_unix_time.h102
-rw-r--r--pdf/goo/vms_unix_times.c42
-rw-r--r--pdf/goo/vms_unlink.c22
-rw-r--r--pdf/pdf-document.cc (renamed from pdf/xpdf/pdf-document.cc)55
-rw-r--r--pdf/pdf-document.h (renamed from pdf/xpdf/pdf-document.h)0
-rw-r--r--pdf/splash/.cvsignore2
-rw-r--r--pdf/splash/Makefile.am54
-rw-r--r--pdf/splash/Splash.cc1732
-rw-r--r--pdf/splash/Splash.h176
-rw-r--r--pdf/splash/SplashBitmap.cc157
-rw-r--r--pdf/splash/SplashBitmap.h48
-rw-r--r--pdf/splash/SplashClip.cc270
-rw-r--r--pdf/splash/SplashClip.h88
-rw-r--r--pdf/splash/SplashErrorCodes.h32
-rw-r--r--pdf/splash/SplashFTFont.cc289
-rw-r--r--pdf/splash/SplashFTFont.h55
-rw-r--r--pdf/splash/SplashFTFontEngine.cc141
-rw-r--r--pdf/splash/SplashFTFontEngine.h60
-rw-r--r--pdf/splash/SplashFTFontFile.cc111
-rw-r--r--pdf/splash/SplashFTFontFile.h70
-rw-r--r--pdf/splash/SplashFont.cc166
-rw-r--r--pdf/splash/SplashFont.h89
-rw-r--r--pdf/splash/SplashFontEngine.cc245
-rw-r--r--pdf/splash/SplashFontEngine.h85
-rw-r--r--pdf/splash/SplashFontFile.cc55
-rw-r--r--pdf/splash/SplashFontFile.h60
-rw-r--r--pdf/splash/SplashFontFileID.cc23
-rw-r--r--pdf/splash/SplashFontFileID.h30
-rw-r--r--pdf/splash/SplashGlyphBitmap.h26
-rw-r--r--pdf/splash/SplashMath.h46
-rw-r--r--pdf/splash/SplashPath.cc177
-rw-r--r--pdf/splash/SplashPath.h107
-rw-r--r--pdf/splash/SplashPattern.cc64
-rw-r--r--pdf/splash/SplashPattern.h81
-rw-r--r--pdf/splash/SplashScreen.cc107
-rw-r--r--pdf/splash/SplashScreen.h40
-rw-r--r--pdf/splash/SplashState.cc99
-rw-r--r--pdf/splash/SplashState.h88
-rw-r--r--pdf/splash/SplashT1Font.cc251
-rw-r--r--pdf/splash/SplashT1Font.h51
-rw-r--r--pdf/splash/SplashT1FontEngine.cc124
-rw-r--r--pdf/splash/SplashT1FontEngine.h53
-rw-r--r--pdf/splash/SplashT1FontFile.cc96
-rw-r--r--pdf/splash/SplashT1FontFile.h57
-rw-r--r--pdf/splash/SplashTypes.h81
-rw-r--r--pdf/splash/SplashXPath.cc417
-rw-r--r--pdf/splash/SplashXPath.h92
-rw-r--r--pdf/splash/SplashXPathScanner.cc271
-rw-r--r--pdf/splash/SplashXPathScanner.h74
-rw-r--r--pdf/splash/vms_make.com0
-rw-r--r--pdf/test-gdk-output-dev.cc (renamed from pdf/xpdf/test-gdk-output-dev.cc)15
-rw-r--r--pdf/xpdf/.cvsignore21
-rw-r--r--pdf/xpdf/Annot.cc137
-rw-r--r--pdf/xpdf/Annot.h81
-rw-r--r--pdf/xpdf/Array.cc73
-rw-r--r--pdf/xpdf/Array.h58
-rw-r--r--pdf/xpdf/BaseFile.h87
-rw-r--r--pdf/xpdf/BuiltinFont.cc65
-rw-r--r--pdf/xpdf/BuiltinFont.h57
-rw-r--r--pdf/xpdf/BuiltinFontTables.cc4284
-rw-r--r--pdf/xpdf/BuiltinFontTables.h23
-rw-r--r--pdf/xpdf/CMap.cc384
-rw-r--r--pdf/xpdf/CMap.h102
-rw-r--r--pdf/xpdf/Catalog.cc364
-rw-r--r--pdf/xpdf/Catalog.h89
-rw-r--r--pdf/xpdf/CharCodeToUnicode.cc533
-rw-r--r--pdf/xpdf/CharCodeToUnicode.h113
-rw-r--r--pdf/xpdf/CharTypes.h24
-rw-r--r--pdf/xpdf/CompactFontTables.h464
-rw-r--r--pdf/xpdf/Decrypt.cc399
-rw-r--r--pdf/xpdf/Decrypt.h61
-rw-r--r--pdf/xpdf/Dict.cc95
-rw-r--r--pdf/xpdf/Dict.h77
-rw-r--r--pdf/xpdf/Error.cc38
-rw-r--r--pdf/xpdf/Error.h23
-rw-r--r--pdf/xpdf/ErrorCodes.h36
-rw-r--r--pdf/xpdf/FontEncodingTables.cc1824
-rw-r--r--pdf/xpdf/FontEncodingTables.h20
-rw-r--r--pdf/xpdf/Function.cc1525
-rw-r--r--pdf/xpdf/Function.h183
-rw-r--r--pdf/xpdf/Gfx.cc3079
-rw-r--r--pdf/xpdf/Gfx.h281
-rw-r--r--pdf/xpdf/GfxFont.cc1508
-rw-r--r--pdf/xpdf/GfxFont.h315
-rw-r--r--pdf/xpdf/GfxState.cc2782
-rw-r--r--pdf/xpdf/GfxState.h1055
-rw-r--r--pdf/xpdf/GlobalParams.cc1764
-rw-r--r--pdf/xpdf/GlobalParams.h313
-rw-r--r--pdf/xpdf/GnomeVFSStream.cc129
-rw-r--r--pdf/xpdf/GnomeVFSStream.h58
-rw-r--r--pdf/xpdf/ImageOutputDev.cc194
-rw-r--r--pdf/xpdf/ImageOutputDev.h76
-rw-r--r--pdf/xpdf/JArithmeticDecoder.cc300
-rw-r--r--pdf/xpdf/JArithmeticDecoder.h91
-rw-r--r--pdf/xpdf/JBIG2Stream.cc3337
-rw-r--r--pdf/xpdf/JBIG2Stream.h143
-rw-r--r--pdf/xpdf/JPXStream.cc2822
-rw-r--r--pdf/xpdf/JPXStream.h340
-rw-r--r--pdf/xpdf/Lexer.cc474
-rw-r--r--pdf/xpdf/Lexer.h77
-rw-r--r--pdf/xpdf/Link.cc851
-rw-r--r--pdf/xpdf/Link.h409
-rw-r--r--pdf/xpdf/Makefile.am131
-rw-r--r--pdf/xpdf/NameToCharCode.cc116
-rw-r--r--pdf/xpdf/NameToCharCode.h42
-rw-r--r--pdf/xpdf/NameToUnicodeTable.h1097
-rw-r--r--pdf/xpdf/Object.cc231
-rw-r--r--pdf/xpdf/Object.h303
-rw-r--r--pdf/xpdf/Outline.cc151
-rw-r--r--pdf/xpdf/Outline.h76
-rw-r--r--pdf/xpdf/OutputDev.cc104
-rw-r--r--pdf/xpdf/OutputDev.h163
-rw-r--r--pdf/xpdf/PDFDoc.cc322
-rw-r--r--pdf/xpdf/PDFDoc.h178
-rw-r--r--pdf/xpdf/PDFDocEncoding.cc44
-rw-r--r--pdf/xpdf/PDFDocEncoding.h16
-rw-r--r--pdf/xpdf/PSOutputDev.cc3803
-rw-r--r--pdf/xpdf/PSOutputDev.h314
-rw-r--r--pdf/xpdf/PSTokenizer.cc135
-rw-r--r--pdf/xpdf/PSTokenizer.h41
-rw-r--r--pdf/xpdf/Page.cc370
-rw-r--r--pdf/xpdf/Page.h178
-rw-r--r--pdf/xpdf/Parser.cc231
-rw-r--r--pdf/xpdf/Parser.h60
-rw-r--r--pdf/xpdf/SplashOutputDev.cc1348
-rw-r--r--pdf/xpdf/SplashOutputDev.h196
-rw-r--r--pdf/xpdf/Stream-CCITT.h459
-rw-r--r--pdf/xpdf/Stream.cc3979
-rw-r--r--pdf/xpdf/Stream.h843
-rw-r--r--pdf/xpdf/TextOutputDev.cc3529
-rw-r--r--pdf/xpdf/TextOutputDev.h570
-rw-r--r--pdf/xpdf/UTF8.h56
-rw-r--r--pdf/xpdf/UnicodeMap.cc293
-rw-r--r--pdf/xpdf/UnicodeMap.h123
-rw-r--r--pdf/xpdf/UnicodeMapTables.h361
-rw-r--r--pdf/xpdf/UnicodeTypeTable.cc299
-rw-r--r--pdf/xpdf/UnicodeTypeTable.h18
-rw-r--r--pdf/xpdf/XPDFApp.cc410
-rw-r--r--pdf/xpdf/XPDFApp.h108
-rw-r--r--pdf/xpdf/XPDFCore.cc1996
-rw-r--r--pdf/xpdf/XPDFCore.h303
-rw-r--r--pdf/xpdf/XPDFTree.cc931
-rw-r--r--pdf/xpdf/XPDFTree.h45
-rw-r--r--pdf/xpdf/XPDFTreeP.h87
-rw-r--r--pdf/xpdf/XPDFViewer.cc2523
-rw-r--r--pdf/xpdf/XPDFViewer.h262
-rw-r--r--pdf/xpdf/XRef.cc1026
-rw-r--r--pdf/xpdf/XRef.h135
-rw-r--r--pdf/xpdf/XSplashOutputDev.cc323
-rw-r--r--pdf/xpdf/XSplashOutputDev.h110
-rw-r--r--pdf/xpdf/about-text.h47
-rw-r--r--pdf/xpdf/about.xbm6
-rw-r--r--pdf/xpdf/backArrow.xbm6
-rw-r--r--pdf/xpdf/backArrowDis.xbm6
-rw-r--r--pdf/xpdf/dblLeftArrow.xbm6
-rw-r--r--pdf/xpdf/dblLeftArrowDis.xbm6
-rw-r--r--pdf/xpdf/dblRightArrow.xbm6
-rw-r--r--pdf/xpdf/dblRightArrowDis.xbm6
-rw-r--r--pdf/xpdf/find.xbm6
-rw-r--r--pdf/xpdf/findDis.xbm6
-rw-r--r--pdf/xpdf/forwardArrow.xbm6
-rw-r--r--pdf/xpdf/forwardArrowDis.xbm6
-rw-r--r--pdf/xpdf/gpdf-g-switch.h24
-rw-r--r--pdf/xpdf/leftArrow.xbm5
-rw-r--r--pdf/xpdf/leftArrowDis.xbm5
-rw-r--r--pdf/xpdf/pdffonts.cc292
-rw-r--r--pdf/xpdf/pdfimages.cc154
-rw-r--r--pdf/xpdf/pdfinfo.cc376
-rw-r--r--pdf/xpdf/pdftoppm.cc189
-rw-r--r--pdf/xpdf/pdftops.cc332
-rw-r--r--pdf/xpdf/pdftotext.cc332
-rw-r--r--pdf/xpdf/prefs-strings.h4
-rw-r--r--pdf/xpdf/print.xbm6
-rw-r--r--pdf/xpdf/printDis.xbm6
-rw-r--r--pdf/xpdf/rightArrow.xbm5
-rw-r--r--pdf/xpdf/rightArrowDis.xbm5
-rw-r--r--pdf/xpdf/vms_make.com129
-rw-r--r--pdf/xpdf/xpdf.cc316
-rw-r--r--pdf/xpdf/xpdfIcon.xpm62
-rw-r--r--pdf/xpdf/xpdfconfig.h110
221 files changed, 75 insertions, 77854 deletions
diff --git a/pdf/xpdf/GDKSplashOutputDev.cc b/pdf/GDKSplashOutputDev.cc
index e570bd0..2dc3dc9 100644
--- a/pdf/xpdf/GDKSplashOutputDev.cc
+++ b/pdf/GDKSplashOutputDev.cc
@@ -7,19 +7,17 @@
//
//========================================================================
-#include <aconf.h>
-
#ifdef USE_GCC_PRAGMAS
#pragma implementation
#endif
-#include "gmem.h"
-#include "SplashTypes.h"
-#include "SplashBitmap.h"
-#include "Object.h"
-#include "GfxState.h"
-#include "TextOutputDev.h"
-#include "GDKSplashOutputDev.h"
+#include <goo/gmem.h>
+#include <splash/SplashTypes.h>
+#include <splash/SplashBitmap.h>
+#include <Object.h>
+#include <GfxState.h>
+#include <TextOutputDev.h>
+#include <GDKSplashOutputDev.h>
//------------------------------------------------------------------------
// Constants and macros
@@ -147,7 +145,7 @@ GBool GDKSplashOutputDev::findText(Unicode *s, int len,
return gFalse;
}
-GString *GDKSplashOutputDev::getText(int xMin, int yMin, int xMax, int yMax) {
+GooString *GDKSplashOutputDev::getText(int xMin, int yMin, int xMax, int yMax) {
return text->getText((double)xMin, (double)yMin,
(double)xMax, (double)yMax);
}
diff --git a/pdf/xpdf/GDKSplashOutputDev.h b/pdf/GDKSplashOutputDev.h
index 6ab769a..197beb5 100644
--- a/pdf/xpdf/GDKSplashOutputDev.h
+++ b/pdf/GDKSplashOutputDev.h
@@ -14,12 +14,10 @@
#pragma interface
#endif
-#include "gpdf-g-switch.h"
-# include <gdk/gdk.h>
-#include "gpdf-g-switch.h"
-#include "SplashTypes.h"
-#include "SplashOutputDev.h"
-#include "TextOutputDev.h"
+#include <gdk/gdk.h>
+#include <splash/SplashTypes.h>
+#include <SplashOutputDev.h>
+#include <TextOutputDev.h>
//------------------------------------------------------------------------
@@ -89,7 +87,7 @@ public:
int *xMax, int *yMax);
// Get the text which is inside the specified rectangle.
- GString *getText(int xMin, int yMin, int xMax, int yMax);
+ GooString *getText(int xMin, int yMin, int xMax, int yMax);
private:
diff --git a/pdf/Makefile.am b/pdf/Makefile.am
index b8fe1da..4604706 100644
--- a/pdf/Makefile.am
+++ b/pdf/Makefile.am
@@ -1,3 +1,27 @@
-SUBDIRS = goo fofi splash xpdf
+INCLUDES = \
+ -I$(top_srcdir) \
+ -I$(top_srcdir)/backend \
+ $(POPPLER_CFLAGS) \
+ $(GTK_CFLAGS) \
+ -DDATADIR=\""$(datadir)"\"
-EXTRA_DIST = aconf.h aconf2.h
+noinst_PROGRAMS = test-gdk-output-dev
+
+noinst_LTLIBRARIES = libpdfdocument.la
+
+libpdfdocument_la_SOURCES = \
+ GDKSplashOutputDev.cc \
+ GDKSplashOutputDev.h \
+ Thumb.cc \
+ Thumb.h \
+ pdf-document.cc \
+ pdf-document.h
+
+test_gdk_output_dev_SOURCES = \
+ test-gdk-output-dev.cc
+
+test_gdk_output_dev_LDADD = \
+ libpdfdocument.la \
+ $(top_builddir)/backend/libevbackend.la \
+ $(POPPLER_LIBS) \
+ $(GTK_LIBS)
diff --git a/pdf/xpdf/Thumb.cc b/pdf/Thumb.cc
index 0fdbf54..02b4d23 100644
--- a/pdf/xpdf/Thumb.cc
+++ b/pdf/Thumb.cc
@@ -20,20 +20,17 @@
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA.
*/
-#include <aconf.h>
#include <string.h>
#ifdef USE_GCC_PRAGMAS
#pragma implementation
#endif
-#include <gpdf-g-switch.h>
-# include <glib.h>
-#include <gpdf-g-switch.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Gfx.h"
-#include "GfxState.h"
+#include <glib.h>
+#include <goo/gmem.h>
+#include <Object.h>
+#include <Gfx.h>
+#include <GfxState.h>
#include "Thumb.h"
/*
diff --git a/pdf/xpdf/Thumb.h b/pdf/Thumb.h
index 968b0c4..1ed4a28 100644
--- a/pdf/xpdf/Thumb.h
+++ b/pdf/Thumb.h
@@ -23,8 +23,6 @@
#ifndef THUMB_H
#define THUMB_H
-#include <aconf.h>
-
class XRef;
class GfxColorSpace;
diff --git a/pdf/aconf.h b/pdf/aconf.h
deleted file mode 100644
index c223a98..0000000
--- a/pdf/aconf.h
+++ /dev/null
@@ -1,2 +0,0 @@
-#include <aconf2.h>
-#include <config.h>
diff --git a/pdf/aconf2.h b/pdf/aconf2.h
deleted file mode 100644
index b51de1e..0000000
--- a/pdf/aconf2.h
+++ /dev/null
@@ -1,38 +0,0 @@
-/*
- * aconf2.h
- *
- * This gets included by aconf.h, and contains miscellaneous global
- * settings not directly controlled by autoconf. This is a separate
- * file because otherwise the configure script will munge any
- * #define/#undef constructs.
- *
- * Copyright 2002-2003 Glyph & Cog, LLC
- */
-
-#ifndef ACONF2_H
-#define ACONF2_H
-
-/*
- * This controls the use of the interface/implementation pragmas.
- */
-#ifdef __GNUC__
-#define USE_GCC_PRAGMAS
-#endif
-/* There is a bug in the version of gcc which ships with MacOS X 10.2 */
-#if defined(__APPLE__) && defined(__MACH__)
-# include <AvailabilityMacros.h>
-#endif
-#ifdef MAC_OS_X_VERSION_MAX_ALLOWED
-# if MAC_OS_X_VERSION_MAX_ALLOWED >= MAC_OS_X_VERSION_10_2
-# undef USE_GCC_PRAGMAS
-# endif
-#endif
-
-/*
- * Make sure WIN32 is defined if appropriate.
- */
-#if defined(_WIN32) && !defined(WIN32)
-# define WIN32
-#endif
-
-#endif
diff --git a/pdf/fofi/.cvsignore b/pdf/fofi/.cvsignore
deleted file mode 100644
index 282522d..0000000
--- a/pdf/fofi/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/pdf/fofi/FoFiBase.cc b/pdf/fofi/FoFiBase.cc
deleted file mode 100644
index 28d0b8c..0000000
--- a/pdf/fofi/FoFiBase.cc
+++ /dev/null
@@ -1,156 +0,0 @@
-//========================================================================
-//
-// FoFiBase.cc
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include "gmem.h"
-#include "FoFiBase.h"
-
-//------------------------------------------------------------------------
-// FoFiBase
-//------------------------------------------------------------------------
-
-FoFiBase::FoFiBase(char *fileA, int lenA, GBool freeFileDataA) {
- fileData = file = (Guchar *)fileA;
- len = lenA;
- freeFileData = freeFileDataA;
-}
-
-FoFiBase::~FoFiBase() {
- if (freeFileData) {
- gfree(fileData);
- }
-}
-
-char *FoFiBase::readFile(char *fileName, int *fileLen) {
- FILE *f;
- char *buf;
- int n;
-
- if (!(f = fopen(fileName, "rb"))) {
- return NULL;
- }
- fseek(f, 0, SEEK_END);
- n = (int)ftell(f);
- fseek(f, 0, SEEK_SET);
- buf = (char *)gmalloc(n);
- if ((int)fread(buf, 1, n, f) != n) {
- gfree(buf);
- fclose(f);
- return NULL;
- }
- fclose(f);
- *fileLen = n;
- return buf;
-}
-
-int FoFiBase::getS8(int pos, GBool *ok) {
- int x;
-
- if (pos < 0 || pos >= len) {
- *ok = gFalse;
- return 0;
- }
- x = file[pos];
- if (x & 0x80) {
- x |= ~0xff;
- }
- return x;
-}
-
-int FoFiBase::getU8(int pos, GBool *ok) {
- if (pos < 0 || pos >= len) {
- *ok = gFalse;
- return 0;
- }
- return file[pos];
-}
-
-int FoFiBase::getS16BE(int pos, GBool *ok) {
- int x;
-
- if (pos < 0 || pos+1 >= len) {
- *ok = gFalse;
- return 0;
- }
- x = file[pos];
- x = (x << 8) + file[pos+1];
- if (x & 0x8000) {
- x |= ~0xffff;
- }
- return x;
-}
-
-int FoFiBase::getU16BE(int pos, GBool *ok) {
- int x;
-
- if (pos < 0 || pos+1 >= len) {
- *ok = gFalse;
- return 0;
- }
- x = file[pos];
- x = (x << 8) + file[pos+1];
- return x;
-}
-
-int FoFiBase::getS32BE(int pos, GBool *ok) {
- int x;
-
- if (pos < 0 || pos+3 >= len) {
- *ok = gFalse;
- return 0;
- }
- x = file[pos];
- x = (x << 8) + file[pos+1];
- x = (x << 8) + file[pos+2];
- x = (x << 8) + file[pos+3];
- if (x & 0x80000000) {
- x |= ~0xffffffff;
- }
- return x;
-}
-
-Guint FoFiBase::getU32BE(int pos, GBool *ok) {
- Guint x;
-
- if (pos < 0 || pos+3 >= len) {
- *ok = gFalse;
- return 0;
- }
- x = file[pos];
- x = (x << 8) + file[pos+1];
- x = (x << 8) + file[pos+2];
- x = (x << 8) + file[pos+3];
- return x;
-}
-
-Guint FoFiBase::getUVarBE(int pos, int size, GBool *ok) {
- Guint x;
- int i;
-
- if (pos < 0 || pos + size > len) {
- *ok = gFalse;
- return 0;
- }
- x = 0;
- for (i = 0; i < size; ++i) {
- x = (x << 8) + file[pos + i];
- }
- return x;
-}
-
-GBool FoFiBase::checkRegion(int pos, int size) {
- return pos >= 0 &&
- pos + size >= pos &&
- pos + size <= len;
-}
diff --git a/pdf/fofi/FoFiBase.h b/pdf/fofi/FoFiBase.h
deleted file mode 100644
index b78840b..0000000
--- a/pdf/fofi/FoFiBase.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//========================================================================
-//
-// FoFiBase.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FOFIBASE_H
-#define FOFIBASE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-
-typedef void (*FoFiOutputFunc)(void *stream, char *data, int len);
-
-//------------------------------------------------------------------------
-// FoFiBase
-//------------------------------------------------------------------------
-
-class FoFiBase {
-public:
-
- virtual ~FoFiBase();
-
-protected:
-
- FoFiBase(char *fileA, int lenA, GBool freeFileDataA);
- static char *readFile(char *fileName, int *fileLen);
-
- // S = signed / U = unsigned
- // 8/16/32/Var = word length, in bytes
- // BE = big endian
- int getS8(int pos, GBool *ok);
- int getU8(int pos, GBool *ok);
- int getS16BE(int pos, GBool *ok);
- int getU16BE(int pos, GBool *ok);
- int getS32BE(int pos, GBool *ok);
- Guint getU32BE(int pos, GBool *ok);
- Guint getUVarBE(int pos, int size, GBool *ok);
-
- GBool checkRegion(int pos, int size);
-
- Guchar *fileData;
- Guchar *file;
- int len;
- GBool freeFileData;
-};
-
-#endif
diff --git a/pdf/fofi/FoFiEncodings.cc b/pdf/fofi/FoFiEncodings.cc
deleted file mode 100644
index 37a17f5..0000000
--- a/pdf/fofi/FoFiEncodings.cc
+++ /dev/null
@@ -1,994 +0,0 @@
-//========================================================================
-//
-// FoFiEncodings.cc
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include "FoFiEncodings.h"
-
-//------------------------------------------------------------------------
-// Type 1 and 1C font data
-//------------------------------------------------------------------------
-
-char *fofiType1StandardEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quoteright",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "quoteleft",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "exclamdown",
- "cent",
- "sterling",
- "fraction",
- "yen",
- "florin",
- "section",
- "currency",
- "quotesingle",
- "quotedblleft",
- "guillemotleft",
- "guilsinglleft",
- "guilsinglright",
- "fi",
- "fl",
- NULL,
- "endash",
- "dagger",
- "daggerdbl",
- "periodcentered",
- NULL,
- "paragraph",
- "bullet",
- "quotesinglbase",
- "quotedblbase",
- "quotedblright",
- "guillemotright",
- "ellipsis",
- "perthousand",
- NULL,
- "questiondown",
- NULL,
- "grave",
- "acute",
- "circumflex",
- "tilde",
- "macron",
- "breve",
- "dotaccent",
- "dieresis",
- NULL,
- "ring",
- "cedilla",
- NULL,
- "hungarumlaut",
- "ogonek",
- "caron",
- "emdash",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "AE",
- NULL,
- "ordfeminine",
- NULL,
- NULL,
- NULL,
- NULL,
- "Lslash",
- "Oslash",
- "OE",
- "ordmasculine",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "ae",
- NULL,
- NULL,
- NULL,
- "dotlessi",
- NULL,
- NULL,
- "lslash",
- "oslash",
- "oe",
- "germandbls",
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-char *fofiType1ExpertEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclamsmall",
- "Hungarumlautsmall",
- NULL,
- "dollaroldstyle",
- "dollarsuperior",
- "ampersandsmall",
- "Acutesmall",
- "parenleftsuperior",
- "parenrightsuperior",
- "twodotenleader",
- "onedotenleader",
- "comma",
- "hyphen",
- "period",
- "fraction",
- "zerooldstyle",
- "oneoldstyle",
- "twooldstyle",
- "threeoldstyle",
- "fouroldstyle",
- "fiveoldstyle",
- "sixoldstyle",
- "sevenoldstyle",
- "eightoldstyle",
- "nineoldstyle",
- "colon",
- "semicolon",
- "commasuperior",
- "threequartersemdash",
- "periodsuperior",
- "questionsmall",
- NULL,
- "asuperior",
- "bsuperior",
- "centsuperior",
- "dsuperior",
- "esuperior",
- NULL,
- NULL,
- NULL,
- "isuperior",
- NULL,
- NULL,
- "lsuperior",
- "msuperior",
- "nsuperior",
- "osuperior",
- NULL,
- NULL,
- "rsuperior",
- "ssuperior",
- "tsuperior",
- NULL,
- "ff",
- "fi",
- "fl",
- "ffi",
- "ffl",
- "parenleftinferior",
- NULL,
- "parenrightinferior",
- "Circumflexsmall",
- "hyphensuperior",
- "Gravesmall",
- "Asmall",
- "Bsmall",
- "Csmall",
- "Dsmall",
- "Esmall",
- "Fsmall",
- "Gsmall",
- "Hsmall",
- "Ismall",
- "Jsmall",
- "Ksmall",
- "Lsmall",
- "Msmall",
- "Nsmall",
- "Osmall",
- "Psmall",
- "Qsmall",
- "Rsmall",
- "Ssmall",
- "Tsmall",
- "Usmall",
- "Vsmall",
- "Wsmall",
- "Xsmall",
- "Ysmall",
- "Zsmall",
- "colonmonetary",
- "onefitted",
- "rupiah",
- "Tildesmall",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "exclamdownsmall",
- "centoldstyle",
- "Lslashsmall",
- NULL,
- NULL,
- "Scaronsmall",
- "Zcaronsmall",
- "Dieresissmall",
- "Brevesmall",
- "Caronsmall",
- NULL,
- "Dotaccentsmall",
- NULL,
- NULL,
- "Macronsmall",
- NULL,
- NULL,
- "figuredash",
- "hypheninferior",
- NULL,
- NULL,
- "Ogoneksmall",
- "Ringsmall",
- "Cedillasmall",
- NULL,
- NULL,
- NULL,
- "onequarter",
- "onehalf",
- "threequarters",
- "questiondownsmall",
- "oneeighth",
- "threeeighths",
- "fiveeighths",
- "seveneighths",
- "onethird",
- "twothirds",
- NULL,
- NULL,
- "zerosuperior",
- "onesuperior",
- "twosuperior",
- "threesuperior",
- "foursuperior",
- "fivesuperior",
- "sixsuperior",
- "sevensuperior",
- "eightsuperior",
- "ninesuperior",
- "zeroinferior",
- "oneinferior",
- "twoinferior",
- "threeinferior",
- "fourinferior",
- "fiveinferior",
- "sixinferior",
- "seveninferior",
- "eightinferior",
- "nineinferior",
- "centinferior",
- "dollarinferior",
- "periodinferior",
- "commainferior",
- "Agravesmall",
- "Aacutesmall",
- "Acircumflexsmall",
- "Atildesmall",
- "Adieresissmall",
- "Aringsmall",
- "AEsmall",
- "Ccedillasmall",
- "Egravesmall",
- "Eacutesmall",
- "Ecircumflexsmall",
- "Edieresissmall",
- "Igravesmall",
- "Iacutesmall",
- "Icircumflexsmall",
- "Idieresissmall",
- "Ethsmall",
- "Ntildesmall",
- "Ogravesmall",
- "Oacutesmall",
- "Ocircumflexsmall",
- "Otildesmall",
- "Odieresissmall",
- "OEsmall",
- "Oslashsmall",
- "Ugravesmall",
- "Uacutesmall",
- "Ucircumflexsmall",
- "Udieresissmall",
- "Yacutesmall",
- "Thornsmall",
- "Ydieresissmall"
-};
-
-//------------------------------------------------------------------------
-// Type 1C font data
-//------------------------------------------------------------------------
-
-char *fofiType1CStdStrings[391] = {
- ".notdef",
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quoteright",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "quoteleft",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- "exclamdown",
- "cent",
- "sterling",
- "fraction",
- "yen",
- "florin",
- "section",
- "currency",
- "quotesingle",
- "quotedblleft",
- "guillemotleft",
- "guilsinglleft",
- "guilsinglright",
- "fi",
- "fl",
- "endash",
- "dagger",
- "daggerdbl",
- "periodcentered",
- "paragraph",
- "bullet",
- "quotesinglbase",
- "quotedblbase",
- "quotedblright",
- "guillemotright",
- "ellipsis",
- "perthousand",
- "questiondown",
- "grave",
- "acute",
- "circumflex",
- "tilde",
- "macron",
- "breve",
- "dotaccent",
- "dieresis",
- "ring",
- "cedilla",
- "hungarumlaut",
- "ogonek",
- "caron",
- "emdash",
- "AE",
- "ordfeminine",
- "Lslash",
- "Oslash",
- "OE",
- "ordmasculine",
- "ae",
- "dotlessi",
- "lslash",
- "oslash",
- "oe",
- "germandbls",
- "onesuperior",
- "logicalnot",
- "mu",
- "trademark",
- "Eth",
- "onehalf",
- "plusminus",
- "Thorn",
- "onequarter",
- "divide",
- "brokenbar",
- "degree",
- "thorn",
- "threequarters",
- "twosuperior",
- "registered",
- "minus",
- "eth",
- "multiply",
- "threesuperior",
- "copyright",
- "Aacute",
- "Acircumflex",
- "Adieresis",
- "Agrave",
- "Aring",
- "Atilde",
- "Ccedilla",
- "Eacute",
- "Ecircumflex",
- "Edieresis",
- "Egrave",
- "Iacute",
- "Icircumflex",
- "Idieresis",
- "Igrave",
- "Ntilde",
- "Oacute",
- "Ocircumflex",
- "Odieresis",
- "Ograve",
- "Otilde",
- "Scaron",
- "Uacute",
- "Ucircumflex",
- "Udieresis",
- "Ugrave",
- "Yacute",
- "Ydieresis",
- "Zcaron",
- "aacute",
- "acircumflex",
- "adieresis",
- "agrave",
- "aring",
- "atilde",
- "ccedilla",
- "eacute",
- "ecircumflex",
- "edieresis",
- "egrave",
- "iacute",
- "icircumflex",
- "idieresis",
- "igrave",
- "ntilde",
- "oacute",
- "ocircumflex",
- "odieresis",
- "ograve",
- "otilde",
- "scaron",
- "uacute",
- "ucircumflex",
- "udieresis",
- "ugrave",
- "yacute",
- "ydieresis",
- "zcaron",
- "exclamsmall",
- "Hungarumlautsmall",
- "dollaroldstyle",
- "dollarsuperior",
- "ampersandsmall",
- "Acutesmall",
- "parenleftsuperior",
- "parenrightsuperior",
- "twodotenleader",
- "onedotenleader",
- "zerooldstyle",
- "oneoldstyle",
- "twooldstyle",
- "threeoldstyle",
- "fouroldstyle",
- "fiveoldstyle",
- "sixoldstyle",
- "sevenoldstyle",
- "eightoldstyle",
- "nineoldstyle",
- "commasuperior",
- "threequartersemdash",
- "periodsuperior",
- "questionsmall",
- "asuperior",
- "bsuperior",
- "centsuperior",
- "dsuperior",
- "esuperior",
- "isuperior",
- "lsuperior",
- "msuperior",
- "nsuperior",
- "osuperior",
- "rsuperior",
- "ssuperior",
- "tsuperior",
- "ff",
- "ffi",
- "ffl",
- "parenleftinferior",
- "parenrightinferior",
- "Circumflexsmall",
- "hyphensuperior",
- "Gravesmall",
- "Asmall",
- "Bsmall",
- "Csmall",
- "Dsmall",
- "Esmall",
- "Fsmall",
- "Gsmall",
- "Hsmall",
- "Ismall",
- "Jsmall",
- "Ksmall",
- "Lsmall",
- "Msmall",
- "Nsmall",
- "Osmall",
- "Psmall",
- "Qsmall",
- "Rsmall",
- "Ssmall",
- "Tsmall",
- "Usmall",
- "Vsmall",
- "Wsmall",
- "Xsmall",
- "Ysmall",
- "Zsmall",
- "colonmonetary",
- "onefitted",
- "rupiah",
- "Tildesmall",
- "exclamdownsmall",
- "centoldstyle",
- "Lslashsmall",
- "Scaronsmall",
- "Zcaronsmall",
- "Dieresissmall",
- "Brevesmall",
- "Caronsmall",
- "Dotaccentsmall",
- "Macronsmall",
- "figuredash",
- "hypheninferior",
- "Ogoneksmall",
- "Ringsmall",
- "Cedillasmall",
- "questiondownsmall",
- "oneeighth",
- "threeeighths",
- "fiveeighths",
- "seveneighths",
- "onethird",
- "twothirds",
- "zerosuperior",
- "foursuperior",
- "fivesuperior",
- "sixsuperior",
- "sevensuperior",
- "eightsuperior",
- "ninesuperior",
- "zeroinferior",
- "oneinferior",
- "twoinferior",
- "threeinferior",
- "fourinferior",
- "fiveinferior",
- "sixinferior",
- "seveninferior",
- "eightinferior",
- "nineinferior",
- "centinferior",
- "dollarinferior",
- "periodinferior",
- "commainferior",
- "Agravesmall",
- "Aacutesmall",
- "Acircumflexsmall",
- "Atildesmall",
- "Adieresissmall",
- "Aringsmall",
- "AEsmall",
- "Ccedillasmall",
- "Egravesmall",
- "Eacutesmall",
- "Ecircumflexsmall",
- "Edieresissmall",
- "Igravesmall",
- "Iacutesmall",
- "Icircumflexsmall",
- "Idieresissmall",
- "Ethsmall",
- "Ntildesmall",
- "Ogravesmall",
- "Oacutesmall",
- "Ocircumflexsmall",
- "Otildesmall",
- "Odieresissmall",
- "OEsmall",
- "Oslashsmall",
- "Ugravesmall",
- "Uacutesmall",
- "Ucircumflexsmall",
- "Udieresissmall",
- "Yacutesmall",
- "Thornsmall",
- "Ydieresissmall",
- "001.000",
- "001.001",
- "001.002",
- "001.003",
- "Black",
- "Bold",
- "Book",
- "Light",
- "Medium",
- "Regular",
- "Roman",
- "Semibold"
-};
-
-Gushort fofiType1CISOAdobeCharset[229] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
- 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
- 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
- 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
- 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228
-};
-
-Gushort fofiType1CExpertCharset[166] = {
- 0, 1, 229, 230, 231, 232, 233, 234, 235, 236,
- 237, 238, 13, 14, 15, 99, 239, 240, 241, 242,
- 243, 244, 245, 246, 247, 248, 27, 28, 249, 250,
- 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
- 261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
- 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
- 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
- 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
- 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
- 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
- 158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
- 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
- 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
- 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
- 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
- 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
- 373, 374, 375, 376, 377, 378
-};
-
-Gushort fofiType1CExpertSubsetCharset[87] = {
- 0, 1, 231, 232, 235, 236, 237, 238, 13, 14,
- 15, 99, 239, 240, 241, 242, 243, 244, 245, 246,
- 247, 248, 27, 28, 249, 250, 251, 253, 254, 255,
- 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- 266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
- 302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
- 323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
- 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
- 340, 341, 342, 343, 344, 345, 346
-};
diff --git a/pdf/fofi/FoFiEncodings.h b/pdf/fofi/FoFiEncodings.h
deleted file mode 100644
index 50e285d..0000000
--- a/pdf/fofi/FoFiEncodings.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//========================================================================
-//
-// FoFiEncodings.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FOFIENCODINGS_H
-#define FOFIENCODINGS_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-// Type 1 and 1C font data
-//------------------------------------------------------------------------
-
-extern char *fofiType1StandardEncoding[256];
-extern char *fofiType1ExpertEncoding[256];
-
-//------------------------------------------------------------------------
-// Type 1C font data
-//------------------------------------------------------------------------
-
-extern char *fofiType1CStdStrings[391];
-extern Gushort fofiType1CISOAdobeCharset[229];
-extern Gushort fofiType1CExpertCharset[166];
-extern Gushort fofiType1CExpertSubsetCharset[87];
-
-#endif
diff --git a/pdf/fofi/FoFiTrueType.cc b/pdf/fofi/FoFiTrueType.cc
deleted file mode 100644
index a4cf43c..0000000
--- a/pdf/fofi/FoFiTrueType.cc
+++ /dev/null
@@ -1,1438 +0,0 @@
-//========================================================================
-//
-// FoFiTrueType.cc
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include "gtypes.h"
-#include "gmem.h"
-#include "GString.h"
-#include "GHash.h"
-#include "FoFiTrueType.h"
-
-//
-// Terminology
-// -----------
-//
-// character code = number used as an element of a text string
-//
-// character name = glyph name = name for a particular glyph within a
-// font
-//
-// glyph index = GID = position (within some internal table in the font)
-// where the instructions to draw a particular glyph are
-// stored
-//
-// Type 1 fonts
-// ------------
-//
-// Type 1 fonts contain:
-//
-// Encoding: array of glyph names, maps char codes to glyph names
-//
-// Encoding[charCode] = charName
-//
-// CharStrings: dictionary of instructions, keyed by character names,
-// maps character name to glyph data
-//
-// CharStrings[charName] = glyphData
-//
-// TrueType fonts
-// --------------
-//
-// TrueType fonts contain:
-//
-// 'cmap' table: mapping from character code to glyph index; there may
-// be multiple cmaps in a TrueType font
-//
-// cmap[charCode] = gid
-//
-// 'post' table: mapping from glyph index to glyph name
-//
-// post[gid] = glyphName
-//
-// Type 42 fonts
-// -------------
-//
-// Type 42 fonts contain:
-//
-// Encoding: array of glyph names, maps char codes to glyph names
-//
-// Encoding[charCode] = charName
-//
-// CharStrings: dictionary of glyph indexes, keyed by character names,
-// maps character name to glyph index
-//
-// CharStrings[charName] = gid
-//
-
-//------------------------------------------------------------------------
-
-struct TrueTypeTable {
- Guint tag;
- Guint checksum;
- int offset;
- int origOffset;
- int len;
-};
-
-struct TrueTypeCmap {
- int platform;
- int encoding;
- int offset;
- int len;
- int fmt;
-};
-
-struct TrueTypeLoca {
- int idx;
- int origOffset;
- int newOffset;
- int len;
-};
-
-#define cmapTag 0x636d6170
-#define glyfTag 0x676c7966
-#define locaTag 0x6c6f6361
-#define nameTag 0x6e616d65
-#define postTag 0x706f7374
-
-static int cmpTrueTypeLocaOffset(const void *p1, const void *p2) {
- TrueTypeLoca *loca1 = (TrueTypeLoca *)p1;
- TrueTypeLoca *loca2 = (TrueTypeLoca *)p2;
-
- if (loca1->origOffset == loca2->origOffset) {
- return loca1->idx - loca2->idx;
- }
- return loca1->origOffset - loca2->origOffset;
-}
-
-static int cmpTrueTypeLocaIdx(const void *p1, const void *p2) {
- TrueTypeLoca *loca1 = (TrueTypeLoca *)p1;
- TrueTypeLoca *loca2 = (TrueTypeLoca *)p2;
-
- return loca1->idx - loca2->idx;
-}
-
-static int cmpTrueTypeTableTag(const void *p1, const void *p2) {
- TrueTypeTable *tab1 = (TrueTypeTable *)p1;
- TrueTypeTable *tab2 = (TrueTypeTable *)p2;
-
- return (int)tab1->tag - (int)tab2->tag;
-}
-
-//------------------------------------------------------------------------
-
-struct T42Table {
- char *tag; // 4-byte tag
- GBool required; // required by the TrueType spec?
-};
-
-// TrueType tables to be embedded in Type 42 fonts.
-// NB: the table names must be in alphabetical order here.
-#define nT42Tables 11
-static T42Table t42Tables[nT42Tables] = {
- { "cvt ", gTrue },
- { "fpgm", gTrue },
- { "glyf", gTrue },
- { "head", gTrue },
- { "hhea", gTrue },
- { "hmtx", gTrue },
- { "loca", gTrue },
- { "maxp", gTrue },
- { "prep", gTrue },
- { "vhea", gFalse },
- { "vmtx", gFalse }
-};
-#define t42HeadTable 3
-#define t42LocaTable 6
-#define t42GlyfTable 2
-
-//------------------------------------------------------------------------
-
-// Glyph names in some arbitrary standard order that Apple uses for
-// their TrueType fonts.
-static char *macGlyphNames[258] = {
- ".notdef", "null", "CR", "space",
- "exclam", "quotedbl", "numbersign", "dollar",
- "percent", "ampersand", "quotesingle", "parenleft",
- "parenright", "asterisk", "plus", "comma",
- "hyphen", "period", "slash", "zero",
- "one", "two", "three", "four",
- "five", "six", "seven", "eight",
- "nine", "colon", "semicolon", "less",
- "equal", "greater", "question", "at",
- "A", "B", "C", "D",
- "E", "F", "G", "H",
- "I", "J", "K", "L",
- "M", "N", "O", "P",
- "Q", "R", "S", "T",
- "U", "V", "W", "X",
- "Y", "Z", "bracketleft", "backslash",
- "bracketright", "asciicircum", "underscore", "grave",
- "a", "b", "c", "d",
- "e", "f", "g", "h",
- "i", "j", "k", "l",
- "m", "n", "o", "p",
- "q", "r", "s", "t",
- "u", "v", "w", "x",
- "y", "z", "braceleft", "bar",
- "braceright", "asciitilde", "Adieresis", "Aring",
- "Ccedilla", "Eacute", "Ntilde", "Odieresis",
- "Udieresis", "aacute", "agrave", "acircumflex",
- "adieresis", "atilde", "aring", "ccedilla",
- "eacute", "egrave", "ecircumflex", "edieresis",
- "iacute", "igrave", "icircumflex", "idieresis",
- "ntilde", "oacute", "ograve", "ocircumflex",
- "odieresis", "otilde", "uacute", "ugrave",
- "ucircumflex", "udieresis", "dagger", "degree",
- "cent", "sterling", "section", "bullet",
- "paragraph", "germandbls", "registered", "copyright",
- "trademark", "acute", "dieresis", "notequal",
- "AE", "Oslash", "infinity", "plusminus",
- "lessequal", "greaterequal", "yen", "mu1",
- "partialdiff", "summation", "product", "pi",
- "integral", "ordfeminine", "ordmasculine", "Ohm",
- "ae", "oslash", "questiondown", "exclamdown",
- "logicalnot", "radical", "florin", "approxequal",
- "increment", "guillemotleft", "guillemotright", "ellipsis",
- "nbspace", "Agrave", "Atilde", "Otilde",
- "OE", "oe", "endash", "emdash",
- "quotedblleft", "quotedblright", "quoteleft", "quoteright",
- "divide", "lozenge", "ydieresis", "Ydieresis",
- "fraction", "currency", "guilsinglleft", "guilsinglright",
- "fi", "fl", "daggerdbl", "periodcentered",
- "quotesinglbase", "quotedblbase", "perthousand", "Acircumflex",
- "Ecircumflex", "Aacute", "Edieresis", "Egrave",
- "Iacute", "Icircumflex", "Idieresis", "Igrave",
- "Oacute", "Ocircumflex", "applelogo", "Ograve",
- "Uacute", "Ucircumflex", "Ugrave", "dotlessi",
- "circumflex", "tilde", "overscore", "breve",
- "dotaccent", "ring", "cedilla", "hungarumlaut",
- "ogonek", "caron", "Lslash", "lslash",
- "Scaron", "scaron", "Zcaron", "zcaron",
- "brokenbar", "Eth", "eth", "Yacute",
- "yacute", "Thorn", "thorn", "minus",
- "multiply", "onesuperior", "twosuperior", "threesuperior",
- "onehalf", "onequarter", "threequarters", "franc",
- "Gbreve", "gbreve", "Idot", "Scedilla",
- "scedilla", "Cacute", "cacute", "Ccaron",
- "ccaron", "dmacron"
-};
-
-//------------------------------------------------------------------------
-// FoFiTrueType
-//------------------------------------------------------------------------
-
-FoFiTrueType *FoFiTrueType::make(char *fileA, int lenA) {
- FoFiTrueType *ff;
-
- ff = new FoFiTrueType(fileA, lenA, gFalse);
- if (!ff->parsedOk) {
- delete ff;
- return NULL;
- }
- return ff;
-}
-
-FoFiTrueType *FoFiTrueType::load(char *fileName) {
- FoFiTrueType *ff;
- char *fileA;
- int lenA;
-
- if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
- return NULL;
- }
- ff = new FoFiTrueType(fileA, lenA, gTrue);
- if (!ff->parsedOk) {
- delete ff;
- return NULL;
- }
- return ff;
-}
-
-FoFiTrueType::FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA):
- FoFiBase(fileA, lenA, freeFileDataA)
-{
- tables = NULL;
- nTables = 0;
- cmaps = NULL;
- nCmaps = 0;
- nameToGID = NULL;
- parsedOk = gFalse;
-
- parse();
-}
-
-FoFiTrueType::~FoFiTrueType() {
- gfree(tables);
- gfree(cmaps);
- delete nameToGID;
-}
-
-int FoFiTrueType::getNumCmaps() {
- return nCmaps;
-}
-
-int FoFiTrueType::getCmapPlatform(int i) {
- return cmaps[i].platform;
-}
-
-int FoFiTrueType::getCmapEncoding(int i) {
- return cmaps[i].encoding;
-}
-
-int FoFiTrueType::findCmap(int platform, int encoding) {
- int i;
-
- for (i = 0; i < nCmaps; ++i) {
- if (cmaps[i].platform == platform && cmaps[i].encoding == encoding) {
- return i;
- }
- }
- return -1;
-}
-
-Gushort FoFiTrueType::mapCodeToGID(int i, int c) {
- Gushort gid;
- int segCnt, segEnd, segStart, segDelta, segOffset;
- int cmapFirst, cmapLen;
- int pos, a, b, m;
- GBool ok;
-
- if (i < 0 || i >= nCmaps) {
- return 0;
- }
- ok = gTrue;
- pos = cmaps[i].offset;
- switch (cmaps[i].fmt) {
- case 0:
- if (c < 0 || c >= cmaps[i].len - 6) {
- return 0;
- }
- gid = getU8(cmaps[i].offset + 6 + c, &ok);
- break;
- case 4:
- segCnt = getU16BE(pos + 6, &ok) / 2;
- a = -1;
- b = segCnt - 1;
- segEnd = getU16BE(pos + 14 + 2*b, &ok);
- if (c > segEnd) {
- // malformed font -- the TrueType spec requires the last segEnd
- // to be 0xffff
- return 0;
- }
- // invariant: seg[a].end < code <= seg[b].end
- while (b - a > 1 && ok) {
- m = (a + b) / 2;
- segEnd = getU16BE(pos + 14 + 2*m, &ok);
- if (segEnd < c) {
- a = m;
- } else {
- b = m;
- }
- }
- segStart = getU16BE(pos + 16 + 2*segCnt + 2*b, &ok);
- segDelta = getU16BE(pos + 16 + 4*segCnt + 2*b, &ok);
- segOffset = getU16BE(pos + 16 + 6*segCnt + 2*b, &ok);
- if (c < segStart) {
- return 0;
- }
- if (segOffset == 0) {
- gid = (c + segDelta) & 0xffff;
- } else {
- gid = getU16BE(pos + 16 + 6*segCnt + 2*b +
- segOffset + 2 * (c - segStart), &ok);
- if (gid != 0) {
- gid = (gid + segDelta) & 0xffff;
- }
- }
- break;
- case 6:
- cmapFirst = getU16BE(pos + 6, &ok);
- cmapLen = getU16BE(pos + 8, &ok);
- if (c < cmapFirst || c >= cmapFirst + cmapLen) {
- return 0;
- }
- gid = getU16BE(pos + 10 + 2 * (c - cmapFirst), &ok);
- break;
- default:
- return 0;
- }
- if (!ok) {
- return 0;
- }
- return gid;
-}
-
-int FoFiTrueType::mapNameToGID(char *name) {
- if (!nameToGID) {
- return 0;
- }
- return nameToGID->lookupInt(name);
-}
-
-int FoFiTrueType::getEmbeddingRights() {
- int i, fsType;
- GBool ok;
-
- if ((i = seekTable("OS/2")) < 0) {
- return 4;
- }
- ok = gTrue;
- fsType = getU16BE(tables[i].offset + 8, &ok);
- if (!ok) {
- return 4;
- }
- if (fsType & 0x0008) {
- return 2;
- }
- if (fsType & 0x0004) {
- return 1;
- }
- if (fsType & 0x0002) {
- return 0;
- }
- return 3;
-}
-
-void FoFiTrueType::convertToType42(char *psName, char **encoding,
- Gushort *codeToGID,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char buf[512];
- GBool ok;
-
- // write the header
- ok = gTrue;
- sprintf(buf, "%%!PS-TrueTypeFont-%g\n", (double)getS32BE(0, &ok) / 65536.0);
- (*outputFunc)(outputStream, buf, strlen(buf));
-
- // begin the font dictionary
- (*outputFunc)(outputStream, "10 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, " def\n", 5);
- (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
- bbox[0], bbox[1], bbox[2], bbox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
-
- // write the guts of the dictionary
- cvtEncoding(encoding, outputFunc, outputStream);
- cvtCharStrings(encoding, codeToGID, outputFunc, outputStream);
- cvtSfnts(outputFunc, outputStream, NULL);
-
- // end the dictionary and define the font
- (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
-}
-
-void FoFiTrueType::convertToCIDType2(char *psName,
- Gushort *cidMap, int nCIDs,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char buf[512];
- Gushort cid;
- GBool ok;
- int i, j, k;
-
- // write the header
- ok = gTrue;
- sprintf(buf, "%%!PS-TrueTypeFont-%g\n", (double)getS32BE(0, &ok) / 65536.0);
- (*outputFunc)(outputStream, buf, strlen(buf));
-
- // begin the font dictionary
- (*outputFunc)(outputStream, "20 dict begin\n", 14);
- (*outputFunc)(outputStream, "/CIDFontName /", 14);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, " def\n", 5);
- (*outputFunc)(outputStream, "/CIDFontType 2 def\n", 19);
- (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
- (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
- (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24);
- (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27);
- (*outputFunc)(outputStream, " /Supplement 0 def\n", 20);
- (*outputFunc)(outputStream, " end def\n", 10);
- (*outputFunc)(outputStream, "/GDBytes 2 def\n", 15);
- if (cidMap) {
- sprintf(buf, "/CIDCount %d def\n", nCIDs);
- (*outputFunc)(outputStream, buf, strlen(buf));
- if (nCIDs > 32767) {
- (*outputFunc)(outputStream, "/CIDMap [", 9);
- for (i = 0; i < nCIDs; i += 32768 - 16) {
- (*outputFunc)(outputStream, "<\n", 2);
- for (j = 0; j < 32768 - 16 && i+j < nCIDs; j += 16) {
- (*outputFunc)(outputStream, " ", 2);
- for (k = 0; k < 16 && i+j+k < nCIDs; ++k) {
- cid = cidMap[i+j+k];
- sprintf(buf, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "\n", 1);
- }
- (*outputFunc)(outputStream, " >", 3);
- }
- (*outputFunc)(outputStream, "\n", 1);
- (*outputFunc)(outputStream, "] def\n", 6);
- } else {
- (*outputFunc)(outputStream, "/CIDMap <\n", 10);
- for (i = 0; i < nCIDs; i += 16) {
- (*outputFunc)(outputStream, " ", 2);
- for (j = 0; j < 16 && i+j < nCIDs; ++j) {
- cid = cidMap[i+j];
- sprintf(buf, "%02x%02x", (cid >> 8) & 0xff, cid & 0xff);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "\n", 1);
- }
- (*outputFunc)(outputStream, "> def\n", 6);
- }
- } else {
- // direct mapping - just fill the string(s) with s[i]=i
- sprintf(buf, "/CIDCount %d def\n", nGlyphs);
- (*outputFunc)(outputStream, buf, strlen(buf));
- if (nGlyphs > 32767) {
- (*outputFunc)(outputStream, "/CIDMap [\n", 10);
- for (i = 0; i < nGlyphs; i += 32767) {
- j = nGlyphs - i < 32767 ? nGlyphs - i : 32767;
- sprintf(buf, " %d string 0 1 %d {\n", 2 * j, j - 1);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, " 2 copy dup 2 mul exch %d add -8 bitshift put\n", i);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, " 1 index exch dup 2 mul 1 add exch %d add"
- " 255 and put\n", i);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, " } for\n", 8);
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- } else {
- sprintf(buf, "/CIDMap %d string\n", 2 * nGlyphs);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, " 0 1 %d {\n", nGlyphs - 1);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream,
- " 2 copy dup 2 mul exch -8 bitshift put\n", 42);
- (*outputFunc)(outputStream,
- " 1 index exch dup 2 mul 1 add exch 255 and put\n", 50);
- (*outputFunc)(outputStream, " } for\n", 8);
- (*outputFunc)(outputStream, "def\n", 4);
- }
- }
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
- bbox[0], bbox[1], bbox[2], bbox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
- (*outputFunc)(outputStream, "/Encoding [] readonly def\n", 26);
- (*outputFunc)(outputStream, "/CharStrings 1 dict dup begin\n", 30);
- (*outputFunc)(outputStream, " /.notdef 0 def\n", 17);
- (*outputFunc)(outputStream, " end readonly def\n", 19);
-
- // write the guts of the dictionary
- cvtSfnts(outputFunc, outputStream, NULL);
-
- // end the dictionary and define the font
- (*outputFunc)(outputStream,
- "CIDFontName currentdict end /CIDFont defineresource pop\n",
- 56);
-}
-
-void FoFiTrueType::convertToType0(char *psName, Gushort *cidMap, int nCIDs,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char buf[512];
- GString *sfntsName;
- int n, i, j;
-
- // write the Type 42 sfnts array
- sfntsName = (new GString(psName))->append("_sfnts");
- cvtSfnts(outputFunc, outputStream, sfntsName);
- delete sfntsName;
-
- // write the descendant Type 42 fonts
- n = cidMap ? nCIDs : nGlyphs;
- for (i = 0; i < n; i += 256) {
- (*outputFunc)(outputStream, "10 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, psName, strlen(psName));
- sprintf(buf, "_%02x def\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FontType 42 def\n", 17);
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- sprintf(buf, "/FontBBox [%d %d %d %d] def\n",
- bbox[0], bbox[1], bbox[2], bbox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/PaintType 0 def\n", 17);
- (*outputFunc)(outputStream, "/sfnts ", 7);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, "_sfnts def\n", 11);
- (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
- for (j = 0; j < 256 && i+j < n; ++j) {
- sprintf(buf, "dup %d /c%02x put\n", j, j);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "readonly def\n", 13);
- (*outputFunc)(outputStream, "/CharStrings 257 dict dup begin\n", 32);
- (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
- for (j = 0; j < 256 && i+j < n; ++j) {
- sprintf(buf, "/c%02x %d def\n", j, cidMap ? cidMap[i+j] : i+j);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "end readonly def\n", 17);
- (*outputFunc)(outputStream,
- "FontName currentdict end definefont pop\n", 40);
- }
-
- // write the Type 0 parent font
- (*outputFunc)(outputStream, "16 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, " def\n", 5);
- (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
- (*outputFunc)(outputStream, "/Encoding [\n", 12);
- for (i = 0; i < n; i += 256) {
- sprintf(buf, "%d\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- (*outputFunc)(outputStream, "/FDepVector [\n", 14);
- for (i = 0; i < n; i += 256) {
- (*outputFunc)(outputStream, "/", 1);
- (*outputFunc)(outputStream, psName, strlen(psName));
- sprintf(buf, "_%02x findfont\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
-}
-
-void FoFiTrueType::writeTTF(FoFiOutputFunc outputFunc,
- void *outputStream) {
- static char cmapTab[20] = {
- 0, 0, // table version number
- 0, 1, // number of encoding tables
- 0, 1, // platform ID
- 0, 0, // encoding ID
- 0, 0, 0, 12, // offset of subtable
- 0, 0, // subtable format
- 0, 1, // subtable length
- 0, 1, // subtable version
- 0, // map char 0 -> glyph 0
- 0 // pad to multiple of four bytes
- };
- static char nameTab[8] = {
- 0, 0, // format
- 0, 0, // number of name records
- 0, 6, // offset to start of string storage
- 0, 0 // pad to multiple of four bytes
- };
- static char postTab[32] = {
- 0, 1, 0, 0, // format
- 0, 0, 0, 0, // italic angle
- 0, 0, // underline position
- 0, 0, // underline thickness
- 0, 0, 0, 0, // fixed pitch
- 0, 0, 0, 0, // min Type 42 memory
- 0, 0, 0, 0, // max Type 42 memory
- 0, 0, 0, 0, // min Type 1 memory
- 0, 0, 0, 0 // max Type 1 memory
- };
- GBool missingCmap, missingName, missingPost, unsortedLoca, badCmapLen;
- int nZeroLengthTables;
- TrueTypeLoca *locaTable;
- TrueTypeTable *newTables;
- int nNewTables, cmapIdx, cmapLen, glyfLen;
- char *tableDir;
- char locaBuf[4];
- GBool ok;
- Guint t;
- int pos, i, j, k, n;
-
- // check for missing tables
- missingCmap = (cmapIdx = seekTable("cmap")) < 0;
- missingName = seekTable("name") < 0;
- missingPost = seekTable("post") < 0;
-
- // read the loca table, check to see if it's sorted
- locaTable = (TrueTypeLoca *)gmalloc((nGlyphs + 1) * sizeof(TrueTypeLoca));
- unsortedLoca = gFalse;
- i = seekTable("loca");
- pos = tables[i].offset;
- ok = gTrue;
- for (i = 0; i <= nGlyphs; ++i) {
- if (locaFmt) {
- locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok);
- } else {
- locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
- }
- if (i > 0 && locaTable[i].origOffset < locaTable[i-1].origOffset) {
- unsortedLoca = gTrue;
- }
- locaTable[i].idx = i;
- }
-
- // check for zero-length tables
- nZeroLengthTables = 0;
- for (i = 0; i < nTables; ++i) {
- if (tables[i].len == 0) {
- ++nZeroLengthTables;
- }
- }
-
- // check for an incorrect cmap table length
- badCmapLen = gFalse;
- cmapLen = 0; // make gcc happy
- if (!missingCmap) {
- cmapLen = cmaps[0].offset + cmaps[0].len;
- for (i = 1; i < nCmaps; ++i) {
- if (cmaps[i].offset + cmaps[i].len > cmapLen) {
- cmapLen = cmaps[i].offset + cmaps[i].len;
- }
- }
- cmapLen -= tables[cmapIdx].offset;
- if (cmapLen > tables[cmapIdx].len) {
- badCmapLen = gTrue;
- }
- }
-
- // if nothing is broken, just write the TTF file as is
- if (!missingCmap && !missingName && !missingPost && !unsortedLoca &&
- !badCmapLen && nZeroLengthTables == 0) {
- (*outputFunc)(outputStream, (char *)file, len);
- goto done1;
- }
-
- // sort the 'loca' table: some (non-compliant) fonts have
- // out-of-order loca tables; in order to correctly handle the case
- // where (compliant) fonts have empty entries in the middle of the
- // table, cmpTrueTypeLocaOffset uses offset as its primary sort key,
- // and idx as its secondary key (ensuring that adjacent entries with
- // the same pos value remain in the same order)
- glyfLen = 0; // make gcc happy
- if (unsortedLoca) {
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
- &cmpTrueTypeLocaOffset);
- for (i = 0; i < nGlyphs; ++i) {
- locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
- }
- locaTable[nGlyphs].len = 0;
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
- &cmpTrueTypeLocaIdx);
- pos = 0;
- for (i = 0; i <= nGlyphs; ++i) {
- locaTable[i].newOffset = pos;
- pos += locaTable[i].len;
- if (pos & 3) {
- pos += 4 - (pos & 3);
- }
- }
- glyfLen = pos;
- }
-
- // construct the new table directory:
- // - keep all original tables with non-zero length
- // - fix the cmap table's length, if necessary
- // - add missing tables
- // - sort the table by tag
- // - compute new table positions, including 4-byte alignment
- nNewTables = nTables - nZeroLengthTables +
- (missingCmap ? 1 : 0) + (missingName ? 1 : 0) +
- (missingPost ? 1 : 0);
- newTables = (TrueTypeTable *)gmalloc(nNewTables * sizeof(TrueTypeTable));
- j = 0;
- for (i = 0; i < nTables; ++i) {
- if (tables[i].len > 0) {
- newTables[j] = tables[i];
- newTables[j].origOffset = tables[i].offset;
- if (newTables[j].tag == cmapTag && badCmapLen) {
- newTables[j].len = cmapLen;
- } else if (newTables[j].tag == locaTag && unsortedLoca) {
- newTables[j].len = (nGlyphs + 1) * (locaFmt ? 4 : 2);
- } else if (newTables[j].tag == glyfTag && unsortedLoca) {
- newTables[j].len = glyfLen;
- }
- ++j;
- }
- }
- if (missingCmap) {
- newTables[j].tag = cmapTag;
- newTables[j].checksum = 0; //~ should compute the checksum
- newTables[j].len = sizeof(cmapTab);
- ++j;
- }
- if (missingName) {
- newTables[j].tag = nameTag;
- newTables[j].checksum = 0; //~ should compute the checksum
- newTables[j].len = sizeof(nameTab);
- ++j;
- }
- if (missingPost) {
- newTables[j].tag = postTag;
- newTables[j].checksum = 0; //~ should compute the checksum
- newTables[j].len = sizeof(postTab);
- ++j;
- }
- qsort(newTables, nNewTables, sizeof(TrueTypeTable),
- &cmpTrueTypeTableTag);
- pos = 12 + nNewTables * 16;
- for (i = 0; i < nNewTables; ++i) {
- newTables[i].offset = pos;
- pos += newTables[i].len;
- if (pos & 3) {
- pos += 4 - (pos & 3);
- }
- }
-
- // write the table directory
- tableDir = (char *)gmalloc(12 + nNewTables * 16);
- tableDir[0] = 0x00; // sfnt version
- tableDir[1] = 0x01;
- tableDir[2] = 0x00;
- tableDir[3] = 0x00;
- tableDir[4] = (char)((nNewTables >> 8) & 0xff); // numTables
- tableDir[5] = (char)(nNewTables & 0xff);
- for (i = -1, t = (Guint)nNewTables; t; ++i, t >>= 1) ;
- t = 1 << (4 + i);
- tableDir[6] = (char)((t >> 8) & 0xff); // searchRange
- tableDir[7] = (char)(t & 0xff);
- tableDir[8] = (char)((i >> 8) & 0xff); // entrySelector
- tableDir[9] = (char)(i & 0xff);
- t = nNewTables * 16 - t;
- tableDir[10] = (char)((t >> 8) & 0xff); // rangeShift
- tableDir[11] = (char)(t & 0xff);
- pos = 12;
- for (i = 0; i < nNewTables; ++i) {
- tableDir[pos ] = (char)(newTables[i].tag >> 24);
- tableDir[pos+ 1] = (char)(newTables[i].tag >> 16);
- tableDir[pos+ 2] = (char)(newTables[i].tag >> 8);
- tableDir[pos+ 3] = (char) newTables[i].tag;
- tableDir[pos+ 4] = (char)(newTables[i].checksum >> 24);
- tableDir[pos+ 5] = (char)(newTables[i].checksum >> 16);
- tableDir[pos+ 6] = (char)(newTables[i].checksum >> 8);
- tableDir[pos+ 7] = (char) newTables[i].checksum;
- tableDir[pos+ 8] = (char)(newTables[i].offset >> 24);
- tableDir[pos+ 9] = (char)(newTables[i].offset >> 16);
- tableDir[pos+10] = (char)(newTables[i].offset >> 8);
- tableDir[pos+11] = (char) newTables[i].offset;
- tableDir[pos+12] = (char)(newTables[i].len >> 24);
- tableDir[pos+13] = (char)(newTables[i].len >> 16);
- tableDir[pos+14] = (char)(newTables[i].len >> 8);
- tableDir[pos+15] = (char) newTables[i].len;
- pos += 16;
- }
- (*outputFunc)(outputStream, tableDir, 12 + nNewTables * 16);
-
- // write the tables
- for (i = 0; i < nNewTables; ++i) {
- if (newTables[i].tag == cmapTag && missingCmap) {
- (*outputFunc)(outputStream, cmapTab, newTables[i].len);
- } else if (newTables[i].tag == nameTag && missingName) {
- (*outputFunc)(outputStream, nameTab, newTables[i].len);
- } else if (newTables[i].tag == postTag && missingPost) {
- (*outputFunc)(outputStream, postTab, newTables[i].len);
- } else if (newTables[i].tag == locaTag && unsortedLoca) {
- for (j = 0; j <= nGlyphs; ++j) {
- if (locaFmt) {
- locaBuf[0] = (char)(locaTable[j].newOffset >> 24);
- locaBuf[1] = (char)(locaTable[j].newOffset >> 16);
- locaBuf[2] = (char)(locaTable[j].newOffset >> 8);
- locaBuf[3] = (char) locaTable[j].newOffset;
- (*outputFunc)(outputStream, locaBuf, 4);
- } else {
- locaBuf[0] = (char)(locaTable[j].newOffset >> 9);
- locaBuf[1] = (char)(locaTable[j].newOffset >> 1);
- (*outputFunc)(outputStream, locaBuf, 2);
- }
- }
- } else if (newTables[i].tag == glyfTag && unsortedLoca) {
- pos = tables[seekTable("glyf")].offset;
- for (j = 0; j < nGlyphs; ++j) {
- n = locaTable[j].len;
- if (n > 0) {
- k = locaTable[j].origOffset;
- if (checkRegion(pos + k, n)) {
- (*outputFunc)(outputStream, (char *)file + pos + k, n);
- } else {
- for (k = 0; k < n; ++k) {
- (*outputFunc)(outputStream, "\0", 1);
- }
- }
- if ((k = locaTable[j].len & 3)) {
- (*outputFunc)(outputStream, "\0\0\0\0", 4 - k);
- }
- }
- }
- } else {
- if (checkRegion(newTables[i].origOffset, newTables[i].len)) {
- (*outputFunc)(outputStream, (char *)file + newTables[i].origOffset,
- newTables[i].len);
- } else {
- for (j = 0; j < newTables[i].len; ++j) {
- (*outputFunc)(outputStream, "\0", 1);
- }
- }
- }
- if (newTables[i].len & 3) {
- (*outputFunc)(outputStream, "\0\0\0", 4 - (newTables[i].len & 3));
- }
- }
-
- gfree(tableDir);
- gfree(newTables);
- done1:
- gfree(locaTable);
-}
-
-void FoFiTrueType::cvtEncoding(char **encoding,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char *name;
- char buf[64];
- int i;
-
- (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
- if (encoding) {
- for (i = 0; i < 256; ++i) {
- if (!(name = encoding[i])) {
- name = ".notdef";
- }
- sprintf(buf, "dup %d /", i);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, name, strlen(name));
- (*outputFunc)(outputStream, " put\n", 5);
- }
- } else {
- for (i = 0; i < 256; ++i) {
- sprintf(buf, "dup %d /c%02x put\n", i, i);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- }
- (*outputFunc)(outputStream, "readonly def\n", 13);
-}
-
-void FoFiTrueType::cvtCharStrings(char **encoding,
- Gushort *codeToGID,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char *name;
- char buf[64], buf2[16];
- int i, k;
-
- // always define '.notdef'
- (*outputFunc)(outputStream, "/CharStrings 256 dict dup begin\n", 32);
- (*outputFunc)(outputStream, "/.notdef 0 def\n", 15);
-
- // if there's no 'cmap' table, punt
- if (nCmaps == 0) {
- goto err;
- }
-
- // map char name to glyph index:
- // 1. use encoding to map name to char code
- // 2. use codeToGID to map char code to glyph index
- // N.B. We do this in reverse order because font subsets can have
- // weird encodings that use the same character name twice, and
- // the first definition is probably the one we want.
- k = 0; // make gcc happy
- for (i = 255; i >= 0; --i) {
- if (encoding) {
- name = encoding[i];
- } else {
- sprintf(buf2, "c%02x", i);
- name = buf2;
- }
- if (name && strcmp(name, ".notdef")) {
- k = codeToGID[i];
- // note: Distiller (maybe Adobe's PS interpreter in general)
- // doesn't like TrueType fonts that have CharStrings entries
- // which point to nonexistent glyphs, hence the (k < nGlyphs)
- // test
- if (k > 0 && k < nGlyphs) {
- (*outputFunc)(outputStream, "/", 1);
- (*outputFunc)(outputStream, name, strlen(name));
- sprintf(buf, " %d def\n", k);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- }
- }
-
- err:
- (*outputFunc)(outputStream, "end readonly def\n", 17);
-}
-
-void FoFiTrueType::cvtSfnts(FoFiOutputFunc outputFunc,
- void *outputStream, GString *name) {
- Guchar headData[54];
- TrueTypeLoca *locaTable;
- Guchar *locaData;
- TrueTypeTable newTables[nT42Tables];
- Guchar tableDir[12 + nT42Tables*16];
- GBool ok;
- Guint checksum;
- int nNewTables;
- int length, pos, glyfPos, i, j, k;
-
- // construct the 'head' table, zero out the font checksum
- i = seekTable("head");
- pos = tables[i].offset;
- if (!checkRegion(pos, 54)) {
- return;
- }
- memcpy(headData, file + pos, 54);
- headData[8] = headData[9] = headData[10] = headData[11] = (Guchar)0;
-
- // read the original 'loca' table, pad entries out to 4 bytes, and
- // sort it into proper order -- some (non-compliant) fonts have
- // out-of-order loca tables; in order to correctly handle the case
- // where (compliant) fonts have empty entries in the middle of the
- // table, cmpTrueTypeLocaPos uses offset as its primary sort key,
- // and idx as its secondary key (ensuring that adjacent entries with
- // the same pos value remain in the same order)
- locaTable = (TrueTypeLoca *)gmalloc((nGlyphs + 1) * sizeof(TrueTypeLoca));
- i = seekTable("loca");
- pos = tables[i].offset;
- ok = gTrue;
- for (i = 0; i <= nGlyphs; ++i) {
- locaTable[i].idx = i;
- if (locaFmt) {
- locaTable[i].origOffset = (int)getU32BE(pos + i*4, &ok);
- } else {
- locaTable[i].origOffset = 2 * getU16BE(pos + i*2, &ok);
- }
- }
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
- &cmpTrueTypeLocaOffset);
- for (i = 0; i < nGlyphs; ++i) {
- locaTable[i].len = locaTable[i+1].origOffset - locaTable[i].origOffset;
- }
- locaTable[nGlyphs].len = 0;
- qsort(locaTable, nGlyphs + 1, sizeof(TrueTypeLoca),
- &cmpTrueTypeLocaIdx);
- pos = 0;
- for (i = 0; i <= nGlyphs; ++i) {
- locaTable[i].newOffset = pos;
- pos += locaTable[i].len;
- if (pos & 3) {
- pos += 4 - (pos & 3);
- }
- }
-
- // construct the new 'loca' table
- locaData = (Guchar *)gmalloc((nGlyphs + 1) * (locaFmt ? 4 : 2));
- for (i = 0; i <= nGlyphs; ++i) {
- pos = locaTable[i].newOffset;
- if (locaFmt) {
- locaData[4*i ] = (Guchar)(pos >> 24);
- locaData[4*i+1] = (Guchar)(pos >> 16);
- locaData[4*i+2] = (Guchar)(pos >> 8);
- locaData[4*i+3] = (Guchar) pos;
- } else {
- locaData[2*i ] = (Guchar)(pos >> 9);
- locaData[2*i+1] = (Guchar)(pos >> 1);
- }
- }
-
- // count the number of tables
- nNewTables = 0;
- for (i = 0; i < nT42Tables; ++i) {
- if (t42Tables[i].required ||
- seekTable(t42Tables[i].tag) >= 0) {
- ++nNewTables;
- }
- }
-
- // construct the new table headers, including table checksums
- // (pad each table out to a multiple of 4 bytes)
- pos = 12 + nNewTables*16;
- k = 0;
- for (i = 0; i < nT42Tables; ++i) {
- length = -1;
- checksum = 0; // make gcc happy
- if (i == t42HeadTable) {
- length = 54;
- checksum = computeTableChecksum(headData, 54);
- } else if (i == t42LocaTable) {
- length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
- checksum = computeTableChecksum(locaData, length);
- } else if (i == t42GlyfTable) {
- length = 0;
- checksum = 0;
- glyfPos = tables[seekTable("glyf")].offset;
- for (j = 0; j < nGlyphs; ++j) {
- length += locaTable[j].len;
- if (length & 3) {
- length += 4 - (length & 3);
- }
- if (checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) {
- checksum +=
- computeTableChecksum(file + glyfPos + locaTable[j].origOffset,
- locaTable[j].len);
- }
- }
- } else {
- if ((j = seekTable(t42Tables[i].tag)) >= 0) {
- length = tables[j].len;
- if (checkRegion(tables[j].offset, length)) {
- checksum = computeTableChecksum(file + tables[j].offset, length);
- }
- } else if (t42Tables[i].required) {
- //~ error(-1, "Embedded TrueType font is missing a required table ('%s')",
- //~ t42Tables[i].tag);
- length = 0;
- checksum = 0;
- }
- }
- if (length >= 0) {
- newTables[k].tag = ((t42Tables[i].tag[0] & 0xff) << 24) |
- ((t42Tables[i].tag[1] & 0xff) << 16) |
- ((t42Tables[i].tag[2] & 0xff) << 8) |
- (t42Tables[i].tag[3] & 0xff);
- newTables[k].checksum = checksum;
- newTables[k].offset = pos;
- newTables[k].len = length;
- pos += length;
- if (pos & 3) {
- pos += 4 - (length & 3);
- }
- ++k;
- }
- }
-
- // construct the table directory
- tableDir[0] = 0x00; // sfnt version
- tableDir[1] = 0x01;
- tableDir[2] = 0x00;
- tableDir[3] = 0x00;
- tableDir[4] = 0; // numTables
- tableDir[5] = nNewTables;
- tableDir[6] = 0; // searchRange
- tableDir[7] = (Guchar)128;
- tableDir[8] = 0; // entrySelector
- tableDir[9] = 3;
- tableDir[10] = 0; // rangeShift
- tableDir[11] = (Guchar)(16 * nNewTables - 128);
- pos = 12;
- for (i = 0; i < nNewTables; ++i) {
- tableDir[pos ] = (Guchar)(newTables[i].tag >> 24);
- tableDir[pos+ 1] = (Guchar)(newTables[i].tag >> 16);
- tableDir[pos+ 2] = (Guchar)(newTables[i].tag >> 8);
- tableDir[pos+ 3] = (Guchar) newTables[i].tag;
- tableDir[pos+ 4] = (Guchar)(newTables[i].checksum >> 24);
- tableDir[pos+ 5] = (Guchar)(newTables[i].checksum >> 16);
- tableDir[pos+ 6] = (Guchar)(newTables[i].checksum >> 8);
- tableDir[pos+ 7] = (Guchar) newTables[i].checksum;
- tableDir[pos+ 8] = (Guchar)(newTables[i].offset >> 24);
- tableDir[pos+ 9] = (Guchar)(newTables[i].offset >> 16);
- tableDir[pos+10] = (Guchar)(newTables[i].offset >> 8);
- tableDir[pos+11] = (Guchar) newTables[i].offset;
- tableDir[pos+12] = (Guchar)(newTables[i].len >> 24);
- tableDir[pos+13] = (Guchar)(newTables[i].len >> 16);
- tableDir[pos+14] = (Guchar)(newTables[i].len >> 8);
- tableDir[pos+15] = (Guchar) newTables[i].len;
- pos += 16;
- }
-
- // compute the font checksum and store it in the head table
- checksum = computeTableChecksum(tableDir, 12 + nNewTables*16);
- for (i = 0; i < nNewTables; ++i) {
- checksum += newTables[i].checksum;
- }
- checksum = 0xb1b0afba - checksum; // because the TrueType spec says so
- headData[ 8] = (Guchar)(checksum >> 24);
- headData[ 9] = (Guchar)(checksum >> 16);
- headData[10] = (Guchar)(checksum >> 8);
- headData[11] = (Guchar) checksum;
-
- // start the sfnts array
- if (name) {
- (*outputFunc)(outputStream, "/", 1);
- (*outputFunc)(outputStream, name->getCString(), name->getLength());
- (*outputFunc)(outputStream, " [\n", 3);
- } else {
- (*outputFunc)(outputStream, "/sfnts [\n", 9);
- }
-
- // write the table directory
- dumpString(tableDir, 12 + nNewTables*16, outputFunc, outputStream);
-
- // write the tables
- for (i = 0; i < nNewTables; ++i) {
- if (i == t42HeadTable) {
- dumpString(headData, 54, outputFunc, outputStream);
- } else if (i == t42LocaTable) {
- length = (nGlyphs + 1) * (locaFmt ? 4 : 2);
- dumpString(locaData, length, outputFunc, outputStream);
- } else if (i == t42GlyfTable) {
- glyfPos = tables[seekTable("glyf")].offset;
- for (j = 0; j < nGlyphs; ++j) {
- if (locaTable[j].len > 0 &&
- checkRegion(glyfPos + locaTable[j].origOffset, locaTable[j].len)) {
- dumpString(file + glyfPos + locaTable[j].origOffset,
- locaTable[j].len, outputFunc, outputStream);
- }
- }
- } else {
- // length == 0 means the table is missing and the error was
- // already reported during the construction of the table
- // headers
- if ((length = newTables[i].len) > 0) {
- if ((j = seekTable(t42Tables[i].tag)) >= 0 &&
- checkRegion(tables[j].offset, tables[j].len)) {
- dumpString(file + tables[j].offset, tables[j].len,
- outputFunc, outputStream);
- }
- }
- }
- }
-
- // end the sfnts array
- (*outputFunc)(outputStream, "] def\n", 6);
-
- gfree(locaData);
- gfree(locaTable);
-}
-
-void FoFiTrueType::dumpString(Guchar *s, int length,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- char buf[64];
- int pad, i, j;
-
- (*outputFunc)(outputStream, "<", 1);
- for (i = 0; i < length; i += 32) {
- for (j = 0; j < 32 && i+j < length; ++j) {
- sprintf(buf, "%02X", s[i+j] & 0xff);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (i % (65536 - 32) == 65536 - 64) {
- (*outputFunc)(outputStream, ">\n<", 3);
- } else if (i+32 < length) {
- (*outputFunc)(outputStream, "\n", 1);
- }
- }
- if (length & 3) {
- pad = 4 - (length & 3);
- for (i = 0; i < pad; ++i) {
- (*outputFunc)(outputStream, "00", 2);
- }
- }
- // add an extra zero byte because the Adobe Type 42 spec says so
- (*outputFunc)(outputStream, "00>\n", 4);
-}
-
-Guint FoFiTrueType::computeTableChecksum(Guchar *data, int length) {
- Guint checksum, word;
- int i;
-
- checksum = 0;
- for (i = 0; i+3 < length; i += 4) {
- word = ((data[i ] & 0xff) << 24) +
- ((data[i+1] & 0xff) << 16) +
- ((data[i+2] & 0xff) << 8) +
- (data[i+3] & 0xff);
- checksum += word;
- }
- if (length & 3) {
- word = 0;
- i = length & ~3;
- switch (length & 3) {
- case 3:
- word |= (data[i+2] & 0xff) << 8;
- case 2:
- word |= (data[i+1] & 0xff) << 16;
- case 1:
- word |= (data[i ] & 0xff) << 24;
- break;
- }
- checksum += word;
- }
- return checksum;
-}
-
-void FoFiTrueType::parse() {
- int pos, i, j;
-
- parsedOk = gTrue;
-
- // read the table directory
- nTables = getU16BE(4, &parsedOk);
- if (!parsedOk) {
- return;
- }
- tables = (TrueTypeTable *)gmalloc(nTables * sizeof(TrueTypeTable));
- pos = 12;
- for (i = 0; i < nTables; ++i) {
- tables[i].tag = getU32BE(pos, &parsedOk);
- tables[i].checksum = getU32BE(pos + 4, &parsedOk);
- tables[i].offset = (int)getU32BE(pos + 8, &parsedOk);
- tables[i].len = (int)getU32BE(pos + 12, &parsedOk);
- if (tables[i].offset + tables[i].len < tables[i].offset ||
- tables[i].offset + tables[i].len > len) {
- parsedOk = gFalse;
- }
- pos += 16;
- }
- if (!parsedOk) {
- return;
- }
-
- // check for tables that are required by both the TrueType spec and
- // the Type 42 spec
- if (seekTable("head") < 0 ||
- seekTable("hhea") < 0 ||
- seekTable("loca") < 0 ||
- seekTable("maxp") < 0 ||
- seekTable("glyf") < 0 ||
- seekTable("hmtx") < 0) {
- parsedOk = gFalse;
- return;
- }
-
- // read the cmaps
- if ((i = seekTable("cmap")) >= 0) {
- pos = tables[i].offset + 2;
- nCmaps = getU16BE(pos, &parsedOk);
- pos += 2;
- if (!parsedOk) {
- return;
- }
- cmaps = (TrueTypeCmap *)gmalloc(nCmaps * sizeof(TrueTypeCmap));
- for (j = 0; j < nCmaps; ++j) {
- cmaps[j].platform = getU16BE(pos, &parsedOk);
- cmaps[j].encoding = getU16BE(pos + 2, &parsedOk);
- cmaps[j].offset = tables[i].offset + getU32BE(pos + 4, &parsedOk);
- pos += 8;
- cmaps[j].fmt = getU16BE(cmaps[j].offset, &parsedOk);
- cmaps[j].len = getU16BE(cmaps[j].offset + 2, &parsedOk);
- }
- if (!parsedOk) {
- return;
- }
- } else {
- nCmaps = 0;
- }
-
- // get the number of glyphs from the maxp table
- i = seekTable("maxp");
- nGlyphs = getU16BE(tables[i].offset + 4, &parsedOk);
- if (!parsedOk) {
- return;
- }
-
- // get the bbox and loca table format from the head table
- i = seekTable("head");
- bbox[0] = getS16BE(tables[i].offset + 36, &parsedOk);
- bbox[1] = getS16BE(tables[i].offset + 38, &parsedOk);
- bbox[2] = getS16BE(tables[i].offset + 40, &parsedOk);
- bbox[3] = getS16BE(tables[i].offset + 42, &parsedOk);
- locaFmt = getS16BE(tables[i].offset + 50, &parsedOk);
- if (!parsedOk) {
- return;
- }
-
- // read the post table
- readPostTable();
- if (!parsedOk) {
- return;
- }
-}
-
-void FoFiTrueType::readPostTable() {
- GString *name;
- int tablePos, postFmt, stringIdx, stringPos;
- int i, j, n, m;
-
- if ((i = seekTable("post")) < 0) {
- return;
- }
- tablePos = tables[i].offset;
- postFmt = getU32BE(tablePos, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (postFmt == 0x00010000) {
- nameToGID = new GHash(gTrue);
- for (i = 0; i < 258; ++i) {
- nameToGID->add(new GString(macGlyphNames[i]), i);
- }
- } else if (postFmt == 0x00020000) {
- nameToGID = new GHash(gTrue);
- n = getU16BE(tablePos + 32, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (n > nGlyphs) {
- n = nGlyphs;
- }
- stringIdx = 0;
- stringPos = tablePos + 34 + 2*n;
- for (i = 0; i < n; ++i) {
- j = getU16BE(tablePos + 34 + 2*i, &parsedOk);
- if (j < 258) {
- nameToGID->removeInt(macGlyphNames[j]);
- nameToGID->add(new GString(macGlyphNames[j]), i);
- } else {
- j -= 258;
- if (j != stringIdx) {
- for (stringIdx = 0, stringPos = tablePos + 34 + 2*n;
- stringIdx < j;
- ++stringIdx, stringPos += 1 + getU8(stringPos, &parsedOk)) ;
- if (!parsedOk) {
- return;
- }
- }
- m = getU8(stringPos, &parsedOk);
- if (!parsedOk || !checkRegion(stringPos + 1, m)) {
- parsedOk = gFalse;
- return;
- }
- name = new GString((char *)&file[stringPos + 1], m);
- nameToGID->removeInt(name);
- nameToGID->add(name, i);
- ++stringIdx;
- stringPos += 1 + m;
- }
- }
- } else if (postFmt == 0x00028000) {
- nameToGID = new GHash(gTrue);
- for (i = 0; i < nGlyphs; ++i) {
- j = getU8(tablePos + 32 + i, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (j < 258) {
- nameToGID->removeInt(macGlyphNames[j]);
- nameToGID->add(new GString(macGlyphNames[j]), i);
- }
- }
- }
-}
-
-int FoFiTrueType::seekTable(char *tag) {
- Guint tagI;
- int i;
-
- tagI = ((tag[0] & 0xff) << 24) |
- ((tag[1] & 0xff) << 16) |
- ((tag[2] & 0xff) << 8) |
- (tag[3] & 0xff);
- for (i = 0; i < nTables; ++i) {
- if (tables[i].tag == tagI) {
- return i;
- }
- }
- return -1;
-}
diff --git a/pdf/fofi/FoFiTrueType.h b/pdf/fofi/FoFiTrueType.h
deleted file mode 100644
index ea05eec..0000000
--- a/pdf/fofi/FoFiTrueType.h
+++ /dev/null
@@ -1,133 +0,0 @@
-//========================================================================
-//
-// FoFiTrueType.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FOFITRUETYPE_H
-#define FOFITRUETYPE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "FoFiBase.h"
-
-class GHash;
-struct TrueTypeTable;
-struct TrueTypeCmap;
-
-//------------------------------------------------------------------------
-// FoFiTrueType
-//------------------------------------------------------------------------
-
-class FoFiTrueType: public FoFiBase {
-public:
-
- // Create a FoFiTrueType object from a memory buffer.
- static FoFiTrueType *make(char *fileA, int lenA);
-
- // Create a FoFiTrueType object from a file on disk.
- static FoFiTrueType *load(char *fileName);
-
- virtual ~FoFiTrueType();
-
- // Return the number of cmaps defined by this font.
- int getNumCmaps();
-
- // Return the platform ID of the <i>th cmap.
- int getCmapPlatform(int i);
-
- // Return the encoding ID of the <i>th cmap.
- int getCmapEncoding(int i);
-
- // Return the index of the cmap for <platform>, <encoding>. Returns
- // -1 if there is no corresponding cmap.
- int findCmap(int platform, int encoding);
-
- // Return the GID corresponding to <c> according to the <i>th cmap.
- Gushort mapCodeToGID(int i, int c);
-
- // Returns the GID corresponding to <name> according to the post
- // table. Returns 0 if there is no mapping for <name> or if the
- // font does not have a post table.
- int mapNameToGID(char *name);
-
- // Returns the least restrictive embedding licensing right (as
- // defined by the TrueType spec):
- // * 4: OS/2 table is missing or invalid
- // * 3: installable embedding
- // * 2: editable embedding
- // * 1: preview & print embedding
- // * 0: restricted license embedding
- int getEmbeddingRights();
-
- // Convert to a Type 42 font, suitable for embedding in a PostScript
- // file. <psName> will be used as the PostScript font name (so we
- // don't need to depend on the 'name' table in the font). The
- // <encoding> array specifies the mapping from char codes to names.
- // If <encoding> is NULL, the encoding is unknown or undefined. The
- // <codeToGID> array specifies the mapping from char codes to GIDs.
- void convertToType42(char *psName, char **encoding,
- Gushort *codeToGID,
- FoFiOutputFunc outputFunc, void *outputStream);
-
- // Convert to a Type 2 CIDFont, suitable for embedding in a
- // PostScript file. <psName> will be used as the PostScript font
- // name (so we don't need to depend on the 'name' table in the
- // font). The <cidMap> array maps CIDs to GIDs; it has <nCIDs>
- // entries.
- void convertToCIDType2(char *psName, Gushort *cidMap, int nCIDs,
- FoFiOutputFunc outputFunc, void *outputStream);
-
- // Convert to a Type 0 (but non-CID) composite font, suitable for
- // embedding in a PostScript file. <psName> will be used as the
- // PostScript font name (so we don't need to depend on the 'name'
- // table in the font). The <cidMap> array maps CIDs to GIDs; it has
- // <nCIDs> entries.
- void convertToType0(char *psName, Gushort *cidMap, int nCIDs,
- FoFiOutputFunc outputFunc, void *outputStream);
-
- // Write a clean TTF file, filling in missing tables and correcting
- // various other errors. If the font is complete and correct, it
- // will be written unmodified.
- void writeTTF(FoFiOutputFunc outputFunc, void *outputStream);
-
-private:
-
- FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA);
- void cvtEncoding(char **encoding,
- FoFiOutputFunc outputFunc,
- void *outputStream);
- void cvtCharStrings(char **encoding,
- Gushort *codeToGID,
- FoFiOutputFunc outputFunc,
- void *outputStream);
- void cvtSfnts(FoFiOutputFunc outputFunc,
- void *outputStream, GString *name);
- void dumpString(Guchar *s, int length,
- FoFiOutputFunc outputFunc,
- void *outputStream);
- Guint computeTableChecksum(Guchar *data, int length);
- void parse();
- void readPostTable();
- int seekTable(char *tag);
-
- TrueTypeTable *tables;
- int nTables;
- TrueTypeCmap *cmaps;
- int nCmaps;
- int nGlyphs;
- int locaFmt;
- int bbox[4];
- GHash *nameToGID;
-
- GBool parsedOk;
-};
-
-#endif
diff --git a/pdf/fofi/FoFiType1.cc b/pdf/fofi/FoFiType1.cc
deleted file mode 100644
index fe54a63..0000000
--- a/pdf/fofi/FoFiType1.cc
+++ /dev/null
@@ -1,207 +0,0 @@
-//========================================================================
-//
-// FoFiType1.cc
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "FoFiEncodings.h"
-#include "FoFiType1.h"
-
-//------------------------------------------------------------------------
-// FoFiType1
-//------------------------------------------------------------------------
-
-FoFiType1 *FoFiType1::make(char *fileA, int lenA) {
- return new FoFiType1(fileA, lenA, gFalse);
-}
-
-FoFiType1 *FoFiType1::load(char *fileName) {
- char *fileA;
- int lenA;
-
- if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
- return NULL;
- }
- return new FoFiType1(fileA, lenA, gTrue);
-}
-
-FoFiType1::FoFiType1(char *fileA, int lenA, GBool freeFileDataA):
- FoFiBase(fileA, lenA, freeFileDataA)
-{
- name = NULL;
- encoding = NULL;
- parsed = gFalse;
-}
-
-FoFiType1::~FoFiType1() {
- int i;
-
- if (name) {
- gfree(name);
- }
- if (encoding && encoding != fofiType1StandardEncoding) {
- for (i = 0; i < 256; ++i) {
- gfree(encoding[i]);
- }
- gfree(encoding);
- }
-}
-
-char *FoFiType1::getName() {
- if (!parsed) {
- parse();
- }
- return name;
-}
-
-char **FoFiType1::getEncoding() {
- if (!parsed) {
- parse();
- }
- return encoding;
-}
-
-void FoFiType1::writeEncoded(char **newEncoding,
- FoFiOutputFunc outputFunc, void *outputStream) {
- char buf[512];
- char *line;
- int i;
-
- // copy everything up to the encoding
- for (line = (char *)file;
- line && strncmp(line, "/Encoding", 9);
- line = getNextLine(line)) ;
- if (!line) {
- // no encoding - just copy the whole font file
- (*outputFunc)(outputStream, (char *)file, len);
- return;
- }
- (*outputFunc)(outputStream, (char *)file, line - (char *)file);
-
- // write the new encoding
- (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
- (*outputFunc)(outputStream,
- "0 1 255 {1 index exch /.notdef put} for\n", 40);
- for (i = 0; i < 256; ++i) {
- if (newEncoding[i]) {
- sprintf(buf, "dup %d /%s put\n", i, newEncoding[i]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- }
- (*outputFunc)(outputStream, "readonly def\n", 13);
-
- // copy everything after the encoding
- if (!strncmp(line, "/Encoding StandardEncoding def", 30)) {
- line = getNextLine(line);
- } else {
- for (line = getNextLine(line);
- line && strncmp(line, "readonly def", 12);
- line = getNextLine(line)) ;
- }
- if (line) {
- (*outputFunc)(outputStream, line, ((char *)file + len) - line);
- }
-}
-
-char *FoFiType1::getNextLine(char *line) {
- while (line < (char *)file + len && *line != '\x0a' && *line != '\x0d') {
- ++line;
- }
- if (line < (char *)file + len && *line == '\x0d') {
- ++line;
- }
- if (line < (char *)file + len && *line == '\x0a') {
- ++line;
- }
- if (line >= (char *)file + len) {
- return NULL;
- }
- return line;
-}
-
-void FoFiType1::parse() {
- char *line, *line1, *p, *p2;
- char buf[256];
- char c;
- int n, code, i, j;
-
- for (i = 1, line = (char *)file;
- i <= 100 && line && (!name || !encoding);
- ++i) {
-
- // get font name
- if (!name && !strncmp(line, "/FontName", 9)) {
- strncpy(buf, line, 255);
- buf[255] = '\0';
- if ((p = strchr(buf+9, '/')) &&
- (p = strtok(p+1, " \t\n\r"))) {
- name = copyString(p);
- }
- line = getNextLine(line);
-
- // get encoding
- } else if (!encoding &&
- !strncmp(line, "/Encoding StandardEncoding def", 30)) {
- encoding = fofiType1StandardEncoding;
- } else if (!encoding &&
- !strncmp(line, "/Encoding 256 array", 19)) {
- encoding = (char **)gmalloc(256 * sizeof(char *));
- for (j = 0; j < 256; ++j) {
- encoding[j] = NULL;
- }
- line = getNextLine(line);
- for (j = 0; j < 300 && line; ++j) {
- line1 = getNextLine(line);
- if ((n = line1 - line) > 255) {
- n = 255;
- }
- strncpy(buf, line, n);
- buf[n] = '\0';
- for (p = buf; *p == ' ' || *p == '\t'; ++p) ;
- if (!strncmp(p, "dup", 3)) {
- for (p += 3; *p == ' ' || *p == '\t'; ++p) ;
- for (p2 = p; *p2 >= '0' && *p2 <= '9'; ++p2) ;
- if (*p2) {
- c = *p2;
- *p2 = '\0';
- if ((code = atoi(p)) < 256) {
- *p2 = c;
- for (p = p2; *p == ' ' || *p == '\t'; ++p) ;
- if (*p == '/') {
- ++p;
- for (p2 = p; *p2 && *p2 != ' ' && *p2 != '\t'; ++p2) ;
- *p2 = '\0';
- encoding[code] = copyString(p);
- }
- }
- }
- } else {
- if (strtok(buf, " \t") &&
- (p = strtok(NULL, " \t\n\r")) && !strcmp(p, "def")) {
- break;
- }
- }
- line = line1;
- }
- //~ check for getinterval/putinterval junk
-
- } else {
- line = getNextLine(line);
- }
-
- ++i;
- }
-
- parsed = gTrue;
-}
diff --git a/pdf/fofi/FoFiType1.h b/pdf/fofi/FoFiType1.h
deleted file mode 100644
index 843352b..0000000
--- a/pdf/fofi/FoFiType1.h
+++ /dev/null
@@ -1,59 +0,0 @@
-//========================================================================
-//
-// FoFiType1.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FOFITYPE1_H
-#define FOFITYPE1_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "FoFiBase.h"
-
-//------------------------------------------------------------------------
-// FoFiType1
-//------------------------------------------------------------------------
-
-class FoFiType1: public FoFiBase {
-public:
-
- // Create a FoFiType1 object from a memory buffer.
- static FoFiType1 *make(char *fileA, int lenA);
-
- // Create a FoFiType1 object from a file on disk.
- static FoFiType1 *load(char *fileName);
-
- virtual ~FoFiType1();
-
- // Return the font name.
- char *getName();
-
- // Return the encoding, as an array of 256 names (any of which may
- // be NULL).
- char **getEncoding();
-
- // Write a version of the Type 1 font file with a new encoding.
- void writeEncoded(char **newEncoding,
- FoFiOutputFunc outputFunc, void *outputStream);
-
-private:
-
- FoFiType1(char *fileA, int lenA, GBool freeFileDataA);
-
- char *getNextLine(char *line);
- void parse();
-
- char *name;
- char **encoding;
- GBool parsed;
-};
-
-#endif
diff --git a/pdf/fofi/FoFiType1C.cc b/pdf/fofi/FoFiType1C.cc
deleted file mode 100644
index 91a21ad..0000000
--- a/pdf/fofi/FoFiType1C.cc
+++ /dev/null
@@ -1,2385 +0,0 @@
-//========================================================================
-//
-// FoFiType1C.cc
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <math.h>
-#include "gmem.h"
-#include "GString.h"
-#include "FoFiEncodings.h"
-#include "FoFiType1C.h"
-
-//------------------------------------------------------------------------
-
-static char hexChars[17] = "0123456789ABCDEF";
-
-//------------------------------------------------------------------------
-// FoFiType1C
-//------------------------------------------------------------------------
-
-FoFiType1C *FoFiType1C::make(char *fileA, int lenA) {
- FoFiType1C *ff;
-
- ff = new FoFiType1C(fileA, lenA, gFalse);
- if (!ff->parse()) {
- delete ff;
- return NULL;
- }
- return ff;
-}
-
-FoFiType1C *FoFiType1C::load(char *fileName) {
- FoFiType1C *ff;
- char *fileA;
- int lenA;
-
- if (!(fileA = FoFiBase::readFile(fileName, &lenA))) {
- return NULL;
- }
- ff = new FoFiType1C(fileA, lenA, gTrue);
- if (!ff->parse()) {
- delete ff;
- return NULL;
- }
- return ff;
-}
-
-FoFiType1C::FoFiType1C(char *fileA, int lenA, GBool freeFileDataA):
- FoFiBase(fileA, lenA, freeFileDataA)
-{
- name = NULL;
- encoding = NULL;
- privateDicts = NULL;
- fdSelect = NULL;
- charset = NULL;
-}
-
-FoFiType1C::~FoFiType1C() {
- int i;
-
- if (name) {
- delete name;
- }
- if (encoding &&
- encoding != fofiType1StandardEncoding &&
- encoding != fofiType1ExpertEncoding) {
- for (i = 0; i < 256; ++i) {
- gfree(encoding[i]);
- }
- gfree(encoding);
- }
- if (privateDicts) {
- gfree(privateDicts);
- }
- if (fdSelect) {
- gfree(fdSelect);
- }
- if (charset &&
- charset != fofiType1CISOAdobeCharset &&
- charset != fofiType1CExpertCharset &&
- charset != fofiType1CExpertSubsetCharset) {
- gfree(charset);
- }
-}
-
-char *FoFiType1C::getName() {
- return name ? name->getCString() : (char *)NULL;
-}
-
-char **FoFiType1C::getEncoding() {
- return encoding;
-}
-
-Gushort *FoFiType1C::getCIDToGIDMap(int *nCIDs) {
- Gushort *map;
- int n, i;
-
- // a CID font's top dict has ROS as the first operator
- if (topDict.firstOp != 0x0c1e) {
- *nCIDs = 0;
- return NULL;
- }
-
- // in a CID font, the charset data is the GID-to-CID mapping, so all
- // we have to do is reverse it
- n = 0;
- for (i = 0; i < nGlyphs; ++i) {
- if (charset[i] > n) {
- n = charset[i];
- }
- }
- ++n;
- map = (Gushort *)gmalloc(n * sizeof(Gushort));
- memset(map, 0, n * sizeof(Gushort));
- for (i = 0; i < nGlyphs; ++i) {
- map[charset[i]] = i;
- }
- *nCIDs = n;
- return map;
-}
-
-void FoFiType1C::convertToType1(char **newEncoding, GBool ascii,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- Type1CEexecBuf eb;
- Type1CIndex subrIdx;
- Type1CIndexVal val;
- char buf[512];
- char **enc;
- GBool ok;
- int i;
-
- // write header and font dictionary, up to encoding
- ok = gTrue;
- (*outputFunc)(outputStream, "%!FontType1-1.0: ", 17);
- (*outputFunc)(outputStream, name->getCString(), name->getLength());
- if (topDict.versionSID != 0) {
- getString(topDict.versionSID, buf, &ok);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "\n", 1);
- // the dictionary needs room for 12 entries: the following 9, plus
- // Private and CharStrings (in the eexec section) and FID (which is
- // added by definefont)
- (*outputFunc)(outputStream, "12 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontInfo 10 dict dup begin\n", 28);
- if (topDict.versionSID != 0) {
- (*outputFunc)(outputStream, "/version (", 10);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.noticeSID != 0) {
- getString(topDict.noticeSID, buf, &ok);
- (*outputFunc)(outputStream, "/Notice (", 9);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.copyrightSID != 0) {
- getString(topDict.copyrightSID, buf, &ok);
- (*outputFunc)(outputStream, "/Copyright (", 12);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.fullNameSID != 0) {
- getString(topDict.fullNameSID, buf, &ok);
- (*outputFunc)(outputStream, "/FullName (", 11);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.familyNameSID != 0) {
- getString(topDict.familyNameSID, buf, &ok);
- (*outputFunc)(outputStream, "/FamilyName (", 13);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.weightSID != 0) {
- getString(topDict.weightSID, buf, &ok);
- (*outputFunc)(outputStream, "/Weight (", 9);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") readonly def\n", 15);
- }
- if (topDict.isFixedPitch) {
- (*outputFunc)(outputStream, "/isFixedPitch true def\n", 23);
- } else {
- (*outputFunc)(outputStream, "/isFixedPitch false def\n", 24);
- }
- sprintf(buf, "/ItalicAngle %g def\n", topDict.italicAngle);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/UnderlinePosition %g def\n", topDict.underlinePosition);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/UnderlineThickness %g def\n", topDict.underlineThickness);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "end readonly def\n", 17);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, name->getCString(), name->getLength());
- (*outputFunc)(outputStream, " def\n", 5);
- sprintf(buf, "/PaintType %d def\n", topDict.paintType);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
- sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] readonly def\n",
- topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2],
- topDict.fontMatrix[3], topDict.fontMatrix[4], topDict.fontMatrix[5]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/FontBBox [%g %g %g %g] readonly def\n",
- topDict.fontBBox[0], topDict.fontBBox[1],
- topDict.fontBBox[2], topDict.fontBBox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/StrokeWidth %g def\n", topDict.strokeWidth);
- (*outputFunc)(outputStream, buf, strlen(buf));
- if (topDict.uniqueID != 0) {
- sprintf(buf, "/UniqueID %d def\n", topDict.uniqueID);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
-
- // write the encoding
- (*outputFunc)(outputStream, "/Encoding ", 10);
- if (!newEncoding && encoding == fofiType1StandardEncoding) {
- (*outputFunc)(outputStream, "StandardEncoding def\n", 21);
- } else {
- (*outputFunc)(outputStream, "256 array\n", 10);
- (*outputFunc)(outputStream,
- "0 1 255 {1 index exch /.notdef put} for\n", 40);
- enc = newEncoding ? newEncoding : encoding;
- for (i = 0; i < 256; ++i) {
- if (enc[i]) {
- sprintf(buf, "dup %d /%s put\n", i, enc[i]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- }
- (*outputFunc)(outputStream, "readonly def\n", 13);
- }
- (*outputFunc)(outputStream, "currentdict end\n", 16);
-
- // start the binary section
- (*outputFunc)(outputStream, "currentfile eexec\n", 18);
- eb.outputFunc = outputFunc;
- eb.outputStream = outputStream;
- eb.ascii = ascii;
- eb.r1 = 55665;
- eb.line = 0;
-
- // write the private dictionary
- eexecWrite(&eb, "\x83\xca\x73\xd5");
- eexecWrite(&eb, "dup /Private 32 dict dup begin\n");
- eexecWrite(&eb, "/RD {string currentfile exch readstring pop}"
- " executeonly def\n");
- eexecWrite(&eb, "/ND {noaccess def} executeonly def\n");
- eexecWrite(&eb, "/NP {noaccess put} executeonly def\n");
- eexecWrite(&eb, "/MinFeature {16 16} def\n");
- eexecWrite(&eb, "/password 5839 def\n");
- if (privateDicts[0].nBlueValues) {
- eexecWrite(&eb, "/BlueValues [");
- for (i = 0; i < privateDicts[0].nBlueValues; ++i) {
- sprintf(buf, "%s%d", i > 0 ? " " : "", privateDicts[0].blueValues[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].nOtherBlues) {
- eexecWrite(&eb, "/OtherBlues [");
- for (i = 0; i < privateDicts[0].nOtherBlues; ++i) {
- sprintf(buf, "%s%d", i > 0 ? " " : "", privateDicts[0].otherBlues[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].nFamilyBlues) {
- eexecWrite(&eb, "/FamilyBlues [");
- for (i = 0; i < privateDicts[0].nFamilyBlues; ++i) {
- sprintf(buf, "%s%d", i > 0 ? " " : "", privateDicts[0].familyBlues[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].nFamilyOtherBlues) {
- eexecWrite(&eb, "/FamilyOtherBlues [");
- for (i = 0; i < privateDicts[0].nFamilyOtherBlues; ++i) {
- sprintf(buf, "%s%d", i > 0 ? " " : "",
- privateDicts[0].familyOtherBlues[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].blueScale != 0.039625) {
- sprintf(buf, "/BlueScale %g def\n", privateDicts[0].blueScale);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].blueShift != 7) {
- sprintf(buf, "/BlueShift %d def\n", privateDicts[0].blueShift);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].blueFuzz != 1) {
- sprintf(buf, "/BlueFuzz %d def\n", privateDicts[0].blueFuzz);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].hasStdHW) {
- sprintf(buf, "/StdHW [%g] def\n", privateDicts[0].stdHW);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].hasStdVW) {
- sprintf(buf, "/StdVW [%g] def\n", privateDicts[0].stdVW);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].nStemSnapH) {
- eexecWrite(&eb, "/StemSnapH [");
- for (i = 0; i < privateDicts[0].nStemSnapH; ++i) {
- sprintf(buf, "%s%g", i > 0 ? " " : "", privateDicts[0].stemSnapH[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].nStemSnapV) {
- eexecWrite(&eb, "/StemSnapV [");
- for (i = 0; i < privateDicts[0].nStemSnapV; ++i) {
- sprintf(buf, "%s%g", i > 0 ? " " : "", privateDicts[0].stemSnapV[i]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[0].hasForceBold) {
- sprintf(buf, "/ForceBold %s def\n",
- privateDicts[0].forceBold ? "true" : "false");
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].forceBoldThreshold != 0) {
- sprintf(buf, "/ForceBoldThreshold %g def\n",
- privateDicts[0].forceBoldThreshold);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].languageGroup != 0) {
- sprintf(buf, "/LanguageGroup %d def\n", privateDicts[0].languageGroup);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[0].expansionFactor != 0.06) {
- sprintf(buf, "/ExpansionFactor %g def\n", privateDicts[0].expansionFactor);
- eexecWrite(&eb, buf);
- }
-
- // set up subroutines
- ok = gTrue;
- getIndex(privateDicts[0].subrsOffset, &subrIdx, &ok);
- if (!ok) {
- subrIdx.pos = -1;
- }
-
- // write the CharStrings
- sprintf(buf, "2 index /CharStrings %d dict dup begin\n", nGlyphs);
- eexecWrite(&eb, buf);
- for (i = 0; i < nGlyphs; ++i) {
- ok = gTrue;
- getIndexVal(&charStringsIdx, i, &val, &ok);
- if (ok) {
- getString(charset[i], buf, &ok);
- if (ok) {
- eexecCvtGlyph(&eb, buf, val.pos, val.len, &subrIdx, &privateDicts[0]);
- }
- }
- }
- eexecWrite(&eb, "end\n");
- eexecWrite(&eb, "end\n");
- eexecWrite(&eb, "readonly put\n");
- eexecWrite(&eb, "noaccess put\n");
- eexecWrite(&eb, "dup /FontName get exch definefont pop\n");
- eexecWrite(&eb, "mark currentfile closefile\n");
-
- // trailer
- if (ascii && eb.line > 0) {
- (*outputFunc)(outputStream, "\n", 1);
- }
- for (i = 0; i < 8; ++i) {
- (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
- }
- (*outputFunc)(outputStream, "cleartomark\n", 12);
-}
-
-void FoFiType1C::convertToCIDType0(char *psName,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- int *cidMap;
- GString *charStrings;
- int *charStringOffsets;
- Type1CIndex subrIdx;
- Type1CIndexVal val;
- int nCIDs, gdBytes;
- char buf[512], buf2[512];
- GBool ok;
- int gid, offset, n, i, j, k;
-
- // compute the CID count and build the CID-to-GID mapping
- nCIDs = 0;
- for (i = 0; i < nGlyphs; ++i) {
- if (charset[i] >= nCIDs) {
- nCIDs = charset[i] + 1;
- }
- }
- cidMap = (int *)gmalloc(nCIDs * sizeof(int));
- for (i = 0; i < nCIDs; ++i) {
- cidMap[i] = -1;
- }
- for (i = 0; i < nGlyphs; ++i) {
- cidMap[charset[i]] = i;
- }
-
- // build the charstrings
- charStrings = new GString();
- charStringOffsets = (int *)gmalloc((nCIDs + 1) * sizeof(int));
- for (i = 0; i < nCIDs; ++i) {
- charStringOffsets[i] = charStrings->getLength();
- if ((gid = cidMap[i]) >= 0) {
- ok = gTrue;
- getIndexVal(&charStringsIdx, gid, &val, &ok);
- if (ok) {
- getIndex(privateDicts[fdSelect[gid]].subrsOffset, &subrIdx, &ok);
- if (!ok) {
- subrIdx.pos = -1;
- }
- cvtGlyph(val.pos, val.len, charStrings,
- &subrIdx, &privateDicts[fdSelect[gid]], gTrue);
- }
- }
- }
- charStringOffsets[nCIDs] = charStrings->getLength();
-
- // compute gdBytes = number of bytes needed for charstring offsets
- // (offset size needs to account for the charstring offset table,
- // with a worst case of five bytes per entry, plus the charstrings
- // themselves)
- i = (nCIDs + 1) * 5 + charStrings->getLength();
- if (i < 0x100) {
- gdBytes = 1;
- } else if (i < 0x10000) {
- gdBytes = 2;
- } else if (i < 0x1000000) {
- gdBytes = 3;
- } else {
- gdBytes = 4;
- }
-
- // begin the font dictionary
- (*outputFunc)(outputStream, "/CIDInit /ProcSet findresource begin\n", 37);
- (*outputFunc)(outputStream, "20 dict begin\n", 14);
- (*outputFunc)(outputStream, "/CIDFontName /", 14);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, " def\n", 5);
- (*outputFunc)(outputStream, "/CIDFontType 0 def\n", 19);
- (*outputFunc)(outputStream, "/CIDSystemInfo 3 dict dup begin\n", 32);
- if (topDict.registrySID > 0 && topDict.orderingSID > 0) {
- ok = gTrue;
- getString(topDict.registrySID, buf, &ok);
- if (ok) {
- (*outputFunc)(outputStream, " /Registry (", 13);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") def\n", 6);
- }
- ok = gTrue;
- getString(topDict.orderingSID, buf, &ok);
- if (ok) {
- (*outputFunc)(outputStream, " /Ordering (", 13);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, ") def\n", 6);
- }
- } else {
- (*outputFunc)(outputStream, " /Registry (Adobe) def\n", 24);
- (*outputFunc)(outputStream, " /Ordering (Identity) def\n", 27);
- }
- sprintf(buf, " /Supplement %d def\n", topDict.supplement);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "end def\n", 8);
- sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] def\n",
- topDict.fontMatrix[0], topDict.fontMatrix[1], topDict.fontMatrix[2],
- topDict.fontMatrix[3], topDict.fontMatrix[4], topDict.fontMatrix[5]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/FontBBox [%g %g %g %g] def\n",
- topDict.fontBBox[0], topDict.fontBBox[1],
- topDict.fontBBox[2], topDict.fontBBox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FontInfo 1 dict dup begin\n", 27);
- (*outputFunc)(outputStream, " /FSType 8 def\n", 16);
- (*outputFunc)(outputStream, "end def\n", 8);
-
- // CIDFont-specific entries
- sprintf(buf, "/CIDCount %d def\n", nCIDs);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FDBytes 1 def\n", 15);
- sprintf(buf, "/GDBytes %d def\n", gdBytes);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/CIDMapOffset 0 def\n", 20);
- if (topDict.paintType != 0) {
- sprintf(buf, "/PaintType %d def\n", topDict.paintType);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/StrokeWidth %g def\n", topDict.strokeWidth);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
-
- // FDArray entry
- sprintf(buf, "/FDArray %d array\n", nFDs);
- (*outputFunc)(outputStream, buf, strlen(buf));
- for (i = 0; i < nFDs; ++i) {
- sprintf(buf, "dup %d 10 dict begin\n", i);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- sprintf(buf, "/PaintType %d def\n", topDict.paintType);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/Private 32 dict begin\n", 23);
- if (privateDicts[i].nBlueValues) {
- (*outputFunc)(outputStream, "/BlueValues [", 13);
- for (j = 0; j < privateDicts[i].nBlueValues; ++j) {
- sprintf(buf, "%s%d", j > 0 ? " " : "", privateDicts[i].blueValues[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].nOtherBlues) {
- (*outputFunc)(outputStream, "/OtherBlues [", 13);
- for (j = 0; j < privateDicts[i].nOtherBlues; ++j) {
- sprintf(buf, "%s%d", j > 0 ? " " : "", privateDicts[i].otherBlues[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].nFamilyBlues) {
- (*outputFunc)(outputStream, "/FamilyBlues [", 14);
- for (j = 0; j < privateDicts[i].nFamilyBlues; ++j) {
- sprintf(buf, "%s%d", j > 0 ? " " : "", privateDicts[i].familyBlues[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].nFamilyOtherBlues) {
- (*outputFunc)(outputStream, "/FamilyOtherBlues [", 19);
- for (j = 0; j < privateDicts[i].nFamilyOtherBlues; ++j) {
- sprintf(buf, "%s%d", j > 0 ? " " : "",
- privateDicts[i].familyOtherBlues[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].blueScale != 0.039625) {
- sprintf(buf, "/BlueScale %g def\n", privateDicts[i].blueScale);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].blueShift != 7) {
- sprintf(buf, "/BlueShift %d def\n", privateDicts[i].blueShift);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].blueFuzz != 1) {
- sprintf(buf, "/BlueFuzz %d def\n", privateDicts[i].blueFuzz);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].hasStdHW) {
- sprintf(buf, "/StdHW [%g] def\n", privateDicts[i].stdHW);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].hasStdVW) {
- sprintf(buf, "/StdVW [%g] def\n", privateDicts[i].stdVW);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].nStemSnapH) {
- (*outputFunc)(outputStream, "/StemSnapH [", 12);
- for (j = 0; j < privateDicts[i].nStemSnapH; ++j) {
- sprintf(buf, "%s%g", j > 0 ? " " : "", privateDicts[i].stemSnapH[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].nStemSnapV) {
- (*outputFunc)(outputStream, "/StemSnapV [", 12);
- for (j = 0; j < privateDicts[i].nStemSnapV; ++j) {
- sprintf(buf, "%s%g", j > 0 ? " " : "", privateDicts[i].stemSnapV[j]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- }
- if (privateDicts[i].hasForceBold) {
- sprintf(buf, "/ForceBold %s def\n",
- privateDicts[i].forceBold ? "true" : "false");
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].forceBoldThreshold != 0) {
- sprintf(buf, "/ForceBoldThreshold %g def\n",
- privateDicts[i].forceBoldThreshold);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].languageGroup != 0) {
- sprintf(buf, "/LanguageGroup %d def\n", privateDicts[i].languageGroup);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (privateDicts[i].expansionFactor != 0.06) {
- sprintf(buf, "/ExpansionFactor %g def\n",
- privateDicts[i].expansionFactor);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "currentdict end def\n", 20);
- (*outputFunc)(outputStream, "currentdict end put\n", 20);
- }
- (*outputFunc)(outputStream, "def\n", 4);
-
- // start the binary section
- offset = (nCIDs + 1) * (1 + gdBytes);
- sprintf(buf, "(Hex) %d StartData\n",
- offset + charStrings->getLength());
- (*outputFunc)(outputStream, buf, strlen(buf));
-
- // write the charstring offset (CIDMap) table
- for (i = 0; i <= nCIDs; i += 6) {
- for (j = 0; j < 6 && i+j <= nCIDs; ++j) {
- if (i+j < nCIDs && cidMap[i+j] >= 0) {
- buf[0] = (char)fdSelect[cidMap[i+j]];
- } else {
- buf[0] = (char)0;
- }
- n = offset + charStringOffsets[i+j];
- for (k = gdBytes; k >= 1; --k) {
- buf[k] = (char)(n & 0xff);
- n >>= 8;
- }
- for (k = 0; k <= gdBytes; ++k) {
- sprintf(buf2, "%02x", buf[k] & 0xff);
- (*outputFunc)(outputStream, buf2, 2);
- }
- }
- (*outputFunc)(outputStream, "\n", 1);
- }
-
- // write the charstring data
- n = charStrings->getLength();
- for (i = 0; i < n; i += 32) {
- for (j = 0; j < 32 && i+j < n; ++j) {
- sprintf(buf, "%02x", charStrings->getChar(i+j) & 0xff);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (i + 32 >= n) {
- (*outputFunc)(outputStream, ">", 1);
- }
- (*outputFunc)(outputStream, "\n", 1);
- }
-
- gfree(charStringOffsets);
- delete charStrings;
- gfree(cidMap);
-}
-
-void FoFiType1C::convertToType0(char *psName,
- FoFiOutputFunc outputFunc,
- void *outputStream) {
- int *cidMap;
- Type1CIndex subrIdx;
- Type1CIndexVal val;
- int nCIDs;
- char buf[512];
- Type1CEexecBuf eb;
- GBool ok;
- int fd, i, j, k;
-
- // compute the CID count and build the CID-to-GID mapping
- nCIDs = 0;
- for (i = 0; i < nGlyphs; ++i) {
- if (charset[i] >= nCIDs) {
- nCIDs = charset[i] + 1;
- }
- }
- cidMap = (int *)gmalloc(nCIDs * sizeof(int));
- for (i = 0; i < nCIDs; ++i) {
- cidMap[i] = -1;
- }
- for (i = 0; i < nGlyphs; ++i) {
- cidMap[charset[i]] = i;
- }
-
- // write the descendant Type 1 fonts
- for (i = 0; i < nCIDs; i += 256) {
-
- //~ this assumes that all CIDs in this block have the same FD --
- //~ to handle multiple FDs correctly, need to somehow divide the
- //~ font up by FD
- fd = 0;
- for (j = 0; j < 256 && i+j < nCIDs; ++j) {
- if (cidMap[i+j] >= 0) {
- fd = fdSelect[cidMap[i+j]];
- break;
- }
- }
-
- // font dictionary (unencrypted section)
- (*outputFunc)(outputStream, "16 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, psName, strlen(psName));
- sprintf(buf, "_%02x def\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, "/FontType 1 def\n", 16);
- sprintf(buf, "/FontMatrix [%g %g %g %g %g %g] def\n",
- topDict.fontMatrix[0], topDict.fontMatrix[1],
- topDict.fontMatrix[2], topDict.fontMatrix[3],
- topDict.fontMatrix[4], topDict.fontMatrix[5]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/FontBBox [%g %g %g %g] def\n",
- topDict.fontBBox[0], topDict.fontBBox[1],
- topDict.fontBBox[2], topDict.fontBBox[3]);
- (*outputFunc)(outputStream, buf, strlen(buf));
- sprintf(buf, "/PaintType %d def\n", topDict.paintType);
- (*outputFunc)(outputStream, buf, strlen(buf));
- if (topDict.paintType != 0) {
- sprintf(buf, "/StrokeWidth %g def\n", topDict.strokeWidth);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "/Encoding 256 array\n", 20);
- for (j = 0; j < 256 && i+j < nCIDs; ++j) {
- sprintf(buf, "dup %d /c%02x put\n", j, j);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- if (j < 256) {
- sprintf(buf, "%d 1 255 { 1 index exch /.notdef put } for\n", j);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "readonly def\n", 13);
- (*outputFunc)(outputStream, "currentdict end\n", 16);
-
- // start the binary section
- (*outputFunc)(outputStream, "currentfile eexec\n", 18);
- eb.outputFunc = outputFunc;
- eb.outputStream = outputStream;
- eb.ascii = gTrue;
- eb.r1 = 55665;
- eb.line = 0;
-
- // start the private dictionary
- eexecWrite(&eb, "\x83\xca\x73\xd5");
- eexecWrite(&eb, "dup /Private 32 dict dup begin\n");
- eexecWrite(&eb, "/RD {string currentfile exch readstring pop}"
- " executeonly def\n");
- eexecWrite(&eb, "/ND {noaccess def} executeonly def\n");
- eexecWrite(&eb, "/NP {noaccess put} executeonly def\n");
- eexecWrite(&eb, "/MinFeature {16 16} def\n");
- eexecWrite(&eb, "/password 5839 def\n");
- if (privateDicts[fd].nBlueValues) {
- eexecWrite(&eb, "/BlueValues [");
- for (k = 0; k < privateDicts[fd].nBlueValues; ++k) {
- sprintf(buf, "%s%d", k > 0 ? " " : "", privateDicts[fd].blueValues[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].nOtherBlues) {
- eexecWrite(&eb, "/OtherBlues [");
- for (k = 0; k < privateDicts[fd].nOtherBlues; ++k) {
- sprintf(buf, "%s%d", k > 0 ? " " : "", privateDicts[fd].otherBlues[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].nFamilyBlues) {
- eexecWrite(&eb, "/FamilyBlues [");
- for (k = 0; k < privateDicts[fd].nFamilyBlues; ++k) {
- sprintf(buf, "%s%d", k > 0 ? " " : "",
- privateDicts[fd].familyBlues[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].nFamilyOtherBlues) {
- eexecWrite(&eb, "/FamilyOtherBlues [");
- for (k = 0; k < privateDicts[fd].nFamilyOtherBlues; ++k) {
- sprintf(buf, "%s%d", k > 0 ? " " : "",
- privateDicts[fd].familyOtherBlues[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].blueScale != 0.039625) {
- sprintf(buf, "/BlueScale %g def\n", privateDicts[fd].blueScale);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].blueShift != 7) {
- sprintf(buf, "/BlueShift %d def\n", privateDicts[fd].blueShift);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].blueFuzz != 1) {
- sprintf(buf, "/BlueFuzz %d def\n", privateDicts[fd].blueFuzz);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].hasStdHW) {
- sprintf(buf, "/StdHW [%g] def\n", privateDicts[fd].stdHW);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].hasStdVW) {
- sprintf(buf, "/StdVW [%g] def\n", privateDicts[fd].stdVW);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].nStemSnapH) {
- eexecWrite(&eb, "/StemSnapH [");
- for (k = 0; k < privateDicts[fd].nStemSnapH; ++k) {
- sprintf(buf, "%s%g", k > 0 ? " " : "", privateDicts[fd].stemSnapH[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].nStemSnapV) {
- eexecWrite(&eb, "/StemSnapV [");
- for (k = 0; k < privateDicts[fd].nStemSnapV; ++k) {
- sprintf(buf, "%s%g", k > 0 ? " " : "", privateDicts[fd].stemSnapV[k]);
- eexecWrite(&eb, buf);
- }
- eexecWrite(&eb, "] def\n");
- }
- if (privateDicts[fd].hasForceBold) {
- sprintf(buf, "/ForceBold %s def\n",
- privateDicts[fd].forceBold ? "true" : "false");
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].forceBoldThreshold != 0) {
- sprintf(buf, "/ForceBoldThreshold %g def\n",
- privateDicts[fd].forceBoldThreshold);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].languageGroup != 0) {
- sprintf(buf, "/LanguageGroup %d def\n", privateDicts[fd].languageGroup);
- eexecWrite(&eb, buf);
- }
- if (privateDicts[fd].expansionFactor != 0.06) {
- sprintf(buf, "/ExpansionFactor %g def\n",
- privateDicts[fd].expansionFactor);
- eexecWrite(&eb, buf);
- }
-
- // set up the subroutines
- ok = gTrue;
- getIndex(privateDicts[fd].subrsOffset, &subrIdx, &ok);
- if (!ok) {
- subrIdx.pos = -1;
- }
-
- // start the CharStrings
- sprintf(buf, "2 index /CharStrings 256 dict dup begin\n");
- eexecWrite(&eb, buf);
-
- // write the .notdef CharString
- ok = gTrue;
- getIndexVal(&charStringsIdx, 0, &val, &ok);
- if (ok) {
- eexecCvtGlyph(&eb, ".notdef", val.pos, val.len,
- &subrIdx, &privateDicts[fd]);
- }
-
- // write the CharStrings
- for (j = 0; j < 256 && i+j < nCIDs; ++j) {
- if (cidMap[i+j] >= 0) {
- ok = gTrue;
- getIndexVal(&charStringsIdx, cidMap[i+j], &val, &ok);
- if (ok) {
- sprintf(buf, "c%02x", j);
- eexecCvtGlyph(&eb, buf, val.pos, val.len,
- &subrIdx, &privateDicts[fd]);
- }
- }
- }
- eexecWrite(&eb, "end\n");
- eexecWrite(&eb, "end\n");
- eexecWrite(&eb, "readonly put\n");
- eexecWrite(&eb, "noaccess put\n");
- eexecWrite(&eb, "dup /FontName get exch definefont pop\n");
- eexecWrite(&eb, "mark currentfile closefile\n");
-
- // trailer
- if (eb.line > 0) {
- (*outputFunc)(outputStream, "\n", 1);
- }
- for (j = 0; j < 8; ++j) {
- (*outputFunc)(outputStream, "0000000000000000000000000000000000000000000000000000000000000000\n", 65);
- }
- (*outputFunc)(outputStream, "cleartomark\n", 12);
- }
-
- // write the Type 0 parent font
- (*outputFunc)(outputStream, "16 dict begin\n", 14);
- (*outputFunc)(outputStream, "/FontName /", 11);
- (*outputFunc)(outputStream, psName, strlen(psName));
- (*outputFunc)(outputStream, " def\n", 5);
- (*outputFunc)(outputStream, "/FontType 0 def\n", 16);
- (*outputFunc)(outputStream, "/FontMatrix [1 0 0 1 0 0] def\n", 30);
- (*outputFunc)(outputStream, "/FMapType 2 def\n", 16);
- (*outputFunc)(outputStream, "/Encoding [\n", 12);
- for (i = 0; i < nCIDs; i += 256) {
- sprintf(buf, "%d\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- (*outputFunc)(outputStream, "/FDepVector [\n", 14);
- for (i = 0; i < nCIDs; i += 256) {
- (*outputFunc)(outputStream, "/", 1);
- (*outputFunc)(outputStream, psName, strlen(psName));
- sprintf(buf, "_%02x findfont\n", i >> 8);
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- (*outputFunc)(outputStream, "] def\n", 6);
- (*outputFunc)(outputStream, "FontName currentdict end definefont pop\n", 40);
-
- gfree(cidMap);
-}
-
-void FoFiType1C::eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName,
- int offset, int nBytes,
- Type1CIndex *subrIdx,
- Type1CPrivateDict *pDict) {
- char buf[512];
- GString *charBuf;
-
- // generate the charstring
- charBuf = new GString();
- cvtGlyph(offset, nBytes, charBuf, subrIdx, pDict, gTrue);
-
- sprintf(buf, "/%s %d RD ", glyphName, charBuf->getLength());
- eexecWrite(eb, buf);
- eexecWriteCharstring(eb, (Guchar *)charBuf->getCString(),
- charBuf->getLength());
- eexecWrite(eb, " ND\n");
-
- delete charBuf;
-}
-
-void FoFiType1C::cvtGlyph(int offset, int nBytes, GString *charBuf,
- Type1CIndex *subrIdx, Type1CPrivateDict *pDict,
- GBool top) {
- Type1CIndexVal val;
- GBool ok, dFP;
- double d, dx, dy;
- Gushort r2;
- Guchar byte;
- int pos, subrBias, start, i, k;
-
- start = charBuf->getLength();
- if (top) {
- charBuf->append((char)73);
- charBuf->append((char)58);
- charBuf->append((char)147);
- charBuf->append((char)134);
- nOps = 0;
- nHints = 0;
- firstOp = gTrue;
- }
-
- pos = offset;
- while (pos < offset + nBytes) {
- ok = gTrue;
- pos = getOp(pos, gTrue, &ok);
- if (!ok) {
- break;
- }
- if (!ops[nOps - 1].isNum) {
- --nOps; // drop the operator
- switch (ops[nOps].op) {
- case 0x0001: // hstem
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hstem", nOps);
- }
- d = 0;
- dFP = gFalse;
- for (k = 0; k < nOps; k += 2) {
- if (ops[k+1].num < 0) {
- d += ops[k].num + ops[k+1].num;
- dFP |= ops[k].isFP | ops[k+1].isFP;
- cvtNum(d, dFP, charBuf);
- cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);
- } else {
- d += ops[k].num;
- dFP |= ops[k].isFP;
- cvtNum(d, dFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- d += ops[k+1].num;
- dFP |= ops[k+1].isFP;
- }
- charBuf->append((char)1);
- }
- nHints += nOps / 2;
- nOps = 0;
- break;
- case 0x0003: // vstem
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vstem", nOps);
- }
- d = 0;
- dFP = gFalse;
- for (k = 0; k < nOps; k += 2) {
- if (ops[k+1].num < 0) {
- d += ops[k].num + ops[k+1].num;
- dFP |= ops[k].isFP | ops[k+1].isFP;
- cvtNum(d, dFP, charBuf);
- cvtNum(-ops[k+1].num, ops[k+1].isFP, charBuf);
- } else {
- d += ops[k].num;
- dFP |= ops[k].isFP;
- cvtNum(d, dFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- d += ops[k+1].num;
- dFP |= ops[k+1].isFP;
- }
- charBuf->append((char)3);
- }
- nHints += nOps / 2;
- nOps = 0;
- break;
- case 0x0004: // vmoveto
- if (firstOp) {
- cvtGlyphWidth(nOps == 2, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps != 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vmoveto", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- charBuf->append((char)4);
- nOps = 0;
- break;
- case 0x0005: // rlineto
- if (nOps < 2 || nOps % 2 != 0) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 rlineto", nOps);
- }
- for (k = 0; k < nOps; k += 2) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- charBuf->append((char)5);
- }
- nOps = 0;
- break;
- case 0x0006: // hlineto
- if (nOps < 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hlineto", nOps);
- }
- for (k = 0; k < nOps; ++k) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- charBuf->append((char)((k & 1) ? 7 : 6));
- }
- nOps = 0;
- break;
- case 0x0007: // vlineto
- if (nOps < 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vlineto", nOps);
- }
- for (k = 0; k < nOps; ++k) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- charBuf->append((char)((k & 1) ? 6 : 7));
- }
- nOps = 0;
- break;
- case 0x0008: // rrcurveto
- if (nOps < 6 || nOps % 6 != 0) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 rrcurveto", nOps);
- }
- for (k = 0; k < nOps; k += 6) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
- charBuf->append((char)8);
- }
- nOps = 0;
- break;
- case 0x000a: // callsubr
- if (nOps >= 1) {
- subrBias = (subrIdx->len < 1240)
- ? 107 : (subrIdx->len < 33900) ? 1131 : 32768;
- k = subrBias + (int)ops[nOps - 1].num;
- --nOps;
- ok = gTrue;
- getIndexVal(subrIdx, k, &val, &ok);
- if (ok) {
- cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse);
- }
- } else {
- //~ error(-1, "Too few args to Type 2 callsubr");
- }
- // don't clear the stack
- break;
- case 0x000b: // return
- // don't clear the stack
- break;
- case 0x000e: // endchar / seac
- if (firstOp) {
- cvtGlyphWidth(nOps == 1 || nOps == 5, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps == 4) {
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- charBuf->append((char)12)->append((char)6);
- } else if (nOps == 0) {
- charBuf->append((char)14);
- } else {
- //~ error(-1, "Wrong number of args (%d) to Type 2 endchar", nOps);
- }
- nOps = 0;
- break;
- case 0x000f: // (obsolete)
- // this op is ignored, but we need the glyph width
- if (firstOp) {
- cvtGlyphWidth(nOps > 0, charBuf, pDict);
- firstOp = gFalse;
- }
- nOps = 0;
- break;
- case 0x0010: // blend
- //~ error(-1, "Unimplemented Type 2 charstring op: %d", file[i]);
- nOps = 0;
- break;
- case 0x0012: // hstemhm
- // ignored
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hstemhm", nOps);
- }
- nHints += nOps / 2;
- nOps = 0;
- break;
- case 0x0013: // hintmask
- // ignored
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps > 0) {
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hintmask/vstemhm",
- //~ nOps);
- }
- nHints += nOps / 2;
- }
- pos += (nHints + 7) >> 3;
- nOps = 0;
- break;
- case 0x0014: // cntrmask
- // ignored
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps > 0) {
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 cntrmask/vstemhm",
- //~ nOps);
- }
- nHints += nOps / 2;
- }
- pos += (nHints + 7) >> 3;
- nOps = 0;
- break;
- case 0x0015: // rmoveto
- if (firstOp) {
- cvtGlyphWidth(nOps == 3, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps != 2) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 rmoveto", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- charBuf->append((char)21);
- nOps = 0;
- break;
- case 0x0016: // hmoveto
- if (firstOp) {
- cvtGlyphWidth(nOps == 2, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps != 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hmoveto", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- charBuf->append((char)22);
- nOps = 0;
- break;
- case 0x0017: // vstemhm
- // ignored
- if (firstOp) {
- cvtGlyphWidth(nOps & 1, charBuf, pDict);
- firstOp = gFalse;
- }
- if (nOps & 1) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vstemhm", nOps);
- }
- nHints += nOps / 2;
- nOps = 0;
- break;
- case 0x0018: // rcurveline
- if (nOps < 8 || (nOps - 2) % 6 != 0) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 rcurveline", nOps);
- }
- for (k = 0; k < nOps - 2; k += 6) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
- charBuf->append((char)8);
- }
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k].isFP, charBuf);
- charBuf->append((char)5);
- nOps = 0;
- break;
- case 0x0019: // rlinecurve
- if (nOps < 8 || (nOps - 6) % 2 != 0) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 rlinecurve", nOps);
- }
- for (k = 0; k < nOps - 6; k += 2) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k].isFP, charBuf);
- charBuf->append((char)5);
- }
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- cvtNum(ops[k+5].num, ops[k+5].isFP, charBuf);
- charBuf->append((char)8);
- nOps = 0;
- break;
- case 0x001a: // vvcurveto
- if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vvcurveto", nOps);
- }
- if (nOps % 2 == 1) {
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- charBuf->append((char)8);
- k = 5;
- } else {
- k = 0;
- }
- for (; k < nOps; k += 4) {
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- charBuf->append((char)8);
- }
- nOps = 0;
- break;
- case 0x001b: // hhcurveto
- if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hhcurveto", nOps);
- }
- if (nOps % 2 == 1) {
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- charBuf->append((char)8);
- k = 5;
- } else {
- k = 0;
- }
- for (; k < nOps; k += 4) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- charBuf->append((char)8);
- }
- nOps = 0;
- break;
- case 0x001d: // callgsubr
- if (nOps >= 1) {
- k = gsubrBias + (int)ops[nOps - 1].num;
- --nOps;
- ok = gTrue;
- getIndexVal(&gsubrIdx, k, &val, &ok);
- if (ok) {
- cvtGlyph(val.pos, val.len, charBuf, subrIdx, pDict, gFalse);
- }
- } else {
- //~ error(-1, "Too few args to Type 2 callgsubr");
- }
- // don't clear the stack
- break;
- case 0x001e: // vhcurveto
- if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 vhcurveto", nOps);
- }
- for (k = 0; k < nOps && k != nOps-5; k += 4) {
- if (k % 8 == 0) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- charBuf->append((char)30);
- } else {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- charBuf->append((char)31);
- }
- }
- if (k == nOps-5) {
- if (k % 8 == 0) {
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- } else {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- }
- charBuf->append((char)8);
- }
- nOps = 0;
- break;
- case 0x001f: // hvcurveto
- if (nOps < 4 || !(nOps % 4 == 0 || (nOps-1) % 4 == 0)) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hvcurveto", nOps);
- }
- for (k = 0; k < nOps && k != nOps-5; k += 4) {
- if (k % 8 == 0) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- charBuf->append((char)31);
- } else {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- charBuf->append((char)30);
- }
- }
- if (k == nOps-5) {
- if (k % 8 == 0) {
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- } else {
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[k].num, ops[k].isFP, charBuf);
- cvtNum(ops[k+1].num, ops[k+1].isFP, charBuf);
- cvtNum(ops[k+2].num, ops[k+2].isFP, charBuf);
- cvtNum(ops[k+3].num, ops[k+3].isFP, charBuf);
- cvtNum(ops[k+4].num, ops[k+4].isFP, charBuf);
- }
- charBuf->append((char)8);
- }
- nOps = 0;
- break;
- case 0x0c00: // dotsection (should be Type 1 only?)
- // ignored
- nOps = 0;
- break;
- case 0x0c03: // and
- case 0x0c04: // or
- case 0x0c05: // not
- case 0x0c08: // store
- case 0x0c09: // abs
- case 0x0c0a: // add
- case 0x0c0b: // sub
- case 0x0c0c: // div
- case 0x0c0d: // load
- case 0x0c0e: // neg
- case 0x0c0f: // eq
- case 0x0c12: // drop
- case 0x0c14: // put
- case 0x0c15: // get
- case 0x0c16: // ifelse
- case 0x0c17: // random
- case 0x0c18: // mul
- case 0x0c1a: // sqrt
- case 0x0c1b: // dup
- case 0x0c1c: // exch
- case 0x0c1d: // index
- case 0x0c1e: // roll
- //~ error(-1, "Unimplemented Type 2 charstring op: 12.%d", file[i+1]);
- nOps = 0;
- break;
- case 0x0c22: // hflex
- if (nOps != 7) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hflex", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- charBuf->append((char)8);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[5].num, ops[5].isFP, charBuf);
- cvtNum(-ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[6].num, ops[6].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- charBuf->append((char)8);
- nOps = 0;
- break;
- case 0x0c23: // flex
- if (nOps != 13) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 flex", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- cvtNum(ops[5].num, ops[5].isFP, charBuf);
- charBuf->append((char)8);
- cvtNum(ops[6].num, ops[6].isFP, charBuf);
- cvtNum(ops[7].num, ops[7].isFP, charBuf);
- cvtNum(ops[8].num, ops[8].isFP, charBuf);
- cvtNum(ops[9].num, ops[9].isFP, charBuf);
- cvtNum(ops[10].num, ops[10].isFP, charBuf);
- cvtNum(ops[11].num, ops[11].isFP, charBuf);
- charBuf->append((char)8);
- nOps = 0;
- break;
- case 0x0c24: // hflex1
- if (nOps != 9) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 hflex1", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- charBuf->append((char)8);
- cvtNum(ops[5].num, ops[5].isFP, charBuf);
- cvtNum(0, gFalse, charBuf);
- cvtNum(ops[6].num, ops[6].isFP, charBuf);
- cvtNum(ops[7].num, ops[7].isFP, charBuf);
- cvtNum(ops[8].num, ops[8].isFP, charBuf);
- cvtNum(-(ops[1].num + ops[3].num + ops[7].num),
- ops[1].isFP | ops[3].isFP | ops[7].isFP, charBuf);
- charBuf->append((char)8);
- nOps = 0;
- break;
- case 0x0c25: // flex1
- if (nOps != 11) {
- //~ error(-1, "Wrong number of args (%d) to Type 2 flex1", nOps);
- }
- cvtNum(ops[0].num, ops[0].isFP, charBuf);
- cvtNum(ops[1].num, ops[1].isFP, charBuf);
- cvtNum(ops[2].num, ops[2].isFP, charBuf);
- cvtNum(ops[3].num, ops[3].isFP, charBuf);
- cvtNum(ops[4].num, ops[4].isFP, charBuf);
- cvtNum(ops[5].num, ops[5].isFP, charBuf);
- charBuf->append((char)8);
- cvtNum(ops[6].num, ops[6].isFP, charBuf);
- cvtNum(ops[7].num, ops[7].isFP, charBuf);
- cvtNum(ops[8].num, ops[8].isFP, charBuf);
- cvtNum(ops[9].num, ops[9].isFP, charBuf);
- dx = ops[0].num + ops[2].num + ops[4].num + ops[6].num + ops[8].num;
- dy = ops[1].num + ops[3].num + ops[5].num + ops[7].num + ops[9].num;
- if (fabs(dx) > fabs(dy)) {
- cvtNum(ops[10].num, ops[10].isFP, charBuf);
- cvtNum(-dy, ops[1].isFP | ops[3].isFP | ops[5].isFP |
- ops[7].isFP | ops[9].isFP, charBuf);
- } else {
- cvtNum(-dx, ops[0].isFP | ops[2].isFP | ops[4].isFP |
- ops[6].isFP | ops[8].isFP, charBuf);
- cvtNum(ops[10].num, ops[10].isFP, charBuf);
- }
- charBuf->append((char)8);
- nOps = 0;
- break;
- default:
- //~ error(-1, "Illegal Type 2 charstring op: %04x",
- //~ ops[nOps].op);
- nOps = 0;
- break;
- }
- }
- }
-
- // charstring encryption
- if (top) {
- r2 = 4330;
- for (i = start; i < charBuf->getLength(); ++i) {
- byte = charBuf->getChar(i) ^ (r2 >> 8);
- charBuf->setChar(i, byte);
- r2 = (byte + r2) * 52845 + 22719;
- }
- }
-}
-
-void FoFiType1C::cvtGlyphWidth(GBool useOp, GString *charBuf,
- Type1CPrivateDict *pDict) {
- double w;
- GBool wFP;
- int i;
-
- if (useOp) {
- w = pDict->nominalWidthX + ops[0].num;
- wFP = pDict->nominalWidthXFP | ops[0].isFP;
- for (i = 1; i < nOps; ++i) {
- ops[i-1] = ops[i];
- }
- --nOps;
- } else {
- w = pDict->defaultWidthX;
- wFP = pDict->defaultWidthXFP;
- }
- cvtNum(0, gFalse, charBuf);
- cvtNum(w, wFP, charBuf);
- charBuf->append((char)13);
-}
-
-void FoFiType1C::cvtNum(double x, GBool isFP, GString *charBuf) {
- Guchar buf[12];
- int y, n;
-
- n = 0;
- if (isFP) {
- if (x >= -32768 && x < 32768) {
- y = (int)(x * 256.0);
- buf[0] = 255;
- buf[1] = (Guchar)(y >> 24);
- buf[2] = (Guchar)(y >> 16);
- buf[3] = (Guchar)(y >> 8);
- buf[4] = (Guchar)y;
- buf[5] = 255;
- buf[6] = 0;
- buf[7] = 0;
- buf[8] = 1;
- buf[9] = 0;
- buf[10] = 12;
- buf[11] = 12;
- n = 12;
- } else {
- //~ error(-1, "Type 2 fixed point constant out of range");
- }
- } else {
- y = (int)x;
- if (y >= -107 && y <= 107) {
- buf[0] = (Guchar)(y + 139);
- n = 1;
- } else if (y > 107 && y <= 1131) {
- y -= 108;
- buf[0] = (Guchar)((y >> 8) + 247);
- buf[1] = (Guchar)(y & 0xff);
- n = 2;
- } else if (y < -107 && y >= -1131) {
- y = -y - 108;
- buf[0] = (Guchar)((y >> 8) + 251);
- buf[1] = (Guchar)(y & 0xff);
- n = 2;
- } else {
- buf[0] = 255;
- buf[1] = (Guchar)(y >> 24);
- buf[2] = (Guchar)(y >> 16);
- buf[3] = (Guchar)(y >> 8);
- buf[4] = (Guchar)y;
- n = 5;
- }
- }
- charBuf->append((char *)buf, n);
-}
-
-void FoFiType1C::eexecWrite(Type1CEexecBuf *eb, char *s) {
- Guchar *p;
- Guchar x;
-
- for (p = (Guchar *)s; *p; ++p) {
- x = *p ^ (eb->r1 >> 8);
- eb->r1 = (x + eb->r1) * 52845 + 22719;
- if (eb->ascii) {
- (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1);
- (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1);
- eb->line += 2;
- if (eb->line == 64) {
- (*eb->outputFunc)(eb->outputStream, "\n", 1);
- eb->line = 0;
- }
- } else {
- (*eb->outputFunc)(eb->outputStream, (char *)&x, 1);
- }
- }
-}
-
-void FoFiType1C::eexecWriteCharstring(Type1CEexecBuf *eb,
- Guchar *s, int n) {
- Guchar x;
- int i;
-
- // eexec encryption
- for (i = 0; i < n; ++i) {
- x = s[i] ^ (eb->r1 >> 8);
- eb->r1 = (x + eb->r1) * 52845 + 22719;
- if (eb->ascii) {
- (*eb->outputFunc)(eb->outputStream, &hexChars[x >> 4], 1);
- (*eb->outputFunc)(eb->outputStream, &hexChars[x & 0x0f], 1);
- eb->line += 2;
- if (eb->line == 64) {
- (*eb->outputFunc)(eb->outputStream, "\n", 1);
- eb->line = 0;
- }
- } else {
- (*eb->outputFunc)(eb->outputStream, (char *)&x, 1);
- }
- }
-}
-
-GBool FoFiType1C::parse() {
- Type1CIndex fdIdx;
- Type1CIndexVal val;
- int i;
-
- parsedOk = gTrue;
-
- // some tools embed Type 1C fonts with an extra whitespace char at
- // the beginning
- if (len > 0 && file[0] != '\x01') {
- ++file;
- --len;
- }
-
- // find the indexes
- getIndex(getU8(2, &parsedOk), &nameIdx, &parsedOk);
- getIndex(nameIdx.endPos, &topDictIdx, &parsedOk);
- getIndex(topDictIdx.endPos, &stringIdx, &parsedOk);
- getIndex(stringIdx.endPos, &gsubrIdx, &parsedOk);
- if (!parsedOk) {
- return gFalse;
- }
- gsubrBias = (gsubrIdx.len < 1240) ? 107
- : (gsubrIdx.len < 33900) ? 1131 : 32768;
-
- // read the first font name
- getIndexVal(&nameIdx, 0, &val, &parsedOk);
- if (!parsedOk) {
- return gFalse;
- }
- name = new GString((char *)&file[val.pos], val.len);
-
- // read the top dict for the first font
- readTopDict();
-
- // for CID fonts: read the FDArray dicts and private dicts
- if (topDict.firstOp == 0x0c1e) {
- if (topDict.fdArrayOffset == 0) {
- nFDs = 1;
- privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict));
- readPrivateDict(0, 0, &privateDicts[0]);
- } else {
- getIndex(topDict.fdArrayOffset, &fdIdx, &parsedOk);
- if (!parsedOk) {
- return gFalse;
- }
- nFDs = fdIdx.len;
- privateDicts = (Type1CPrivateDict *)
- gmalloc(nFDs * sizeof(Type1CPrivateDict));
- for (i = 0; i < nFDs; ++i) {
- getIndexVal(&fdIdx, i, &val, &parsedOk);
- if (!parsedOk) {
- return gFalse;
- }
- readFD(val.pos, val.len, &privateDicts[i]);
- }
- }
-
- // for 8-bit fonts: read the private dict
- } else {
- privateDicts = (Type1CPrivateDict *)gmalloc(sizeof(Type1CPrivateDict));
- readPrivateDict(topDict.privateOffset, topDict.privateSize,
- &privateDicts[0]);
- }
-
- // check for parse errors in the private dict(s)
- if (!parsedOk) {
- return gFalse;
- }
-
- // get the charstrings index
- if (topDict.charStringsOffset <= 0) {
- parsedOk = gFalse;
- return gFalse;
- }
- getIndex(topDict.charStringsOffset, &charStringsIdx, &parsedOk);
- if (!parsedOk) {
- return gFalse;
- }
- nGlyphs = charStringsIdx.len;
-
- // for CID fonts: read the FDSelect table
- if (topDict.firstOp == 0x0c1e) {
- readFDSelect();
- if (!parsedOk) {
- return gFalse;
- }
- }
-
- // read the charset
- if (!readCharset()) {
- parsedOk = gFalse;
- return gFalse;
- }
-
- // for 8-bit fonts: build the encoding
- if (topDict.firstOp != 0x0c14 && topDict.firstOp != 0x0c1e) {
- buildEncoding();
- if (!parsedOk) {
- return gFalse;
- }
- }
-
- return parsedOk;
-}
-
-void FoFiType1C::readTopDict() {
- Type1CIndexVal topDictPtr;
- int pos;
-
- topDict.firstOp = -1;
- topDict.versionSID = 0;
- topDict.noticeSID = 0;
- topDict.copyrightSID = 0;
- topDict.fullNameSID = 0;
- topDict.familyNameSID = 0;
- topDict.weightSID = 0;
- topDict.isFixedPitch = 0;
- topDict.italicAngle = 0;
- topDict.underlinePosition = -100;
- topDict.underlineThickness = 50;
- topDict.paintType = 0;
- topDict.charstringType = 2;
- topDict.fontMatrix[0] = 0.001;
- topDict.fontMatrix[1] = 0;
- topDict.fontMatrix[2] = 0;
- topDict.fontMatrix[3] = 0.001;
- topDict.fontMatrix[4] = 0;
- topDict.fontMatrix[5] = 0;
- topDict.uniqueID = 0;
- topDict.fontBBox[0] = 0;
- topDict.fontBBox[1] = 0;
- topDict.fontBBox[2] = 0;
- topDict.fontBBox[3] = 0;
- topDict.strokeWidth = 0;
- topDict.charsetOffset = 0;
- topDict.encodingOffset = 0;
- topDict.charStringsOffset = 0;
- topDict.privateSize = 0;
- topDict.privateOffset = 0;
- topDict.registrySID = 0;
- topDict.orderingSID = 0;
- topDict.supplement = 0;
- topDict.fdArrayOffset = 0;
- topDict.fdSelectOffset = 0;
-
- getIndexVal(&topDictIdx, 0, &topDictPtr, &parsedOk);
- pos = topDictPtr.pos;
- nOps = 0;
- while (pos < topDictPtr.pos + topDictPtr.len) {
- pos = getOp(pos, gFalse, &parsedOk);
- if (!parsedOk) {
- break;
- }
- if (!ops[nOps - 1].isNum) {
- --nOps; // drop the operator
- if (topDict.firstOp < 0) {
- topDict.firstOp = ops[nOps].op;
- }
- switch (ops[nOps].op) {
- case 0x0000: topDict.versionSID = (int)ops[0].num; break;
- case 0x0001: topDict.noticeSID = (int)ops[0].num; break;
- case 0x0c00: topDict.copyrightSID = (int)ops[0].num; break;
- case 0x0002: topDict.fullNameSID = (int)ops[0].num; break;
- case 0x0003: topDict.familyNameSID = (int)ops[0].num; break;
- case 0x0004: topDict.weightSID = (int)ops[0].num; break;
- case 0x0c01: topDict.isFixedPitch = (int)ops[0].num; break;
- case 0x0c02: topDict.italicAngle = ops[0].num; break;
- case 0x0c03: topDict.underlinePosition = ops[0].num; break;
- case 0x0c04: topDict.underlineThickness = ops[0].num; break;
- case 0x0c05: topDict.paintType = (int)ops[0].num; break;
- case 0x0c06: topDict.charstringType = (int)ops[0].num; break;
- case 0x0c07: topDict.fontMatrix[0] = ops[0].num;
- topDict.fontMatrix[1] = ops[1].num;
- topDict.fontMatrix[2] = ops[2].num;
- topDict.fontMatrix[3] = ops[3].num;
- topDict.fontMatrix[4] = ops[4].num;
- topDict.fontMatrix[5] = ops[5].num; break;
- case 0x000d: topDict.uniqueID = (int)ops[0].num; break;
- case 0x0005: topDict.fontBBox[0] = ops[0].num;
- topDict.fontBBox[1] = ops[1].num;
- topDict.fontBBox[2] = ops[2].num;
- topDict.fontBBox[3] = ops[3].num; break;
- case 0x0c08: topDict.strokeWidth = ops[0].num; break;
- case 0x000f: topDict.charsetOffset = (int)ops[0].num; break;
- case 0x0010: topDict.encodingOffset = (int)ops[0].num; break;
- case 0x0011: topDict.charStringsOffset = (int)ops[0].num; break;
- case 0x0012: topDict.privateSize = (int)ops[0].num;
- topDict.privateOffset = (int)ops[1].num; break;
- case 0x0c1e: topDict.registrySID = (int)ops[0].num;
- topDict.orderingSID = (int)ops[1].num;
- topDict.supplement = (int)ops[2].num; break;
- case 0x0c24: topDict.fdArrayOffset = (int)ops[0].num; break;
- case 0x0c25: topDict.fdSelectOffset = (int)ops[0].num; break;
- }
- nOps = 0;
- }
- }
-}
-
-// Read a CID font dict (FD) - this pulls out the private dict
-// pointer, and reads the private dict.
-void FoFiType1C::readFD(int offset, int length, Type1CPrivateDict *pDict) {
- int pos, pSize, pOffset;
-
- pSize = pOffset = 0;
- pos = offset;
- nOps = 0;
- while (pos < offset + length) {
- pos = getOp(pos, gFalse, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (!ops[nOps - 1].isNum) {
- if (ops[nOps - 1].op == 0x0012) {
- if (nOps < 3) {
- parsedOk = gFalse;
- return;
- }
- pSize = (int)ops[0].num;
- pOffset = (int)ops[1].num;
- break;
- }
- nOps = 0;
- }
- }
- readPrivateDict(pOffset, pSize, pDict);
-}
-
-void FoFiType1C::readPrivateDict(int offset, int length,
- Type1CPrivateDict *pDict) {
- int pos;
-
- pDict->nBlueValues = 0;
- pDict->nOtherBlues = 0;
- pDict->nFamilyBlues = 0;
- pDict->nFamilyOtherBlues = 0;
- pDict->blueScale = 0.039625;
- pDict->blueShift = 7;
- pDict->blueFuzz = 1;
- pDict->hasStdHW = gFalse;
- pDict->hasStdVW = gFalse;
- pDict->nStemSnapH = 0;
- pDict->nStemSnapV = 0;
- pDict->hasForceBold = gFalse;
- pDict->forceBoldThreshold = 0;
- pDict->languageGroup = 0;
- pDict->expansionFactor = 0.06;
- pDict->initialRandomSeed = 0;
- pDict->subrsOffset = 0;
- pDict->defaultWidthX = 0;
- pDict->defaultWidthXFP = 0;
- pDict->nominalWidthX = 0;
- pDict->nominalWidthXFP = 0;
-
- // no dictionary
- if (offset == 0 || length == 0) {
- return;
- }
-
- pos = offset;
- nOps = 0;
- while (pos < offset + length) {
- pos = getOp(pos, gFalse, &parsedOk);
- if (!parsedOk) {
- break;
- }
- if (!ops[nOps - 1].isNum) {
- --nOps; // drop the operator
- switch (ops[nOps].op) {
- case 0x0006:
- pDict->nBlueValues = getDeltaIntArray(pDict->blueValues,
- type1CMaxBlueValues);
- break;
- case 0x0007:
- pDict->nOtherBlues = getDeltaIntArray(pDict->otherBlues,
- type1CMaxOtherBlues);
- break;
- case 0x0008:
- pDict->nFamilyBlues = getDeltaIntArray(pDict->familyBlues,
- type1CMaxBlueValues);
- break;
- case 0x0009:
- pDict->nFamilyOtherBlues = getDeltaIntArray(pDict->familyOtherBlues,
- type1CMaxOtherBlues);
- break;
- case 0x0c09:
- pDict->blueScale = ops[0].num;
- break;
- case 0x0c0a:
- pDict->blueShift = (int)ops[0].num;
- break;
- case 0x0c0b:
- pDict->blueFuzz = (int)ops[0].num;
- break;
- case 0x000a:
- pDict->stdHW = ops[0].num;
- pDict->hasStdHW = gTrue;
- break;
- case 0x000b:
- pDict->stdVW = ops[0].num;
- pDict->hasStdVW = gTrue;
- break;
- case 0x0c0c:
- pDict->nStemSnapH = getDeltaFPArray(pDict->stemSnapH,
- type1CMaxStemSnap);
- break;
- case 0x0c0d:
- pDict->nStemSnapV = getDeltaFPArray(pDict->stemSnapV,
- type1CMaxStemSnap);
- break;
- case 0x0c0e:
- pDict->forceBold = ops[0].num != 0;
- pDict->hasForceBold = gTrue;
- break;
- case 0x0c0f:
- pDict->forceBoldThreshold = ops[0].num;
- break;
- case 0x0c11:
- pDict->languageGroup = (int)ops[0].num;
- break;
- case 0x0c12:
- pDict->expansionFactor = ops[0].num;
- break;
- case 0x0c13:
- pDict->initialRandomSeed = (int)ops[0].num;
- break;
- case 0x0013:
- pDict->subrsOffset = offset + (int)ops[0].num;
- break;
- case 0x0014:
- pDict->defaultWidthX = ops[0].num;
- break;
- case 0x0015:
- pDict->nominalWidthX = ops[0].num;
- break;
- }
- nOps = 0;
- }
- }
-}
-
-void FoFiType1C::readFDSelect() {
- int fdSelectFmt, pos, nRanges, gid0, gid1, fd, i, j;
-
- fdSelect = (Guchar *)gmalloc(nGlyphs);
- if (topDict.fdSelectOffset == 0) {
- for (i = 0; i < nGlyphs; ++i) {
- fdSelect[i] = 0;
- }
- } else {
- pos = topDict.fdSelectOffset;
- fdSelectFmt = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (fdSelectFmt == 0) {
- if (!checkRegion(pos, nGlyphs)) {
- parsedOk = gFalse;
- return;
- }
- memcpy(fdSelect, file + pos, nGlyphs);
- } else if (fdSelectFmt == 3) {
- nRanges = getU16BE(pos, &parsedOk);
- pos += 2;
- gid0 = getU16BE(pos, &parsedOk);
- pos += 2;
- for (i = 1; i <= nRanges; ++i) {
- fd = getU8(pos++, &parsedOk);
- gid1 = getU16BE(pos, &parsedOk);
- if (!parsedOk) {
- return;
- }
- pos += 2;
- if (gid0 > gid1 || gid1 > nGlyphs) {
- //~ error(-1, "Bad FDSelect table in CID font");
- parsedOk = gFalse;
- return;
- }
- for (j = gid0; j < gid1; ++j) {
- fdSelect[j] = fd;
- }
- gid0 = gid1;
- }
- } else {
- //~ error(-1, "Unknown FDSelect table format in CID font");
- for (i = 0; i < nGlyphs; ++i) {
- fdSelect[i] = 0;
- }
- }
- }
-}
-
-void FoFiType1C::buildEncoding() {
- char buf[256];
- int nCodes, nRanges, encFormat;
- int pos, c, sid, nLeft, nSups, i, j;
-
- if (topDict.encodingOffset == 0) {
- encoding = fofiType1StandardEncoding;
-
- } else if (topDict.encodingOffset == 1) {
- encoding = fofiType1ExpertEncoding;
-
- } else {
- encoding = (char **)gmalloc(256 * sizeof(char *));
- for (i = 0; i < 256; ++i) {
- encoding[i] = NULL;
- }
- pos = topDict.encodingOffset;
- encFormat = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if ((encFormat & 0x7f) == 0) {
- nCodes = 1 + getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (nCodes > nGlyphs) {
- nCodes = nGlyphs;
- }
- for (i = 1; i < nCodes; ++i) {
- c = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- if (encoding[c]) {
- gfree(encoding[c]);
- }
- encoding[c] = copyString(getString(charset[i], buf, &parsedOk));
- }
- } else if ((encFormat & 0x7f) == 1) {
- nRanges = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- nCodes = 1;
- for (i = 0; i < nRanges; ++i) {
- c = getU8(pos++, &parsedOk);
- nLeft = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- for (j = 0; j <= nLeft && nCodes < nGlyphs; ++j) {
- if (c < 256) {
- if (encoding[c]) {
- gfree(encoding[c]);
- }
- encoding[c] = copyString(getString(charset[nCodes], buf,
- &parsedOk));
- }
- ++nCodes;
- ++c;
- }
- }
- }
- if (encFormat & 0x80) {
- nSups = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- return;
- }
- for (i = 0; i < nSups; ++i) {
- c = getU8(pos++, &parsedOk);;
- if (!parsedOk) {
- return;;
- }
- sid = getU16BE(pos, &parsedOk);
- pos += 2;
- if (!parsedOk) {
- return;
- }
- if (encoding[c]) {
- gfree(encoding[c]);
- }
- encoding[c] = copyString(getString(sid, buf, &parsedOk));
- }
- }
- }
-}
-
-GBool FoFiType1C::readCharset() {
- int charsetFormat, c, pos;
- int nLeft, i, j;
-
- if (topDict.charsetOffset == 0) {
- charset = fofiType1CISOAdobeCharset;
- } else if (topDict.charsetOffset == 1) {
- charset = fofiType1CExpertCharset;
- } else if (topDict.charsetOffset == 2) {
- charset = fofiType1CExpertSubsetCharset;
- } else {
- charset = (Gushort *)gmalloc(nGlyphs * sizeof(Gushort));
- for (i = 0; i < nGlyphs; ++i) {
- charset[i] = 0;
- }
- pos = topDict.charsetOffset;
- charsetFormat = getU8(pos++, &parsedOk);
- if (charsetFormat == 0) {
- for (i = 1; i < nGlyphs; ++i) {
- charset[i] = (Gushort)getU16BE(pos, &parsedOk);
- pos += 2;
- if (!parsedOk) {
- break;
- }
- }
- } else if (charsetFormat == 1) {
- i = 1;
- while (i < nGlyphs) {
- c = getU16BE(pos, &parsedOk);
- pos += 2;
- nLeft = getU8(pos++, &parsedOk);
- if (!parsedOk) {
- break;
- }
- for (j = 0; j <= nLeft && i < nGlyphs; ++j) {
- charset[i++] = (Gushort)c++;
- }
- }
- } else if (charsetFormat == 2) {
- i = 1;
- while (i < nGlyphs) {
- c = getU16BE(pos, &parsedOk);
- pos += 2;
- nLeft = getU16BE(pos, &parsedOk);
- pos += 2;
- if (!parsedOk) {
- break;
- }
- for (j = 0; j <= nLeft && i < nGlyphs; ++j) {
- charset[i++] = (Gushort)c++;
- }
- }
- }
- if (!parsedOk) {
- gfree(charset);
- charset = NULL;
- return gFalse;
- }
- }
- return gTrue;
-}
-
-int FoFiType1C::getOp(int pos, GBool charstring, GBool *ok) {
- static char nybChars[16] = "0123456789.ee -";
- Type1COp op;
- char buf[65];
- int b0, b1, nyb0, nyb1, x, i;
-
- b0 = getU8(pos++, ok);
- op.isNum = gTrue;
- op.isFP = gFalse;
-
- if (b0 == 28) {
- x = getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- if (x & 0x8000) {
- x |= ~0xffff;
- }
- op.num = x;
-
- } else if (!charstring && b0 == 29) {
- x = getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- if (x & 0x80000000) {
- x |= ~0xffffffff;
- }
- op.num = x;
-
- } else if (!charstring && b0 == 30) {
- i = 0;
- do {
- b1 = getU8(pos++, ok);
- nyb0 = b1 >> 4;
- nyb1 = b1 & 0x0f;
- if (nyb0 == 0xf) {
- break;
- }
- buf[i++] = nybChars[nyb0];
- if (i == 64) {
- break;
- }
- if (nyb0 == 0xc) {
- buf[i++] = '-';
- }
- if (i == 64) {
- break;
- }
- if (nyb1 == 0xf) {
- break;
- }
- buf[i++] = nybChars[nyb1];
- if (i == 64) {
- break;
- }
- if (nyb1 == 0xc) {
- buf[i++] = '-';
- }
- } while (i < 64);
- buf[i] = '\0';
- op.num = atof(buf);
- op.isFP = gTrue;
-
- } else if (b0 >= 32 && b0 <= 246) {
- op.num = b0 - 139;
-
- } else if (b0 >= 247 && b0 <= 250) {
- op.num = ((b0 - 247) << 8) + getU8(pos++, ok) + 108;
-
- } else if (b0 >= 251 && b0 <= 254) {
- op.num = -((b0 - 251) << 8) - getU8(pos++, ok) - 108;
-
- } else if (charstring && b0 == 255) {
- x = getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- x = (x << 8) | getU8(pos++, ok);
- if (x & 0x80000000) {
- x |= ~0xffffffff;
- }
- op.num = (double)x / 65536.0;
- op.isFP = gTrue;
-
- } else if (b0 == 12) {
- op.isNum = gFalse;
- op.op = 0x0c00 + getU8(pos++, ok);
-
- } else {
- op.isNum = gFalse;
- op.op = b0;
- }
-
- if (nOps < 49) {
- ops[nOps++] = op;
- }
-
- return pos;
-}
-
-// Convert the delta-encoded ops array to an array of ints.
-int FoFiType1C::getDeltaIntArray(int *arr, int maxLen) {
- int x;
- int n, i;
-
- if ((n = nOps) > maxLen) {
- n = maxLen;
- }
- x = 0;
- for (i = 0; i < n; ++i) {
- x += (int)ops[i].num;
- arr[i] = x;
- }
- return n;
-}
-
-// Convert the delta-encoded ops array to an array of doubles.
-int FoFiType1C::getDeltaFPArray(double *arr, int maxLen) {
- double x;
- int n, i;
-
- if ((n = nOps) > maxLen) {
- n = maxLen;
- }
- x = 0;
- for (i = 0; i < n; ++i) {
- x += ops[i].num;
- arr[i] = x;
- }
- return n;
-}
-
-void FoFiType1C::getIndex(int pos, Type1CIndex *idx, GBool *ok) {
- idx->pos = pos;
- idx->len = getU16BE(pos, ok);
- if (idx->len == 0) {
- // empty indexes are legal
- idx->offSize = 0;
- idx->startPos = idx->endPos = 0;
- } else {
- idx->offSize = getU8(pos + 2, ok);
- if (idx->offSize < 1 || idx->offSize > 4) {
- *ok = gFalse;
- }
- idx->startPos = pos + 3 + (idx->len + 1) * idx->offSize - 1;
- if (idx->startPos < 0 || idx->startPos >= len) {
- *ok = gFalse;
- }
- idx->endPos = idx->startPos + getUVarBE(pos + 3 + idx->len * idx->offSize,
- idx->offSize, ok);
- if (idx->endPos < idx->startPos || idx->endPos > len) {
- *ok = gFalse;
- }
- }
-}
-
-void FoFiType1C::getIndexVal(Type1CIndex *idx, int i,
- Type1CIndexVal *val, GBool *ok) {
- int pos0, pos1;
-
- if (i < 0 || i >= idx->len) {
- *ok = gFalse;
- return;
- }
- pos0 = idx->startPos + getUVarBE(idx->pos + 3 + i * idx->offSize,
- idx->offSize, ok);
- pos1 = idx->startPos + getUVarBE(idx->pos + 3 + (i + 1) * idx->offSize,
- idx->offSize, ok);
- if (pos0 < idx->startPos || pos0 >= idx->endPos ||
- pos1 <= idx->startPos || pos1 > idx->endPos ||
- pos1 < pos0) {
- *ok = gFalse;
- }
- val->pos = pos0;
- val->len = pos1 - pos0;
-}
-
-char *FoFiType1C::getString(int sid, char *buf, GBool *ok) {
- Type1CIndexVal val;
- int n;
-
- if (sid < 391) {
- strcpy(buf, fofiType1CStdStrings[sid]);
- } else {
- sid -= 391;
- getIndexVal(&stringIdx, sid, &val, ok);
- if (ok) {
- if ((n = val.len) > 255) {
- n = 255;
- }
- strncpy(buf, (char *)&file[val.pos], n);
- buf[n] = '\0';
- } else {
- buf[0] = '\0';
- }
- }
- return buf;
-}
diff --git a/pdf/fofi/FoFiType1C.h b/pdf/fofi/FoFiType1C.h
deleted file mode 100644
index e6f2b64..0000000
--- a/pdf/fofi/FoFiType1C.h
+++ /dev/null
@@ -1,226 +0,0 @@
-//========================================================================
-//
-// FoFiType1C.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FOFITYPE1C_H
-#define FOFITYPE1C_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "FoFiBase.h"
-
-class GString;
-
-//------------------------------------------------------------------------
-
-struct Type1CIndex {
- int pos; // absolute position in file
- int len; // length (number of entries)
- int offSize; // offset size
- int startPos; // position of start of index data - 1
- int endPos; // position one byte past end of the index
-};
-
-struct Type1CIndexVal {
- int pos; // absolute position in file
- int len; // length, in bytes
-};
-
-struct Type1CTopDict {
- int firstOp;
-
- int versionSID;
- int noticeSID;
- int copyrightSID;
- int fullNameSID;
- int familyNameSID;
- int weightSID;
- int isFixedPitch;
- double italicAngle;
- double underlinePosition;
- double underlineThickness;
- int paintType;
- int charstringType;
- double fontMatrix[6];
- int uniqueID;
- double fontBBox[4];
- double strokeWidth;
- int charsetOffset;
- int encodingOffset;
- int charStringsOffset;
- int privateSize;
- int privateOffset;
-
- // CIDFont entries
- int registrySID;
- int orderingSID;
- int supplement;
- int fdArrayOffset;
- int fdSelectOffset;
-};
-
-#define type1CMaxBlueValues 14
-#define type1CMaxOtherBlues 10
-#define type1CMaxStemSnap 12
-
-struct Type1CPrivateDict {
- int blueValues[type1CMaxBlueValues];
- int nBlueValues;
- int otherBlues[type1CMaxOtherBlues];
- int nOtherBlues;
- int familyBlues[type1CMaxBlueValues];
- int nFamilyBlues;
- int familyOtherBlues[type1CMaxOtherBlues];
- int nFamilyOtherBlues;
- double blueScale;
- int blueShift;
- int blueFuzz;
- double stdHW;
- GBool hasStdHW;
- double stdVW;
- GBool hasStdVW;
- double stemSnapH[type1CMaxStemSnap];
- int nStemSnapH;
- double stemSnapV[type1CMaxStemSnap];
- int nStemSnapV;
- GBool forceBold;
- GBool hasForceBold;
- double forceBoldThreshold;
- int languageGroup;
- double expansionFactor;
- int initialRandomSeed;
- int subrsOffset;
- double defaultWidthX;
- GBool defaultWidthXFP;
- double nominalWidthX;
- GBool nominalWidthXFP;
-};
-
-struct Type1COp {
- GBool isNum; // true -> number, false -> operator
- GBool isFP; // true -> floating point number, false -> int
- union {
- double num; // if num is true
- int op; // if num is false
- };
-};
-
-struct Type1CEexecBuf {
- FoFiOutputFunc outputFunc;
- void *outputStream;
- GBool ascii; // ASCII encoding?
- Gushort r1; // eexec encryption key
- int line; // number of eexec chars left on current line
-};
-
-//------------------------------------------------------------------------
-// FoFiType1C
-//------------------------------------------------------------------------
-
-class FoFiType1C: public FoFiBase {
-public:
-
- // Create a FoFiType1C object from a memory buffer.
- static FoFiType1C *make(char *fileA, int lenA);
-
- // Create a FoFiType1C object from a file on disk.
- static FoFiType1C *load(char *fileName);
-
- virtual ~FoFiType1C();
-
- // Return the font name.
- char *getName();
-
- // Return the encoding, as an array of 256 names (any of which may
- // be NULL). This is only useful with 8-bit fonts.
- char **getEncoding();
-
- // Return the mapping from CIDs to GIDs, and return the number of
- // CIDs in *<nCIDs>. This is only useful for CID fonts.
- Gushort *getCIDToGIDMap(int *nCIDs);
-
- // Convert to a Type 1 font, suitable for embedding in a PostScript
- // file. This is only useful with 8-bit fonts. If <newEncoding> is
- // not NULL, it will be used in place of the encoding in the Type 1C
- // font. If <ascii> is true the eexec section will be hex-encoded,
- // otherwise it will be left as binary data.
- void convertToType1(char **newEncoding, GBool ascii,
- FoFiOutputFunc outputFunc, void *outputStream);
-
- // Convert to a Type 0 CIDFont, suitable for embedding in a
- // PostScript file. <psName> will be used as the PostScript font
- // name.
- void convertToCIDType0(char *psName,
- FoFiOutputFunc outputFunc, void *outputStream);
-
- // Convert to a Type 0 (but non-CID) composite font, suitable for
- // embedding in a PostScript file. <psName> will be used as the
- // PostScript font name.
- void convertToType0(char *psName,
- FoFiOutputFunc outputFunc, void *outputStream);
-
-private:
-
- FoFiType1C(char *fileA, int lenA, GBool freeFileDataA);
- void eexecCvtGlyph(Type1CEexecBuf *eb, char *glyphName,
- int offset, int nBytes,
- Type1CIndex *subrIdx,
- Type1CPrivateDict *pDict);
- void cvtGlyph(int offset, int nBytes, GString *charBuf,
- Type1CIndex *subrIdx, Type1CPrivateDict *pDict,
- GBool top);
- void cvtGlyphWidth(GBool useOp, GString *charBuf,
- Type1CPrivateDict *pDict);
- void cvtNum(double x, GBool isFP, GString *charBuf);
- void eexecWrite(Type1CEexecBuf *eb, char *s);
- void eexecWriteCharstring(Type1CEexecBuf *eb, Guchar *s, int n);
- GBool parse();
- void readTopDict();
- void readFD(int offset, int length, Type1CPrivateDict *pDict);
- void readPrivateDict(int offset, int length, Type1CPrivateDict *pDict);
- void readFDSelect();
- void buildEncoding();
- GBool readCharset();
- int getOp(int pos, GBool charstring, GBool *ok);
- int getDeltaIntArray(int *arr, int maxLen);
- int getDeltaFPArray(double *arr, int maxLen);
- void getIndex(int pos, Type1CIndex *idx, GBool *ok);
- void getIndexVal(Type1CIndex *idx, int i, Type1CIndexVal *val, GBool *ok);
- char *getString(int sid, char *buf, GBool *ok);
-
- GString *name;
- char **encoding;
-
- Type1CIndex nameIdx;
- Type1CIndex topDictIdx;
- Type1CIndex stringIdx;
- Type1CIndex gsubrIdx;
- Type1CIndex charStringsIdx;
-
- Type1CTopDict topDict;
- Type1CPrivateDict *privateDicts;
-
- int nGlyphs;
- int nFDs;
- Guchar *fdSelect;
- Gushort *charset;
- int gsubrBias;
-
- GBool parsedOk;
-
- Type1COp ops[49]; // operands and operator
- int nOps; // number of operands
- int nHints; // number of hints for the current glyph
- GBool firstOp; // true if we haven't hit the first op yet
-};
-
-#endif
diff --git a/pdf/fofi/Makefile.am b/pdf/fofi/Makefile.am
deleted file mode 100644
index 0c1887c..0000000
--- a/pdf/fofi/Makefile.am
+++ /dev/null
@@ -1,21 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/pdf \
- -I$(top_srcdir)/pdf/goo
-
-noinst_LTLIBRARIES = libfofi.la
-
-libfofi_la_SOURCES = \
- FoFiBase.cc \
- FoFiBase.h \
- FoFiEncodings.cc \
- FoFiEncodings.h \
- FoFiTrueType.cc \
- FoFiTrueType.h \
- FoFiType1.cc \
- FoFiType1.h \
- FoFiType1C.cc \
- FoFiType1C.h
-
-EXTRA_DIST = \
- vms_make.com
diff --git a/pdf/fofi/vms_make.com b/pdf/fofi/vms_make.com
deleted file mode 100644
index e69de29..0000000
--- a/pdf/fofi/vms_make.com
+++ /dev/null
diff --git a/pdf/goo/.cvsignore b/pdf/goo/.cvsignore
deleted file mode 100644
index e7315c7..0000000
--- a/pdf/goo/.cvsignore
+++ /dev/null
@@ -1,4 +0,0 @@
-.deps
-Makefile
-Makefile.in
-semantic.cache
diff --git a/pdf/goo/GHash.cc b/pdf/goo/GHash.cc
deleted file mode 100644
index 1dd0e26..0000000
--- a/pdf/goo/GHash.cc
+++ /dev/null
@@ -1,356 +0,0 @@
-//========================================================================
-//
-// GHash.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "GString.h"
-#include "GHash.h"
-
-//------------------------------------------------------------------------
-
-struct GHashBucket {
- GString *key;
- union {
- void *p;
- int i;
- } val;
- GHashBucket *next;
-};
-
-struct GHashIter {
- int h;
- GHashBucket *p;
-};
-
-//------------------------------------------------------------------------
-
-GHash::GHash(GBool deleteKeysA) {
- int h;
-
- deleteKeys = deleteKeysA;
- size = 7;
- tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
- for (h = 0; h < size; ++h) {
- tab[h] = NULL;
- }
- len = 0;
-}
-
-GHash::~GHash() {
- GHashBucket *p;
- int h;
-
- for (h = 0; h < size; ++h) {
- while (tab[h]) {
- p = tab[h];
- tab[h] = p->next;
- if (deleteKeys) {
- delete p->key;
- }
- delete p;
- }
- }
- gfree(tab);
-}
-
-void GHash::add(GString *key, void *val) {
- GHashBucket *p;
- int h;
-
- // expand the table if necessary
- if (len >= size) {
- expand();
- }
-
- // add the new symbol
- p = new GHashBucket;
- p->key = key;
- p->val.p = val;
- h = hash(key);
- p->next = tab[h];
- tab[h] = p;
- ++len;
-}
-
-void GHash::add(GString *key, int val) {
- GHashBucket *p;
- int h;
-
- // expand the table if necessary
- if (len >= size) {
- expand();
- }
-
- // add the new symbol
- p = new GHashBucket;
- p->key = key;
- p->val.i = val;
- h = hash(key);
- p->next = tab[h];
- tab[h] = p;
- ++len;
-}
-
-void *GHash::lookup(GString *key) {
- GHashBucket *p;
- int h;
-
- if (!(p = find(key, &h))) {
- return NULL;
- }
- return p->val.p;
-}
-
-int GHash::lookupInt(GString *key) {
- GHashBucket *p;
- int h;
-
- if (!(p = find(key, &h))) {
- return 0;
- }
- return p->val.i;
-}
-
-void *GHash::lookup(char *key) {
- GHashBucket *p;
- int h;
-
- if (!(p = find(key, &h))) {
- return NULL;
- }
- return p->val.p;
-}
-
-int GHash::lookupInt(char *key) {
- GHashBucket *p;
- int h;
-
- if (!(p = find(key, &h))) {
- return 0;
- }
- return p->val.i;
-}
-
-void *GHash::remove(GString *key) {
- GHashBucket *p;
- GHashBucket **q;
- void *val;
- int h;
-
- if (!(p = find(key, &h))) {
- return NULL;
- }
- q = &tab[h];
- while (*q != p) {
- q = &((*q)->next);
- }
- *q = p->next;
- if (deleteKeys) {
- delete p->key;
- }
- val = p->val.p;
- delete p;
- --len;
- return val;
-}
-
-int GHash::removeInt(GString *key) {
- GHashBucket *p;
- GHashBucket **q;
- int val;
- int h;
-
- if (!(p = find(key, &h))) {
- return 0;
- }
- q = &tab[h];
- while (*q != p) {
- q = &((*q)->next);
- }
- *q = p->next;
- if (deleteKeys) {
- delete p->key;
- }
- val = p->val.i;
- delete p;
- --len;
- return val;
-}
-
-void *GHash::remove(char *key) {
- GHashBucket *p;
- GHashBucket **q;
- void *val;
- int h;
-
- if (!(p = find(key, &h))) {
- return NULL;
- }
- q = &tab[h];
- while (*q != p) {
- q = &((*q)->next);
- }
- *q = p->next;
- if (deleteKeys) {
- delete p->key;
- }
- val = p->val.p;
- delete p;
- --len;
- return val;
-}
-
-int GHash::removeInt(char *key) {
- GHashBucket *p;
- GHashBucket **q;
- int val;
- int h;
-
- if (!(p = find(key, &h))) {
- return 0;
- }
- q = &tab[h];
- while (*q != p) {
- q = &((*q)->next);
- }
- *q = p->next;
- if (deleteKeys) {
- delete p->key;
- }
- val = p->val.i;
- delete p;
- --len;
- return val;
-}
-
-void GHash::startIter(GHashIter **iter) {
- *iter = new GHashIter;
- (*iter)->h = -1;
- (*iter)->p = NULL;
-}
-
-GBool GHash::getNext(GHashIter **iter, GString **key, void **val) {
- if (!*iter) {
- return gFalse;
- }
- if ((*iter)->p) {
- (*iter)->p = (*iter)->p->next;
- }
- while (!(*iter)->p) {
- if (++(*iter)->h == size) {
- delete *iter;
- *iter = NULL;
- return gFalse;
- }
- (*iter)->p = tab[(*iter)->h];
- }
- *key = (*iter)->p->key;
- *val = (*iter)->p->val.p;
- return gTrue;
-}
-
-GBool GHash::getNext(GHashIter **iter, GString **key, int *val) {
- if (!*iter) {
- return gFalse;
- }
- if ((*iter)->p) {
- (*iter)->p = (*iter)->p->next;
- }
- while (!(*iter)->p) {
- if (++(*iter)->h == size) {
- delete *iter;
- *iter = NULL;
- return gFalse;
- }
- (*iter)->p = tab[(*iter)->h];
- }
- *key = (*iter)->p->key;
- *val = (*iter)->p->val.i;
- return gTrue;
-}
-
-void GHash::killIter(GHashIter **iter) {
- delete *iter;
- *iter = NULL;
-}
-
-void GHash::expand() {
- GHashBucket **oldTab;
- GHashBucket *p;
- int oldSize, h, i;
-
- oldSize = size;
- oldTab = tab;
- size = 2*size + 1;
- tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
- for (h = 0; h < size; ++h) {
- tab[h] = NULL;
- }
- for (i = 0; i < oldSize; ++i) {
- while (oldTab[i]) {
- p = oldTab[i];
- oldTab[i] = oldTab[i]->next;
- h = hash(p->key);
- p->next = tab[h];
- tab[h] = p;
- }
- }
- gfree(oldTab);
-}
-
-GHashBucket *GHash::find(GString *key, int *h) {
- GHashBucket *p;
-
- *h = hash(key);
- for (p = tab[*h]; p; p = p->next) {
- if (!p->key->cmp(key)) {
- return p;
- }
- }
- return NULL;
-}
-
-GHashBucket *GHash::find(char *key, int *h) {
- GHashBucket *p;
-
- *h = hash(key);
- for (p = tab[*h]; p; p = p->next) {
- if (!p->key->cmp(key)) {
- return p;
- }
- }
- return NULL;
-}
-
-int GHash::hash(GString *key) {
- char *p;
- unsigned int h;
- int i;
-
- h = 0;
- for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) {
- h = 17 * h + (int)(*p & 0xff);
- }
- return (int)(h % size);
-}
-
-int GHash::hash(char *key) {
- char *p;
- unsigned int h;
-
- h = 0;
- for (p = key; *p; ++p) {
- h = 17 * h + (int)(*p & 0xff);
- }
- return (int)(h % size);
-}
diff --git a/pdf/goo/GHash.h b/pdf/goo/GHash.h
deleted file mode 100644
index 4a6e08d..0000000
--- a/pdf/goo/GHash.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//========================================================================
-//
-// GHash.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GHASH_H
-#define GHASH_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-class GString;
-struct GHashBucket;
-struct GHashIter;
-
-//------------------------------------------------------------------------
-
-class GHash {
-public:
-
- GHash(GBool deleteKeysA = gFalse);
- ~GHash();
- void add(GString *key, void *val);
- void add(GString *key, int val);
- void *lookup(GString *key);
- int lookupInt(GString *key);
- void *lookup(char *key);
- int lookupInt(char *key);
- void *remove(GString *key);
- int removeInt(GString *key);
- void *remove(char *key);
- int removeInt(char *key);
- int getLength() { return len; }
- void startIter(GHashIter **iter);
- GBool getNext(GHashIter **iter, GString **key, void **val);
- GBool getNext(GHashIter **iter, GString **key, int *val);
- void killIter(GHashIter **iter);
-
-private:
-
- void expand();
- GHashBucket *find(GString *key, int *h);
- GHashBucket *find(char *key, int *h);
- int hash(GString *key);
- int hash(char *key);
-
- GBool deleteKeys; // set if key strings should be deleted
- int size; // number of buckets
- int len; // number of entries
- GHashBucket **tab;
-};
-
-#define deleteGHash(hash, T) \
- do { \
- GHash *_hash = (hash); \
- { \
- GHashIter *_iter; \
- GString *_key; \
- void *_p; \
- _hash->startIter(&_iter); \
- while (_hash->getNext(&_iter, &_key, &_p)) { \
- delete (T*)_p; \
- } \
- delete _hash; \
- } \
- } while(0)
-
-#endif
diff --git a/pdf/goo/GList.cc b/pdf/goo/GList.cc
deleted file mode 100644
index 9534232..0000000
--- a/pdf/goo/GList.cc
+++ /dev/null
@@ -1,92 +0,0 @@
-//========================================================================
-//
-// GList.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include "gmem.h"
-#include "GList.h"
-
-//------------------------------------------------------------------------
-// GList
-//------------------------------------------------------------------------
-
-GList::GList() {
- size = 8;
- data = (void **)gmalloc(size * sizeof(void*));
- length = 0;
- inc = 0;
-}
-
-GList::GList(int sizeA) {
- size = sizeA;
- data = (void **)gmalloc(size * sizeof(void*));
- length = 0;
- inc = 0;
-}
-
-GList::~GList() {
- gfree(data);
-}
-
-void GList::append(void *p) {
- if (length >= size) {
- expand();
- }
- data[length++] = p;
-}
-
-void GList::append(GList *list) {
- int i;
-
- while (length + list->length > size) {
- expand();
- }
- for (i = 0; i < list->length; ++i) {
- data[length++] = list->data[i];
- }
-}
-
-void GList::insert(int i, void *p) {
- if (length >= size) {
- expand();
- }
- if (i < length) {
- memmove(data+i+1, data+i, (length - i) * sizeof(void *));
- }
- data[i] = p;
- ++length;
-}
-
-void *GList::del(int i) {
- void *p;
-
- p = data[i];
- if (i < length - 1) {
- memmove(data+i, data+i+1, (length - i - 1) * sizeof(void *));
- }
- --length;
- if (size - length >= ((inc > 0) ? inc : size/2)) {
- shrink();
- }
- return p;
-}
-
-void GList::expand() {
- size += (inc > 0) ? inc : size;
- data = (void **)grealloc(data, size * sizeof(void*));
-}
-
-void GList::shrink() {
- size -= (inc > 0) ? inc : size/2;
- data = (void **)grealloc(data, size * sizeof(void*));
-}
diff --git a/pdf/goo/GList.h b/pdf/goo/GList.h
deleted file mode 100644
index 4c52489..0000000
--- a/pdf/goo/GList.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//========================================================================
-//
-// GList.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GLIST_H
-#define GLIST_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-// GList
-//------------------------------------------------------------------------
-
-class GList {
-public:
-
- // Create an empty list.
- GList();
-
- // Create an empty list with space for <size1> elements.
- GList(int sizeA);
-
- // Destructor - does not free pointed-to objects.
- ~GList();
-
- //----- general
-
- // Get the number of elements.
- int getLength() { return length; }
-
- //----- ordered list support
-
- // Return the <i>th element.
- // Assumes 0 <= i < length.
- void *get(int i) { return data[i]; }
-
- // Append an element to the end of the list.
- void append(void *p);
-
- // Append another list to the end of this one.
- void append(GList *list);
-
- // Insert an element at index <i>.
- // Assumes 0 <= i <= length.
- void insert(int i, void *p);
-
- // Deletes and returns the element at index <i>.
- // Assumes 0 <= i < length.
- void *del(int i);
-
- //----- control
-
- // Set allocation increment to <inc>. If inc > 0, that many
- // elements will be allocated every time the list is expanded.
- // If inc <= 0, the list will be doubled in size.
- void setAllocIncr(int incA) { inc = incA; }
-
-private:
-
- void expand();
- void shrink();
-
- void **data; // the list elements
- int size; // size of data array
- int length; // number of elements on list
- int inc; // allocation increment
-};
-
-#define deleteGList(list, T) \
- do { \
- GList *_list = (list); \
- { \
- int _i; \
- for (_i = 0; _i < _list->getLength(); ++_i) { \
- delete (T*)_list->get(_i); \
- } \
- delete _list; \
- } \
- } while (0)
-
-#endif
diff --git a/pdf/goo/GMutex.h b/pdf/goo/GMutex.h
deleted file mode 100644
index 7fa93d8..0000000
--- a/pdf/goo/GMutex.h
+++ /dev/null
@@ -1,49 +0,0 @@
-//========================================================================
-//
-// GMutex.h
-//
-// Portable mutex macros.
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GMUTEX_H
-#define GMUTEX_H
-
-// Usage:
-//
-// GMutex m;
-// gInitMutex(&m);
-// ...
-// gLockMutex(&m);
-// ... critical section ...
-// gUnlockMutex(&m);
-// ...
-// gDestroyMutex(&m);
-
-#ifdef WIN32
-
-#include <windows.h>
-
-typedef CRITICAL_SECTION GMutex;
-
-#define gInitMutex(m) InitializeCriticalSection(m)
-#define gDestroyMutex(m) DeleteCriticalSection(m)
-#define gLockMutex(m) EnterCriticalSection(m)
-#define gUnlockMutex(m) LeaveCriticalSection(m)
-
-#else // assume pthreads
-
-#include <pthread.h>
-
-typedef pthread_mutex_t GMutex;
-
-#define gInitMutex(m) pthread_mutex_init(m, NULL)
-#define gDestroyMutex(m) pthread_mutex_destroy(m)
-#define gLockMutex(m) pthread_mutex_lock(m)
-#define gUnlockMutex(m) pthread_mutex_unlock(m)
-
-#endif
-
-#endif
diff --git a/pdf/goo/GString.cc b/pdf/goo/GString.cc
deleted file mode 100644
index 7653fd0..0000000
--- a/pdf/goo/GString.cc
+++ /dev/null
@@ -1,236 +0,0 @@
-//========================================================================
-//
-// GString.cc
-//
-// Simple variable-length string type.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <ctype.h>
-#include "gtypes.h"
-#include "GString.h"
-
-static inline int size(int len) {
- int delta;
-
- delta = len < 256 ? 7 : 255;
- return ((len + 1) + delta) & ~delta;
-}
-
-inline void GString::resize(int length1) {
- char *s1;
-
- if (!s) {
- s = new char[size(length1)];
- } else if (size(length1) != size(length)) {
- s1 = new char[size(length1)];
- memcpy(s1, s, length + 1);
- delete[] s;
- s = s1;
- }
-}
-
-GString::GString() {
- s = NULL;
- resize(length = 0);
- s[0] = '\0';
-}
-
-GString::GString(const char *sA) {
- int n = strlen(sA);
-
- s = NULL;
- resize(length = n);
- memcpy(s, sA, n + 1);
-}
-
-GString::GString(const char *sA, int lengthA) {
- s = NULL;
- resize(length = lengthA);
- memcpy(s, sA, length * sizeof(char));
- s[length] = '\0';
-}
-
-GString::GString(GString *str, int idx, int lengthA) {
- s = NULL;
- resize(length = lengthA);
- memcpy(s, str->getCString() + idx, length);
- s[length] = '\0';
-}
-
-GString::GString(GString *str) {
- s = NULL;
- resize(length = str->getLength());
- memcpy(s, str->getCString(), length + 1);
-}
-
-GString::GString(GString *str1, GString *str2) {
- int n1 = str1->getLength();
- int n2 = str2->getLength();
-
- s = NULL;
- resize(length = n1 + n2);
- memcpy(s, str1->getCString(), n1);
- memcpy(s + n1, str2->getCString(), n2 + 1);
-}
-
-GString *GString::fromInt(int x) {
- char buf[24]; // enough space for 64-bit ints plus a little extra
- GBool neg;
- Guint y;
- int i;
-
- i = 24;
- if (x == 0) {
- buf[--i] = '0';
- } else {
- if ((neg = x < 0)) {
- y = (Guint)-x;
- } else {
- y = (Guint)x;
- }
- while (i > 0 && y > 0) {
- buf[--i] = '0' + y % 10;
- y /= 10;
- }
- if (neg && i > 0) {
- buf[--i] = '-';
- }
- }
- return new GString(buf + i, 24 - i);
-}
-
-GString::~GString() {
- delete[] s;
-}
-
-GString *GString::clear() {
- s[length = 0] = '\0';
- resize(0);
- return this;
-}
-
-GString *GString::append(char c) {
- resize(length + 1);
- s[length++] = c;
- s[length] = '\0';
- return this;
-}
-
-GString *GString::append(GString *str) {
- int n = str->getLength();
-
- resize(length + n);
- memcpy(s + length, str->getCString(), n + 1);
- length += n;
- return this;
-}
-
-GString *GString::append(const char *str) {
- int n = strlen(str);
-
- resize(length + n);
- memcpy(s + length, str, n + 1);
- length += n;
- return this;
-}
-
-GString *GString::append(const char *str, int lengthA) {
- resize(length + lengthA);
- memcpy(s + length, str, lengthA);
- length += lengthA;
- s[length] = '\0';
- return this;
-}
-
-GString *GString::insert(int i, char c) {
- int j;
-
- resize(length + 1);
- for (j = length + 1; j > i; --j)
- s[j] = s[j-1];
- s[i] = c;
- ++length;
- return this;
-}
-
-GString *GString::insert(int i, GString *str) {
- int n = str->getLength();
- int j;
-
- resize(length + n);
- for (j = length; j >= i; --j)
- s[j+n] = s[j];
- memcpy(s+i, str->getCString(), n);
- length += n;
- return this;
-}
-
-GString *GString::insert(int i, const char *str) {
- int n = strlen(str);
- int j;
-
- resize(length + n);
- for (j = length; j >= i; --j)
- s[j+n] = s[j];
- memcpy(s+i, str, n);
- length += n;
- return this;
-}
-
-GString *GString::insert(int i, const char *str, int lengthA) {
- int j;
-
- resize(length + lengthA);
- for (j = length; j >= i; --j)
- s[j+lengthA] = s[j];
- memcpy(s+i, str, lengthA);
- length += lengthA;
- return this;
-}
-
-GString *GString::del(int i, int n) {
- int j;
-
- if (n > 0) {
- if (i + n > length) {
- n = length - i;
- }
- for (j = i; j <= length - n; ++j) {
- s[j] = s[j + n];
- }
- resize(length -= n);
- }
- return this;
-}
-
-GString *GString::upperCase() {
- int i;
-
- for (i = 0; i < length; ++i) {
- if (islower(s[i]))
- s[i] = toupper(s[i]);
- }
- return this;
-}
-
-GString *GString::lowerCase() {
- int i;
-
- for (i = 0; i < length; ++i) {
- if (isupper(s[i]))
- s[i] = tolower(s[i]);
- }
- return this;
-}
diff --git a/pdf/goo/GString.h b/pdf/goo/GString.h
deleted file mode 100644
index 2083802..0000000
--- a/pdf/goo/GString.h
+++ /dev/null
@@ -1,100 +0,0 @@
-//========================================================================
-//
-// GString.h
-//
-// Simple variable-length string type.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GSTRING_H
-#define GSTRING_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <string.h>
-
-class GString {
-public:
-
- // Create an empty string.
- GString();
-
- // Create a string from a C string.
- GString(const char *sA);
-
- // Create a string from <lengthA> chars at <sA>. This string
- // can contain null characters.
- GString(const char *sA, int lengthA);
-
- // Create a string from <lengthA> chars at <idx> in <str>.
- GString(GString *str, int idx, int lengthA);
-
- // Copy a string.
- GString(GString *str);
- GString *copy() { return new GString(this); }
-
- // Concatenate two strings.
- GString(GString *str1, GString *str2);
-
- // Convert an integer to a string.
- static GString *fromInt(int x);
-
- // Destructor.
- ~GString();
-
- // Get length.
- int getLength() { return length; }
-
- // Get C string.
- char *getCString() { return s; }
-
- // Get <i>th character.
- char getChar(int i) { return s[i]; }
-
- // Change <i>th character.
- void setChar(int i, char c) { s[i] = c; }
-
- // Clear string to zero length.
- GString *clear();
-
- // Append a character or string.
- GString *append(char c);
- GString *append(GString *str);
- GString *append(const char *str);
- GString *append(const char *str, int lengthA);
-
- // Insert a character or string.
- GString *insert(int i, char c);
- GString *insert(int i, GString *str);
- GString *insert(int i, const char *str);
- GString *insert(int i, const char *str, int lengthA);
-
- // Delete a character or range of characters.
- GString *del(int i, int n = 1);
-
- // Convert string to all-upper/all-lower case.
- GString *upperCase();
- GString *lowerCase();
-
- // Compare two strings: -1:< 0:= +1:>
- // These functions assume the strings do not contain null characters.
- int cmp(GString *str) { return strcmp(s, str->getCString()); }
- int cmpN(GString *str, int n) { return strncmp(s, str->getCString(), n); }
- int cmp(const char *sA) { return strcmp(s, sA); }
- int cmpN(const char *sA, int n) { return strncmp(s, sA, n); }
-
-private:
-
- int length;
- char *s;
-
- void resize(int length1);
-};
-
-#endif
diff --git a/pdf/goo/Makefile.am b/pdf/goo/Makefile.am
deleted file mode 100644
index 793ee87..0000000
--- a/pdf/goo/Makefile.am
+++ /dev/null
@@ -1,34 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/pdf
-
-noinst_LTLIBRARIES = libGoo.la
-
-libGoo_la_SOURCES = \
- GHash.cc \
- GHash.h \
- GList.cc \
- GList.h \
- GMutex.h \
- GString.cc \
- GString.h \
- gmempp.cc \
- gfile.cc \
- gfile.h \
- gmem.c \
- gmem.h \
- gtypes.h \
- parseargs.c \
- parseargs.h \
- gfile.h \
- gmem.h \
- parseargs.h
-
-EXTRA_DIST = \
- vms_directory.c \
- vms_dirent.h \
- vms_sys_dirent.h\
- vms_unix_time.h \
- vms_unix_times.c\
- vms_unlink.c \
- vms_make.com
diff --git a/pdf/goo/gfile.cc b/pdf/goo/gfile.cc
deleted file mode 100644
index 11f5cf6..0000000
--- a/pdf/goo/gfile.cc
+++ /dev/null
@@ -1,705 +0,0 @@
-//========================================================================
-//
-// gfile.cc
-//
-// Miscellaneous file and directory name manipulation.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifndef WIN32
-# if defined(MACOS)
-# include <sys/stat.h>
-# elif !defined(ACORN)
-# include <sys/types.h>
-# include <sys/stat.h>
-# include <fcntl.h>
-# endif
-# include <limits.h>
-# include <string.h>
-# if !defined(VMS) && !defined(ACORN) && !defined(MACOS)
-# include <pwd.h>
-# endif
-# if defined(VMS) && (__DECCXX_VER < 50200000)
-# include <unixlib.h>
-# endif
-#endif // WIN32
-#include "GString.h"
-#include "gfile.h"
-
-// Some systems don't define this, so just make it something reasonably
-// large.
-#ifndef PATH_MAX
-#define PATH_MAX 1024
-#endif
-
-//------------------------------------------------------------------------
-
-GString *getHomeDir() {
-#ifdef VMS
- //---------- VMS ----------
- return new GString("SYS$LOGIN:");
-
-#elif defined(__EMX__) || defined(WIN32)
- //---------- OS/2+EMX and Win32 ----------
- char *s;
- GString *ret;
-
- if ((s = getenv("HOME")))
- ret = new GString(s);
- else
- ret = new GString(".");
- return ret;
-
-#elif defined(ACORN)
- //---------- RISCOS ----------
- return new GString("@");
-
-#elif defined(MACOS)
- //---------- MacOS ----------
- return new GString(":");
-
-#else
- //---------- Unix ----------
- char *s;
- struct passwd *pw;
- GString *ret;
-
- if ((s = getenv("HOME"))) {
- ret = new GString(s);
- } else {
- if ((s = getenv("USER")))
- pw = getpwnam(s);
- else
- pw = getpwuid(getuid());
- if (pw)
- ret = new GString(pw->pw_dir);
- else
- ret = new GString(".");
- }
- return ret;
-#endif
-}
-
-GString *getCurrentDir() {
- char buf[PATH_MAX+1];
-
-#if defined(__EMX__)
- if (_getcwd2(buf, sizeof(buf)))
-#elif defined(WIN32)
- if (GetCurrentDirectory(sizeof(buf), buf))
-#elif defined(ACORN)
- if (strcpy(buf, "@"))
-#elif defined(MACOS)
- if (strcpy(buf, ":"))
-#else
- if (getcwd(buf, sizeof(buf)))
-#endif
- return new GString(buf);
- return new GString();
-}
-
-GString *appendToPath(GString *path, char *fileName) {
-#if defined(VMS)
- //---------- VMS ----------
- //~ this should handle everything necessary for file
- //~ requesters, but it's certainly not complete
- char *p0, *p1, *p2;
- char *q1;
-
- p0 = path->getCString();
- p1 = p0 + path->getLength() - 1;
- if (!strcmp(fileName, "-")) {
- if (*p1 == ']') {
- for (p2 = p1; p2 > p0 && *p2 != '.' && *p2 != '['; --p2) ;
- if (*p2 == '[')
- ++p2;
- path->del(p2 - p0, p1 - p2);
- } else if (*p1 == ':') {
- path->append("[-]");
- } else {
- path->clear();
- path->append("[-]");
- }
- } else if ((q1 = strrchr(fileName, '.')) && !strncmp(q1, ".DIR;", 5)) {
- if (*p1 == ']') {
- path->insert(p1 - p0, '.');
- path->insert(p1 - p0 + 1, fileName, q1 - fileName);
- } else if (*p1 == ':') {
- path->append('[');
- path->append(']');
- path->append(fileName, q1 - fileName);
- } else {
- path->clear();
- path->append(fileName, q1 - fileName);
- }
- } else {
- if (*p1 != ']' && *p1 != ':')
- path->clear();
- path->append(fileName);
- }
- return path;
-
-#elif defined(WIN32)
- //---------- Win32 ----------
- GString *tmp;
- char buf[256];
- char *fp;
-
- tmp = new GString(path);
- tmp->append('/');
- tmp->append(fileName);
- GetFullPathName(tmp->getCString(), sizeof(buf), buf, &fp);
- delete tmp;
- path->clear();
- path->append(buf);
- return path;
-
-#elif defined(ACORN)
- //---------- RISCOS ----------
- char *p;
- int i;
-
- path->append(".");
- i = path->getLength();
- path->append(fileName);
- for (p = path->getCString() + i; *p; ++p) {
- if (*p == '/') {
- *p = '.';
- } else if (*p == '.') {
- *p = '/';
- }
- }
- return path;
-
-#elif defined(MACOS)
- //---------- MacOS ----------
- char *p;
- int i;
-
- path->append(":");
- i = path->getLength();
- path->append(fileName);
- for (p = path->getCString() + i; *p; ++p) {
- if (*p == '/') {
- *p = ':';
- } else if (*p == '.') {
- *p = ':';
- }
- }
- return path;
-
-#elif defined(__EMX__)
- //---------- OS/2+EMX ----------
- int i;
-
- // appending "." does nothing
- if (!strcmp(fileName, "."))
- return path;
-
- // appending ".." goes up one directory
- if (!strcmp(fileName, "..")) {
- for (i = path->getLength() - 2; i >= 0; --i) {
- if (path->getChar(i) == '/' || path->getChar(i) == '\\' ||
- path->getChar(i) == ':')
- break;
- }
- if (i <= 0) {
- if (path->getChar(0) == '/' || path->getChar(0) == '\\') {
- path->del(1, path->getLength() - 1);
- } else if (path->getLength() >= 2 && path->getChar(1) == ':') {
- path->del(2, path->getLength() - 2);
- } else {
- path->clear();
- path->append("..");
- }
- } else {
- if (path->getChar(i-1) == ':')
- ++i;
- path->del(i, path->getLength() - i);
- }
- return path;
- }
-
- // otherwise, append "/" and new path component
- if (path->getLength() > 0 &&
- path->getChar(path->getLength() - 1) != '/' &&
- path->getChar(path->getLength() - 1) != '\\')
- path->append('/');
- path->append(fileName);
- return path;
-
-#else
- //---------- Unix ----------
- int i;
-
- // appending "." does nothing
- if (!strcmp(fileName, "."))
- return path;
-
- // appending ".." goes up one directory
- if (!strcmp(fileName, "..")) {
- for (i = path->getLength() - 2; i >= 0; --i) {
- if (path->getChar(i) == '/')
- break;
- }
- if (i <= 0) {
- if (path->getChar(0) == '/') {
- path->del(1, path->getLength() - 1);
- } else {
- path->clear();
- path->append("..");
- }
- } else {
- path->del(i, path->getLength() - i);
- }
- return path;
- }
-
- // otherwise, append "/" and new path component
- if (path->getLength() > 0 &&
- path->getChar(path->getLength() - 1) != '/')
- path->append('/');
- path->append(fileName);
- return path;
-#endif
-}
-
-GString *grabPath(char *fileName) {
-#ifdef VMS
- //---------- VMS ----------
- char *p;
-
- if ((p = strrchr(fileName, ']')))
- return new GString(fileName, p + 1 - fileName);
- if ((p = strrchr(fileName, ':')))
- return new GString(fileName, p + 1 - fileName);
- return new GString();
-
-#elif defined(__EMX__) || defined(WIN32)
- //---------- OS/2+EMX and Win32 ----------
- char *p;
-
- if ((p = strrchr(fileName, '/')))
- return new GString(fileName, p - fileName);
- if ((p = strrchr(fileName, '\\')))
- return new GString(fileName, p - fileName);
- if ((p = strrchr(fileName, ':')))
- return new GString(fileName, p + 1 - fileName);
- return new GString();
-
-#elif defined(ACORN)
- //---------- RISCOS ----------
- char *p;
-
- if ((p = strrchr(fileName, '.')))
- return new GString(fileName, p - fileName);
- return new GString();
-
-#elif defined(MACOS)
- //---------- MacOS ----------
- char *p;
-
- if ((p = strrchr(fileName, ':')))
- return new GString(fileName, p - fileName);
- return new GString();
-
-#else
- //---------- Unix ----------
- char *p;
-
- if ((p = strrchr(fileName, '/')))
- return new GString(fileName, p - fileName);
- return new GString();
-#endif
-}
-
-GBool isAbsolutePath(char *path) {
-#ifdef VMS
- //---------- VMS ----------
- return strchr(path, ':') ||
- (path[0] == '[' && path[1] != '.' && path[1] != '-');
-
-#elif defined(__EMX__) || defined(WIN32)
- //---------- OS/2+EMX and Win32 ----------
- return path[0] == '/' || path[0] == '\\' || path[1] == ':';
-
-#elif defined(ACORN)
- //---------- RISCOS ----------
- return path[0] == '$';
-
-#elif defined(MACOS)
- //---------- MacOS ----------
- return path[0] != ':';
-
-#else
- //---------- Unix ----------
- return path[0] == '/';
-#endif
-}
-
-GString *makePathAbsolute(GString *path) {
-#ifdef VMS
- //---------- VMS ----------
- char buf[PATH_MAX+1];
-
- if (!isAbsolutePath(path->getCString())) {
- if (getcwd(buf, sizeof(buf))) {
- path->insert(0, buf);
- }
- }
- return path;
-
-#elif defined(WIN32)
- //---------- Win32 ----------
- char buf[_MAX_PATH];
- char *fp;
-
- buf[0] = '\0';
- if (!GetFullPathName(path->getCString(), _MAX_PATH, buf, &fp)) {
- path->clear();
- return path;
- }
- path->clear();
- path->append(buf);
- return path;
-
-#elif defined(ACORN)
- //---------- RISCOS ----------
- path->insert(0, '@');
- return path;
-
-#elif defined(MACOS)
- //---------- MacOS ----------
- path->del(0, 1);
- return path;
-
-#else
- //---------- Unix and OS/2+EMX ----------
- struct passwd *pw;
- char buf[PATH_MAX+1];
- GString *s;
- char *p1, *p2;
- int n;
-
- if (path->getChar(0) == '~') {
- if (path->getChar(1) == '/' ||
-#ifdef __EMX__
- path->getChar(1) == '\\' ||
-#endif
- path->getLength() == 1) {
- path->del(0, 1);
- s = getHomeDir();
- path->insert(0, s);
- delete s;
- } else {
- p1 = path->getCString() + 1;
-#ifdef __EMX__
- for (p2 = p1; *p2 && *p2 != '/' && *p2 != '\\'; ++p2) ;
-#else
- for (p2 = p1; *p2 && *p2 != '/'; ++p2) ;
-#endif
- if ((n = p2 - p1) > PATH_MAX)
- n = PATH_MAX;
- strncpy(buf, p1, n);
- buf[n] = '\0';
- if ((pw = getpwnam(buf))) {
- path->del(0, p2 - p1 + 1);
- path->insert(0, pw->pw_dir);
- }
- }
- } else if (!isAbsolutePath(path->getCString())) {
- if (getcwd(buf, sizeof(buf))) {
-#ifndef __EMX__
- path->insert(0, '/');
-#endif
- path->insert(0, buf);
- }
- }
- return path;
-#endif
-}
-
-time_t getModTime(char *fileName) {
-#ifdef WIN32
- //~ should implement this, but it's (currently) only used in xpdf
- return 0;
-#else
- struct stat statBuf;
-
- if (stat(fileName, &statBuf)) {
- return 0;
- }
- return statBuf.st_mtime;
-#endif
-}
-
-GBool openTempFile(GString **name, FILE **f, char *mode, char *ext) {
-#if defined(WIN32)
- //---------- Win32 ----------
- char *s;
-
- if (!(s = _tempnam(getenv("TEMP"), NULL))) {
- return gFalse;
- }
- *name = new GString(s);
- free(s);
- if (ext) {
- (*name)->append(ext);
- }
- if (!(*f = fopen((*name)->getCString(), mode))) {
- delete (*name);
- return gFalse;
- }
- return gTrue;
-#elif defined(VMS) || defined(__EMX__) || defined(ACORN) || defined(MACOS)
- //---------- non-Unix ----------
- char *s;
-
- // There is a security hole here: an attacker can create a symlink
- // with this file name after the tmpnam call and before the fopen
- // call. I will happily accept fixes to this function for non-Unix
- // OSs.
- if (!(s = tmpnam(NULL))) {
- return gFalse;
- }
- *name = new GString(s);
- if (ext) {
- (*name)->append(ext);
- }
- if (!(*f = fopen((*name)->getCString(), mode))) {
- delete (*name);
- return gFalse;
- }
- return gTrue;
-#else
- //---------- Unix ----------
- char *s;
- int fd;
-
- if (ext) {
-#if HAVE_MKSTEMPS
- if ((s = getenv("TMPDIR"))) {
- *name = new GString(s);
- } else {
- *name = new GString("/tmp");
- }
- (*name)->append("/XXXXXX")->append(ext);
- fd = mkstemps((*name)->getCString(), strlen(ext));
-#else
- if (!(s = tmpnam(NULL))) {
- return gFalse;
- }
- *name = new GString(s);
- (*name)->append(ext);
- fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600);
-#endif
- } else {
-#if HAVE_MKSTEMP
- if ((s = getenv("TMPDIR"))) {
- *name = new GString(s);
- } else {
- *name = new GString("/tmp");
- }
- (*name)->append("/XXXXXX");
- fd = mkstemp((*name)->getCString());
-#else // HAVE_MKSTEMP
- if (!(s = tmpnam(NULL))) {
- return gFalse;
- }
- *name = new GString(s);
- fd = open((*name)->getCString(), O_WRONLY | O_CREAT | O_EXCL, 0600);
-#endif // HAVE_MKSTEMP
- }
- if (fd < 0 || !(*f = fdopen(fd, mode))) {
- delete *name;
- return gFalse;
- }
- return gTrue;
-#endif
-}
-
-GBool executeCommand(char *cmd) {
-#ifdef VMS
- return system(cmd) ? gTrue : gFalse;
-#else
- return system(cmd) ? gFalse : gTrue;
-#endif
-}
-
-char *getLine(char *buf, int size, FILE *f) {
- int c, i;
-
- i = 0;
- while (i < size - 1) {
- if ((c = fgetc(f)) == EOF) {
- break;
- }
- buf[i++] = (char)c;
- if (c == '\x0a') {
- break;
- }
- if (c == '\x0d') {
- c = fgetc(f);
- if (c == '\x0a' && i < size - 1) {
- buf[i++] = (char)c;
- } else if (c != EOF) {
- ungetc(c, f);
- }
- break;
- }
- }
- buf[i] = '\0';
- if (i == 0) {
- return NULL;
- }
- return buf;
-}
-
-//------------------------------------------------------------------------
-// GDir and GDirEntry
-//------------------------------------------------------------------------
-
-GDirEntry::GDirEntry(char *dirPath, char *nameA, GBool doStat) {
-#ifdef VMS
- char *p;
-#elif defined(WIN32)
- int fa;
- GString *s;
-#elif defined(ACORN)
-#else
- struct stat st;
- GString *s;
-#endif
-
- name = new GString(nameA);
- dir = gFalse;
- if (doStat) {
-#ifdef VMS
- if (!strcmp(nameA, "-") ||
- ((p = strrchr(nameA, '.')) && !strncmp(p, ".DIR;", 5)))
- dir = gTrue;
-#elif defined(ACORN)
-#else
- s = new GString(dirPath);
- appendToPath(s, nameA);
-#ifdef WIN32
- fa = GetFileAttributes(s->getCString());
- dir = (fa != 0xFFFFFFFF && (fa & FILE_ATTRIBUTE_DIRECTORY));
-#else
- if (stat(s->getCString(), &st) == 0)
- dir = S_ISDIR(st.st_mode);
-#endif
- delete s;
-#endif
- }
-}
-
-GDirEntry::~GDirEntry() {
- delete name;
-}
-
-GDir::GDir(char *name, GBool doStatA) {
- path = new GString(name);
- doStat = doStatA;
-#if defined(WIN32)
- GString *tmp;
-
- tmp = path->copy();
- tmp->append("/*.*");
- hnd = FindFirstFile(tmp->getCString(), &ffd);
- delete tmp;
-#elif defined(ACORN)
-#elif defined(MACOS)
-#else
- dir = opendir(name);
-#ifdef VMS
- needParent = strchr(name, '[') != NULL;
-#endif
-#endif
-}
-
-GDir::~GDir() {
- delete path;
-#if defined(WIN32)
- if (hnd) {
- FindClose(hnd);
- hnd = NULL;
- }
-#elif defined(ACORN)
-#elif defined(MACOS)
-#else
- if (dir)
- closedir(dir);
-#endif
-}
-
-GDirEntry *GDir::getNextEntry() {
- GDirEntry *e;
-
-#if defined(WIN32)
- if (hnd) {
- e = new GDirEntry(path->getCString(), ffd.cFileName, doStat);
- if (hnd && !FindNextFile(hnd, &ffd)) {
- FindClose(hnd);
- hnd = NULL;
- }
- } else {
- e = NULL;
- }
-#elif defined(ACORN)
-#elif defined(MACOS)
-#elif defined(VMS)
- struct dirent *ent;
- e = NULL;
- if (dir) {
- if (needParent) {
- e = new GDirEntry(path->getCString(), "-", doStat);
- needParent = gFalse;
- return e;
- }
- ent = readdir(dir);
- if (ent) {
- e = new GDirEntry(path->getCString(), ent->d_name, doStat);
- }
- }
-#else
- struct dirent *ent;
- e = NULL;
- if (dir) {
- ent = readdir(dir);
- if (ent && !strcmp(ent->d_name, ".")) {
- ent = readdir(dir);
- }
- if (ent) {
- e = new GDirEntry(path->getCString(), ent->d_name, doStat);
- }
- }
-#endif
-
- return e;
-}
-
-void GDir::rewind() {
-#ifdef WIN32
- GString *tmp;
-
- if (hnd)
- FindClose(hnd);
- tmp = path->copy();
- tmp->append("/*.*");
- hnd = FindFirstFile(tmp->getCString(), &ffd);
- delete tmp;
-#elif defined(ACORN)
-#elif defined(MACOS)
-#else
- if (dir)
- rewinddir(dir);
-#ifdef VMS
- needParent = strchr(path->getCString(), '[') != NULL;
-#endif
-#endif
-}
diff --git a/pdf/goo/gfile.h b/pdf/goo/gfile.h
deleted file mode 100644
index d364d8d..0000000
--- a/pdf/goo/gfile.h
+++ /dev/null
@@ -1,140 +0,0 @@
-//========================================================================
-//
-// gfile.h
-//
-// Miscellaneous file and directory name manipulation.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GFILE_H
-#define GFILE_H
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-extern "C" {
-#if defined(WIN32)
-# include <sys/stat.h>
-# ifdef FPTEX
-# include <win32lib.h>
-# else
-# include <windows.h>
-# endif
-#elif defined(ACORN)
-#elif defined(MACOS)
-# include <ctime.h>
-#else
-# include <unistd.h>
-# include <sys/types.h>
-# ifdef VMS
-# include "vms_dirent.h"
-# elif HAVE_DIRENT_H
-# include <dirent.h>
-# define NAMLEN(d) strlen((d)->d_name)
-# else
-# define dirent direct
-# define NAMLEN(d) (d)->d_namlen
-# if HAVE_SYS_NDIR_H
-# include <sys/ndir.h>
-# endif
-# if HAVE_SYS_DIR_H
-# include <sys/dir.h>
-# endif
-# if HAVE_NDIR_H
-# include <ndir.h>
-# endif
-# endif
-#endif
-}
-#include "gtypes.h"
-
-class GString;
-
-//------------------------------------------------------------------------
-
-// Get home directory path.
-extern GString *getHomeDir();
-
-// Get current directory.
-extern GString *getCurrentDir();
-
-// Append a file name to a path string. <path> may be an empty
-// string, denoting the current directory). Returns <path>.
-extern GString *appendToPath(GString *path, char *fileName);
-
-// Grab the path from the front of the file name. If there is no
-// directory component in <fileName>, returns an empty string.
-extern GString *grabPath(char *fileName);
-
-// Is this an absolute path or file name?
-extern GBool isAbsolutePath(char *path);
-
-// Make this path absolute by prepending current directory (if path is
-// relative) or prepending user's directory (if path starts with '~').
-extern GString *makePathAbsolute(GString *path);
-
-// Get the modification time for <fileName>. Returns 0 if there is an
-// error.
-extern time_t getModTime(char *fileName);
-
-// Create a temporary file and open it for writing. If <ext> is not
-// NULL, it will be used as the file name extension. Returns both the
-// name and the file pointer. For security reasons, all writing
-// should be done to the returned file pointer; the file may be
-// reopened later for reading, but not for writing. The <mode> string
-// should be "w" or "wb". Returns true on success.
-extern GBool openTempFile(GString **name, FILE **f, char *mode, char *ext);
-
-// Execute <command>. Returns true on success.
-extern GBool executeCommand(char *cmd);
-
-// Just like fgets, but handles Unix, Mac, and/or DOS end-of-line
-// conventions.
-extern char *getLine(char *buf, int size, FILE *f);
-
-//------------------------------------------------------------------------
-// GDir and GDirEntry
-//------------------------------------------------------------------------
-
-class GDirEntry {
-public:
-
- GDirEntry(char *dirPath, char *nameA, GBool doStat);
- ~GDirEntry();
- GString *getName() { return name; }
- GBool isDir() { return dir; }
-
-private:
-
- GString *name; // dir/file name
- GBool dir; // is it a directory?
-};
-
-class GDir {
-public:
-
- GDir(char *name, GBool doStatA = gTrue);
- ~GDir();
- GDirEntry *getNextEntry();
- void rewind();
-
-private:
-
- GString *path; // directory path
- GBool doStat; // call stat() for each entry?
-#if defined(WIN32)
- WIN32_FIND_DATA ffd;
- HANDLE hnd;
-#elif defined(ACORN)
-#elif defined(MACOS)
-#else
- DIR *dir; // the DIR structure from opendir()
-#ifdef VMS
- GBool needParent; // need to return an entry for [-]
-#endif
-#endif
-};
-
-#endif
diff --git a/pdf/goo/gmem.c b/pdf/goo/gmem.c
deleted file mode 100644
index 07bbf81..0000000
--- a/pdf/goo/gmem.c
+++ /dev/null
@@ -1,204 +0,0 @@
-/*
- * gmem.c
- *
- * Memory routines with out-of-memory checking.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "gmem.h"
-
-#ifdef DEBUG_MEM
-
-typedef struct _GMemHdr {
- int size;
- int index;
- struct _GMemHdr *next;
-} GMemHdr;
-
-#define gMemHdrSize ((sizeof(GMemHdr) + 7) & ~7)
-#define gMemTrlSize (sizeof(long))
-
-#if gmemTrlSize==8
-#define gMemDeadVal 0xdeadbeefdeadbeefUL
-#else
-#define gMemDeadVal 0xdeadbeefUL
-#endif
-
-/* round data size so trailer will be aligned */
-#define gMemDataSize(size) \
- ((((size) + gMemTrlSize - 1) / gMemTrlSize) * gMemTrlSize)
-
-#define gMemNLists 64
-#define gMemListShift 4
-#define gMemListMask (gMemNLists - 1)
-static GMemHdr *gMemList[gMemNLists] = {
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
- NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
-};
-
-static int gMemIndex = 0;
-static int gMemAlloc = 0;
-
-#endif /* DEBUG_MEM */
-
-void *gmalloc(int size) {
-#ifdef DEBUG_MEM
- int size1;
- char *mem;
- GMemHdr *hdr;
- void *data;
- int lst;
- unsigned long *trl, *p;
-
- if (size == 0)
- return NULL;
- size1 = gMemDataSize(size);
- if (!(mem = (char *)malloc(size1 + gMemHdrSize + gMemTrlSize))) {
- fprintf(stderr, "Out of memory\n");
- exit(1);
- }
- hdr = (GMemHdr *)mem;
- data = (void *)(mem + gMemHdrSize);
- trl = (unsigned long *)(mem + gMemHdrSize + size1);
- hdr->size = size;
- hdr->index = gMemIndex++;
- lst = ((int)hdr >> gMemListShift) & gMemListMask;
- hdr->next = gMemList[lst];
- gMemList[lst] = hdr;
- ++gMemAlloc;
- for (p = (unsigned long *)data; p <= trl; ++p)
- *p = gMemDeadVal;
- return data;
-#else
- void *p;
-
- if (size == 0)
- return NULL;
- if (!(p = malloc(size))) {
- fprintf(stderr, "Out of memory\n");
- exit(1);
- }
- return p;
-#endif
-}
-
-void *grealloc(void *p, int size) {
-#ifdef DEBUG_MEM
- GMemHdr *hdr;
- void *q;
- int oldSize;
-
- if (size == 0) {
- if (p)
- gfree(p);
- return NULL;
- }
- if (p) {
- hdr = (GMemHdr *)((char *)p - gMemHdrSize);
- oldSize = hdr->size;
- q = gmalloc(size);
- memcpy(q, p, size < oldSize ? size : oldSize);
- gfree(p);
- } else {
- q = gmalloc(size);
- }
- return q;
-#else
- void *q;
-
- if (size == 0) {
- if (p)
- free(p);
- return NULL;
- }
- if (p)
- q = realloc(p, size);
- else
- q = malloc(size);
- if (!q) {
- fprintf(stderr, "Out of memory\n");
- exit(1);
- }
- return q;
-#endif
-}
-
-void gfree(void *p) {
-#ifdef DEBUG_MEM
- int size;
- GMemHdr *hdr;
- GMemHdr *prevHdr, *q;
- int lst;
- unsigned long *trl, *clr;
-
- if (p) {
- hdr = (GMemHdr *)((char *)p - gMemHdrSize);
- lst = ((int)hdr >> gMemListShift) & gMemListMask;
- for (prevHdr = NULL, q = gMemList[lst]; q; prevHdr = q, q = q->next) {
- if (q == hdr)
- break;
- }
- if (q) {
- if (prevHdr)
- prevHdr->next = hdr->next;
- else
- gMemList[lst] = hdr->next;
- --gMemAlloc;
- size = gMemDataSize(hdr->size);
- trl = (unsigned long *)((char *)hdr + gMemHdrSize + size);
- if (*trl != gMemDeadVal) {
- fprintf(stderr, "Overwrite past end of block %d at address %p\n",
- hdr->index, p);
- }
- for (clr = (unsigned long *)hdr; clr <= trl; ++clr)
- *clr = gMemDeadVal;
- free(hdr);
- } else {
- fprintf(stderr, "Attempted to free bad address %p\n", p);
- }
- }
-#else
- if (p)
- free(p);
-#endif
-}
-
-#ifdef DEBUG_MEM
-void gMemReport(FILE *f) {
- GMemHdr *p;
- int lst;
-
- fprintf(f, "%d memory allocations in all\n", gMemIndex);
- if (gMemAlloc > 0) {
- fprintf(f, "%d memory blocks left allocated:\n", gMemAlloc);
- fprintf(f, " index size\n");
- fprintf(f, "-------- --------\n");
- for (lst = 0; lst < gMemNLists; ++lst) {
- for (p = gMemList[lst]; p; p = p->next)
- fprintf(f, "%8d %8d\n", p->index, p->size);
- }
- } else {
- fprintf(f, "No memory blocks left allocated\n");
- }
-}
-#endif
-
-char *copyString(char *s) {
- char *s1;
-
- s1 = (char *)gmalloc(strlen(s) + 1);
- strcpy(s1, s);
- return s1;
-}
diff --git a/pdf/goo/gmem.h b/pdf/goo/gmem.h
deleted file mode 100644
index 587e7fa..0000000
--- a/pdf/goo/gmem.h
+++ /dev/null
@@ -1,53 +0,0 @@
-/*
- * gmem.h
- *
- * Memory routines with out-of-memory checking.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-#ifndef GMEM_H
-#define GMEM_H
-
-#include <stdio.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Same as malloc, but prints error message and exits if malloc()
- * returns NULL.
- */
-extern void *gmalloc(int size);
-
-/*
- * Same as realloc, but prints error message and exits if realloc()
- * returns NULL. If <p> is NULL, calls malloc instead of realloc().
- */
-extern void *grealloc(void *p, int size);
-
-/*
- * Same as free, but checks for and ignores NULL pointers.
- */
-extern void gfree(void *p);
-
-#ifdef DEBUG_MEM
-/*
- * Report on unfreed memory.
- */
-extern void gMemReport(FILE *f);
-#else
-#define gMemReport(f)
-#endif
-
-/*
- * Allocate memory and copy a string into it.
- */
-extern char *copyString(char *s);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif
diff --git a/pdf/goo/gmempp.cc b/pdf/goo/gmempp.cc
deleted file mode 100644
index b1ee970..0000000
--- a/pdf/goo/gmempp.cc
+++ /dev/null
@@ -1,32 +0,0 @@
-//========================================================================
-//
-// gmempp.cc
-//
-// Use gmalloc/gfree for C++ new/delete operators.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include "gmem.h"
-
-#ifdef DEBUG_MEM
-
-void *operator new(size_t size) {
- return gmalloc((int)size);
-}
-
-void *operator new[](size_t size) {
- return gmalloc((int)size);
-}
-
-void operator delete(void *p) {
- gfree(p);
-}
-
-void operator delete[](void *p) {
- gfree(p);
-}
-
-#endif
diff --git a/pdf/goo/gtypes.h b/pdf/goo/gtypes.h
deleted file mode 100644
index 9f64f57..0000000
--- a/pdf/goo/gtypes.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * gtypes.h
- *
- * Some useful simple types.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-#ifndef GTYPES_H
-#define GTYPES_H
-
-/*
- * These have stupid names to avoid conflicts with some (but not all)
- * C++ compilers which define them.
- */
-typedef int GBool;
-#define gTrue 1
-#define gFalse 0
-
-/*
- * These have stupid names to avoid conflicts with <sys/types.h>,
- * which on various systems defines some random subset of these.
- */
-typedef unsigned char Guchar;
-typedef unsigned short Gushort;
-typedef unsigned int Guint;
-typedef unsigned long Gulong;
-
-#endif
diff --git a/pdf/goo/parseargs.c b/pdf/goo/parseargs.c
deleted file mode 100644
index 6bcde2c..0000000
--- a/pdf/goo/parseargs.c
+++ /dev/null
@@ -1,195 +0,0 @@
-/*
- * parseargs.h
- *
- * Command line argument parser.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-#include <locale.h>
-#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])) {
- {
- char *theLocale = setlocale(LC_NUMERIC, "C");
- *(double *)arg->val = atof(argv[i+1]);
- setlocale(LC_NUMERIC, theLocale);
- }
- 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 --git a/pdf/goo/parseargs.h b/pdf/goo/parseargs.h
deleted file mode 100644
index 0d163b9..0000000
--- a/pdf/goo/parseargs.h
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * parseargs.h
- *
- * Command line argument parser.
- *
- * Copyright 1996-2003 Glyph & Cog, LLC
- */
-
-#ifndef PARSEARGS_H
-#define PARSEARGS_H
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#include "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 --git a/pdf/goo/vms_directory.c b/pdf/goo/vms_directory.c
deleted file mode 100644
index 92d9493..0000000
--- a/pdf/goo/vms_directory.c
+++ /dev/null
@@ -1,214 +0,0 @@
-/*
- * DIRECTORY.C - VMS emulation routines for UNIX Directory
- * callable routines
- *
- * Author: Patrick L. Mahan
- * Location: TGV, Inc
- * Date: 19-November-1991
- *
- * Purpose: Provides emulation of the BSD directory routines
- * which are used by some of the X11 R4 release
- * software.
- *
- * Side effects: This is only a partial emulation. Not all of
- * the required information is passed to the user.
- *
- * Modification History
- *
- * Date | Who | Version | History
- * ------------+-----------+---------------+----------------------------
- * 19-Nov-1991 | PLM | 1.0 | First Write
- * 20-Apr-1992 | PLM | 1.1 | Added validation check for
- * | | | for the directory
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <rmsdef.h>
-#include <descrip.h>
-#include <lib$routines.h>
-#include "vms_dirent.h"
-
-#define NOWILD 0x00000001
-#define MULTIPLE 0x00000002
-
-static unsigned long context = 0;
-
-static struct dsc$descriptor_s *create_descriptor ( name )
-char *name;
-{
- struct dsc$descriptor_s *retdescrip;
-
- retdescrip = (struct dsc$descriptor_s *)calloc(1, sizeof(struct dsc$descriptor_s));
-
- if (retdescrip == NULL) return ((struct dsc$descriptor_s *)NULL);
-
- retdescrip->dsc$b_dtype = DSC$K_DTYPE_T;
- retdescrip->dsc$b_class = DSC$K_CLASS_S;
- retdescrip->dsc$w_length = strlen(name);
- retdescrip->dsc$a_pointer = name;
-
- return (retdescrip);
-}
-
-static int Check_Directory( dirname )
-char *dirname;
-{
- static char *tmpdir, *cp;
- FILE *tfp;
- int status;
-
- status = 1;
-
- tmpdir = calloc(strlen(dirname)+15,sizeof(char));
-
- strcpy(tmpdir, dirname);
-
- cp = strrchr(tmpdir, '.');
-
- if (cp != NULL) {
- *cp = ']';
- cp = strrchr(tmpdir, ']');
- *cp = '.';
- strcat(tmpdir, "dir");
- }
- else {
- char *tmp1;
- tmp1 = calloc(strlen(dirname)+1,sizeof(char));
- cp = strchr(tmpdir, '[');
- cp++;
- strcpy(tmp1, cp);
- cp = strrchr(tmp1, ']');
- *cp = '\0';
- cp = strchr(tmpdir, '[');
- cp++;
- *cp = '\0';
- strcat(tmpdir, "000000]");
- strcat(tmpdir, tmp1);
- strcat(tmpdir, ".dir");
- }
-
- tfp = fopen(tmpdir, "r");
-
- if (tfp == NULL) status = 0;
-
- fclose(tfp);
-
- return (status);
-}
-
-DIR *opendir( dirname )
-char *dirname;
-{
- DIR *retdir;
- struct dsc$descriptor_s filedescriptor;
- char *filepathname;
-
- retdir = (DIR *) calloc(1, sizeof(DIR));
-
- if (retdir == NULL) return ((DIR *)NULL);
-
- if (!Check_Directory(dirname)) return ((DIR *)NULL);
-
- filepathname = (char *)calloc(256, sizeof(char));
-
- strcpy(filepathname, dirname);
- strcat(filepathname, "*.*.*");
-
- retdir->dd_fd = (unsigned long) create_descriptor(filepathname);
- retdir->dd_loc = 0;
- retdir->dd_size = strlen(filepathname);
- retdir->dd_bsize = 0;
- retdir->dd_off = 0;
- retdir->dd_buf = filepathname;
-
- return (retdir);
-}
-
-struct dirent *readdir( dirp )
-DIR *dirp;
-{
- static struct dirent *retdirent;
- struct dsc$descriptor_s retfilenamedesc;
- struct dsc$descriptor_s searchpathdesc = *((struct dsc$descriptor_s *)dirp->dd_fd);
- char retfilename[256];
- char *sp;
- unsigned long istatus;
- unsigned long rms_status;
- unsigned long flags;
-
- retdirent = (struct dirent *)NULL;
-
- flags = MULTIPLE;
-
- retfilenamedesc.dsc$b_dtype = DSC$K_DTYPE_T;
- retfilenamedesc.dsc$b_class = DSC$K_CLASS_S;
- retfilenamedesc.dsc$w_length = 255;
- retfilenamedesc.dsc$a_pointer= retfilename;
-
- istatus = lib$find_file (&searchpathdesc,
- &retfilenamedesc,
- &dirp->dd_loc,
- 0, 0,
- &rms_status,
- &flags);
-
- if (!(istatus & 1) && (istatus != RMS$_NMF) && (istatus != RMS$_FNF))
- {
- lib$signal (istatus);
- return (retdirent);
- }
- else if ((istatus == RMS$_NMF) || (istatus == RMS$_FNF))
- return (retdirent);
-
- retfilename[retfilenamedesc.dsc$w_length] = '\0';
-
- sp = strchr(retfilename, ' ');
- if (sp != NULL) *sp = '\0';
-
- sp = strrchr(retfilename, ']');
- if (sp != NULL)
- sp++;
- else
- sp = retfilename;
-
- retdirent = (struct dirent *)calloc(1, sizeof(struct dirent));
-
- strcpy(retdirent->d_name, sp);
- retdirent->d_namlen = strlen(sp);
- retdirent->d_fileno = 0;
- retdirent->d_off = 0;
- retdirent->d_reclen = DIRSIZ(retdirent);
-
- return (retdirent);
-}
-
-long telldir( dirp )
-DIR *dirp;
-{
- return(0);
-}
-
-void seekdir( dirp, loc )
-DIR *dirp;
-int loc;
-{
- return;
-}
-
-void rewinddir( dirp )
-DIR *dirp;
-{
- lib$find_file_end (&dirp->dd_loc);
-}
-
-void closedir( dirp )
-DIR *dirp;
-{
- lib$find_file_end (&dirp->dd_loc);
-
- cfree ((void *) dirp->dd_fd);
- cfree (dirp->dd_buf);
- cfree (dirp);
-}
diff --git a/pdf/goo/vms_dirent.h b/pdf/goo/vms_dirent.h
deleted file mode 100644
index 13e21a0..0000000
--- a/pdf/goo/vms_dirent.h
+++ /dev/null
@@ -1,67 +0,0 @@
-/* @(#)dirent.h 1.7 89/06/25 SMI */
-
-/*
- * Filesystem-independent directory information.
- */
-
-#ifndef __dirent_h
-#define __dirent_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Make sure we don't get the V7 RTL dirent functions. These are broken. */
-
-#ifndef __CRTL_VER
-# define __CRTL_VER __VMS_VER
-#endif
-#if __CRTL_VER >= 70000000
-#include <dirent.h>
-#endif
-
-#include <types.h>
-
-#define opendir goo_opendir
-#define readdir goo_readdir
-#define closedir goo_closedir
-#define seekdir goo_seekdir
-#define telldir goo_telldir
-#define rewinddir goo_rewindir
-#define DIR GOO_DIR
-
-#ifndef _POSIX_SOURCE
-#define d_ino d_fileno /* compatability */
-#ifndef NULL
-#define NULL 0
-#endif
-#endif /* !_POSIX_SOURCE */
-
-/*
- * Definitions for library routines operating on directories.
- */
-typedef struct __dirdesc {
- unsigned long dd_fd; /* file descriptor */
- long dd_loc; /* buf offset of entry from last readddir() */
- long dd_size; /* amount of valid data in buffer */
- long dd_bsize; /* amount of entries read at a time */
- long dd_off; /* Current offset in dir (for telldir) */
- char *dd_buf; /* directory data buffer */
-} DIR;
-
-#include "vms_sys_dirent.h"
-
-extern DIR *opendir(char *dirname);
-extern struct dirent *readdir(DIR *dirp);
-extern void closedir(DIR *dirp);
-#ifndef _POSIX_SOURCE
-extern void seekdir(DIR *dirp, int loc);
-extern long telldir(DIR *dirp);
-#endif /* POSIX_SOURCE */
-extern void rewinddir(DIR *dirp);
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !__dirent_h */
diff --git a/pdf/goo/vms_make.com b/pdf/goo/vms_make.com
deleted file mode 100644
index 676643f..0000000
--- a/pdf/goo/vms_make.com
+++ /dev/null
@@ -1,82 +0,0 @@
-$!========================================================================
-$!
-$! Goo library compile script for VMS.
-$!
-$! Written by Patrick Moreau, Martin P.J. Zinser.
-$!
-$! Copyright 1996-2003 Glyph & Cog, LLC
-$!
-$!========================================================================
-$!
-$ GOO_CXXOBJS = "GString.obj,gmempp.obj,gfile.obj,ghash.obj,glist.obj"
-$ GOO_CCOBJS = "gmem.obj,parseargs.obj,vms_directory.obj,vms_unix_times.obj"
-$!
-$ if f$extract(1,3,f$getsyi("Version")) .lts. "7.0"
-$ then
-$ GOO_CCOBJS = GOO_CCOBJS + ",vms_unlink.obj"
-$ endif
-$!
-$ i = 0
-$ j = 0
-$COMPILE_CXX_LOOP:
-$ file = f$element(i, ",",GOO_CXXOBJS)
-$ if file .eqs. "," then goto COMPILE_CC_LOOP
-$ i = i + 1
-$ name = f$parse(file,,,"NAME")
-$ call make 'file "CXXCOMP ''name'.cc" -
- 'name'.cc
-$ goto COMPILE_CXX_LOOP
-$!
-$COMPILE_CC_LOOP:
-$ file = f$element(j, ",",GOO_CCOBJS)
-$ if file .eqs. "," then goto COMPILE_END
-$ j = j + 1
-$ name = f$parse(file,,,"NAME")
-$ call make 'file "CCOMP ''name'.c" -
- 'name'.c
-$ goto COMPILE_CC_LOOP
-$!
-$COMPILE_END:
-$ call make libgoo.olb "lib/cre libgoo.olb ''GOO_CXXOBJS',''GOO_CCOBJS'" *.obj
-$!
-$ exit
-$!
-$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
-$ V = 'F$Verify(0)
-$! P1 = What we are trying to make
-$! P2 = Command to make it
-$! P3 - P8 What it depends on
-$
-$ If F$Search(P1) .Eqs. "" Then Goto Makeit
-$ Time = F$CvTime(F$File(P1,"RDT"))
-$arg=3
-$Loop:
-$ Argument = P'arg
-$ If Argument .Eqs. "" Then Goto Exit
-$ El=0
-$Loop2:
-$ File = F$Element(El," ",Argument)
-$ If File .Eqs. " " Then Goto Endl
-$ AFile = ""
-$Loop3:
-$ OFile = AFile
-$ AFile = F$Search(File)
-$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
-$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
-$ Goto Loop3
-$NextEL:
-$ El = El + 1
-$ Goto Loop2
-$EndL:
-$ arg=arg+1
-$ If arg .Le. 8 Then Goto Loop
-$ Goto Exit
-$
-$Makeit:
-$ VV=F$VERIFY(0)
-$ write sys$output P2
-$ 'P2
-$ VV='F$Verify(VV)
-$Exit:
-$ If V Then Set Verify
-$ENDSUBROUTINE
diff --git a/pdf/goo/vms_sys_dirent.h b/pdf/goo/vms_sys_dirent.h
deleted file mode 100644
index 2c20d71..0000000
--- a/pdf/goo/vms_sys_dirent.h
+++ /dev/null
@@ -1,54 +0,0 @@
-/* @(#)dirent.h 1.4 89/06/16 SMI */
-
-/*
- * Filesystem-independent directory information.
- * Directory entry structures are of variable length.
- * Each directory entry is a struct dirent containing its file number, the
- * offset of the next entry (a cookie interpretable only the filesystem
- * type that generated it), the length of the entry, and the length of the
- * name contained in the entry. These are followed by the name. The
- * entire entry is padded with null bytes to a 4 byte boundary. All names
- * are guaranteed null terminated. The maximum length of a name in a
- * directory is MAXNAMLEN, plus a null byte.
- */
-
-#ifndef __sys_dirent_h
-#define __sys_dirent_h
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-#define dirent GOO_dirent
-
-struct dirent {
- long d_off; /* offset of next disk dir entry */
- unsigned long d_fileno; /* file number of entry */
- unsigned short d_reclen; /* length of this record */
- unsigned short d_namlen; /* length of string in d_name */
- char d_name[255+1]; /* name (up to MAXNAMLEN + 1) */
-};
-
-#ifndef _POSIX_SOURCE
-/*
- * It's unlikely to change, but make sure that sizeof d_name above is
- * at least MAXNAMLEN + 1 (more may be added for padding).
- */
-#define MAXNAMLEN 255
-/*
- * The macro DIRSIZ(dp) gives the minimum amount of space required to represent
- * a directory entry. For any directory entry dp->d_reclen >= DIRSIZ(dp).
- * Specific filesystem types may use this macro to construct the value
- * for d_reclen.
- */
-#undef DIRSIZ
-#define DIRSIZ(dp) \
- (((sizeof(struct dirent) - (MAXNAMLEN+1) + ((dp)->d_namlen+1)) +3) & ~3)
-
-#endif /* !_POSIX_SOURCE */
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /* !__sys_dirent_h */
diff --git a/pdf/goo/vms_unix_time.h b/pdf/goo/vms_unix_time.h
deleted file mode 100644
index f8e8382..0000000
--- a/pdf/goo/vms_unix_time.h
+++ /dev/null
@@ -1,102 +0,0 @@
-/* @(#)time.h 2.9 87/01/17 SMI; from UCB 7.1 6/4/86 */
-
-/*
- Definitions of various structures used on UNIX for
- time-related syscalls.
-*/
-
-/*
- * Copyright (c) 1982, 1986 Regents of the University of California.
- * All rights reserved. The Berkeley software License Agreement
- * specifies the terms and conditions for redistribution.
- */
-
-#ifndef _UNIX_TIME_
-#define _UNIX_TIME_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Structure returned by gettimeofday(2) system call,
- * and used in other calls.
- */
-#ifndef __DECC
-struct timeval
-{
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
-};
-#else
-#if (__DECC_VER < 50200000) && (__VMS_VER < 70000000)
-struct timeval
-{
- long tv_sec; /* seconds */
- long tv_usec; /* and microseconds */
-};
-#endif /* __DECC_VER */
-#endif /* __DECC */
-struct timezone
-{
- int tz_minuteswest; /* minutes west of Greenwich */
- int tz_dsttime; /* type of dst correction */
-};
-
-#define DST_NONE 0 /* not on dst */
-#define DST_USA 1 /* USA style dst */
-#define DST_AUST 2 /* Australian style dst */
-#define DST_WET 3 /* Western European dst */
-#define DST_MET 4 /* Middle European dst */
-#define DST_EET 5 /* Eastern European dst */
-#define DST_CAN 6 /* Canada */
-#define DST_GB 7 /* Great Britain and Eire */
-#define DST_RUM 8 /* Rumania */
-#define DST_TUR 9 /* Turkey */
-#define DST_AUSTALT 10 /* Australian style with shift in 1986 */
-
-/*
- * Operations on timevals.
- *
- * NB: timercmp does not work for >= or <=.
- */
-#define timerisset(tvp) ((tvp)->tv_sec || (tvp)->tv_usec)
-#define timercmp(tvp, uvp, cmp) \
- ((tvp)->tv_sec cmp (uvp)->tv_sec || \
- (tvp)->tv_sec == (uvp)->tv_sec && (tvp)->tv_usec cmp (uvp)->tv_usec)
-#define timerclear(tvp) (tvp)->tv_sec = (tvp)->tv_usec = 0
-
-/*
- * Names of the interval timers, and structure
- * defining a timer setting.
- */
-#define ITIMER_REAL 0
-#define ITIMER_VIRTUAL 1
-#define ITIMER_PROF 2
-
-#ifndef __DECC
-struct itimerval
-{
- struct timeval it_interval; /* timer interval */
- struct timeval it_value; /* current value */
-};
-#else
-#if (__DECC_VER < 50200000) && (__VMS_VER < 70000000)
-struct itimerval
-{
- struct timeval it_interval; /* timer interval */
- struct timeval it_value; /* current value */
-};
-#endif /* __DECC_VER */
-#endif /* __DECC */
-
-#ifndef KERNEL
-#include <time.h>
-#endif
-
-#ifdef __cplusplus
-}
-#endif
-
-#endif /*!_UNIX_TIME_*/
-
diff --git a/pdf/goo/vms_unix_times.c b/pdf/goo/vms_unix_times.c
deleted file mode 100644
index 004c0d0..0000000
--- a/pdf/goo/vms_unix_times.c
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * UNIX-style Time Functions
- *
- */
-#include <stdio.h>
-#include <signal.h>
-#include <time.h>
-#include "vms_unix_time.h"
-
-/*
- * gettimeofday(2) - Returns the current time
- *
- * NOTE: The timezone portion is useless on VMS.
- * Even on UNIX, it is only provided for backwards
- * compatibilty and is not guaranteed to be correct.
- */
-
-#if (__VMS_VER < 70000000)
-int gettimeofday(tv, tz)
-struct timeval *tv;
-struct timezone *tz;
-{
- timeb_t tmp_time;
-
- ftime(&tmp_time);
-
- if (tv != NULL)
- {
- tv->tv_sec = tmp_time.time;
- tv->tv_usec = tmp_time.millitm * 1000;
- }
-
- if (tz != NULL)
- {
- tz->tz_minuteswest = tmp_time.timezone;
- tz->tz_dsttime = tmp_time.dstflag;
- }
-
- return (0);
-
-} /*** End gettimeofday() ***/
-#endif
diff --git a/pdf/goo/vms_unlink.c b/pdf/goo/vms_unlink.c
deleted file mode 100644
index e2cf687..0000000
--- a/pdf/goo/vms_unlink.c
+++ /dev/null
@@ -1,22 +0,0 @@
-/*
- * vms_unlink.c
- *
- * A UNIX-style unlink() function for VMS.
- *
- * Thanks to Patrick Moreau (pmoreau@cena.dgac.fr).
- */
-
-#include <descrip.h>
-#include <string.h>
-#include <lib$routines.h>
-
-int unlink(char *filename) {
- static struct dsc$descriptor_s file_desc;
-
- file_desc.dsc$w_length = strlen(filename);
- file_desc.dsc$b_dtype = DSC$K_DTYPE_T;
- file_desc.dsc$b_class = DSC$K_CLASS_S;
- file_desc.dsc$a_pointer= filename;
-
- return (lib$delete_file(&file_desc));
-}
diff --git a/pdf/xpdf/pdf-document.cc b/pdf/pdf-document.cc
index 41c2eb8..a749d36 100644
--- a/pdf/xpdf/pdf-document.cc
+++ b/pdf/pdf-document.cc
@@ -19,28 +19,26 @@
#include <glib/gi18n.h>
-#include "gpdf-g-switch.h"
#include "pdf-document.h"
#include "ev-ps-exporter.h"
#include "ev-document-find.h"
#include "ev-document-misc.h"
-#include "gpdf-g-switch.h"
#include "ev-document-links.h"
#include "ev-document-security.h"
#include "ev-document-thumbnails.h"
-#include "GlobalParams.h"
-#include "GDKSplashOutputDev.h"
-#include "SplashBitmap.h"
-#include "PDFDoc.h"
-#include "Outline.h"
-#include "ErrorCodes.h"
-#include "UnicodeMap.h"
-#include "GlobalParams.h"
-#include "GfxState.h"
+#include <goo/GooList.h>
+#include <splash/SplashBitmap.h>
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+#include <Outline.h>
+#include <ErrorCodes.h>
+#include <UnicodeMap.h>
+#include <GfxState.h>
+#include <PSOutputDev.h>
+
#include "Thumb.h"
-#include "goo/GList.h"
-#include "PSOutputDev.h"
+#include "GDKSplashOutputDev.h"
enum {
PROP_0,
@@ -163,8 +161,8 @@ pdf_document_load (EvDocument *document,
PDFDoc *newDoc;
int err;
char *filename;
- GString *filename_g;
- GString *enc;
+ GooString *filename_g;
+ GooString *enc;
if (!globalParams) {
globalParams = new GlobalParams("/etc/xpdfrc");
@@ -172,7 +170,7 @@ pdf_document_load (EvDocument *document,
}
if (! pdf_document->umap) {
- enc = new GString("UTF-8");
+ enc = new GooString("UTF-8");
pdf_document->umap = globalParams->getUnicodeMap(enc);
pdf_document->umap->incRefCnt ();
delete enc;
@@ -182,13 +180,13 @@ pdf_document_load (EvDocument *document,
if (!filename)
return FALSE;
- filename_g = new GString (filename);
+ filename_g = new GooString (filename);
g_free (filename);
// open the PDF file, assumes ownership of filename_g
- GString *password = NULL;
+ GooString *password = NULL;
if (pdf_document->password)
- password = new GString (pdf_document->password);
+ password = new GooString (pdf_document->password);
newDoc = new PDFDoc(filename_g, password, password);
if (password)
delete password;
@@ -236,7 +234,7 @@ pdf_document_save (EvDocument *document,
filename = g_filename_from_uri (uri, NULL, error);
if (filename != NULL) {
- GString *fname = new GString (filename);
+ GooString *fname = new GooString (filename);
retval = pdf_document->doc->saveAs (fname);
}
@@ -744,8 +742,7 @@ pdf_document_ps_export_end (EvPSExporter *exporter)
/* EvDocumentLinks Implementation */
typedef struct
{
- /* goo GList, not glib */
- GList *items;
+ GooList *items;
int index;
int level;
} LinksIter;
@@ -754,7 +751,7 @@ static gchar *
unicode_to_char (OutlineItem *outline_item,
UnicodeMap *uMap)
{
- GString gstr;
+ GooString gstr;
gchar buf[8]; /* 8 is enough for mapping an unicode char to a string */
int i, n;
@@ -789,7 +786,7 @@ pdf_document_links_begin_read (EvDocumentLinks *document_links)
PdfDocument *pdf_document = PDF_DOCUMENT (document_links);
Outline *outline;
LinksIter *iter;
- GList *items;
+ GooList *items;
g_return_val_if_fail (PDF_IS_DOCUMENT (document_links), NULL);
@@ -813,7 +810,7 @@ build_link_from_action (PdfDocument *pdf_document,
{
EvLink *link = NULL;
- if (link_action == NULL) {
+ if (link_action == NULL) {
link = ev_link_new_title (title);
} else if (link_action->getKind () == actionGoToR) {
g_warning ("actionGoToR links not implemented");
@@ -828,7 +825,7 @@ build_link_from_action (PdfDocument *pdf_document,
LinkGoTo *link_goto;
Ref page_ref;
gint page_num = 0;
- GString *named_dest;
+ GooString *named_dest;
link_goto = dynamic_cast <LinkGoTo *> (link_action);
link_dest = link_goto->getDest ();
@@ -995,7 +992,7 @@ pdf_document_set_property (GObject *object,
}
static gboolean
-has_unicode_marker (GString *string)
+has_unicode_marker (GooString *string)
{
return ((string->getChar (0) & 0xff) == 0xfe &&
(string->getChar (1) & 0xff) == 0xff);
@@ -1004,7 +1001,7 @@ has_unicode_marker (GString *string)
static gchar *
pdf_info_dict_get_string (Dict *info_dict, const gchar *key) {
Object obj;
- GString *value;
+ GooString *value;
gchar *result;
g_return_val_if_fail (info_dict != NULL, NULL);
@@ -1051,7 +1048,7 @@ static char *
pdf_document_get_text (EvDocument *document, GdkRectangle *rect)
{
PdfDocument *pdf_document = PDF_DOCUMENT (document);
- GString *sel_text = new GString;
+ GooString *sel_text = new GooString;
const char *text;
int x1, y1, x2, y2;
diff --git a/pdf/xpdf/pdf-document.h b/pdf/pdf-document.h
index 5b119b4..5b119b4 100644
--- a/pdf/xpdf/pdf-document.h
+++ b/pdf/pdf-document.h
diff --git a/pdf/splash/.cvsignore b/pdf/splash/.cvsignore
deleted file mode 100644
index 282522d..0000000
--- a/pdf/splash/.cvsignore
+++ /dev/null
@@ -1,2 +0,0 @@
-Makefile
-Makefile.in
diff --git a/pdf/splash/Makefile.am b/pdf/splash/Makefile.am
deleted file mode 100644
index 4a4ec28..0000000
--- a/pdf/splash/Makefile.am
+++ /dev/null
@@ -1,54 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/pdf \
- -I$(top_srcdir)/pdf/goo \
- -I$(top_srcdir)/pdf/fofi \
- $(FREETYPE_CFLAGS)
-
-noinst_LTLIBRARIES = libsplash.la
-
-libsplash_la_SOURCES = \
- Splash.cc \
- Splash.h \
- SplashBitmap.cc \
- SplashBitmap.h \
- SplashClip.cc \
- SplashClip.h \
- SplashErrorCodes.h \
- SplashFTFont.cc \
- SplashFTFont.h \
- SplashFTFontEngine.cc \
- SplashFTFontEngine.h \
- SplashFTFontFile.cc \
- SplashFTFontFile.h \
- SplashFont.cc \
- SplashFont.h \
- SplashFontEngine.cc \
- SplashFontEngine.h \
- SplashFontFile.cc \
- SplashFontFile.h \
- SplashFontFileID.cc \
- SplashFontFileID.h \
- SplashGlyphBitmap.h \
- SplashMath.h \
- SplashPath.cc \
- SplashPath.h \
- SplashPattern.cc \
- SplashPattern.h \
- SplashScreen.cc \
- SplashScreen.h \
- SplashState.cc \
- SplashState.h \
- SplashT1Font.cc \
- SplashT1Font.h \
- SplashT1FontEngine.cc \
- SplashT1FontEngine.h \
- SplashT1FontFile.cc \
- SplashT1FontFile.h \
- SplashTypes.h \
- SplashXPath.cc \
- SplashXPath.h \
- SplashXPathScanner.cc \
- SplashXPathScanner.h
-
-EXTRA_DIST = vms_make.com
diff --git a/pdf/splash/Splash.cc b/pdf/splash/Splash.cc
deleted file mode 100644
index 6202dd1..0000000
--- a/pdf/splash/Splash.cc
+++ /dev/null
@@ -1,1732 +0,0 @@
-//========================================================================
-//
-// Splash.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "SplashErrorCodes.h"
-#include "SplashMath.h"
-#include "SplashBitmap.h"
-#include "SplashState.h"
-#include "SplashPath.h"
-#include "SplashXPath.h"
-#include "SplashXPathScanner.h"
-#include "SplashPattern.h"
-#include "SplashScreen.h"
-#include "SplashClip.h"
-#include "SplashFont.h"
-#include "SplashGlyphBitmap.h"
-#include "Splash.h"
-
-//------------------------------------------------------------------------
-// Splash
-//------------------------------------------------------------------------
-
-Splash::Splash(SplashBitmap *bitmapA) {
- bitmap = bitmapA;
- state = new SplashState(bitmap->width, bitmap->height);
- debugMode = gFalse;
-}
-
-Splash::~Splash() {
- while (state->next) {
- restoreState();
- }
- delete state;
-}
-
-//------------------------------------------------------------------------
-// state read
-//------------------------------------------------------------------------
-
-
-SplashPattern *Splash::getStrokePattern() {
- return state->strokePattern;
-}
-
-SplashPattern *Splash::getFillPattern() {
- return state->fillPattern;
-}
-
-SplashScreen *Splash::getScreen() {
- return state->screen;
-}
-
-SplashCoord Splash::getLineWidth() {
- return state->lineWidth;
-}
-
-int Splash::getLineCap() {
- return state->lineCap;
-}
-
-int Splash::getLineJoin() {
- return state->lineJoin;
-}
-
-SplashCoord Splash::getMiterLimit() {
- return state->miterLimit;
-}
-
-SplashCoord Splash::getFlatness() {
- return state->flatness;
-}
-
-SplashCoord *Splash::getLineDash() {
- return state->lineDash;
-}
-
-int Splash::getLineDashLength() {
- return state->lineDashLength;
-}
-
-SplashCoord Splash::getLineDashPhase() {
- return state->lineDashPhase;
-}
-
-SplashClip *Splash::getClip() {
- return state->clip;
-}
-
-//------------------------------------------------------------------------
-// state write
-//------------------------------------------------------------------------
-
-void Splash::setStrokePattern(SplashPattern *strokePattern) {
- state->setStrokePattern(strokePattern);
-}
-
-void Splash::setFillPattern(SplashPattern *fillPattern) {
- state->setFillPattern(fillPattern);
-}
-
-void Splash::setScreen(SplashScreen *screen) {
- state->setScreen(screen);
-}
-
-void Splash::setLineWidth(SplashCoord lineWidth) {
- state->lineWidth = lineWidth;
-}
-
-void Splash::setLineCap(int lineCap) {
- state->lineCap = lineCap;
-}
-
-void Splash::setLineJoin(int lineJoin) {
- state->lineJoin = lineJoin;
-}
-
-void Splash::setMiterLimit(SplashCoord miterLimit) {
- state->miterLimit = miterLimit;
-}
-
-void Splash::setFlatness(SplashCoord flatness) {
- if (flatness < 1) {
- state->flatness = 1;
- } else {
- state->flatness = flatness;
- }
-}
-
-void Splash::setLineDash(SplashCoord *lineDash, int lineDashLength,
- SplashCoord lineDashPhase) {
- state->setLineDash(lineDash, lineDashLength, lineDashPhase);
-}
-
-void Splash::clipResetToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- state->clip->resetToRect(x0, y0, x1, y1);
-}
-
-SplashError Splash::clipToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- return state->clip->clipToRect(x0, y0, x1, y1);
-}
-
-SplashError Splash::clipToPath(SplashPath *path, GBool eo) {
- return state->clip->clipToPath(path, state->flatness, eo);
-}
-
-//------------------------------------------------------------------------
-// state save/restore
-//------------------------------------------------------------------------
-
-void Splash::saveState() {
- SplashState *newState;
-
- newState = state->copy();
- newState->next = state;
- state = newState;
-}
-
-SplashError Splash::restoreState() {
- SplashState *oldState;
-
- if (!state->next) {
- return splashErrNoSave;
- }
- oldState = state;
- state = state->next;
- delete oldState;
- return splashOk;
-}
-
-//------------------------------------------------------------------------
-// drawing operations
-//------------------------------------------------------------------------
-
-void Splash::clear(SplashColor color) {
- SplashMono1P *mono1;
- SplashMono8 *mono8;
- SplashRGB8 *rgb8;
- SplashRGB8P *rgb8pline, *rgb8p;
- SplashBGR8P *bgr8line, *bgr8;
- SplashMono1 data;
- int n, i, x, y;
-
- switch (bitmap->mode) {
- case splashModeMono1:
- n = ((bitmap->width + 7) >> 3) * bitmap->height;
- data = color.mono1 ? 0xff : 0x00;
- for (i = 0, mono1 = bitmap->data.mono1; i < n; ++i, ++mono1) {
- *mono1 = data;
- }
- break;
- case splashModeMono8:
- n = bitmap->width * bitmap->height;
- for (i = 0, mono8 = bitmap->data.mono8; i < n; ++i, ++mono8) {
- *mono8 = color.mono8;
- }
- break;
- case splashModeRGB8:
- n = bitmap->width * bitmap->height;
- for (i = 0, rgb8 = bitmap->data.rgb8; i < n; ++i, ++rgb8) {
- *rgb8 = color.rgb8;
- }
- break;
- case splashModeRGB8Packed:
- rgb8pline = bitmap->data.rgb8p;
- for (y = 0; y < bitmap->height; ++y) {
- rgb8p = rgb8pline;
- for (x = 0; x < bitmap->width; ++x) {
- rgb8p[0] = splashRGB8R(color.rgb8);
- rgb8p[1] = splashRGB8G(color.rgb8);
- rgb8p[2] = splashRGB8B(color.rgb8);
- rgb8p += 3;
- }
- rgb8pline += bitmap->rowSize;
- }
- break;
- case splashModeBGR8Packed:
- bgr8line = bitmap->data.bgr8;
- for (y = 0; y < bitmap->height; ++y) {
- bgr8 = bgr8line;
- for (x = 0; x < bitmap->width; ++x) {
- bgr8[2] = splashBGR8R(color.bgr8);
- bgr8[1] = splashBGR8G(color.bgr8);
- bgr8[0] = splashBGR8B(color.bgr8);
- bgr8 += 3;
- }
- bgr8line += bitmap->rowSize;
- }
- break;
- }
-}
-
-SplashError Splash::stroke(SplashPath *path) {
- SplashXPath *xPath, *xPath2;
-
- if (debugMode) {
- printf("stroke [dash:%d] [width:%.2f]:\n",
- state->lineDashLength, state->lineWidth);
- dumpPath(path);
- }
- if (path->length == 0) {
- return splashErrEmptyPath;
- }
- xPath = new SplashXPath(path, state->flatness, gFalse);
- if (state->lineDashLength > 0) {
- xPath2 = makeDashedPath(xPath);
- delete xPath;
- xPath = xPath2;
- }
- if (state->lineWidth <= 1) {
- strokeNarrow(xPath);
- } else {
- strokeWide(xPath);
- }
- delete xPath;
- return splashOk;
-}
-
-void Splash::strokeNarrow(SplashXPath *xPath) {
- SplashXPathSeg *seg;
- int x0, x1, x2, x3, y0, y1, x, y, t;
- SplashCoord dx, dy, dxdy;
- SplashClipResult clipRes;
- int i;
-
- for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) {
-
- x0 = splashFloor(seg->x0);
- x1 = splashFloor(seg->x1);
- y0 = splashFloor(seg->y0);
- y1 = splashFloor(seg->y1);
-
- // horizontal segment
- if (y0 == y1) {
- if (x0 > x1) {
- t = x0; x0 = x1; x1 = t;
- }
- if ((clipRes = state->clip->testSpan(x0, x1, y0))
- != splashClipAllOutside) {
- drawSpan(x0, x1, y0, state->strokePattern,
- clipRes == splashClipAllInside);
- }
-
- // segment with |dx| > |dy|
- } else if (splashAbs(seg->dxdy) > 1) {
- dx = seg->x1 - seg->x0;
- dy = seg->y1 - seg->y0;
- dxdy = seg->dxdy;
- if (y0 > y1) {
- t = y0; y0 = y1; y1 = t;
- t = x0; x0 = x1; x1 = t;
- dx = -dx;
- dy = -dy;
- }
- if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0,
- x0 <= x1 ? x1 : x0, y1))
- != splashClipAllOutside) {
- if (dx > 0) {
- x2 = x0;
- for (y = y0; y < y1; ++y) {
- x3 = splashFloor(seg->x0 + (y + 1 - seg->y0) * dxdy);
- drawSpan(x2, x3 - 1, y, state->strokePattern,
- clipRes == splashClipAllInside);
- x2 = x3;
- }
- drawSpan(x2, x1, y, state->strokePattern,
- clipRes == splashClipAllInside);
- } else {
- x2 = x0;
- for (y = y0; y < y1; ++y) {
- x3 = splashFloor(seg->x0 + (y + 1 - seg->y0) * dxdy);
- drawSpan(x3 + 1, x2, y, state->strokePattern,
- clipRes == splashClipAllInside);
- x2 = x3;
- }
- drawSpan(x1, x2, y, state->strokePattern,
- clipRes == splashClipAllInside);
- }
- }
-
- // segment with |dy| > |dx|
- } else {
- dxdy = seg->dxdy;
- if (y0 > y1) {
- t = y0; y0 = y1; y1 = t;
- }
- if ((clipRes = state->clip->testRect(x0 <= x1 ? x0 : x1, y0,
- x0 <= x1 ? x1 : x0, y1))
- != splashClipAllOutside) {
- for (y = y0; y <= y1; ++y) {
- x = splashFloor(seg->x0 + (y - seg->y0) * dxdy);
- drawPixel(x, y, state->strokePattern,
- clipRes == splashClipAllInside);
- }
- }
- }
- }
-}
-
-void Splash::strokeWide(SplashXPath *xPath) {
- SplashXPathSeg *seg, *seg2;
- SplashPath *widePath;
- SplashCoord d, dx, dy, wdx, wdy, dxPrev, dyPrev, wdxPrev, wdyPrev;
- SplashCoord dotprod, miter;
- int i, j;
-
- dx = dy = wdx = wdy = 0; // make gcc happy
- dxPrev = dyPrev = wdxPrev = wdyPrev = 0; // make gcc happy
-
- for (i = 0, seg = xPath->segs; i < xPath->length; ++i, ++seg) {
-
- // save the deltas for the previous segment; if this is the first
- // segment on a subpath, compute the deltas for the last segment
- // on the subpath (which may be used to draw a line join)
- if (seg->flags & splashXPathFirst) {
- for (j = i + 1, seg2 = &xPath->segs[j]; j < xPath->length; ++j, ++seg2) {
- if (seg2->flags & splashXPathLast) {
- d = splashDist(seg2->x0, seg2->y0, seg2->x1, seg2->y1);
- if (d == 0) {
- //~ not clear what the behavior should be for joins with d==0
- dxPrev = 0;
- dyPrev = 1;
- } else {
- d = 1 / d;
- dxPrev = d * (seg2->x1 - seg2->x0);
- dyPrev = d * (seg2->y1 - seg2->y0);
- }
- wdxPrev = 0.5 * state->lineWidth * dxPrev;
- wdyPrev = 0.5 * state->lineWidth * dyPrev;
- break;
- }
- }
- } else {
- dxPrev = dx;
- dyPrev = dy;
- wdxPrev = wdx;
- wdyPrev = wdy;
- }
-
- // compute deltas for this line segment
- d = splashDist(seg->x0, seg->y0, seg->x1, seg->y1);
- if (d == 0) {
- // we need to draw end caps on zero-length lines
- //~ not clear what the behavior should be for splashLineCapButt with d==0
- dx = 0;
- dy = 1;
- } else {
- d = 1 / d;
- dx = d * (seg->x1 - seg->x0);
- dy = d * (seg->y1 - seg->y0);
- }
- wdx = 0.5 * state->lineWidth * dx;
- wdy = 0.5 * state->lineWidth * dy;
-
- // initialize the path (which will be filled)
- widePath = new SplashPath();
- widePath->moveTo(seg->x0 - wdy, seg->y0 + wdx);
-
- // draw the start cap
- if (seg->flags & splashXPathEnd0) {
- switch (state->lineCap) {
- case splashLineCapButt:
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- break;
- case splashLineCapRound:
- widePath->arcCWTo(seg->x0 + wdy, seg->y0 - wdx, seg->x0, seg->y0);
- break;
- case splashLineCapProjecting:
- widePath->lineTo(seg->x0 - wdx - wdy, seg->y0 + wdx - wdy);
- widePath->lineTo(seg->x0 - wdx + wdy, seg->y0 - wdx - wdy);
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- break;
- }
- } else {
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- }
-
- // draw the left side of the segment
- widePath->lineTo(seg->x1 + wdy, seg->y1 - wdx);
-
- // draw the end cap
- if (seg->flags & splashXPathEnd1) {
- switch (state->lineCap) {
- case splashLineCapButt:
- widePath->lineTo(seg->x1 - wdy, seg->y1 + wdx);
- break;
- case splashLineCapRound:
- widePath->arcCWTo(seg->x1 - wdy, seg->y1 + wdx, seg->x1, seg->y1);
- break;
- case splashLineCapProjecting:
- widePath->lineTo(seg->x1 + wdx + wdy, seg->y1 - wdx + wdy);
- widePath->lineTo(seg->x1 + wdx - wdy, seg->y1 + wdx + wdy);
- widePath->lineTo(seg->x1 - wdy, seg->y1 + wdx);
- break;
- }
- } else {
- widePath->lineTo(seg->x1 - wdy, seg->y1 + wdx);
- }
-
- // draw the right side of the segment
- widePath->lineTo(seg->x0 - wdy, seg->y0 + wdx);
-
- // fill the segment
- fillWithPattern(widePath, gTrue, state->strokePattern);
- delete widePath;
-
- // draw the line join
- if (!(seg->flags & splashXPathEnd0)) {
- widePath = NULL;
- switch (state->lineJoin) {
- case splashLineJoinMiter:
- dotprod = -(dx * dxPrev + dy * dyPrev);
- if (dotprod != 1) {
- widePath = new SplashPath();
- widePath->moveTo(seg->x0, seg->y0);
- miter = 2 / (1 - dotprod);
- if (splashSqrt(miter) <= state->miterLimit) {
- miter = splashSqrt(miter - 1);
- if (dy * dxPrev > dx * dyPrev) {
- widePath->lineTo(seg->x0 + wdyPrev, seg->y0 - wdxPrev);
- widePath->lineTo(seg->x0 + wdy - miter * wdx,
- seg->y0 - wdx - miter * wdy);
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- } else {
- widePath->lineTo(seg->x0 - wdyPrev, seg->y0 + wdxPrev);
- widePath->lineTo(seg->x0 - wdy - miter * wdx,
- seg->y0 + wdx - miter * wdy);
- widePath->lineTo(seg->x0 - wdy, seg->y0 + wdx);
- }
- } else {
- if (dy * dxPrev > dx * dyPrev) {
- widePath->lineTo(seg->x0 + wdyPrev, seg->y0 - wdxPrev);
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- } else {
- widePath->lineTo(seg->x0 - wdyPrev, seg->y0 + wdxPrev);
- widePath->lineTo(seg->x0 - wdy, seg->y0 + wdx);
- }
- }
- }
- break;
- case splashLineJoinRound:
- widePath = new SplashPath();
- widePath->moveTo(seg->x0 + wdy, seg->y0 - wdx);
- widePath->arcCWTo(seg->x0 + wdy, seg->y0 - wdx, seg->x0, seg->y0);
- break;
- case splashLineJoinBevel:
- widePath = new SplashPath();
- widePath->moveTo(seg->x0, seg->y0);
- if (dy * dxPrev > dx * dyPrev) {
- widePath->lineTo(seg->x0 + wdyPrev, seg->y0 - wdxPrev);
- widePath->lineTo(seg->x0 + wdy, seg->y0 - wdx);
- } else {
- widePath->lineTo(seg->x0 - wdyPrev, seg->y0 + wdxPrev);
- widePath->lineTo(seg->x0 - wdy, seg->y0 + wdx);
- }
- break;
- }
- if (widePath) {
- fillWithPattern(widePath, gTrue, state->strokePattern);
- delete widePath;
- }
- }
- }
-}
-
-SplashXPath *Splash::makeDashedPath(SplashXPath *xPath) {
- SplashXPath *dPath;
- GBool lineDashStartOn, lineDashOn;
- GBool atSegStart, atSegEnd, atDashStart, atDashEnd;
- int lineDashStartIdx, lineDashIdx, subpathStart;
- SplashCoord lineDashTotal, lineDashStartPhase, lineDashDist;
- int segIdx;
- SplashXPathSeg *seg;
- SplashCoord sx0, sy0, sx1, sy1, ax0, ay0, ax1, ay1, dist;
- int i;
-
- dPath = new SplashXPath();
-
- lineDashTotal = 0;
- for (i = 0; i < state->lineDashLength; ++i) {
- lineDashTotal += state->lineDash[i];
- }
- lineDashStartPhase = state->lineDashPhase;
- i = splashFloor(lineDashStartPhase / lineDashTotal);
- lineDashStartPhase -= i * lineDashTotal;
- lineDashStartOn = gTrue;
- lineDashStartIdx = 0;
- while (lineDashStartPhase >= state->lineDash[lineDashStartIdx]) {
- lineDashStartOn = !lineDashStartOn;
- lineDashStartPhase -= state->lineDash[lineDashStartIdx];
- ++lineDashStartIdx;
- }
-
- segIdx = 0;
- seg = xPath->segs;
- sx0 = seg->x0;
- sy0 = seg->y0;
- sx1 = seg->x1;
- sy1 = seg->y1;
- dist = splashDist(sx0, sy0, sx1, sy1);
- lineDashOn = lineDashStartOn;
- lineDashIdx = lineDashStartIdx;
- lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase;
- atSegStart = gTrue;
- atDashStart = gTrue;
- subpathStart = dPath->length;
-
- while (segIdx < xPath->length) {
-
- ax0 = sx0;
- ay0 = sy0;
- if (dist <= lineDashDist) {
- ax1 = sx1;
- ay1 = sy1;
- lineDashDist -= dist;
- dist = 0;
- atSegEnd = gTrue;
- atDashEnd = lineDashDist == 0 || (seg->flags & splashXPathLast);
- } else {
- ax1 = sx0 + (lineDashDist / dist) * (sx1 - sx0);
- ay1 = sy0 + (lineDashDist / dist) * (sy1 - sy0);
- sx0 = ax1;
- sy0 = ay1;
- dist -= lineDashDist;
- lineDashDist = 0;
- atSegEnd = gFalse;
- atDashEnd = gTrue;
- }
-
- if (lineDashOn) {
- dPath->addSegment(ax0, ay0, ax1, ay1,
- atDashStart, atDashEnd,
- atDashStart, atDashEnd);
- // end of closed subpath
- if (atSegEnd &&
- (seg->flags & splashXPathLast) &&
- !(seg->flags & splashXPathEnd1)) {
- dPath->segs[subpathStart].flags &= ~splashXPathEnd0;
- dPath->segs[dPath->length - 1].flags &= ~splashXPathEnd1;
- }
- }
-
- if (atDashEnd) {
- lineDashOn = !lineDashOn;
- if (++lineDashIdx == state->lineDashLength) {
- lineDashIdx = 0;
- }
- lineDashDist = state->lineDash[lineDashIdx];
- atDashStart = gTrue;
- } else {
- atDashStart = gFalse;
- }
- if (atSegEnd) {
- if (++segIdx < xPath->length) {
- ++seg;
- sx0 = seg->x0;
- sy0 = seg->y0;
- sx1 = seg->x1;
- sy1 = seg->y1;
- dist = splashDist(sx0, sy0, sx1, sy1);
- if (seg->flags & splashXPathFirst) {
- lineDashOn = lineDashStartOn;
- lineDashIdx = lineDashStartIdx;
- lineDashDist = state->lineDash[lineDashIdx] - lineDashStartPhase;
- atDashStart = gTrue;
- subpathStart = dPath->length;
- }
- }
- atSegStart = gTrue;
- } else {
- atSegStart = gFalse;
- }
- }
-
- return dPath;
-}
-
-SplashError Splash::fill(SplashPath *path, GBool eo) {
- if (debugMode) {
- printf("fill [eo:%d]:\n", eo);
- dumpPath(path);
- }
- return fillWithPattern(path, eo, state->fillPattern);
-}
-
-SplashError Splash::fillWithPattern(SplashPath *path, GBool eo,
- SplashPattern *pattern) {
- SplashXPath *xPath;
- SplashXPathScanner *scanner;
- int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
- SplashClipResult clipRes, clipRes2;
-
- if (path->length == 0 || path->length == 1) {
- return splashErrEmptyPath;
- }
- xPath = new SplashXPath(path, state->flatness, gTrue);
- xPath->sort();
- scanner = new SplashXPathScanner(xPath, eo);
-
- // get the min and max x and y values
- scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
-
- // check clipping
- if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
- != splashClipAllOutside) {
-
- // draw the spans
- for (y = yMinI; y <= yMaxI; ++y) {
- while (scanner->getNextSpan(y, &x0, &x1)) {
- if (clipRes == splashClipAllInside) {
- drawSpan(x0, x1, y, pattern, gTrue);
- } else {
- clipRes2 = state->clip->testSpan(x0, x1, y);
- drawSpan(x0, x1, y, pattern, clipRes2 == splashClipAllInside);
- }
- }
- }
- }
-
- delete scanner;
- delete xPath;
- return splashOk;
-}
-
-SplashError Splash::xorFill(SplashPath *path, GBool eo) {
- SplashXPath *xPath;
- SplashXPathScanner *scanner;
- int xMinI, yMinI, xMaxI, yMaxI, x0, x1, y;
- SplashClipResult clipRes, clipRes2;
-
- if (path->length == 0) {
- return splashErrEmptyPath;
- }
- xPath = new SplashXPath(path, state->flatness, gTrue);
- xPath->sort();
- scanner = new SplashXPathScanner(xPath, eo);
-
- // get the min and max x and y values
- scanner->getBBox(&xMinI, &yMinI, &xMaxI, &yMaxI);
-
- // check clipping
- if ((clipRes = state->clip->testRect(xMinI, yMinI, xMaxI, yMaxI))
- != splashClipAllOutside) {
-
- // draw the spans
- for (y = yMinI; y <= yMaxI; ++y) {
- while (scanner->getNextSpan(y, &x0, &x1)) {
- if (clipRes == splashClipAllInside) {
- xorSpan(x0, x1, y, state->fillPattern, gTrue);
- } else {
- clipRes2 = state->clip->testSpan(x0, x1, y);
- xorSpan(x0, x1, y, state->fillPattern,
- clipRes2 == splashClipAllInside);
- }
- }
- }
- }
-
- delete scanner;
- delete xPath;
- return splashOk;
-}
-
-void Splash::drawPixel(int x, int y, SplashColor *color, GBool noClip) {
- SplashMono1P *mono1;
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
-
- if (noClip || state->clip->test(x, y)) {
- switch (bitmap->mode) {
- case splashModeMono1:
- mono1 = &bitmap->data.mono8[y * bitmap->rowSize + (x >> 3)];
- if (color->mono1) {
- *mono1 |= 0x80 >> (x & 7);
- } else {
- *mono1 &= ~(0x80 >> (x & 7));
- }
- break;
- case splashModeMono8:
- bitmap->data.mono8[y * bitmap->width + x] = color->mono8;
- break;
- case splashModeRGB8:
- bitmap->data.rgb8[y * bitmap->width + x] = color->rgb8;
- break;
- case splashModeRGB8Packed:
- rgb8p = &bitmap->data.rgb8p[y * bitmap->rowSize + 3 * x];
- rgb8p[0] = splashRGB8R(color->rgb8);
- rgb8p[1] = splashRGB8G(color->rgb8);
- rgb8p[2] = splashRGB8B(color->rgb8);
- break;
- case splashModeBGR8Packed:
- bgr8 = &bitmap->data.bgr8[y * bitmap->rowSize + 3 * x];
- bgr8[2] = splashBGR8R(color->bgr8);
- bgr8[1] = splashBGR8G(color->bgr8);
- bgr8[0] = splashBGR8B(color->bgr8);
- break;
- }
- }
-}
-
-void Splash::drawPixel(int x, int y, SplashPattern *pattern, GBool noClip) {
- SplashColor color;
- SplashMono1P *mono1;
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
-
- if (noClip || state->clip->test(x, y)) {
- color = pattern->getColor(x, y);
- switch (bitmap->mode) {
- case splashModeMono1:
- mono1 = &bitmap->data.mono8[y * bitmap->rowSize + (x >> 3)];
- if (color.mono1) {
- *mono1 |= 0x80 >> (x & 7);
- } else {
- *mono1 &= ~(0x80 >> (x & 7));
- }
- break;
- case splashModeMono8:
- bitmap->data.mono8[y * bitmap->width + x] = color.mono8;
- break;
- case splashModeRGB8:
- bitmap->data.rgb8[y * bitmap->width + x] = color.rgb8;
- break;
- case splashModeRGB8Packed:
- rgb8p = &bitmap->data.rgb8p[y * bitmap->rowSize + 3 * x];
- rgb8p[0] = splashRGB8R(color.rgb8);
- rgb8p[1] = splashRGB8G(color.rgb8);
- rgb8p[2] = splashRGB8B(color.rgb8);
- break;
- case splashModeBGR8Packed:
- bgr8 = &bitmap->data.bgr8[y * bitmap->rowSize + 3 * x];
- bgr8[2] = splashBGR8R(color.bgr8);
- bgr8[1] = splashBGR8G(color.bgr8);
- bgr8[0] = splashBGR8B(color.bgr8);
- break;
- }
- }
-}
-
-void Splash::drawSpan(int x0, int x1, int y, SplashPattern *pattern,
- GBool noClip) {
- SplashColor color;
- SplashMono1P *mono1;
- SplashMono8 *mono8;
- SplashRGB8 *rgb8;
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
- SplashMono1 mask1;
- int i, j, n;
-
- n = x1 - x0 + 1;
-
- switch (bitmap->mode) {
- case splashModeMono1:
- mono1 = &bitmap->data.mono8[y * bitmap->rowSize + (x0 >> 3)];
- i = 0;
- if ((j = x0 & 7)) {
- mask1 = 0x80 >> j;
- for (j = x0 & 7; j < 8 && i < n; ++i, ++j) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- if (color.mono1) {
- *mono1 |= mask1;
- } else {
- *mono1 &= ~mask1;
- }
- }
- mask1 >>= 1;
- }
- ++mono1;
- }
- while (i < n) {
- mask1 = 0x80;
- for (j = 0; j < 8 && i < n; ++i, ++j) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- if (color.mono1) {
- *mono1 |= mask1;
- } else {
- *mono1 &= ~mask1;
- }
- }
- mask1 >>= 1;
- }
- ++mono1;
- }
- break;
-
- case splashModeMono8:
- mono8 = &bitmap->data.mono8[y * bitmap->width + x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- *mono8 = color.mono8;
- }
- ++mono8;
- }
- break;
-
- case splashModeRGB8:
- rgb8 = &bitmap->data.rgb8[y * bitmap->width + x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- *rgb8 = color.rgb8;
- }
- ++rgb8;
- }
- break;
-
- case splashModeRGB8Packed:
- rgb8p = &bitmap->data.rgb8p[y * bitmap->rowSize + 3 * x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- rgb8p[0] = splashRGB8R(color.rgb8);
- rgb8p[1] = splashRGB8G(color.rgb8);
- rgb8p[2] = splashRGB8B(color.rgb8);
- }
- rgb8p += 3;
- }
- break;
-
- case splashModeBGR8Packed:
- bgr8 = &bitmap->data.bgr8[y * bitmap->rowSize + 3 * x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- bgr8[2] = splashBGR8R(color.bgr8);
- bgr8[1] = splashBGR8G(color.bgr8);
- bgr8[0] = splashBGR8B(color.bgr8);
- }
- bgr8 += 3;
- }
- break;
- }
-}
-
-void Splash::xorSpan(int x0, int x1, int y, SplashPattern *pattern,
- GBool noClip) {
- SplashColor color;
- SplashMono1P *mono1;
- SplashMono8 *mono8;
- SplashRGB8 *rgb8;
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
- SplashMono1 mask1;
- int i, j, n;
-
- n = x1 - x0 + 1;
-
- switch (bitmap->mode) {
- case splashModeMono1:
- mono1 = &bitmap->data.mono8[y * bitmap->rowSize + (x0 >> 3)];
- i = 0;
- if ((j = x0 & 7)) {
- mask1 = 0x80 >> j;
- for (j = x0 & 7; j < 8 && i < n; ++i, ++j) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- if (color.mono1) {
- *mono1 ^= mask1;
- }
- }
- mask1 >>= 1;
- }
- ++mono1;
- }
- while (i < n) {
- mask1 = 0x80;
- for (j = 0; j < 8 && i < n; ++i, ++j) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- if (color.mono1) {
- *mono1 ^= mask1;
- }
- }
- mask1 >>= 1;
- }
- ++mono1;
- }
- break;
-
- case splashModeMono8:
- mono8 = &bitmap->data.mono8[y * bitmap->width + x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- *mono8 ^= color.mono8;
- }
- ++mono8;
- }
- break;
-
- case splashModeRGB8:
- rgb8 = &bitmap->data.rgb8[y * bitmap->width + x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- *rgb8 ^= color.rgb8;
- }
- ++rgb8;
- }
- break;
-
- case splashModeRGB8Packed:
- rgb8p = &bitmap->data.rgb8p[y * bitmap->rowSize + 3 * x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- rgb8p[0] ^= splashRGB8R(color.rgb8);
- rgb8p[1] ^= splashRGB8G(color.rgb8);
- rgb8p[2] ^= splashRGB8B(color.rgb8);
- }
- rgb8p += 3;
- }
- break;
-
- case splashModeBGR8Packed:
- bgr8 = &bitmap->data.bgr8[y * bitmap->rowSize + 3 * x0];
- for (i = 0; i < n; ++i) {
- if (noClip || state->clip->test(x0 + i, y)) {
- color = pattern->getColor(x0 + i, y);
- bgr8[2] ^= splashBGR8R(color.bgr8);
- bgr8[1] ^= splashBGR8G(color.bgr8);
- bgr8[0] ^= splashBGR8B(color.bgr8);
- }
- bgr8 += 3;
- }
- break;
- }
-}
-
-void Splash::getPixel(int x, int y, SplashColor *pixel) {
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
-
- if (y < 0 || y >= bitmap->height || x < 0 || x >= bitmap->width) {
- return;
- }
- switch (bitmap->mode) {
- case splashModeMono1:
- pixel->mono1 = (bitmap->data.mono1[y * bitmap->rowSize + (x >> 3)]
- >> (7 - (x & 7))) & 1;
- break;
- case splashModeMono8:
- pixel->mono8 = bitmap->data.mono8[y * bitmap->width + x];
- break;
- case splashModeRGB8:
- pixel->rgb8 = bitmap->data.rgb8[y * bitmap->width + x];
- break;
- case splashModeRGB8Packed:
- rgb8p = &bitmap->data.rgb8p[y * bitmap->rowSize + 3 * x];
- pixel->rgb8 = splashMakeRGB8(rgb8p[0], rgb8p[1], rgb8p[2]);
- break;
- case splashModeBGR8Packed:
- bgr8 = &bitmap->data.bgr8[y * bitmap->rowSize + 3 * x];
- pixel->bgr8 = splashMakeBGR8(bgr8[2], bgr8[1], bgr8[0]);
- break;
- }
-}
-
-SplashError Splash::fillChar(SplashCoord x, SplashCoord y,
- int c, SplashFont *font) {
- SplashGlyphBitmap glyph;
- int x0, y0, xFrac, yFrac;
- SplashError err;
-
- if (debugMode) {
- printf("fillChar: x=%.2f y=%.2f c=%3d=0x%02x='%c'\n",
- x, y, c, c, c);
- }
- x0 = splashFloor(x);
- xFrac = splashFloor((x - x0) * splashFontFraction);
- y0 = splashFloor(y);
- yFrac = splashFloor((y - y0) * splashFontFraction);
- if (!font->getGlyph(c, xFrac, yFrac, &glyph)) {
- return splashErrNoGlyph;
- }
- err = fillGlyph(x, y, &glyph);
- if (glyph.freeData) {
- gfree(glyph.data);
- }
- return err;
-}
-
-SplashError Splash::fillGlyph(SplashCoord x, SplashCoord y,
- SplashGlyphBitmap *glyph) {
- int alpha, ialpha;
- Guchar *p;
- SplashColor fg;
- SplashMono1P *mono1Ptr;
- SplashMono8 *mono8Ptr;
- SplashRGB8 *rgb8Ptr;
- SplashRGB8P *rgb8pPtr;
- SplashBGR8P *bgr8Ptr;
- SplashMono8 bgMono8;
- int bgR, bgG, bgB;
- SplashClipResult clipRes;
- GBool noClip;
- int x0, y0, x1, y1, xx, xx1, yy;
-
- x0 = splashFloor(x);
- y0 = splashFloor(y);
-
- if ((clipRes = state->clip->testRect(x0 - glyph->x,
- y0 - glyph->y,
- x0 - glyph->x + glyph->w - 1,
- y0 - glyph->y + glyph->h - 1))
- != splashClipAllOutside) {
- noClip = clipRes == splashClipAllInside;
-
- //~ optimize this
- if (glyph->aa) {
- p = glyph->data;
- for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
- for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; ++xx, ++x1) {
- alpha = *p++;
- if (alpha > 0) {
- if (noClip || state->clip->test(x1, y1)) {
- ialpha = 255 - alpha;
- fg = state->fillPattern->getColor(x1, y1);
- switch (bitmap->mode) {
- case splashModeMono1:
- if (alpha >= 0x80) {
- mono1Ptr = &bitmap->data.mono1[y1 * bitmap->rowSize +
- (x1 >> 3)];
- if (fg.mono1) {
- *mono1Ptr |= 0x80 >> (x1 & 7);
- } else {
- *mono1Ptr &= ~(0x80 >> (x1 & 7));
- }
- }
- break;
- case splashModeMono8:
- mono8Ptr = &bitmap->data.mono8[y1 * bitmap->width + x1];
- bgMono8 = *mono8Ptr;
- // note: floor(x / 255) = x >> 8 (for 16-bit x)
- *mono8Ptr = (alpha * fg.mono8 + ialpha * bgMono8) >> 8;
- break;
- case splashModeRGB8:
- rgb8Ptr = &bitmap->data.rgb8[y1 * bitmap->width + x1];
- bgR = splashRGB8R(*rgb8Ptr);
- bgG = splashRGB8G(*rgb8Ptr);
- bgB = splashRGB8B(*rgb8Ptr);
- *rgb8Ptr = splashMakeRGB8((alpha * splashRGB8R(fg.rgb8) +
- ialpha * bgR) >> 8,
- (alpha * splashRGB8G(fg.rgb8) +
- ialpha * bgG) >> 8,
- (alpha * splashRGB8B(fg.rgb8) +
- ialpha * bgB) >> 8);
- break;
- case splashModeRGB8Packed:
- rgb8pPtr = &bitmap->data.rgb8p[y1 * bitmap->rowSize + 3 * x1];
- rgb8pPtr[0] =
- (alpha * splashRGB8R(fg.rgb8) + ialpha * rgb8pPtr[0]) >> 8;
- rgb8pPtr[1] =
- (alpha * splashRGB8G(fg.rgb8) + ialpha * rgb8pPtr[1]) >> 8;
- rgb8pPtr[2] =
- (alpha * splashRGB8B(fg.rgb8) + ialpha * rgb8pPtr[2]) >> 8;
- break;
- case splashModeBGR8Packed:
- bgr8Ptr = &bitmap->data.bgr8[y1 * bitmap->rowSize + 3 * x1];
- bgr8Ptr[2] =
- (alpha * splashBGR8R(fg.bgr8) + ialpha * bgr8Ptr[2]) >> 8;
- bgr8Ptr[1] =
- (alpha * splashBGR8G(fg.bgr8) + ialpha * bgr8Ptr[1]) >> 8;
- bgr8Ptr[0] =
- (alpha * splashBGR8B(fg.bgr8) + ialpha * bgr8Ptr[0]) >> 8;
- break;
- }
- }
- }
- }
- }
-
- } else {
- p = glyph->data;
- for (yy = 0, y1 = y0 - glyph->y; yy < glyph->h; ++yy, ++y1) {
- for (xx = 0, x1 = x0 - glyph->x; xx < glyph->w; xx += 8) {
- alpha = *p++;
- for (xx1 = 0; xx1 < 8 && xx + xx1 < glyph->w; ++xx1, ++x1) {
- if (alpha & 0x80) {
- if (noClip || state->clip->test(x1, y1)) {
- fg = state->fillPattern->getColor(x1, y1);
- switch (bitmap->mode) {
- case splashModeMono1:
- mono1Ptr = &bitmap->data.mono1[y1 * bitmap->rowSize +
- (x1 >> 3)];
- if (fg.mono1) {
- *mono1Ptr |= 0x80 >> (x1 & 7);
- } else {
- *mono1Ptr &= ~(0x80 >> (x1 & 7));
- }
- break;
- case splashModeMono8:
- bitmap->data.mono8[y1 * bitmap->width + x1] = fg.mono8;
- break;
- case splashModeRGB8:
- bitmap->data.rgb8[y1 * bitmap->width + x1] = fg.rgb8;
- break;
- case splashModeRGB8Packed:
- rgb8pPtr = &bitmap->data.rgb8p[y1 * bitmap->rowSize + 3 * x1];
- rgb8pPtr[0] = splashRGB8R(fg.rgb8);
- rgb8pPtr[1] = splashRGB8G(fg.rgb8);
- rgb8pPtr[2] = splashRGB8B(fg.rgb8);
- break;
- case splashModeBGR8Packed:
- bgr8Ptr = &bitmap->data.bgr8[y1 * bitmap->rowSize + 3 * x1];
- bgr8Ptr[2] = splashBGR8R(fg.bgr8);
- bgr8Ptr[1] = splashBGR8G(fg.bgr8);
- bgr8Ptr[0] = splashBGR8B(fg.bgr8);
- break;
- }
- }
- }
- alpha <<= 1;
- }
- }
- }
- }
- }
-
- return splashOk;
-}
-
-SplashError Splash::fillImageMask(SplashImageMaskSource src, void *srcData,
- int w, int h, SplashCoord *mat) {
- GBool rot;
- SplashCoord xScale, yScale, xShear, yShear;
- int tx, ty, scaledWidth, scaledHeight, xSign, ySign;
- int ulx, uly, llx, lly, urx, ury, lrx, lry;
- int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1;
- int xMin, xMax, yMin, yMax;
- SplashClipResult clipRes, clipRes2;
- int yp, yq, yt, yStep, lastYStep;
- int xp, xq, xt, xStep, xSrc;
- int k1, spanXMin, spanXMax, spanY;
- SplashMono1 *pixBuf;
- SplashMono1 *p;
- int pixAcc;
- SplashCoord alpha;
- SplashColor fg, bg, pix;
- int x, y, x1, y1, x2, y2;
- int n, m, i, j;
-
- if (debugMode) {
- printf("fillImageMask: w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
- w, h, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
- }
-
- // check for singular matrix
- if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) {
- return splashErrSingularMatrix;
- }
-
- // compute scale, shear, rotation, translation parameters
- rot = splashAbs(mat[1]) > splashAbs(mat[0]);
- if (rot) {
- xScale = -mat[1];
- yScale = mat[2] - (mat[0] * mat[3]) / mat[1];
- xShear = -mat[3] / yScale;
- yShear = -mat[0] / mat[1];
- } else {
- xScale = mat[0];
- yScale = mat[3] - (mat[1] * mat[2]) / mat[0];
- xShear = mat[2] / yScale;
- yShear = mat[1] / mat[0];
- }
- tx = splashRound(mat[4]);
- ty = splashRound(mat[5]);
- scaledWidth = abs(splashRound(mat[4] + xScale) - tx) + 1;
- scaledHeight = abs(splashRound(mat[5] + yScale) - ty) + 1;
- xSign = (xScale < 0) ? -1 : 1;
- ySign = (yScale < 0) ? -1 : 1;
-
- // clipping
- ulx1 = 0;
- uly1 = 0;
- urx1 = xSign * (scaledWidth - 1);
- ury1 = splashRound(yShear * urx1);
- llx1 = splashRound(xShear * ySign * (scaledHeight - 1));
- lly1 = ySign * (scaledHeight - 1) + splashRound(yShear * llx1);
- lrx1 = xSign * (scaledWidth - 1) +
- splashRound(xShear * ySign * (scaledHeight - 1));
- lry1 = ySign * (scaledHeight - 1) + splashRound(yShear * lrx1);
- if (rot) {
- ulx = tx + uly1; uly = ty - ulx1;
- urx = tx + ury1; ury = ty - urx1;
- llx = tx + lly1; lly = ty - llx1;
- lrx = tx + lry1; lry = ty - lrx1;
- } else {
- ulx = tx + ulx1; uly = ty + uly1;
- urx = tx + urx1; ury = ty + ury1;
- llx = tx + llx1; lly = ty + lly1;
- lrx = tx + lrx1; lry = ty + lry1;
- }
- xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx
- : (llx < lrx) ? llx : lrx
- : (urx < llx) ? (urx < lrx) ? urx : lrx
- : (llx < lrx) ? llx : lrx;
- xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx
- : (llx > lrx) ? llx : lrx
- : (urx > llx) ? (urx > lrx) ? urx : lrx
- : (llx > lrx) ? llx : lrx;
- yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry
- : (lly < lry) ? lly : lry
- : (ury < lly) ? (ury < lry) ? ury : lry
- : (lly < lry) ? lly : lry;
- yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry
- : (lly > lry) ? lly : lry
- : (ury > lly) ? (ury > lry) ? ury : lry
- : (lly > lry) ? lly : lry;
- clipRes = state->clip->testRect(xMin, yMin, xMax, yMax);
-
- // compute Bresenham parameters for x and y scaling
- yp = h / scaledHeight;
- yq = h % scaledHeight;
- xp = w / scaledWidth;
- xq = w % scaledWidth;
-
- // allocate pixel buffer
- pixBuf = (SplashMono1 *)gmalloc((yp + 1) * w * sizeof(SplashMono1));
-
- // init y scale Bresenham
- yt = 0;
- lastYStep = 1;
-
- for (y = 0; y < scaledHeight; ++y) {
-
- // y scale Bresenham
- yStep = yp;
- yt += yq;
- if (yt >= scaledHeight) {
- yt -= scaledHeight;
- ++yStep;
- }
-
- // read row(s) from image
- n = (yp > 0) ? yStep : lastYStep;
- if (n > 0) {
- p = pixBuf;
- for (i = 0; i < n; ++i) {
- for (j = 0; j < w; ++j) {
- (*src)(srcData, p++);
- }
- }
- }
- lastYStep = yStep;
-
- // loop-invariant constants
- k1 = splashRound(xShear * ySign * y);
-
- // clipping test
- if (clipRes != splashClipAllInside &&
- !rot &&
- splashRound(yShear * k1) ==
- splashRound(yShear * (xSign * (scaledWidth - 1) + k1))) {
- if (xSign > 0) {
- spanXMin = tx + k1;
- spanXMax = spanXMin + (scaledWidth - 1);
- } else {
- spanXMax = tx + k1;
- spanXMin = spanXMax - (scaledWidth - 1);
- }
- spanY = ty + ySign * y + splashRound(xShear * ySign * y);
- clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY);
- if (clipRes2 == splashClipAllOutside) {
- continue;
- }
- } else {
- clipRes2 = clipRes;
- }
-
- // init x scale Bresenham
- xt = 0;
- xSrc = 0;
-
- for (x = 0; x < scaledWidth; ++x) {
-
- // x scale Bresenham
- xStep = xp;
- xt += xq;
- if (xt >= scaledWidth) {
- xt -= scaledWidth;
- ++xStep;
- }
-
- // x shear
- x1 = xSign * x + k1;
-
- // y shear
- y1 = ySign * y + splashRound(yShear * x1);
-
- // rotation
- if (rot) {
- x2 = y1;
- y2 = -x1;
- } else {
- x2 = x1;
- y2 = y1;
- }
-
- // compute the alpha value for (x,y) after the x and y scaling
- // operations
- n = yStep > 0 ? yStep : 1;
- m = xStep > 0 ? xStep : 1;
- p = pixBuf + xSrc;
- pixAcc = 0;
- for (i = 0; i < n; ++i) {
- for (j = 0; j < m; ++j) {
- pixAcc += *p++;
- }
- p += w - m;
- }
-
- // blend fill color with background
- if (pixAcc != 0) {
- fg = state->fillPattern->getColor(tx + x2, ty + y2);
- if (pixAcc == n * m) {
- pix = fg;
- } else {
- getPixel(tx + x2, ty + y2, &bg);
- alpha = (SplashCoord)pixAcc / (SplashCoord)(n * m);
- switch (bitmap->mode) {
- case splashModeMono1:
- pix.mono1 = splashRound(alpha * fg.mono1 +
- (1 - alpha) * bg.mono1);
- break;
- case splashModeMono8:
- pix.mono8 = splashRound(alpha * fg.mono8 +
- (1 - alpha) * bg.mono8);
- break;
- case splashModeRGB8:
- case splashModeRGB8Packed:
- pix.rgb8 = splashMakeRGB8(
- splashRound(alpha * splashRGB8R(fg.rgb8) +
- (1 - alpha) * splashRGB8R(bg.rgb8)),
- splashRound(alpha * splashRGB8G(fg.rgb8) +
- (1 - alpha) * splashRGB8G(bg.rgb8)),
- splashRound(alpha * splashRGB8B(fg.rgb8) +
- (1 - alpha) * splashRGB8B(bg.rgb8)));
- break;
- case splashModeBGR8Packed:
- pix.bgr8 = splashMakeBGR8(
- splashRound(alpha * splashBGR8R(fg.bgr8) +
- (1 - alpha) * splashBGR8R(bg.bgr8)),
- splashRound(alpha * splashBGR8G(fg.bgr8) +
- (1 - alpha) * splashBGR8G(bg.bgr8)),
- splashRound(alpha * splashBGR8B(fg.bgr8) +
- (1 - alpha) * splashBGR8B(bg.bgr8)));
- break;
- }
- }
- drawPixel(tx + x2, ty + y2, &pix, clipRes2 == splashClipAllInside);
- }
-
- // x scale Bresenham
- xSrc += xStep;
- }
- }
-
- // free memory
- gfree(pixBuf);
-
- return splashOk;
-}
-
-SplashError Splash::drawImage(SplashImageSource src, void *srcData,
- SplashColorMode srcMode,
- int w, int h, SplashCoord *mat) {
- GBool ok, rot, halftone;
- SplashCoord xScale, yScale, xShear, yShear;
- int tx, ty, scaledWidth, scaledHeight, xSign, ySign;
- int ulx, uly, llx, lly, urx, ury, lrx, lry;
- int ulx1, uly1, llx1, lly1, urx1, ury1, lrx1, lry1;
- int xMin, xMax, yMin, yMax;
- SplashClipResult clipRes, clipRes2;
- int yp, yq, yt, yStep, lastYStep;
- int xp, xq, xt, xStep, xSrc;
- int k1, spanXMin, spanXMax, spanY;
- SplashColor *pixBuf, *p;
- Guchar *alphaBuf, *q;
- SplashColor pix;
- SplashCoord pixAcc[splashMaxColorComps];
- int alphaAcc;
- SplashCoord pixMul, alphaMul, alpha;
- int x, y, x1, y1, x2, y2;
- int n, m, i, j;
-
- if (debugMode) {
- printf("drawImage: srcMode=%d w=%d h=%d mat=[%.2f %.2f %.2f %.2f %.2f %.2f]\n",
- srcMode, w, h, mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
- }
-
- // check color modes
- ok = gFalse; // make gcc happy
- switch (bitmap->mode) {
- case splashModeMono1:
- ok = srcMode == splashModeMono1 || srcMode == splashModeMono8;
- break;
- case splashModeMono8:
- ok = srcMode == splashModeMono8;
- break;
- case splashModeRGB8:
- ok = srcMode == splashModeRGB8;
- break;
- case splashModeRGB8Packed:
- ok = srcMode == splashModeRGB8Packed;
- break;
- case splashModeBGR8Packed:
- ok = srcMode == splashModeBGR8Packed;
- break;
- }
- if (!ok) {
- return splashErrModeMismatch;
- }
- halftone = bitmap->mode == splashModeMono1 && srcMode == splashModeMono8;
-
- // check for singular matrix
- if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.000001) {
- return splashErrSingularMatrix;
- }
-
- // compute scale, shear, rotation, translation parameters
- rot = splashAbs(mat[1]) > splashAbs(mat[0]);
- if (rot) {
- xScale = -mat[1];
- yScale = mat[2] - (mat[0] * mat[3]) / mat[1];
- xShear = -mat[3] / yScale;
- yShear = -mat[0] / mat[1];
- } else {
- xScale = mat[0];
- yScale = mat[3] - (mat[1] * mat[2]) / mat[0];
- xShear = mat[2] / yScale;
- yShear = mat[1] / mat[0];
- }
- tx = splashRound(mat[4]);
- ty = splashRound(mat[5]);
- scaledWidth = abs(splashRound(mat[4] + xScale) - tx) + 1;
- scaledHeight = abs(splashRound(mat[5] + yScale) - ty) + 1;
- xSign = (xScale < 0) ? -1 : 1;
- ySign = (yScale < 0) ? -1 : 1;
-
- // clipping
- ulx1 = 0;
- uly1 = 0;
- urx1 = xSign * (scaledWidth - 1);
- ury1 = splashRound(yShear * urx1);
- llx1 = splashRound(xShear * ySign * (scaledHeight - 1));
- lly1 = ySign * (scaledHeight - 1) + splashRound(yShear * llx1);
- lrx1 = xSign * (scaledWidth - 1) +
- splashRound(xShear * ySign * (scaledHeight - 1));
- lry1 = ySign * (scaledHeight - 1) + splashRound(yShear * lrx1);
- if (rot) {
- ulx = tx + uly1; uly = ty - ulx1;
- urx = tx + ury1; ury = ty - urx1;
- llx = tx + lly1; lly = ty - llx1;
- lrx = tx + lry1; lry = ty - lrx1;
- } else {
- ulx = tx + ulx1; uly = ty + uly1;
- urx = tx + urx1; ury = ty + ury1;
- llx = tx + llx1; lly = ty + lly1;
- lrx = tx + lrx1; lry = ty + lry1;
- }
- xMin = (ulx < urx) ? (ulx < llx) ? (ulx < lrx) ? ulx : lrx
- : (llx < lrx) ? llx : lrx
- : (urx < llx) ? (urx < lrx) ? urx : lrx
- : (llx < lrx) ? llx : lrx;
- xMax = (ulx > urx) ? (ulx > llx) ? (ulx > lrx) ? ulx : lrx
- : (llx > lrx) ? llx : lrx
- : (urx > llx) ? (urx > lrx) ? urx : lrx
- : (llx > lrx) ? llx : lrx;
- yMin = (uly < ury) ? (uly < lly) ? (uly < lry) ? uly : lry
- : (lly < lry) ? lly : lry
- : (ury < lly) ? (ury < lry) ? ury : lry
- : (lly < lry) ? lly : lry;
- yMax = (uly > ury) ? (uly > lly) ? (uly > lry) ? uly : lry
- : (lly > lry) ? lly : lry
- : (ury > lly) ? (ury > lry) ? ury : lry
- : (lly > lry) ? lly : lry;
- if ((clipRes = state->clip->testRect(xMin, yMin, xMax, yMax))
- == splashClipAllOutside) {
- return splashOk;
- }
-
- // compute Bresenham parameters for x and y scaling
- yp = h / scaledHeight;
- yq = h % scaledHeight;
- xp = w / scaledWidth;
- xq = w % scaledWidth;
-
- // allocate pixel buffer
- pixBuf = (SplashColor *)gmalloc((yp + 1) * w * sizeof(SplashColor));
- alphaBuf = (Guchar *)gmalloc((yp + 1) * w * sizeof(Guchar));
-
- // init y scale Bresenham
- yt = 0;
- lastYStep = 1;
-
- for (y = 0; y < scaledHeight; ++y) {
-
- // y scale Bresenham
- yStep = yp;
- yt += yq;
- if (yt >= scaledHeight) {
- yt -= scaledHeight;
- ++yStep;
- }
-
- // read row(s) from image
- n = (yp > 0) ? yStep : lastYStep;
- if (n > 0) {
- p = pixBuf;
- q = alphaBuf;
- for (i = 0; i < n; ++i) {
- for (j = 0; j < w; ++j) {
- (*src)(srcData, p++, q++);
- }
- }
- }
- lastYStep = yStep;
-
- // loop-invariant constants
- k1 = splashRound(xShear * ySign * y);
-
- // clipping test
- if (clipRes != splashClipAllInside &&
- !rot &&
- splashRound(yShear * k1) ==
- splashRound(yShear * (xSign * (scaledWidth - 1) + k1))) {
- if (xSign > 0) {
- spanXMin = tx + k1;
- spanXMax = spanXMin + (scaledWidth - 1);
- } else {
- spanXMax = tx + k1;
- spanXMin = spanXMax - (scaledWidth - 1);
- }
- spanY = ty + ySign * y + splashRound(xShear * ySign * y);
- clipRes2 = state->clip->testSpan(spanXMin, spanXMax, spanY);
- if (clipRes2 == splashClipAllOutside) {
- continue;
- }
- } else {
- clipRes2 = clipRes;
- }
-
- // init x scale Bresenham
- xt = 0;
- xSrc = 0;
-
- for (x = 0; x < scaledWidth; ++x) {
-
- // x scale Bresenham
- xStep = xp;
- xt += xq;
- if (xt >= scaledWidth) {
- xt -= scaledWidth;
- ++xStep;
- }
-
- // x shear
- x1 = xSign * x + k1;
-
- // y shear
- y1 = ySign * y + splashRound(yShear * x1);
-
- // rotation
- if (rot) {
- x2 = y1;
- y2 = -x1;
- } else {
- x2 = x1;
- y2 = y1;
- }
-
- // compute the filtered pixel at (x,y) after the x and y scaling
- // operations
- n = yStep > 0 ? yStep : 1;
- m = xStep > 0 ? xStep : 1;
- p = pixBuf + xSrc;
- q = alphaBuf + xSrc;
- for (i = 0; i < splashMaxColorComps; ++i) {
- pixAcc[i] = 0;
- }
- alphaAcc = 0;
- for (i = 0; i < n; ++i) {
- for (j = 0; j < m; ++j) {
- switch (srcMode) {
- case splashModeMono1:
- pixAcc[0] += p->mono1;
- break;
- case splashModeMono8:
- pixAcc[0] += p->mono8;
- break;
- case splashModeRGB8:
- case splashModeRGB8Packed:
- pixAcc[0] += splashRGB8R(p->rgb8);
- pixAcc[1] += splashRGB8G(p->rgb8);
- pixAcc[2] += splashRGB8B(p->rgb8);
- break;
- case splashModeBGR8Packed:
- pixAcc[0] += splashBGR8R(p->bgr8);
- pixAcc[1] += splashBGR8G(p->bgr8);
- pixAcc[2] += splashBGR8B(p->bgr8);
- break;
- }
- ++p;
- alphaAcc += *q++;
- }
- p += w - m;
- q += w - m;
- }
- alphaMul = 1 / (SplashCoord)(n * m);
- if (halftone) {
- pixMul = (SplashCoord)alphaMul / 256.0;
- } else {
- pixMul = alphaMul;
- }
- alpha = (SplashCoord)alphaAcc * alphaMul;
-
- //~ this should blend if 0 < alpha < 1
- if (alpha > 0.75) {
-
- // mono8 -> mono1 conversion, with halftoning
- if (halftone) {
- pix.mono1 = state->screen->test(tx + x2, ty + y2,
- pixAcc[0] * pixMul);
-
- // no conversion, no halftoning
- } else {
- switch (bitmap->mode) {
- case splashModeMono1:
- pix.mono1 = splashRound(pixAcc[0] * pixMul);
- break;
- case splashModeMono8:
- pix.mono8 = splashRound(pixAcc[0] * pixMul);
- break;
- case splashModeRGB8:
- case splashModeRGB8Packed:
- pix.rgb8 = splashMakeRGB8(splashRound(pixAcc[0] * pixMul),
- splashRound(pixAcc[1] * pixMul),
- splashRound(pixAcc[2] * pixMul));
- break;
- case splashModeBGR8Packed:
- pix.bgr8 = splashMakeBGR8(splashRound(pixAcc[0] * pixMul),
- splashRound(pixAcc[1] * pixMul),
- splashRound(pixAcc[2] * pixMul));
- break;
- }
- }
-
- // set pixel
- drawPixel(tx + x2, ty + y2, &pix, clipRes2 == splashClipAllInside);
- }
-
- // x scale Bresenham
- xSrc += xStep;
- }
- }
-
- gfree(pixBuf);
- gfree(alphaBuf);
-
- return splashOk;
-}
-
-void Splash::dumpPath(SplashPath *path) {
- int i;
-
- for (i = 0; i < path->length; ++i) {
- printf(" %3d: x=%8.2f y=%8.2f%s%s%s%s%s\n",
- i, path->pts[i].x, path->pts[i].y,
- (path->flags[i] & splashPathFirst) ? " first" : "",
- (path->flags[i] & splashPathLast) ? " last" : "",
- (path->flags[i] & splashPathClosed) ? " closed" : "",
- (path->flags[i] & splashPathCurve) ? " curve" : "",
- (path->flags[i] & splashPathArcCW) ? " arcCW" : "");
- }
-}
diff --git a/pdf/splash/Splash.h b/pdf/splash/Splash.h
deleted file mode 100644
index efcbdab..0000000
--- a/pdf/splash/Splash.h
+++ /dev/null
@@ -1,176 +0,0 @@
-//========================================================================
-//
-// Splash.h
-//
-//========================================================================
-
-#ifndef SPLASH_H
-#define SPLASH_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashBitmap;
-class SplashGlyphBitmap;
-class SplashState;
-class SplashPattern;
-class SplashScreen;
-class SplashPath;
-class SplashXPath;
-class SplashClip;
-class SplashFont;
-
-//------------------------------------------------------------------------
-
-// Retrieves the next pixel in an image mask. Normally, fills in
-// *<pixel> and returns true. If the image stream is exhausted,
-// returns false.
-typedef GBool (*SplashImageMaskSource)(void *data, SplashMono1 *pixel);
-
-// Retrieves the next pixel in an image. Normally, fills in *<pixel>
-// (pixel color) and *<alpha> (1 for opaque, 0 for transparent), and
-// returns true. If the image stream is exhausted, returns false.
-typedef GBool (*SplashImageSource)(void *data, SplashColor *pixel,
- Guchar *alpha);
-
-//------------------------------------------------------------------------
-// Splash
-//------------------------------------------------------------------------
-
-class Splash {
-public:
-
- // Create a new rasterizer object.
- Splash(SplashBitmap *bitmapA);
-
- ~Splash();
-
- //----- state read
-
- SplashPattern *getStrokePattern();
- SplashPattern *getFillPattern();
- SplashScreen *getScreen();
- SplashCoord getLineWidth();
- int getLineCap();
- int getLineJoin();
- SplashCoord getMiterLimit();
- SplashCoord getFlatness();
- SplashCoord *getLineDash();
- int getLineDashLength();
- SplashCoord getLineDashPhase();
- SplashClip *getClip();
-
- //----- state write
-
- void setStrokePattern(SplashPattern *strokeColor);
- void setFillPattern(SplashPattern *fillColor);
- void setScreen(SplashScreen *screen);
- void setLineWidth(SplashCoord lineWidth);
- void setLineCap(int lineCap);
- void setLineJoin(int lineJoin);
- void setMiterLimit(SplashCoord miterLimit);
- void setFlatness(SplashCoord flatness);
- // the <lineDash> array will be copied
- void setLineDash(SplashCoord *lineDash, int lineDashLength,
- SplashCoord lineDashPhase);
- void clipResetToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1);
- SplashError clipToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1);
- SplashError clipToPath(SplashPath *path, GBool eo);
-
- //----- state save/restore
-
- void saveState();
- SplashError restoreState();
-
- //----- drawing operations
-
- // Fill the bitmap with <color>. This is not subject to clipping.
- void clear(SplashColor color);
-
- // Stroke a path using the current stroke pattern.
- SplashError stroke(SplashPath *path);
-
- // Fill a path using the current fill pattern.
- SplashError fill(SplashPath *path, GBool eo);
-
- // Fill a path, XORing with the current fill pattern.
- SplashError xorFill(SplashPath *path, GBool eo);
-
- // Draw a character, using the current fill pattern.
- SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font);
-
- // Draw a glyph, using the current fill pattern. This function does
- // not free any data, i.e., it ignores glyph->freeData.
- SplashError fillGlyph(SplashCoord x, SplashCoord y,
- SplashGlyphBitmap *glyph);
-
- // Draws an image mask using the fill color. This will read <w>*<h>
- // pixels from <src>, in raster order, starting with the top line.
- // "1" pixels will be drawn with the current fill color; "0" pixels
- // are transparent. The matrix:
- // [ mat[0] mat[1] 0 ]
- // [ mat[2] mat[3] 0 ]
- // [ mat[4] mat[5] 1 ]
- // maps a unit square to the desired destination for the image, in
- // PostScript style:
- // [x' y' 1] = [x y 1] * mat
- // Note that the Splash y axis points downward, and the image source
- // is assumed to produce pixels in raster order, starting from the
- // top line.
- SplashError fillImageMask(SplashImageMaskSource src, void *srcData,
- int w, int h, SplashCoord *mat);
-
- // Draw an image. This will read <w>*<h> pixels from <src>, in
- // raster order, starting with the top line. These pixels are
- // assumed to be in the source mode, <srcMode>. The following
- // combinations of source and target modes are supported:
- // source target
- // ------ ------
- // Mono1 Mono1
- // Mono8 Mono1 -- with dithering
- // Mono8 Mono8
- // RGB8 RGB8
- // BGR8packed BGR8Packed
- // The matrix behaves as for fillImageMask.
- SplashError drawImage(SplashImageSource src, void *srcData,
- SplashColorMode srcMode,
- int w, int h, SplashCoord *mat);
-
- //~ drawMaskedImage
-
- //----- misc
-
- // Return the associated bitmap.
- SplashBitmap *getBitmap() { return bitmap; }
-
- // Toggle debug mode on or off.
- void setDebugMode(GBool debugModeA) { debugMode = debugModeA; }
-
-private:
-
- void strokeNarrow(SplashXPath *xPath);
- void strokeWide(SplashXPath *xPath);
- SplashXPath *makeDashedPath(SplashXPath *xPath);
- SplashError fillWithPattern(SplashPath *path, GBool eo,
- SplashPattern *pattern);
- void drawPixel(int x, int y, SplashColor *color, GBool noClip);
- void drawPixel(int x, int y, SplashPattern *pattern, GBool noClip);
- void drawSpan(int x0, int x1, int y, SplashPattern *pattern, GBool noClip);
- void xorSpan(int x0, int x1, int y, SplashPattern *pattern, GBool noClip);
- void putPixel(int x, int y, SplashColor *pixel);
- void getPixel(int x, int y, SplashColor *pixel);
- void dumpPath(SplashPath *path);
-
- SplashBitmap *bitmap;
- SplashState *state;
- GBool debugMode;
-};
-
-#endif
diff --git a/pdf/splash/SplashBitmap.cc b/pdf/splash/SplashBitmap.cc
deleted file mode 100644
index 0bec16e..0000000
--- a/pdf/splash/SplashBitmap.cc
+++ /dev/null
@@ -1,157 +0,0 @@
-//========================================================================
-//
-// SplashBitmap.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include "gmem.h"
-#include "SplashErrorCodes.h"
-#include "SplashBitmap.h"
-
-//------------------------------------------------------------------------
-// SplashBitmap
-//------------------------------------------------------------------------
-
-SplashBitmap::SplashBitmap(int widthA, int heightA, SplashColorMode modeA) {
- width = widthA;
- height = heightA;
- mode = modeA;
- switch (mode) {
- case splashModeMono1:
- rowSize = (width + 7) >> 3;
- data.mono1 = (SplashMono1P *)
- gmalloc(rowSize * height * sizeof(SplashMono1P));
- break;
- case splashModeMono8:
- rowSize = width;
- data.mono8 = (SplashMono8 *)
- gmalloc(width * height * sizeof(SplashMono8));
- break;
- case splashModeRGB8:
- rowSize = width << 2;
- data.rgb8 = (SplashRGB8 *)
- gmalloc(width * height * sizeof(SplashRGB8));
- break;
- case splashModeRGB8Packed:
- rowSize = (width * 3 + 3) & ~3;
- data.rgb8p = (SplashRGB8P *)
- gmalloc(rowSize * height * sizeof(SplashRGB8P));
- break;
- case splashModeBGR8Packed:
- rowSize = (width * 3 + 3) & ~3;
- data.bgr8 = (SplashBGR8P *)
- gmalloc(rowSize * height * sizeof(SplashMono1P));
- }
-}
-
-
-SplashBitmap::~SplashBitmap() {
- switch (mode) {
- case splashModeMono1:
- gfree(data.mono1);
- break;
- case splashModeMono8:
- gfree(data.mono8);
- break;
- case splashModeRGB8:
- gfree(data.rgb8);
- break;
- case splashModeRGB8Packed:
- gfree(data.rgb8p);
- break;
- case splashModeBGR8Packed:
- gfree(data.bgr8);
- }
-}
-
-SplashError SplashBitmap::writePNMFile(char *fileName) {
- FILE *f;
- SplashMono1P *mono1;
- SplashMono8 *mono8;
- SplashRGB8 *rgb8;
- SplashRGB8P *rgb8pline, *rgb8p;
- SplashBGR8P *bgr8line, *bgr8;
- int x, y;
-
- if (!(f = fopen(fileName, "wb"))) {
- return splashErrOpenFile;
- }
-
- switch (mode) {
-
- case splashModeMono1:
- fprintf(f, "P4\n%d %d\n", width, height);
- mono1 = data.mono1;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; x += 8) {
- fputc(*mono1 ^ 0xff, f);
- ++mono1;
- }
- }
- break;
-
- case splashModeMono8:
- fprintf(f, "P5\n%d %d\n255\n", width, height);
- mono8 = data.mono8;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; ++x) {
- fputc(*mono8, f);
- ++mono8;
- }
- }
- break;
-
- case splashModeRGB8:
- fprintf(f, "P6\n%d %d\n255\n", width, height);
- rgb8 = data.rgb8;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; ++x) {
- fputc(splashRGB8R(*rgb8), f);
- fputc(splashRGB8G(*rgb8), f);
- fputc(splashRGB8B(*rgb8), f);
- ++rgb8;
- }
- }
- break;
-
- case splashModeRGB8Packed:
- fprintf(f, "P6\n%d %d\n255\n", width, height);
- rgb8pline = data.rgb8p;
- for (y = 0; y < height; ++y) {
- rgb8p = rgb8pline;
- for (x = 0; x < width; ++x) {
- fputc(rgb8p[0], f);
- fputc(rgb8p[1], f);
- fputc(rgb8p[2], f);
- rgb8p += 3;
- }
- rgb8pline += rowSize;
- }
- break;
-
- case splashModeBGR8Packed:
- fprintf(f, "P6\n%d %d\n255\n", width, height);
- bgr8line = data.bgr8;
- for (y = 0; y < height; ++y) {
- bgr8 = bgr8line;
- for (x = 0; x < width; ++x) {
- fputc(bgr8[2], f);
- fputc(bgr8[1], f);
- fputc(bgr8[0], f);
- bgr8 += 3;
- }
- bgr8line += rowSize;
- }
- break;
- }
-
- fclose(f);
- return splashOk;
-}
diff --git a/pdf/splash/SplashBitmap.h b/pdf/splash/SplashBitmap.h
deleted file mode 100644
index 75e3217..0000000
--- a/pdf/splash/SplashBitmap.h
+++ /dev/null
@@ -1,48 +0,0 @@
-//========================================================================
-//
-// SplashBitmap.h
-//
-//========================================================================
-
-#ifndef SPLASHBITMAP_H
-#define SPLASHBITMAP_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-//------------------------------------------------------------------------
-// SplashBitmap
-//------------------------------------------------------------------------
-
-class SplashBitmap {
-public:
-
- // Create a new bitmap.
- SplashBitmap(int widthA, int heightA, SplashColorMode modeA);
-
- ~SplashBitmap();
-
- int getWidth() { return width; }
- int getHeight() { return height; }
- int getRowSize() { return rowSize; }
- SplashColorMode getMode() { return mode; }
- SplashColorPtr getDataPtr() { return data; }
-
- SplashError writePNMFile(char *fileName);
-
-private:
-
- int width, height; // size of bitmap
- int rowSize; // size of one row of data, in bytes
- SplashColorMode mode; // color mode
- SplashColorPtr data;
-
- friend class Splash;
-};
-
-#endif
diff --git a/pdf/splash/SplashClip.cc b/pdf/splash/SplashClip.cc
deleted file mode 100644
index 4c70c03..0000000
--- a/pdf/splash/SplashClip.cc
+++ /dev/null
@@ -1,270 +0,0 @@
-//========================================================================
-//
-// SplashClip.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "SplashErrorCodes.h"
-#include "SplashMath.h"
-#include "SplashPath.h"
-#include "SplashXPath.h"
-#include "SplashXPathScanner.h"
-#include "SplashClip.h"
-
-//------------------------------------------------------------------------
-// SplashClip.flags
-//------------------------------------------------------------------------
-
-#define splashClipEO 0x01 // use even-odd rule
-
-//------------------------------------------------------------------------
-// SplashClip
-//------------------------------------------------------------------------
-
-SplashClip::SplashClip(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- if (x0 < x1) {
- xMin = splashFloor(x0);
- xMax = splashFloor(x1);
- } else {
- xMin = splashFloor(x1);
- xMax = splashFloor(x0);
- }
- if (y0 < y1) {
- yMin = splashFloor(y0);
- yMax = splashFloor(y1);
- } else {
- yMin = splashFloor(y1);
- yMax = splashFloor(y0);
- }
- paths = NULL;
- flags = NULL;
- scanners = NULL;
- length = size = 0;
-}
-
-SplashClip::SplashClip(SplashClip *clip) {
- int i;
-
- xMin = clip->xMin;
- yMin = clip->yMin;
- xMax = clip->xMax;
- yMax = clip->yMax;
- length = clip->length;
- size = clip->size;
- paths = (SplashXPath **)gmalloc(size * sizeof(SplashXPath *));
- flags = (Guchar *)gmalloc(size * sizeof(Guchar));
- scanners = (SplashXPathScanner **)
- gmalloc(size * sizeof(SplashXPathScanner *));
- for (i = 0; i < length; ++i) {
- paths[i] = clip->paths[i]->copy();
- flags[i] = clip->flags[i];
- scanners[i] = new SplashXPathScanner(paths[i], flags[i] & splashClipEO);
- }
-}
-
-SplashClip::~SplashClip() {
- int i;
-
- for (i = 0; i < length; ++i) {
- delete paths[i];
- delete scanners[i];
- }
- gfree(paths);
- gfree(flags);
- gfree(scanners);
-}
-
-void SplashClip::grow(int nPaths) {
- if (length + nPaths > size) {
- if (size == 0) {
- size = 32;
- }
- while (size < length + nPaths) {
- size *= 2;
- }
- paths = (SplashXPath **)grealloc(paths, size * sizeof(SplashXPath *));
- flags = (Guchar *)grealloc(flags, size * sizeof(Guchar));
- scanners = (SplashXPathScanner **)
- grealloc(scanners, size * sizeof(SplashXPathScanner *));
- }
-}
-
-void SplashClip::resetToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- int i;
-
- for (i = 0; i < length; ++i) {
- delete paths[i];
- delete scanners[i];
- }
- gfree(paths);
- gfree(flags);
- gfree(scanners);
- paths = NULL;
- flags = NULL;
- scanners = NULL;
- length = size = 0;
-
- if (x0 < x1) {
- xMin = splashFloor(x0);
- xMax = splashFloor(x1);
- } else {
- xMin = splashFloor(x1);
- xMax = splashFloor(x0);
- }
- if (y0 < y1) {
- yMin = splashFloor(y0);
- yMax = splashFloor(y1);
- } else {
- yMin = splashFloor(y1);
- yMax = splashFloor(y0);
- }
-}
-
-SplashError SplashClip::clipToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- int x0I, y0I, x1I, y1I;
-
- if (x0 < x1) {
- x0I = splashFloor(x0);
- x1I = splashFloor(x1);
- } else {
- x0I = splashFloor(x1);
- x1I = splashFloor(x0);
- }
- if (x0I > xMin) {
- xMin = x0I;
- }
- if (x1I < xMax) {
- xMax = x1I;
- }
- if (y0 < y1) {
- y0I = splashFloor(y0);
- y1I = splashFloor(y1);
- } else {
- y0I = splashFloor(y1);
- y1I = splashFloor(y0);
- }
- if (y0I > yMin) {
- yMin = y0I;
- }
- if (y1I < yMax) {
- yMax = y1I;
- }
- return splashOk;
-}
-
-SplashError SplashClip::clipToPath(SplashPath *path, SplashCoord flatness,
- GBool eo) {
- SplashXPath *xPath;
-
- xPath = new SplashXPath(path, flatness, gTrue);
-
- // check for an empty path
- if (xPath->length == 0) {
- xMax = xMin - 1;
- yMax = yMin - 1;
- delete xPath;
-
- // check for a rectangle
- } else if (xPath->length == 4 &&
- ((xPath->segs[0].x0 == xPath->segs[0].x1 &&
- xPath->segs[0].x0 == xPath->segs[1].x0 &&
- xPath->segs[0].x0 == xPath->segs[3].x1 &&
- xPath->segs[2].x0 == xPath->segs[2].x1 &&
- xPath->segs[2].x0 == xPath->segs[1].x1 &&
- xPath->segs[2].x0 == xPath->segs[3].x0 &&
- xPath->segs[1].y0 == xPath->segs[1].y1 &&
- xPath->segs[1].y0 == xPath->segs[0].y1 &&
- xPath->segs[1].y0 == xPath->segs[2].y0 &&
- xPath->segs[3].y0 == xPath->segs[3].y1 &&
- xPath->segs[3].y0 == xPath->segs[0].y0 &&
- xPath->segs[3].y0 == xPath->segs[2].y1) ||
- (xPath->segs[0].y0 == xPath->segs[0].y1 &&
- xPath->segs[0].y0 == xPath->segs[1].y0 &&
- xPath->segs[0].y0 == xPath->segs[3].y1 &&
- xPath->segs[2].y0 == xPath->segs[2].y1 &&
- xPath->segs[2].y0 == xPath->segs[1].y1 &&
- xPath->segs[2].y0 == xPath->segs[3].y0 &&
- xPath->segs[1].x0 == xPath->segs[1].x1 &&
- xPath->segs[1].x0 == xPath->segs[0].x1 &&
- xPath->segs[1].x0 == xPath->segs[2].x0 &&
- xPath->segs[3].x0 == xPath->segs[3].x1 &&
- xPath->segs[3].x0 == xPath->segs[0].x0 &&
- xPath->segs[3].x0 == xPath->segs[2].x1))) {
- clipToRect(xPath->segs[0].x0, xPath->segs[0].y0,
- xPath->segs[2].x0, xPath->segs[2].y0);
- delete xPath;
-
- } else {
- grow(1);
- xPath->sort();
- paths[length] = xPath;
- flags[length] = eo ? splashClipEO : 0;
- scanners[length] = new SplashXPathScanner(xPath, eo);
- ++length;
- }
-
- return splashOk;
-}
-
-GBool SplashClip::test(int x, int y) {
- int i;
-
- // check the rectangle
- if (x < xMin || x > xMax || y < yMin || y > yMax) {
- return gFalse;
- }
-
- // check the paths
- for (i = 0; i < length; ++i) {
- if (!scanners[i]->test(x, y)) {
- return gFalse;
- }
- }
-
- return gTrue;
-}
-
-SplashClipResult SplashClip::testRect(int rectXMin, int rectYMin,
- int rectXMax, int rectYMax) {
- if (rectXMax < xMin || rectXMin > xMax ||
- rectYMax < yMin || rectYMin > yMax) {
- return splashClipAllOutside;
- }
- if (rectXMin >= xMin && rectXMax <= xMax &&
- rectYMin >= yMin && rectYMax <= yMax &&
- length == 0) {
- return splashClipAllInside;
- }
- return splashClipPartial;
-}
-
-SplashClipResult SplashClip::testSpan(int spanXMin, int spanXMax, int spanY) {
- int i;
-
- if (spanXMax < xMin || spanXMin > xMax ||
- spanY < yMin || spanY > yMax) {
- return splashClipAllOutside;
- }
- if (!(spanXMin >= xMin && spanXMax <= xMax &&
- spanY >= yMin && spanY <= yMax)) {
- return splashClipPartial;
- }
- for (i = 0; i < length; ++i) {
- if (!scanners[i]->testSpan(xMin, xMax, spanY)) {
- return splashClipPartial;
- }
- }
- return splashClipAllInside;
-}
diff --git a/pdf/splash/SplashClip.h b/pdf/splash/SplashClip.h
deleted file mode 100644
index 34a4cc5..0000000
--- a/pdf/splash/SplashClip.h
+++ /dev/null
@@ -1,88 +0,0 @@
-//========================================================================
-//
-// SplashClip.h
-//
-//========================================================================
-
-#ifndef SPLASHCLIP_H
-#define SPLASHCLIP_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashPath;
-class SplashXPath;
-class SplashXPathScanner;
-
-//------------------------------------------------------------------------
-
-enum SplashClipResult {
- splashClipAllInside,
- splashClipAllOutside,
- splashClipPartial
-};
-
-//------------------------------------------------------------------------
-// SplashClip
-//------------------------------------------------------------------------
-
-class SplashClip {
-public:
-
- // Create a clip, for the given rectangle.
- SplashClip(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1);
-
- // Copy a clip.
- SplashClip *copy() { return new SplashClip(this); }
-
- ~SplashClip();
-
- // Reset the clip to a rectangle.
- void resetToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1);
-
- // Intersect the clip with a rectangle.
- SplashError clipToRect(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1);
-
- // Interesect the clip with <path>.
- SplashError clipToPath(SplashPath *path, SplashCoord flatness,
- GBool eo);
-
- // Returns true if (<x>,<y>) is inside the clip.
- GBool test(int x, int y);
-
- // Tests a rectangle against the clipping region. Returns one of:
- // - splashClipAllInside if the entire rectangle is inside the
- // clipping region, i.e., all pixels in the rectangle are
- // visible
- // - splashClipAllOutside if the entire rectangle is outside the
- // clipping region, i.e., all the pixels in the rectangle are
- // clipped
- // - splashClipPartial if the rectangle is part inside and part
- // outside the clipping region
- SplashClipResult testRect(int rectXMin, int rectYMin,
- int rectXMax, int rectYMax);
-
- // Similar to testRect, but tests a horizontal span.
- SplashClipResult testSpan(int spanXMin, int spanXMax, int spanY);
-
-private:
-
- SplashClip(SplashClip *clip);
- void grow(int nPaths);
-
- int xMin, yMin, xMax, yMax;
- SplashXPath **paths;
- Guchar *flags;
- SplashXPathScanner **scanners;
- int length, size;
-};
-
-#endif
diff --git a/pdf/splash/SplashErrorCodes.h b/pdf/splash/SplashErrorCodes.h
deleted file mode 100644
index 2a70d4b..0000000
--- a/pdf/splash/SplashErrorCodes.h
+++ /dev/null
@@ -1,32 +0,0 @@
-//========================================================================
-//
-// SplashErrorCodes.h
-//
-//========================================================================
-
-#ifndef SPLASHERRORCODES_H
-#define SPLASHERRORCODES_H
-
-#include <aconf.h>
-
-//------------------------------------------------------------------------
-
-#define splashOk 0 // no error
-
-#define splashErrNoCurPt 1 // no current point
-
-#define splashErrEmptyPath 2 // zero points in path
-
-#define splashErrBogusPath 3 // only one point in subpath
-
-#define splashErrNoSave 4 // state stack is empty
-
-#define splashErrOpenFile 5 // couldn't open file
-
-#define splashErrNoGlyph 6 // couldn't get the requested glyph
-
-#define splashErrModeMismatch 7 // invalid combination of color modes
-
-#define splashErrSingularMatrix 8 // matrix is singular
-
-#endif
diff --git a/pdf/splash/SplashFTFont.cc b/pdf/splash/SplashFTFont.cc
deleted file mode 100644
index 8234014..0000000
--- a/pdf/splash/SplashFTFont.cc
+++ /dev/null
@@ -1,289 +0,0 @@
-//========================================================================
-//
-// SplashFTFont.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashGlyphBitmap.h"
-#include "SplashPath.h"
-#include "SplashFTFontEngine.h"
-#include "SplashFTFontFile.h"
-#include "SplashFTFont.h"
-
-#include FT_OUTLINE_H
-#include FT_INTERNAL_OBJECTS_H // needed for FT_New_Size decl
-
-//------------------------------------------------------------------------
-
-static int glyphPathMoveTo(FT_Vector *pt, void *path);
-static int glyphPathLineTo(FT_Vector *pt, void *path);
-static int glyphPathConicTo(FT_Vector *ctrl, FT_Vector *pt, void *path);
-static int glyphPathCubicTo(FT_Vector *ctrl1, FT_Vector *ctrl2,
- FT_Vector *pt, void *path);
-
-//------------------------------------------------------------------------
-// SplashFTFont
-//------------------------------------------------------------------------
-
-SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA):
- SplashFont(fontFileA, matA, fontFileA->engine->aa)
-{
- FT_Face face;
- SplashCoord size, div;
- int x, y;
-
- face = fontFileA->face;
- if (FT_New_Size(face, &sizeObj)) {
- return;
- }
- face->size = sizeObj;
- size = splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]);
- if (FT_Set_Pixel_Sizes(face, 0, (int)size)) {
- return;
- }
-
- div = face->bbox.xMax > 20000 ? 65536 : 1;
-
- // transform the four corners of the font bounding box -- the min
- // and max values form the bounding box of the transformed font
- x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMin) /
- (div * face->units_per_EM));
- xMin = xMax = x;
- y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMin) /
- (div * face->units_per_EM));
- yMin = yMax = y;
- x = (int)((mat[0] * face->bbox.xMin + mat[2] * face->bbox.yMax) /
- (div * face->units_per_EM));
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)((mat[1] * face->bbox.xMin + mat[3] * face->bbox.yMax) /
- (div * face->units_per_EM));
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMin) /
- (div * face->units_per_EM));
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMin) /
- (div * face->units_per_EM));
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- x = (int)((mat[0] * face->bbox.xMax + mat[2] * face->bbox.yMax) /
- (div * face->units_per_EM));
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)((mat[1] * face->bbox.xMax + mat[3] * face->bbox.yMax) /
- (div * face->units_per_EM));
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- // This is a kludge: some buggy PDF generators embed fonts with
- // zero bounding boxes.
- if (xMax == xMin) {
- xMin = 0;
- xMax = (int)size;
- }
- if (yMax == yMin) {
- yMin = 0;
- yMax = (int)(1.2 * size);
- }
-
- // compute the transform matrix
- matrix.xx = (FT_Fixed)((mat[0] / size) * 65536);
- matrix.yx = (FT_Fixed)((mat[1] / size) * 65536);
- matrix.xy = (FT_Fixed)((mat[2] / size) * 65536);
- matrix.yy = (FT_Fixed)((mat[3] / size) * 65536);
-}
-
-SplashFTFont::~SplashFTFont() {
-}
-
-GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) {
- return SplashFont::getGlyph(c, xFrac, 0, bitmap);
-}
-
-GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) {
- SplashFTFontFile *ff;
- FT_Vector offset;
- FT_GlyphSlot slot;
- FT_UInt gid;
- int rowSize;
- Guchar *p, *q;
- int i;
-
- ff = (SplashFTFontFile *)fontFile;
-
- ff->face->size = sizeObj;
- offset.x = (FT_Pos)(xFrac * splashFontFractionMul * 64);
- offset.y = 0;
- FT_Set_Transform(ff->face, &matrix, &offset);
- slot = ff->face->glyph;
-
- if (ff->codeToGID && c < ff->codeToGIDLen) {
- gid = (FT_UInt)ff->codeToGID[c];
- } else {
- gid = (FT_UInt)c;
- }
-
- // if we have the FT2 bytecode interpreter, autohinting won't be used
-#ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
- if (FT_Load_Glyph(ff->face, gid,
- aa ? FT_LOAD_NO_BITMAP : FT_LOAD_DEFAULT)) {
- return gFalse;
- }
-#else
- // FT2's autohinting doesn't always work very well (especially with
- // font subsets), so turn it off if anti-aliasing is enabled; if
- // anti-aliasing is disabled, this seems to be a tossup - some fonts
- // look better with hinting, some without, so leave hinting on
- if (FT_Load_Glyph(ff->face, gid,
- aa ? FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP
- : FT_LOAD_DEFAULT)) {
- return gFalse;
- }
-#endif
- if (FT_Render_Glyph(slot, aa ? ft_render_mode_normal
- : ft_render_mode_mono)) {
- return gFalse;
- }
-
- bitmap->x = -slot->bitmap_left;
- bitmap->y = slot->bitmap_top;
- bitmap->w = slot->bitmap.width;
- bitmap->h = slot->bitmap.rows;
- bitmap->aa = aa;
- if (aa) {
- rowSize = bitmap->w;
- } else {
- rowSize = (bitmap->w + 7) >> 3;
- }
- bitmap->data = (Guchar *)gmalloc(rowSize * bitmap->h);
- bitmap->freeData = gTrue;
- for (i = 0, p = bitmap->data, q = slot->bitmap.buffer;
- i < bitmap->h;
- ++i, p += rowSize, q += slot->bitmap.pitch) {
- memcpy(p, q, rowSize);
- }
-
- return gTrue;
-}
-
-SplashPath *SplashFTFont::getGlyphPath(int c) {
- static FT_Outline_Funcs outlineFuncs = {
- &glyphPathMoveTo,
- &glyphPathLineTo,
- &glyphPathConicTo,
- &glyphPathCubicTo,
- 0, 0
- };
- SplashFTFontFile *ff;
- SplashPath *path;
- FT_GlyphSlot slot;
- FT_UInt gid;
- FT_Glyph glyph;
-
- ff = (SplashFTFontFile *)fontFile;
- ff->face->size = sizeObj;
- FT_Set_Transform(ff->face, &matrix, NULL);
- slot = ff->face->glyph;
- if (ff->codeToGID && c < ff->codeToGIDLen) {
- gid = ff->codeToGID[c];
- } else {
- gid = (FT_UInt)c;
- }
- if (FT_Load_Glyph(ff->face, gid, FT_LOAD_DEFAULT)) {
- return NULL;
- }
- if (FT_Get_Glyph(slot, &glyph)) {
- return NULL;
- }
- path = new SplashPath();
- FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline,
- &outlineFuncs, path);
- return path;
-}
-
-static int glyphPathMoveTo(FT_Vector *pt, void *path) {
- ((SplashPath *)path)->moveTo(pt->x / 64.0, -pt->y / 64.0);
- return 0;
-}
-
-static int glyphPathLineTo(FT_Vector *pt, void *path) {
- ((SplashPath *)path)->lineTo(pt->x / 64.0, -pt->y / 64.0);
- return 0;
-}
-
-static int glyphPathConicTo(FT_Vector *ctrl, FT_Vector *pt, void *path) {
- SplashCoord x0, y0, x1, y1, x2, y2, x3, y3, xc, yc;
-
- if (!((SplashPath *)path)->getCurPt(&x0, &y0)) {
- return 0;
- }
- xc = ctrl->x / 64.0;
- yc = -ctrl->y / 64.0;
- x3 = pt->x / 64.0;
- y3 = -pt->y / 64.0;
-
- // A second-order Bezier curve is defined by two endpoints, p0 and
- // p3, and one control point, pc:
- //
- // p(t) = (1-t)^2*p0 + t*(1-t)*pc + t^2*p3
- //
- // A third-order Bezier curve is defined by the same two endpoints,
- // p0 and p3, and two control points, p1 and p2:
- //
- // p(t) = (1-t)^3*p0 + 3t*(1-t)^2*p1 + 3t^2*(1-t)*p2 + t^3*p3
- //
- // Applying some algebra, we can convert a second-order curve to a
- // third-order curve:
- //
- // p1 = (1/3) * (p0 + 2pc)
- // p2 = (1/3) * (2pc + p3)
-
- x1 = (1.0 / 3.0) * (x0 + 2 * xc);
- y1 = (1.0 / 3.0) * (y0 + 2 * yc);
- x2 = (1.0 / 3.0) * (2 * xc + x3);
- y2 = (1.0 / 3.0) * (2 * yc + y3);
-
- ((SplashPath *)path)->curveTo(x1, y1, x2, y2, x3, y3);
- return 0;
-}
-
-static int glyphPathCubicTo(FT_Vector *ctrl1, FT_Vector *ctrl2,
- FT_Vector *pt, void *path) {
- ((SplashPath *)path)->curveTo(ctrl1->x / 64.0, -ctrl1->y / 64.0,
- ctrl2->x / 64.0, -ctrl2->y / 64.0,
- pt->x / 64.0, -pt->y / 64.0);
- return 0;
-}
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/pdf/splash/SplashFTFont.h b/pdf/splash/SplashFTFont.h
deleted file mode 100644
index efd0eda..0000000
--- a/pdf/splash/SplashFTFont.h
+++ /dev/null
@@ -1,55 +0,0 @@
-//========================================================================
-//
-// SplashFTFont.h
-//
-//========================================================================
-
-#ifndef SPLASHFTFONT_H
-#define SPLASHFTFONT_H
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include "SplashFont.h"
-
-class SplashFTFontFile;
-
-//------------------------------------------------------------------------
-// SplashFTFont
-//------------------------------------------------------------------------
-
-class SplashFTFont: public SplashFont {
-public:
-
- SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA);
-
- virtual ~SplashFTFont();
-
- // Munge xFrac and yFrac before calling SplashFont::getGlyph.
- virtual GBool getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap);
-
- // Rasterize a glyph. The <xFrac> and <yFrac> values are the same
- // as described for getGlyph.
- virtual GBool makeGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap);
-
- // Return the path for a glyph.
- virtual SplashPath *getGlyphPath(int c);
-
-private:
-
- FT_Size sizeObj;
- FT_Matrix matrix;
-};
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#endif
diff --git a/pdf/splash/SplashFTFontEngine.cc b/pdf/splash/SplashFTFontEngine.cc
deleted file mode 100644
index 7401459..0000000
--- a/pdf/splash/SplashFTFontEngine.cc
+++ /dev/null
@@ -1,141 +0,0 @@
-//========================================================================
-//
-// SplashFTFontEngine.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#ifndef WIN32
-# include <unistd.h>
-#endif
-#include "gmem.h"
-#include "GString.h"
-#include "gfile.h"
-#include "FoFiTrueType.h"
-#include "FoFiType1C.h"
-#include "SplashFTFontFile.h"
-#include "SplashFTFontEngine.h"
-
-#ifdef VMS
-#if (__VMS_VER < 70000000)
-extern "C" int unlink(char *filename);
-#endif
-#endif
-
-//------------------------------------------------------------------------
-
-static void fileWrite(void *stream, char *data, int len) {
- fwrite(data, 1, len, (FILE *)stream);
-}
-
-//------------------------------------------------------------------------
-// SplashFTFontEngine
-//------------------------------------------------------------------------
-
-SplashFTFontEngine::SplashFTFontEngine(GBool aaA, FT_Library libA) {
- aa = aaA;
- lib = libA;
-}
-
-SplashFTFontEngine *SplashFTFontEngine::init(GBool aaA) {
- FT_Library libA;
-
- if (FT_Init_FreeType(&libA)) {
- return NULL;
- }
- return new SplashFTFontEngine(aaA, libA);
-}
-
-SplashFTFontEngine::~SplashFTFontEngine() {
- FT_Done_FreeType(lib);
-}
-
-SplashFontFile *SplashFTFontEngine::loadType1Font(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- char **enc) {
- return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
-}
-
-SplashFontFile *SplashFTFontEngine::loadType1CFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- char **enc) {
- return SplashFTFontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
-}
-
-SplashFontFile *SplashFTFontEngine::loadCIDFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile) {
- FoFiType1C *ff;
- Gushort *cidToGIDMap;
- int nCIDs;
- SplashFontFile *ret;
-
- // check for a CFF font
-#if HAVE_FREETYPE_217_OR_OLDER
- if ((ff = FoFiType1C::load(fileName))) {
- cidToGIDMap = ff->getCIDToGIDMap(&nCIDs);
- delete ff;
- } else {
- cidToGIDMap = NULL;
- nCIDs = 0;
- }
-#else
- // No need to check for CFF Font, freetype treats all CID fonts the same way
- cidToGIDMap = NULL;
- nCIDs = 0;
-#endif
-
- ret = SplashFTFontFile::loadCIDFont(this, idA, fileName, deleteFile,
- cidToGIDMap, nCIDs);
- if (!ret) {
- gfree(cidToGIDMap);
- }
- return ret;
-}
-
-SplashFontFile *SplashFTFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- Gushort *codeToGID,
- int codeToGIDLen) {
- FoFiTrueType *ff;
- GString *tmpFileName;
- FILE *tmpFile;
- SplashFontFile *ret;
-
- if (!(ff = FoFiTrueType::load(fileName))) {
- return NULL;
- }
- tmpFileName = NULL;
- if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
- delete ff;
- return NULL;
- }
- ff->writeTTF(&fileWrite, tmpFile);
- delete ff;
- fclose(tmpFile);
- ret = SplashFTFontFile::loadTrueTypeFont(this, idA,
- tmpFileName->getCString(),
- gTrue, codeToGID, codeToGIDLen);
- if (ret) {
- if (deleteFile) {
- unlink(fileName);
- }
- } else {
- unlink(tmpFileName->getCString());
- }
- delete tmpFileName;
- return ret;
-}
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/pdf/splash/SplashFTFontEngine.h b/pdf/splash/SplashFTFontEngine.h
deleted file mode 100644
index c87108d..0000000
--- a/pdf/splash/SplashFTFontEngine.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//========================================================================
-//
-// SplashFTFontEngine.h
-//
-//========================================================================
-
-#ifndef SPLASHFTFONTENGINE_H
-#define SPLASHFTFONTENGINE_H
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include "gtypes.h"
-
-class SplashFontFile;
-class SplashFontFileID;
-
-//------------------------------------------------------------------------
-// SplashFTFontEngine
-//------------------------------------------------------------------------
-
-class SplashFTFontEngine {
-public:
-
- static SplashFTFontEngine *init(GBool aaA);
-
- ~SplashFTFontEngine();
-
- // Load fonts.
- SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
- SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
- SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile);
- SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile,
- Gushort *codeToGID, int codeToGIDLen);
-
-private:
-
- SplashFTFontEngine(GBool aaA, FT_Library libA);
-
- GBool aa;
- FT_Library lib;
-
- friend class SplashFTFontFile;
- friend class SplashFTFont;
-};
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#endif
diff --git a/pdf/splash/SplashFTFontFile.cc b/pdf/splash/SplashFTFontFile.cc
deleted file mode 100644
index a750966..0000000
--- a/pdf/splash/SplashFTFontFile.cc
+++ /dev/null
@@ -1,111 +0,0 @@
-//========================================================================
-//
-// SplashFTFontFile.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "SplashFTFontEngine.h"
-#include "SplashFTFont.h"
-#include "SplashFTFontFile.h"
-
-//------------------------------------------------------------------------
-// SplashFTFontFile
-//------------------------------------------------------------------------
-
-SplashFontFile *SplashFTFontFile::loadType1Font(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA,
- GBool deleteFileA,
- char **encA) {
- FT_Face faceA;
- Gushort *codeToGIDA;
- char *name;
- int i;
-
- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
- return NULL;
- }
- codeToGIDA = (Gushort *)gmalloc(256 * sizeof(int));
- for (i = 0; i < 256; ++i) {
- codeToGIDA[i] = 0;
- if ((name = encA[i])) {
- codeToGIDA[i] = (Gushort)FT_Get_Name_Index(faceA, name);
- }
- }
-
- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
- faceA, codeToGIDA, 256);
-}
-
-SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA,
- GBool deleteFileA,
- Gushort *codeToGIDA,
- int codeToGIDLenA) {
- FT_Face faceA;
-
- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
- return NULL;
- }
-
- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
- faceA, codeToGIDA, codeToGIDLenA);
-}
-
-SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA,
- GBool deleteFileA,
- Gushort *codeToGIDA,
- int codeToGIDLenA) {
- FT_Face faceA;
-
- if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
- return NULL;
- }
-
- return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
- faceA, codeToGIDA, codeToGIDLenA);
-}
-
-SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA, GBool deleteFileA,
- FT_Face faceA,
- Gushort *codeToGIDA, int codeToGIDLenA):
- SplashFontFile(idA, fileNameA, deleteFileA)
-{
- engine = engineA;
- face = faceA;
- codeToGID = codeToGIDA;
- codeToGIDLen = codeToGIDLenA;
-}
-
-SplashFTFontFile::~SplashFTFontFile() {
- if (face) {
- FT_Done_Face(face);
- }
- if (codeToGID) {
- gfree(codeToGID);
- }
-}
-
-SplashFont *SplashFTFontFile::makeFont(SplashCoord *mat) {
- SplashFont *font;
-
- font = new SplashFTFont(this, mat);
- font->initCache();
- return font;
-}
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
diff --git a/pdf/splash/SplashFTFontFile.h b/pdf/splash/SplashFTFontFile.h
deleted file mode 100644
index 76f1f81..0000000
--- a/pdf/splash/SplashFTFontFile.h
+++ /dev/null
@@ -1,70 +0,0 @@
-//========================================================================
-//
-// SplashFTFontFile.h
-//
-//========================================================================
-
-#ifndef SPLASHFTFONTFILE_H
-#define SPLASHFTFONTFILE_H
-
-#include <aconf.h>
-
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include "SplashFontFile.h"
-
-class SplashFontFileID;
-class SplashFTFontEngine;
-
-//------------------------------------------------------------------------
-// SplashFTFontFile
-//------------------------------------------------------------------------
-
-class SplashFTFontFile: public SplashFontFile {
-public:
-
- static SplashFontFile *loadType1Font(SplashFTFontEngine *engineA,
- SplashFontFileID *idA, char *fileNameA,
- GBool deleteFileA, char **encA);
- static SplashFontFile *loadCIDFont(SplashFTFontEngine *engineA,
- SplashFontFileID *idA, char *fileNameA,
- GBool deleteFileA,
- Gushort *codeToCIDA, int codeToGIDLenA);
- static SplashFontFile *loadTrueTypeFont(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA,
- GBool deleteFileA,
- Gushort *codeToGIDA,
- int codeToGIDLenA);
-
- virtual ~SplashFTFontFile();
-
- // Create a new SplashFTFont, i.e., a scaled instance of this font
- // file.
- virtual SplashFont *makeFont(SplashCoord *mat);
-
-private:
-
- SplashFTFontFile(SplashFTFontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA, GBool deleteFileA,
- FT_Face faceA,
- Gushort *codeToGIDA, int codeToGIDLenA);
-
- SplashFTFontEngine *engine;
- FT_Face face;
- Gushort *codeToGID;
- int codeToGIDLen;
-
- friend class SplashFTFont;
-};
-
-#endif // HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
-
-#endif
diff --git a/pdf/splash/SplashFont.cc b/pdf/splash/SplashFont.cc
deleted file mode 100644
index 461c981..0000000
--- a/pdf/splash/SplashFont.cc
+++ /dev/null
@@ -1,166 +0,0 @@
-//========================================================================
-//
-// SplashFont.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashGlyphBitmap.h"
-#include "SplashFontFile.h"
-#include "SplashFont.h"
-
-//------------------------------------------------------------------------
-
-struct SplashFontCacheTag {
- int c;
- short xFrac, yFrac; // x and y fractions
- int mru; // valid bit (0x80000000) and MRU index
- int x, y, w, h; // offset and size of glyph
-};
-
-//------------------------------------------------------------------------
-// SplashFont
-//------------------------------------------------------------------------
-
-SplashFont::SplashFont(SplashFontFile *fontFileA, SplashCoord *matA,
- GBool aaA) {
- fontFile = fontFileA;
- fontFile->incRefCnt();
- mat[0] = matA[0];
- mat[1] = matA[1];
- mat[2] = matA[2];
- mat[3] = matA[3];
- aa = aaA;
-
- cache = NULL;
- cacheTags = NULL;
-
- xMin = yMin = xMax = yMax = 0;
-}
-
-void SplashFont::initCache() {
- int i;
-
- // this should be (max - min + 1), but we add some padding to
- // deal with rounding errors
- glyphW = xMax - xMin + 3;
- glyphH = yMax - yMin + 3;
- if (aa) {
- glyphSize = glyphW * glyphH;
- } else {
- glyphSize = ((glyphW + 7) >> 3) * glyphH;
- }
-
- // set up the glyph pixmap cache
- cacheAssoc = 8;
- if (glyphSize <= 256) {
- cacheSets = 8;
- } else if (glyphSize <= 512) {
- cacheSets = 4;
- } else if (glyphSize <= 1024) {
- cacheSets = 2;
- } else {
- cacheSets = 1;
- }
- cache = (Guchar *)gmalloc(cacheSets * cacheAssoc * glyphSize);
- cacheTags = (SplashFontCacheTag *)gmalloc(cacheSets * cacheAssoc *
- sizeof(SplashFontCacheTag));
- for (i = 0; i < cacheSets * cacheAssoc; ++i) {
- cacheTags[i].mru = i & (cacheAssoc - 1);
- }
-}
-
-SplashFont::~SplashFont() {
- fontFile->decRefCnt();
- if (cache) {
- gfree(cache);
- }
- if (cacheTags) {
- gfree(cacheTags);
- }
-}
-
-GBool SplashFont::getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) {
- SplashGlyphBitmap bitmap2;
- int size;
- Guchar *p;
- int i, j, k;
-
- // check the cache
- i = (c & (cacheSets - 1)) * cacheAssoc;
- for (j = 0; j < cacheAssoc; ++j) {
- if ((cacheTags[i+j].mru & 0x80000000) &&
- cacheTags[i+j].c == c &&
- (int)cacheTags[i+j].xFrac == xFrac &&
- (int)cacheTags[i+j].yFrac == yFrac) {
- bitmap->x = cacheTags[i+j].x;
- bitmap->y = cacheTags[i+j].y;
- bitmap->w = cacheTags[i+j].w;
- bitmap->h = cacheTags[i+j].h;
- for (k = 0; k < cacheAssoc; ++k) {
- if (k != j &&
- (cacheTags[i+k].mru & 0x7fffffff) <
- (cacheTags[i+j].mru & 0x7fffffff)) {
- ++cacheTags[i+k].mru;
- }
- }
- cacheTags[i+j].mru = 0x80000000;
- bitmap->aa = aa;
- bitmap->data = cache + (i+j) * glyphSize;
- bitmap->freeData = gFalse;
- return gTrue;
- }
- }
-
- // generate the glyph bitmap
- if (!makeGlyph(c, xFrac, yFrac, &bitmap2)) {
- return gFalse;
- }
-
- // if the glyph doesn't fit in the bounding box, return a temporary
- // uncached bitmap
- if (bitmap2.w > glyphW || bitmap2.h > glyphH) {
- *bitmap = bitmap2;
- return gTrue;
- }
-
- // insert glyph pixmap in cache
- if (aa) {
- size = bitmap2.w * bitmap2.h;
- } else {
- size = ((bitmap2.w + 7) >> 3) * bitmap2.h;
- }
- p = NULL; // make gcc happy
- for (j = 0; j < cacheAssoc; ++j) {
- if ((cacheTags[i+j].mru & 0x7fffffff) == cacheAssoc - 1) {
- cacheTags[i+j].mru = 0x80000000;
- cacheTags[i+j].c = c;
- cacheTags[i+j].xFrac = (short)xFrac;
- cacheTags[i+j].yFrac = (short)yFrac;
- cacheTags[i+j].x = bitmap2.x;
- cacheTags[i+j].y = bitmap2.y;
- cacheTags[i+j].w = bitmap2.w;
- cacheTags[i+j].h = bitmap2.h;
- p = cache + (i+j) * glyphSize;
- memcpy(p, bitmap2.data, size);
- } else {
- ++cacheTags[i+j].mru;
- }
- }
- *bitmap = bitmap2;
- bitmap->data = p;
- bitmap->freeData = gFalse;
- if (bitmap2.freeData) {
- gfree(bitmap2.data);
- }
- return gTrue;
-}
diff --git a/pdf/splash/SplashFont.h b/pdf/splash/SplashFont.h
deleted file mode 100644
index 49e36c2..0000000
--- a/pdf/splash/SplashFont.h
+++ /dev/null
@@ -1,89 +0,0 @@
-//========================================================================
-//
-// SplashFont.h
-//
-//========================================================================
-
-#ifndef SPLASHFONT_H
-#define SPLASHFONT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "SplashTypes.h"
-
-struct SplashGlyphBitmap;
-struct SplashFontCacheTag;
-class SplashFontFile;
-class SplashPath;
-
-//------------------------------------------------------------------------
-
-// Fractional positioning uses this many bits to the right of the
-// decimal points.
-#define splashFontFractionBits 2
-#define splashFontFraction (1 << splashFontFractionBits)
-#define splashFontFractionMul (1 / (SplashCoord)splashFontFraction)
-
-//------------------------------------------------------------------------
-// SplashFont
-//------------------------------------------------------------------------
-
-class SplashFont {
-public:
-
- SplashFont(SplashFontFile *fontFileA, SplashCoord *matA, GBool aaA);
-
- // This must be called after the constructor, so that the subclass
- // constructor has a chance to compute the bbox.
- void initCache();
-
- virtual ~SplashFont();
-
- SplashFontFile *getFontFile() { return fontFile; }
-
- // Return true if <this> matches the specified font file and matrix.
- GBool matches(SplashFontFile *fontFileA, SplashCoord *matA) {
- return fontFileA == fontFile &&
- matA[0] == mat[0] && matA[1] == mat[1] &&
- matA[2] == mat[2] && matA[3] == mat[3];
- }
-
- // Get a glyph - this does a cache lookup first, and if not found,
- // creates a new bitmap and adds it to the cache. The <xFrac> and
- // <yFrac> values are splashFontFractionBits bits each, representing
- // the numerators of fractions in [0, 1), where the denominator is
- // splashFontFraction = 1 << splashFontFractionBits. Subclasses
- // should override this to zero out xFrac and/or yFrac if they don't
- // support fractional coordinates.
- virtual GBool getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap);
-
- // Rasterize a glyph. The <xFrac> and <yFrac> values are the same
- // as described for getGlyph.
- virtual GBool makeGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) = 0;
-
- // Return the path for a glyph.
- virtual SplashPath *getGlyphPath(int c) = 0;
-
-protected:
-
- SplashFontFile *fontFile;
- SplashCoord mat[4]; // font transform matrix
- GBool aa; // anti-aliasing
- int xMin, yMin, xMax, yMax; // glyph bounding box
- Guchar *cache; // glyph bitmap cache
- SplashFontCacheTag * // cache tags
- cacheTags;
- int glyphW, glyphH; // size of glyph bitmaps
- int glyphSize; // size of glyph bitmaps, in bytes
- int cacheSets; // number of sets in cache
- int cacheAssoc; // cache associativity (glyphs per set)
-};
-
-#endif
diff --git a/pdf/splash/SplashFontEngine.cc b/pdf/splash/SplashFontEngine.cc
deleted file mode 100644
index b8aef70..0000000
--- a/pdf/splash/SplashFontEngine.cc
+++ /dev/null
@@ -1,245 +0,0 @@
-//========================================================================
-//
-// SplashFontEngine.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#if HAVE_T1LIB_H
-#include <t1lib.h>
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#ifndef WIN32
-# include <unistd.h>
-#endif
-#include "gmem.h"
-#include "GString.h"
-#include "SplashT1FontEngine.h"
-#include "SplashFTFontEngine.h"
-#include "SplashFontFile.h"
-#include "SplashFontFileID.h"
-#include "SplashFont.h"
-#include "SplashFontEngine.h"
-
-#ifdef VMS
-#if (__VMS_VER < 70000000)
-extern "C" int unlink(char *filename);
-#endif
-#endif
-
-//------------------------------------------------------------------------
-// SplashFontEngine
-//------------------------------------------------------------------------
-
-SplashFontEngine::SplashFontEngine(
-#if HAVE_T1LIB_H
- GBool enableT1lib,
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- GBool enableFreeType,
-#endif
- GBool aa) {
- int i;
-
- for (i = 0; i < splashFontCacheSize; ++i) {
- fontCache[i] = NULL;
- }
-
-#if HAVE_T1LIB_H
- if (enableT1lib) {
- t1Engine = SplashT1FontEngine::init(aa);
- } else {
- t1Engine = NULL;
- }
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (enableFreeType) {
- ftEngine = SplashFTFontEngine::init(aa);
- } else {
- ftEngine = NULL;
- }
-#endif
-}
-
-SplashFontEngine::~SplashFontEngine() {
- int i;
-
- for (i = 0; i < splashFontCacheSize; ++i) {
- if (fontCache[i]) {
- delete fontCache[i];
- }
- }
-
-#if HAVE_T1LIB_H
- if (t1Engine) {
- delete t1Engine;
- }
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (ftEngine) {
- delete ftEngine;
- }
-#endif
-}
-
-SplashFontFile *SplashFontEngine::getFontFile(SplashFontFileID *id) {
- SplashFontFile *fontFile;
- int i;
-
- for (i = 0; i < splashFontCacheSize; ++i) {
- if (fontCache[i]) {
- fontFile = fontCache[i]->getFontFile();
- if (fontFile && fontFile->getID()->matches(id)) {
- return fontFile;
- }
- }
- }
- return NULL;
-}
-
-SplashFontFile *SplashFontEngine::loadType1Font(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile, char **enc) {
- SplashFontFile *fontFile;
-
- fontFile = NULL;
-#if HAVE_T1LIB_H
- if (!fontFile && t1Engine) {
- fontFile = t1Engine->loadType1Font(idA, fileName, deleteFile, enc);
- }
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (!fontFile && ftEngine) {
- fontFile = ftEngine->loadType1Font(idA, fileName, deleteFile, enc);
- }
-#endif
-
- // delete the (temporary) font file -- with Unix hard link
- // semantics, this will remove the last link; otherwise it will
- // return an error, leaving the file to be deleted later (if
- // loadXYZFont failed, the file will always be deleted)
- if (deleteFile) {
- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
- }
-
- return fontFile;
-}
-
-SplashFontFile *SplashFontEngine::loadType1CFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- char **enc) {
- SplashFontFile *fontFile;
-
- fontFile = NULL;
-#if HAVE_T1LIB_H
- if (!fontFile && t1Engine) {
- fontFile = t1Engine->loadType1CFont(idA, fileName, deleteFile, enc);
- }
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (!fontFile && ftEngine) {
- fontFile = ftEngine->loadType1CFont(idA, fileName, deleteFile, enc);
- }
-#endif
-
- // delete the (temporary) font file -- with Unix hard link
- // semantics, this will remove the last link; otherwise it will
- // return an error, leaving the file to be deleted later (if
- // loadXYZFont failed, the file will always be deleted)
- if (deleteFile) {
- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
- }
-
- return fontFile;
-}
-
-SplashFontFile *SplashFontEngine::loadCIDFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile) {
- SplashFontFile *fontFile;
-
- fontFile = NULL;
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (!fontFile && ftEngine) {
- fontFile = ftEngine->loadCIDFont(idA, fileName, deleteFile);
- }
-#endif
-
- // delete the (temporary) font file -- with Unix hard link
- // semantics, this will remove the last link; otherwise it will
- // return an error, leaving the file to be deleted later (if
- // loadXYZFont failed, the file will always be deleted)
- if (deleteFile) {
- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
- }
-
- return fontFile;
-}
-
-SplashFontFile *SplashFontEngine::loadTrueTypeFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- Gushort *codeToGID,
- int codeToGIDLen) {
- SplashFontFile *fontFile;
-
- fontFile = NULL;
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- if (!fontFile && ftEngine) {
- fontFile = ftEngine->loadTrueTypeFont(idA, fileName, deleteFile,
- codeToGID, codeToGIDLen);
- }
-#endif
-
- if (!fontFile) {
- gfree(codeToGID);
- }
-
- // delete the (temporary) font file -- with Unix hard link
- // semantics, this will remove the last link; otherwise it will
- // return an error, leaving the file to be deleted later (if
- // loadXYZFont failed, the file will always be deleted)
- if (deleteFile) {
- unlink(fontFile ? fontFile->fileName->getCString() : fileName);
- }
-
- return fontFile;
-}
-
-SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile,
- SplashCoord *mat) {
- SplashFont *font;
- int i, j;
-
- font = fontCache[0];
- if (font && font->matches(fontFile, mat)) {
- return font;
- }
- for (i = 1; i < splashFontCacheSize; ++i) {
- font = fontCache[i];
- if (font && font->matches(fontFile, mat)) {
- for (j = i; j > 0; --j) {
- fontCache[j] = fontCache[j-1];
- }
- fontCache[0] = font;
- return font;
- }
- }
- font = fontFile->makeFont(mat);
- if (fontCache[splashFontCacheSize - 1]) {
- delete fontCache[splashFontCacheSize - 1];
- }
- for (j = splashFontCacheSize - 1; j > 0; --j) {
- fontCache[j] = fontCache[j-1];
- }
- fontCache[0] = font;
- return font;
-}
diff --git a/pdf/splash/SplashFontEngine.h b/pdf/splash/SplashFontEngine.h
deleted file mode 100644
index 2548221..0000000
--- a/pdf/splash/SplashFontEngine.h
+++ /dev/null
@@ -1,85 +0,0 @@
-//========================================================================
-//
-// SplashFontEngine.h
-//
-//========================================================================
-
-#ifndef SPLASHFONTENGINE_H
-#define SPLASHFONTENGINE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-class SplashT1FontEngine;
-class SplashFTFontEngine;
-class SplashDTFontEngine;
-class SplashFontFile;
-class SplashFontFileID;
-class SplashFont;
-
-//------------------------------------------------------------------------
-
-#define splashFontCacheSize 16
-
-//------------------------------------------------------------------------
-// SplashFontEngine
-//------------------------------------------------------------------------
-
-class SplashFontEngine {
-public:
-
- // Create a font engine.
- SplashFontEngine(
-#if HAVE_T1LIB_H
- GBool enableT1lib,
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- GBool enableFreeType,
-#endif
- GBool aa);
-
- ~SplashFontEngine();
-
- // Get a font file from the cache. Returns NULL if there is no
- // matching entry in the cache.
- SplashFontFile *getFontFile(SplashFontFileID *id);
-
- // Load fonts - these create new SplashFontFile objects.
- SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
- SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
- SplashFontFile *loadCIDFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile);
- SplashFontFile *loadTrueTypeFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile,
- Gushort *codeToGID, int codeToGIDLen);
-
- // Get a font - this does a cache lookup first, and if not found,
- // creates a new SplashFont object and adds it to the cache. The
- // matrix:
- // [ mat[0] mat[1] ]
- // [ mat[2] mat[3] ]
- // specifies the font transform in PostScript style:
- // [x' y'] = [x y] * mat
- // Note that the Splash y axis points downward.
- SplashFont *getFont(SplashFontFile *fontFile, SplashCoord *mat);
-
-private:
-
- SplashFont *fontCache[splashFontCacheSize];
-
-#if HAVE_T1LIB_H
- SplashT1FontEngine *t1Engine;
-#endif
-#if HAVE_FREETYPE_FREETYPE_H || HAVE_FREETYPE_H
- SplashFTFontEngine *ftEngine;
-#endif
-};
-
-#endif
diff --git a/pdf/splash/SplashFontFile.cc b/pdf/splash/SplashFontFile.cc
deleted file mode 100644
index acbc12a..0000000
--- a/pdf/splash/SplashFontFile.cc
+++ /dev/null
@@ -1,55 +0,0 @@
-//========================================================================
-//
-// SplashFontFile.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#ifndef WIN32
-# include <unistd.h>
-#endif
-#include "GString.h"
-#include "SplashFontFile.h"
-#include "SplashFontFileID.h"
-
-#ifdef VMS
-#if (__VMS_VER < 70000000)
-extern "C" int unlink(char *filename);
-#endif
-#endif
-
-//------------------------------------------------------------------------
-// SplashFontFile
-//------------------------------------------------------------------------
-
-SplashFontFile::SplashFontFile(SplashFontFileID *idA, char *fileNameA,
- GBool deleteFileA) {
- id = idA;
- fileName = new GString(fileNameA);
- deleteFile = deleteFileA;
- refCnt = 0;
-}
-
-SplashFontFile::~SplashFontFile() {
- if (deleteFile) {
- unlink(fileName->getCString());
- }
- delete fileName;
- delete id;
-}
-
-void SplashFontFile::incRefCnt() {
- ++refCnt;
-}
-
-void SplashFontFile::decRefCnt() {
- if (!--refCnt) {
- delete this;
- }
-}
diff --git a/pdf/splash/SplashFontFile.h b/pdf/splash/SplashFontFile.h
deleted file mode 100644
index 2fe1def..0000000
--- a/pdf/splash/SplashFontFile.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//========================================================================
-//
-// SplashFontFile.h
-//
-//========================================================================
-
-#ifndef SPLASHFONTFILE_H
-#define SPLASHFONTFILE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "SplashTypes.h"
-
-class GString;
-class SplashFontEngine;
-class SplashFont;
-class SplashFontFileID;
-
-//------------------------------------------------------------------------
-// SplashFontFile
-//------------------------------------------------------------------------
-
-class SplashFontFile {
-public:
-
- virtual ~SplashFontFile();
-
- // Create a new SplashFont, i.e., a scaled instance of this font
- // file.
- virtual SplashFont *makeFont(SplashCoord *mat) = 0;
-
- // Get the font file ID.
- SplashFontFileID *getID() { return id; }
-
- // Increment the reference count.
- void incRefCnt();
-
- // Decrement the reference count. If the new value is zero, delete
- // the SplashFontFile object.
- void decRefCnt();
-
-protected:
-
- SplashFontFile(SplashFontFileID *idA, char *fileNameA,
- GBool deleteFileA);
-
- SplashFontFileID *id;
- GString *fileName;
- GBool deleteFile;
- int refCnt;
-
- friend class SplashFontEngine;
-};
-
-#endif
diff --git a/pdf/splash/SplashFontFileID.cc b/pdf/splash/SplashFontFileID.cc
deleted file mode 100644
index af37cb2..0000000
--- a/pdf/splash/SplashFontFileID.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-//========================================================================
-//
-// SplashFontFileID.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "SplashFontFileID.h"
-
-//------------------------------------------------------------------------
-// SplashFontFileID
-//------------------------------------------------------------------------
-
-SplashFontFileID::SplashFontFileID() {
-}
-
-SplashFontFileID::~SplashFontFileID() {
-}
diff --git a/pdf/splash/SplashFontFileID.h b/pdf/splash/SplashFontFileID.h
deleted file mode 100644
index bed11d3..0000000
--- a/pdf/splash/SplashFontFileID.h
+++ /dev/null
@@ -1,30 +0,0 @@
-//========================================================================
-//
-// SplashFontFileID.h
-//
-//========================================================================
-
-#ifndef SPLASHFONTFILEID_H
-#define SPLASHFONTFILEID_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-// SplashFontFileID
-//------------------------------------------------------------------------
-
-class SplashFontFileID {
-public:
-
- SplashFontFileID();
- virtual ~SplashFontFileID();
- virtual GBool matches(SplashFontFileID *id) = 0;
-};
-
-#endif
diff --git a/pdf/splash/SplashGlyphBitmap.h b/pdf/splash/SplashGlyphBitmap.h
deleted file mode 100644
index 044ba4a..0000000
--- a/pdf/splash/SplashGlyphBitmap.h
+++ /dev/null
@@ -1,26 +0,0 @@
-//========================================================================
-//
-// SplashGlyphBitmap.h
-//
-//========================================================================
-
-#ifndef SPLASHGLYPHBITMAP_H
-#define SPLASHGLYPHBITMAP_H
-
-#include <aconf.h>
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-// SplashGlyphBitmap
-//------------------------------------------------------------------------
-
-struct SplashGlyphBitmap {
- int x, y, w, h; // offset and size of glyph
- GBool aa; // anti-aliased: true means 8-bit alpha
- // bitmap; false means 1-bit
- Guchar *data; // bitmap data
- GBool freeData; // true if data memory should be freed
-};
-
-#endif
diff --git a/pdf/splash/SplashMath.h b/pdf/splash/SplashMath.h
deleted file mode 100644
index f1bde14..0000000
--- a/pdf/splash/SplashMath.h
+++ /dev/null
@@ -1,46 +0,0 @@
-//========================================================================
-//
-// SplashMath.h
-//
-//========================================================================
-
-#ifndef SPLASHMATH_H
-#define SPLASHMATH_H
-
-#include <aconf.h>
-#include <math.h>
-#include "SplashTypes.h"
-
-static inline SplashCoord splashAbs(SplashCoord x) {
- return fabs(x);
-}
-
-static inline int splashFloor(SplashCoord x) {
- return (int)floor(x);
-}
-
-static inline int splashCeil(SplashCoord x) {
- return (int)ceil(x);
-}
-
-static inline int splashRound(SplashCoord x) {
- return (int)floor(x + 0.5);
-}
-
-static inline SplashCoord splashSqrt(SplashCoord x) {
- return sqrt(x);
-}
-
-static inline SplashCoord splashPow(SplashCoord x, SplashCoord y) {
- return pow(x, y);
-}
-
-static inline SplashCoord splashDist(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1) {
- SplashCoord dx, dy;
- dx = x1 - x0;
- dy = y1 - y0;
- return sqrt(dx * dx + dy * dy);
-}
-
-#endif
diff --git a/pdf/splash/SplashPath.cc b/pdf/splash/SplashPath.cc
deleted file mode 100644
index 465990f..0000000
--- a/pdf/splash/SplashPath.cc
+++ /dev/null
@@ -1,177 +0,0 @@
-//========================================================================
-//
-// SplashPath.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include "gmem.h"
-#include "SplashErrorCodes.h"
-#include "SplashPath.h"
-
-//------------------------------------------------------------------------
-// SplashPath
-//------------------------------------------------------------------------
-
-// A path can be in three possible states:
-//
-// 1. no current point -- zero or more finished subpaths
-// [curSubpath == length]
-//
-// 2. one point in subpath
-// [curSubpath == length - 1]
-//
-// 3. open subpath with two or more points
-// [curSubpath < length - 1]
-
-SplashPath::SplashPath() {
- pts = NULL;
- flags = NULL;
- length = size = 0;
- curSubpath = 0;
-}
-
-SplashPath::SplashPath(SplashPath *path) {
- length = path->length;
- size = path->size;
- pts = (SplashPathPoint *)gmalloc(size * sizeof(SplashPathPoint));
- flags = (Guchar *)gmalloc(size * sizeof(Guchar));
- memcpy(pts, path->pts, length * sizeof(SplashPathPoint));
- memcpy(flags, path->flags, length * sizeof(Guchar));
- curSubpath = path->curSubpath;
-}
-
-SplashPath::~SplashPath() {
- gfree(pts);
- gfree(flags);
-}
-
-// Add space for <nPts> more points.
-void SplashPath::grow(int nPts) {
- if (length + nPts > size) {
- if (size == 0) {
- size = 32;
- }
- while (size < length + nPts) {
- size *= 2;
- }
- pts = (SplashPathPoint *)grealloc(pts, size * sizeof(SplashPathPoint));
- flags = (Guchar *)grealloc(flags, size * sizeof(Guchar));
- }
-}
-
-void SplashPath::append(SplashPath *path) {
- int i;
-
- curSubpath = length + path->curSubpath;
- grow(path->length);
- for (i = 0; i < path->length; ++i) {
- pts[length] = path->pts[i];
- flags[length] = path->flags[i];
- ++length;
- }
-}
-
-SplashError SplashPath::moveTo(SplashCoord x, SplashCoord y) {
- if (onePointSubpath()) {
- return splashErrBogusPath;
- }
- grow(1);
- pts[length].x = x;
- pts[length].y = y;
- flags[length] = splashPathFirst | splashPathLast;
- curSubpath = length++;
- return splashOk;
-}
-
-SplashError SplashPath::lineTo(SplashCoord x, SplashCoord y) {
- if (noCurrentPoint()) {
- return splashErrNoCurPt;
- }
- flags[length-1] &= ~splashPathLast;
- grow(1);
- pts[length].x = x;
- pts[length].y = y;
- flags[length] = splashPathLast;
- ++length;
- return splashOk;
-}
-
-SplashError SplashPath::curveTo(SplashCoord x1, SplashCoord y1,
- SplashCoord x2, SplashCoord y2,
- SplashCoord x3, SplashCoord y3) {
- if (noCurrentPoint()) {
- return splashErrNoCurPt;
- }
- flags[length-1] &= ~splashPathLast;
- grow(3);
- pts[length].x = x1;
- pts[length].y = y1;
- flags[length] = splashPathCurve;
- ++length;
- pts[length].x = x2;
- pts[length].y = y2;
- flags[length] = splashPathCurve;
- ++length;
- pts[length].x = x3;
- pts[length].y = y3;
- flags[length] = splashPathLast;
- ++length;
- return splashOk;
-}
-
-SplashError SplashPath::arcCWTo(SplashCoord x1, SplashCoord y1,
- SplashCoord xc, SplashCoord yc) {
- if (noCurrentPoint()) {
- return splashErrNoCurPt;
- }
- flags[length-1] &= ~splashPathLast;
- grow(2);
- pts[length].x = xc;
- pts[length].y = yc;
- flags[length] = splashPathArcCW;
- ++length;
- pts[length].x = x1;
- pts[length].y = y1;
- flags[length] = splashPathLast;
- ++length;
- return splashOk;
-}
-
-SplashError SplashPath::close() {
- if (noCurrentPoint()) {
- return splashErrNoCurPt;
- }
- if (pts[length - 1].x != pts[curSubpath].x ||
- pts[length - 1].y != pts[curSubpath].y) {
- lineTo(pts[curSubpath].x, pts[curSubpath].y);
- }
- flags[curSubpath] |= splashPathClosed;
- flags[length - 1] |= splashPathClosed;
- curSubpath = length;
- return splashOk;
-}
-
-void SplashPath::offset(SplashCoord dx, SplashCoord dy) {
- int i;
-
- for (i = 0; i < length; ++i) {
- pts[i].x += dx;
- pts[i].y += dy;
- }
-}
-
-GBool SplashPath::getCurPt(SplashCoord *x, SplashCoord *y) {
- if (noCurrentPoint()) {
- return gFalse;
- }
- *x = pts[length - 1].x;
- *y = pts[length - 1].y;
- return gTrue;
-}
diff --git a/pdf/splash/SplashPath.h b/pdf/splash/SplashPath.h
deleted file mode 100644
index 8aa1a8b..0000000
--- a/pdf/splash/SplashPath.h
+++ /dev/null
@@ -1,107 +0,0 @@
-//========================================================================
-//
-// SplashPath.h
-//
-//========================================================================
-
-#ifndef SPLASHPATH_H
-#define SPLASHPATH_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-//------------------------------------------------------------------------
-// SplashPathPoint
-//------------------------------------------------------------------------
-
-struct SplashPathPoint {
- SplashCoord x, y;
-};
-
-//------------------------------------------------------------------------
-// SplashPath.flags
-//------------------------------------------------------------------------
-
-// first point on each subpath sets this flag
-#define splashPathFirst 0x01
-
-// last point on each subpath sets this flag
-#define splashPathLast 0x02
-
-// if the subpath is closed, its first and last points must be
-// identical, and must set this flag
-#define splashPathClosed 0x04
-
-// curve control points set this flag
-#define splashPathCurve 0x08
-
-// clockwise arc center points set this flag
-#define splashPathArcCW 0x10
-
-//------------------------------------------------------------------------
-// SplashPath
-//------------------------------------------------------------------------
-
-class SplashPath {
-public:
-
- // Create an empty path.
- SplashPath();
-
- // Copy a path.
- SplashPath *copy() { return new SplashPath(this); }
-
- ~SplashPath();
-
- // Append <path> to <this>.
- void append(SplashPath *path);
-
- // Start a new subpath.
- SplashError moveTo(SplashCoord x, SplashCoord y);
-
- // Add a line segment to the last subpath.
- SplashError lineTo(SplashCoord x, SplashCoord y);
-
- // Add a third-order (cubic) Bezier curve segment to the last
- // subpath.
- SplashError curveTo(SplashCoord x1, SplashCoord y1,
- SplashCoord x2, SplashCoord y2,
- SplashCoord x3, SplashCoord y3);
-
- // Add a clockwise circular arc with center (xc, yc) and endpoint
- // (x1, y1).
- SplashError arcCWTo(SplashCoord x1, SplashCoord y1,
- SplashCoord xc, SplashCoord yc);
-
- // Close the last subpath, adding a line segment if necessary.
- SplashError close();
-
- // Add (<dx>, <dy>) to every point on this path.
- void offset(SplashCoord dx, SplashCoord dy);
-
- // Get the current point.
- GBool getCurPt(SplashCoord *x, SplashCoord *y);
-
-private:
-
- SplashPath(SplashPath *path);
- void grow(int nPts);
- GBool noCurrentPoint() { return curSubpath == length; }
- GBool onePointSubpath() { return curSubpath == length - 1; }
- GBool openSubpath() { return curSubpath < length - 1; }
-
- SplashPathPoint *pts; // array of points
- Guchar *flags; // array of flags
- int length, size; // length/size of the pts and flags arrays
- int curSubpath; // index of first point in last subpath
-
- friend class SplashXPath;
- friend class Splash;
-};
-
-#endif
diff --git a/pdf/splash/SplashPattern.cc b/pdf/splash/SplashPattern.cc
deleted file mode 100644
index 1cbd8a9..0000000
--- a/pdf/splash/SplashPattern.cc
+++ /dev/null
@@ -1,64 +0,0 @@
-//========================================================================
-//
-// SplashPattern.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "SplashMath.h"
-#include "SplashScreen.h"
-#include "SplashPattern.h"
-
-//------------------------------------------------------------------------
-// SplashPattern
-//------------------------------------------------------------------------
-
-SplashPattern::SplashPattern() {
-}
-
-SplashPattern::~SplashPattern() {
-}
-
-//------------------------------------------------------------------------
-// SplashSolidColor
-//------------------------------------------------------------------------
-
-SplashSolidColor::SplashSolidColor(SplashColor colorA) {
- color = colorA;
-}
-
-SplashSolidColor::~SplashSolidColor() {
-}
-
-SplashColor SplashSolidColor::getColor(int x, int y) {
- return color;
-}
-
-//------------------------------------------------------------------------
-// SplashHalftone
-//------------------------------------------------------------------------
-
-SplashHalftone::SplashHalftone(SplashColor color0A, SplashColor color1A,
- SplashScreen *screenA, SplashCoord valueA) {
- color0 = color0A;
- color1 = color1A;
- screen = screenA;
- value = valueA;
-}
-
-SplashPattern *SplashHalftone::copy() {
- return new SplashHalftone(color0, color1, screen->copy(), value);
-}
-
-SplashHalftone::~SplashHalftone() {
- delete screen;
-}
-
-SplashColor SplashHalftone::getColor(int x, int y) {
- return screen->test(x, y, value) ? color1 : color0;
-}
diff --git a/pdf/splash/SplashPattern.h b/pdf/splash/SplashPattern.h
deleted file mode 100644
index 4bf4477..0000000
--- a/pdf/splash/SplashPattern.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//========================================================================
-//
-// SplashPattern.h
-//
-//========================================================================
-
-#ifndef SPLASHPATTERN_H
-#define SPLASHPATTERN_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashScreen;
-
-//------------------------------------------------------------------------
-// SplashPattern
-//------------------------------------------------------------------------
-
-class SplashPattern {
-public:
-
- SplashPattern();
-
- virtual SplashPattern *copy() = 0;
-
- virtual ~SplashPattern();
-
- virtual SplashColor getColor(int x, int y) = 0;
-
-private:
-};
-
-//------------------------------------------------------------------------
-// SplashSolidColor
-//------------------------------------------------------------------------
-
-class SplashSolidColor: public SplashPattern {
-public:
-
- SplashSolidColor(SplashColor colorA);
-
- virtual SplashPattern *copy() { return new SplashSolidColor(color); }
-
- virtual ~SplashSolidColor();
-
- virtual SplashColor getColor(int x, int y);
-
-private:
-
- SplashColor color;
-};
-
-//------------------------------------------------------------------------
-// SplashHalftone
-//------------------------------------------------------------------------
-
-class SplashHalftone: public SplashPattern {
-public:
-
- SplashHalftone(SplashColor color0A, SplashColor color1A,
- SplashScreen *screenA, SplashCoord valueA);
-
- virtual SplashPattern *copy();
-
- virtual ~SplashHalftone();
-
- virtual SplashColor getColor(int x, int y);
-
-private:
-
- SplashColor color0, color1;
- SplashScreen *screen;
- SplashCoord value;
-};
-
-#endif
diff --git a/pdf/splash/SplashScreen.cc b/pdf/splash/SplashScreen.cc
deleted file mode 100644
index 4230856..0000000
--- a/pdf/splash/SplashScreen.cc
+++ /dev/null
@@ -1,107 +0,0 @@
-//========================================================================
-//
-// SplashScreen.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashScreen.h"
-
-//------------------------------------------------------------------------
-// SplashScreen
-//------------------------------------------------------------------------
-
-// This generates a 45 degree screen using a circular dot spot
-// function. DPI = resolution / ((size / 2) * sqrt(2)).
-// Gamma correction (gamma = 1 / 1.33) is also computed here.
-SplashScreen::SplashScreen(int sizeA) {
- SplashCoord *dist;
- SplashCoord u, v, d;
- int x, y, x1, y1, i;
-
- size = sizeA >> 1;
- if (size < 1) {
- size = 1;
- }
-
- // initialize the threshold matrix
- mat = (SplashCoord *)gmalloc(2 * size * size * sizeof(SplashCoord));
- for (y = 0; y < 2 * size; ++y) {
- for (x = 0; x < size; ++x) {
- mat[y * size + x] = -1;
- }
- }
-
- // build the distance matrix
- dist = (SplashCoord *)gmalloc(2 * size * size * sizeof(SplashCoord));
- for (y = 0; y < size; ++y) {
- for (x = 0; x < size; ++x) {
- if (x + y < size - 1) {
- u = (SplashCoord)x + 0.5 - 0; //~ (-0.5);
- v = (SplashCoord)y + 0.5 - 0;
- } else {
- u = (SplashCoord)x + 0.5 - (SplashCoord)size; //~ ((SplashCoord)size - 0.5);
- v = (SplashCoord)y + 0.5 - (SplashCoord)size;
- }
- dist[y * size + x] = u*u + v*v;
- }
- }
- for (y = 0; y < size; ++y) {
- for (x = 0; x < size; ++x) {
- if (x < y) {
- u = (SplashCoord)x + 0.5 - 0; //~ (-0.5);
- v = (SplashCoord)y + 0.5 - (SplashCoord)size;
- } else {
- u = (SplashCoord)x + 0.5 - (SplashCoord)size; //~ ((SplashCoord)size - 0.5);
- v = (SplashCoord)y + 0.5 - 0;
- }
- dist[(size + y) * size + x] = u*u + v*v;
- }
- }
-
- // build the threshold matrix
- x1 = y1 = 0; // make gcc happy
- for (i = 1; i <= 2 * size * size; ++i) {
- d = 2 * size * size;
- for (y = 0; y < 2 * size; ++y) {
- for (x = 0; x < size; ++x) {
- if (mat[y * size + x] < 0 &&
- dist[y * size + x] < d) {
- x1 = x;
- y1 = y;
- d = dist[y1 * size + x1];
- }
- }
- }
- u = 1.0 - (SplashCoord)i / (SplashCoord)(2 * size * size + 1);
- mat[y1 * size + x1] = splashPow(u, 1.33);
- }
-
- gfree(dist);
-}
-
-SplashScreen::~SplashScreen() {
- gfree(mat);
-}
-
-int SplashScreen::test(int x, int y, SplashCoord value) {
- SplashCoord *mat1;
- int xx, yy;
-
- xx = x % (2 * size);
- yy = y % (2 * size);
- mat1 = mat;
- if ((xx / size) ^ (yy / size)) {
- mat1 += size * size;
- }
- xx %= size;
- yy %= size;
- return value < mat1[yy * size + xx] ? 0 : 1;
-}
diff --git a/pdf/splash/SplashScreen.h b/pdf/splash/SplashScreen.h
deleted file mode 100644
index 33024bb..0000000
--- a/pdf/splash/SplashScreen.h
+++ /dev/null
@@ -1,40 +0,0 @@
-//========================================================================
-//
-// SplashScreen.h
-//
-//========================================================================
-
-#ifndef SPLASHSCREEN_H
-#define SPLASHSCREEN_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-//------------------------------------------------------------------------
-// SplashScreen
-//------------------------------------------------------------------------
-
-class SplashScreen {
-public:
-
- SplashScreen(int sizeA);
- ~SplashScreen();
-
- SplashScreen *copy() { return new SplashScreen(size << 1); }
-
- // Return the computed pixel value (0=black, 1=white) for the gray
- // level <value> at (<x>, <y>).
- int test(int x, int y, SplashCoord value);
-
-private:
-
- SplashCoord *mat; // threshold matrix
- int size; // size of the threshold matrix
-};
-
-#endif
diff --git a/pdf/splash/SplashState.cc b/pdf/splash/SplashState.cc
deleted file mode 100644
index 7d5dc83..0000000
--- a/pdf/splash/SplashState.cc
+++ /dev/null
@@ -1,99 +0,0 @@
-//========================================================================
-//
-// SplashState.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include "gmem.h"
-#include "SplashPattern.h"
-#include "SplashScreen.h"
-#include "SplashClip.h"
-#include "SplashState.h"
-
-//------------------------------------------------------------------------
-// SplashState
-//------------------------------------------------------------------------
-
-SplashState::SplashState(int width, int height) {
- SplashColor color;
-
- memset(&color, 0, sizeof(SplashColor));
- strokePattern = new SplashSolidColor(color);
- fillPattern = new SplashSolidColor(color);
- screen = new SplashScreen(10);
- lineWidth = 0;
- lineCap = splashLineCapButt;
- lineJoin = splashLineJoinMiter;
- miterLimit = 10;
- flatness = 1;
- lineDash = NULL;
- lineDashLength = 0;
- lineDashPhase = 0;
- clip = new SplashClip(0, 0, width - 1, height - 1);
- next = NULL;
-}
-
-SplashState::SplashState(SplashState *state) {
- strokePattern = state->strokePattern->copy();
- fillPattern = state->fillPattern->copy();
- screen = state->screen->copy();
- lineWidth = state->lineWidth;
- lineCap = state->lineCap;
- lineJoin = state->lineJoin;
- miterLimit = state->miterLimit;
- flatness = state->flatness;
- if (state->lineDash) {
- lineDashLength = state->lineDashLength;
- lineDash = (SplashCoord *)gmalloc(lineDashLength * sizeof(SplashCoord));
- memcpy(lineDash, state->lineDash, lineDashLength * sizeof(SplashCoord));
- } else {
- lineDash = NULL;
- lineDashLength = 0;
- }
- lineDashPhase = state->lineDashPhase;
- clip = state->clip->copy();
- next = NULL;
-}
-
-SplashState::~SplashState() {
- delete strokePattern;
- delete fillPattern;
- delete screen;
- gfree(lineDash);
- delete clip;
-}
-
-void SplashState::setStrokePattern(SplashPattern *strokePatternA) {
- delete strokePattern;
- strokePattern = strokePatternA;
-}
-
-void SplashState::setFillPattern(SplashPattern *fillPatternA) {
- delete fillPattern;
- fillPattern = fillPatternA;
-}
-
-void SplashState::setScreen(SplashScreen *screenA) {
- delete screen;
- screen = screenA;
-}
-
-void SplashState::setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
- SplashCoord lineDashPhaseA) {
- gfree(lineDash);
- lineDashLength = lineDashLengthA;
- if (lineDashLength > 0) {
- lineDash = (SplashCoord *)gmalloc(lineDashLength * sizeof(SplashCoord));
- memcpy(lineDash, lineDashA, lineDashLength * sizeof(SplashCoord));
- } else {
- lineDash = NULL;
- }
- lineDashPhase = lineDashPhaseA;
-}
diff --git a/pdf/splash/SplashState.h b/pdf/splash/SplashState.h
deleted file mode 100644
index 8fcb54b..0000000
--- a/pdf/splash/SplashState.h
+++ /dev/null
@@ -1,88 +0,0 @@
-//========================================================================
-//
-// SplashState.h
-//
-//========================================================================
-
-#ifndef SPLASHSTATE_H
-#define SPLASHSTATE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashPattern;
-class SplashScreen;
-class SplashClip;
-
-//------------------------------------------------------------------------
-// line cap values
-//------------------------------------------------------------------------
-
-#define splashLineCapButt 0
-#define splashLineCapRound 1
-#define splashLineCapProjecting 2
-
-//------------------------------------------------------------------------
-// line join values
-//------------------------------------------------------------------------
-
-#define splashLineJoinMiter 0
-#define splashLineJoinRound 1
-#define splashLineJoinBevel 2
-
-//------------------------------------------------------------------------
-// SplashState
-//------------------------------------------------------------------------
-
-class SplashState {
-public:
-
- // Create a new state object, initialized with default settings.
- SplashState(int width, int height);
-
- // Copy a state object.
- SplashState *copy() { return new SplashState(this); }
-
- ~SplashState();
-
- // Set the stroke pattern. This does not copy <strokePatternA>.
- void setStrokePattern(SplashPattern *strokePatternA);
-
- // Set the fill pattern. This does not copy <fillPatternA>.
- void setFillPattern(SplashPattern *fillPatternA);
-
- // Set the screen. This does not copy <screenA>.
- void setScreen(SplashScreen *screenA);
-
- // Set the line dash pattern. This copies the <lineDashA> array.
- void setLineDash(SplashCoord *lineDashA, int lineDashLengthA,
- SplashCoord lineDashPhaseA);
-
-private:
-
- SplashState(SplashState *state);
-
- SplashPattern *strokePattern;
- SplashPattern *fillPattern;
- SplashScreen *screen;
- SplashCoord lineWidth;
- int lineCap;
- int lineJoin;
- SplashCoord miterLimit;
- SplashCoord flatness;
- SplashCoord *lineDash;
- int lineDashLength;
- SplashCoord lineDashPhase;
- SplashClip *clip;
-
- SplashState *next; // used by Splash class
-
- friend class Splash;
-};
-
-#endif
diff --git a/pdf/splash/SplashT1Font.cc b/pdf/splash/SplashT1Font.cc
deleted file mode 100644
index 8338aba..0000000
--- a/pdf/splash/SplashT1Font.cc
+++ /dev/null
@@ -1,251 +0,0 @@
-//========================================================================
-//
-// SplashT1Font.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <t1lib.h>
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashGlyphBitmap.h"
-#include "SplashPath.h"
-#include "SplashT1FontEngine.h"
-#include "SplashT1FontFile.h"
-#include "SplashT1Font.h"
-
-//------------------------------------------------------------------------
-
-static Guchar bitReverse[256] = {
- 0x00, 0x80, 0x40, 0xc0, 0x20, 0xa0, 0x60, 0xe0,
- 0x10, 0x90, 0x50, 0xd0, 0x30, 0xb0, 0x70, 0xf0,
- 0x08, 0x88, 0x48, 0xc8, 0x28, 0xa8, 0x68, 0xe8,
- 0x18, 0x98, 0x58, 0xd8, 0x38, 0xb8, 0x78, 0xf8,
- 0x04, 0x84, 0x44, 0xc4, 0x24, 0xa4, 0x64, 0xe4,
- 0x14, 0x94, 0x54, 0xd4, 0x34, 0xb4, 0x74, 0xf4,
- 0x0c, 0x8c, 0x4c, 0xcc, 0x2c, 0xac, 0x6c, 0xec,
- 0x1c, 0x9c, 0x5c, 0xdc, 0x3c, 0xbc, 0x7c, 0xfc,
- 0x02, 0x82, 0x42, 0xc2, 0x22, 0xa2, 0x62, 0xe2,
- 0x12, 0x92, 0x52, 0xd2, 0x32, 0xb2, 0x72, 0xf2,
- 0x0a, 0x8a, 0x4a, 0xca, 0x2a, 0xaa, 0x6a, 0xea,
- 0x1a, 0x9a, 0x5a, 0xda, 0x3a, 0xba, 0x7a, 0xfa,
- 0x06, 0x86, 0x46, 0xc6, 0x26, 0xa6, 0x66, 0xe6,
- 0x16, 0x96, 0x56, 0xd6, 0x36, 0xb6, 0x76, 0xf6,
- 0x0e, 0x8e, 0x4e, 0xce, 0x2e, 0xae, 0x6e, 0xee,
- 0x1e, 0x9e, 0x5e, 0xde, 0x3e, 0xbe, 0x7e, 0xfe,
- 0x01, 0x81, 0x41, 0xc1, 0x21, 0xa1, 0x61, 0xe1,
- 0x11, 0x91, 0x51, 0xd1, 0x31, 0xb1, 0x71, 0xf1,
- 0x09, 0x89, 0x49, 0xc9, 0x29, 0xa9, 0x69, 0xe9,
- 0x19, 0x99, 0x59, 0xd9, 0x39, 0xb9, 0x79, 0xf9,
- 0x05, 0x85, 0x45, 0xc5, 0x25, 0xa5, 0x65, 0xe5,
- 0x15, 0x95, 0x55, 0xd5, 0x35, 0xb5, 0x75, 0xf5,
- 0x0d, 0x8d, 0x4d, 0xcd, 0x2d, 0xad, 0x6d, 0xed,
- 0x1d, 0x9d, 0x5d, 0xdd, 0x3d, 0xbd, 0x7d, 0xfd,
- 0x03, 0x83, 0x43, 0xc3, 0x23, 0xa3, 0x63, 0xe3,
- 0x13, 0x93, 0x53, 0xd3, 0x33, 0xb3, 0x73, 0xf3,
- 0x0b, 0x8b, 0x4b, 0xcb, 0x2b, 0xab, 0x6b, 0xeb,
- 0x1b, 0x9b, 0x5b, 0xdb, 0x3b, 0xbb, 0x7b, 0xfb,
- 0x07, 0x87, 0x47, 0xc7, 0x27, 0xa7, 0x67, 0xe7,
- 0x17, 0x97, 0x57, 0xd7, 0x37, 0xb7, 0x77, 0xf7,
- 0x0f, 0x8f, 0x4f, 0xcf, 0x2f, 0xaf, 0x6f, 0xef,
- 0x1f, 0x9f, 0x5f, 0xdf, 0x3f, 0xbf, 0x7f, 0xff
-};
-
-//------------------------------------------------------------------------
-// SplashT1Font
-//------------------------------------------------------------------------
-
-SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA):
- SplashFont(fontFileA, matA, ((SplashT1FontFile *)fontFileA)->engine->aa)
-{
- T1_TMATRIX matrix;
- BBox bbox;
- SplashCoord bbx0, bby0, bbx1, bby1;
- int x, y;
-
- t1libID = T1_CopyFont(fontFileA->t1libID);
-
- // compute font size
- size = (float)splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]);
-
- // transform the four corners of the font bounding box -- the min
- // and max values form the bounding box of the transformed font
- bbox = T1_GetFontBBox(t1libID);
- bbx0 = 0.001 * bbox.llx;
- bby0 = 0.001 * bbox.lly;
- bbx1 = 0.001 * bbox.urx;
- bby1 = 0.001 * bbox.ury;
- // some fonts are completely broken, so we fake it (with values
- // large enough that most glyphs should fit)
- if (bbx0 == 0 && bby0 == 0 && bbx1 == 0 && bby1 == 0) {
- bbx0 = bby0 = -0.5;
- bbx1 = bby1 = 1.5;
- }
- x = (int)(mat[0] * bbx0 + mat[2] * bby0);
- xMin = xMax = x;
- y = (int)(mat[1] * bbx0 + mat[3] * bby0);
- yMin = yMax = y;
- x = (int)(mat[0] * bbx0 + mat[2] * bby1);
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)(mat[1] * bbx0 + mat[3] * bby1);
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- x = (int)(mat[0] * bbx1 + mat[2] * bby0);
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)(mat[1] * bbx1 + mat[3] * bby0);
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- x = (int)(mat[0] * bbx1 + mat[2] * bby1);
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- y = (int)(mat[1] * bbx1 + mat[3] * bby1);
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- // This is a kludge: some buggy PDF generators embed fonts with
- // zero bounding boxes.
- if (xMax == xMin) {
- xMin = 0;
- xMax = (int)size;
- }
- if (yMax == yMin) {
- yMin = 0;
- yMax = (int)(1.2 * size);
- }
- // Another kludge: an unusually large xMin or yMin coordinate is
- // probably wrong.
- if (xMin > 0) {
- xMin = 0;
- }
- if (yMin > 0) {
- yMin = 0;
- }
- // Another kludge: t1lib doesn't correctly handle fonts with
- // real (non-integer) bounding box coordinates.
- if (xMax - xMin > 5000) {
- xMin = 0;
- xMax = (int)size;
- }
- if (yMax - yMin > 5000) {
- yMin = 0;
- yMax = (int)(1.2 * size);
- }
-
- // transform the font
- matrix.cxx = mat[0] / size;
- matrix.cxy = mat[1] / size;
- matrix.cyx = mat[2] / size;
- matrix.cyy = mat[3] / size;
- T1_TransformFont(t1libID, &matrix);
-}
-
-SplashT1Font::~SplashT1Font() {
- T1_DeleteFont(t1libID);
-}
-
-GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) {
- return SplashFont::getGlyph(c, 0, 0, bitmap);
-}
-
-GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap) {
- GLYPH *glyph;
- int n, i;
-
- if (aa) {
- glyph = T1_AASetChar(t1libID, c, size, NULL);
- } else {
- glyph = T1_SetChar(t1libID, c, size, NULL);
- }
- if (!glyph) {
- return gFalse;
- }
-
- bitmap->x = -glyph->metrics.leftSideBearing;
- bitmap->y = glyph->metrics.ascent;
- bitmap->w = glyph->metrics.rightSideBearing - glyph->metrics.leftSideBearing;
- bitmap->h = glyph->metrics.ascent - glyph->metrics.descent;
- bitmap->aa = aa;
- if (aa) {
- bitmap->data = (Guchar *)glyph->bits;
- bitmap->freeData = gFalse;
- } else {
- n = bitmap->h * ((bitmap->w + 7) >> 3);
- bitmap->data = (Guchar *)gmalloc(n);
- for (i = 0; i < n; ++i) {
- bitmap->data[i] = bitReverse[glyph->bits[i] & 0xff];
- }
- bitmap->freeData = gTrue;
- }
-
- return gTrue;
-}
-
-SplashPath *SplashT1Font::getGlyphPath(int c) {
- SplashPath *path;
- T1_OUTLINE *outline;
- T1_PATHSEGMENT *seg;
- T1_BEZIERSEGMENT *bez;
- SplashCoord x, y, x1, y1;
-
- path = new SplashPath();
- outline = T1_GetCharOutline(t1libID, c, size, NULL);
- x = 0;
- y = 0;
- for (seg = outline; seg; seg = seg->link) {
- switch (seg->type) {
- case T1_PATHTYPE_MOVE:
- x += seg->dest.x / 65536.0;
- y += seg->dest.y / 65536.0;
- path->moveTo(x, y);
- break;
- case T1_PATHTYPE_LINE:
- x += seg->dest.x / 65536.0;
- y += seg->dest.y / 65536.0;
- path->lineTo(x, y);
- break;
- case T1_PATHTYPE_BEZIER:
- bez = (T1_BEZIERSEGMENT *)seg;
- x1 = x + bez->dest.x / 65536.0;
- y1 = y + bez->dest.y / 65536.0;
- path->curveTo(x + bez->B.x / 65536.0, y + bez->B.y / 65536.0,
- x + bez->C.x / 65536.0, y + bez->C.y / 65536.0,
- x1, y1);
- x = x1;
- y = y1;
- break;
- }
- }
- T1_FreeOutline(outline);
- return path;
-}
-
-#endif // HAVE_T1LIB_H
diff --git a/pdf/splash/SplashT1Font.h b/pdf/splash/SplashT1Font.h
deleted file mode 100644
index e745e07..0000000
--- a/pdf/splash/SplashT1Font.h
+++ /dev/null
@@ -1,51 +0,0 @@
-//========================================================================
-//
-// SplashT1Font.h
-//
-//========================================================================
-
-#ifndef SPLASHT1FONT_H
-#define SPLASHT1FONT_H
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashFont.h"
-
-//------------------------------------------------------------------------
-// SplashT1Font
-//------------------------------------------------------------------------
-
-class SplashT1Font: public SplashFont {
-public:
-
- SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA);
-
- virtual ~SplashT1Font();
-
- // Munge xFrac and yFrac before calling SplashFont::getGlyph.
- virtual GBool getGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap);
-
- // Rasterize a glyph. The <xFrac> and <yFrac> values are the same
- // as described for getGlyph.
- virtual GBool makeGlyph(int c, int xFrac, int yFrac,
- SplashGlyphBitmap *bitmap);
-
- // Return the path for a glyph.
- virtual SplashPath *getGlyphPath(int c);
-
-private:
-
- int t1libID; // t1lib font ID
- float size;
-};
-
-#endif // HAVE_T1LIB_H
-
-#endif
diff --git a/pdf/splash/SplashT1FontEngine.cc b/pdf/splash/SplashT1FontEngine.cc
deleted file mode 100644
index a1c9342..0000000
--- a/pdf/splash/SplashT1FontEngine.cc
+++ /dev/null
@@ -1,124 +0,0 @@
-//========================================================================
-//
-// SplashT1FontEngine.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stdio.h>
-#ifndef WIN32
-# include <unistd.h>
-#endif
-#include <t1lib.h>
-#include "GString.h"
-#include "gfile.h"
-#include "FoFiType1C.h"
-#include "SplashT1FontFile.h"
-#include "SplashT1FontEngine.h"
-
-#ifdef VMS
-#if (__VMS_VER < 70000000)
-extern "C" int unlink(char *filename);
-#endif
-#endif
-
-//------------------------------------------------------------------------
-
-int SplashT1FontEngine::t1libInitCount = 0;
-
-//------------------------------------------------------------------------
-
-static void fileWrite(void *stream, char *data, int len) {
- fwrite(data, 1, len, (FILE *)stream);
-}
-
-//------------------------------------------------------------------------
-// SplashT1FontEngine
-//------------------------------------------------------------------------
-
-SplashT1FontEngine::SplashT1FontEngine(GBool aaA) {
- aa = aaA;
-}
-
-SplashT1FontEngine *SplashT1FontEngine::init(GBool aaA) {
- // grayVals[i] = round(i * 255 / 16)
- static unsigned long grayVals[17] = {
- 0, 16, 32, 48, 64, 80, 96, 112, 128, 143, 159, 175, 191, 207, 223, 239, 255
- };
-
- //~ for multithreading: need a mutex here
- if (t1libInitCount == 0) {
- T1_SetBitmapPad(8);
- if (!T1_InitLib(NO_LOGFILE | IGNORE_CONFIGFILE | IGNORE_FONTDATABASE |
- T1_NO_AFM)) {
- return NULL;
- }
- if (aaA) {
- T1_AASetBitsPerPixel(8);
- T1_AASetLevel(T1_AA_HIGH);
- T1_AAHSetGrayValues(grayVals);
- } else {
- T1_AANSetGrayValues(0, 1);
- }
- }
- ++t1libInitCount;
-
- return new SplashT1FontEngine(aaA);
-}
-
-SplashT1FontEngine::~SplashT1FontEngine() {
- //~ for multithreading: need a mutex here
- if (--t1libInitCount == 0) {
- T1_CloseLib();
- }
-}
-
-SplashFontFile *SplashT1FontEngine::loadType1Font(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- char **enc) {
- return SplashT1FontFile::loadType1Font(this, idA, fileName, deleteFile, enc);
-}
-
-SplashFontFile *SplashT1FontEngine::loadType1CFont(SplashFontFileID *idA,
- char *fileName,
- GBool deleteFile,
- char **enc) {
- FoFiType1C *ff;
- GString *tmpFileName;
- FILE *tmpFile;
- SplashFontFile *ret;
-
- if (!(ff = FoFiType1C::load(fileName))) {
- return NULL;
- }
- tmpFileName = NULL;
- if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
- delete ff;
- return NULL;
- }
- ff->convertToType1(NULL, gTrue, &fileWrite, tmpFile);
- delete ff;
- fclose(tmpFile);
- ret = SplashT1FontFile::loadType1Font(this, idA, tmpFileName->getCString(),
- gTrue, enc);
- if (ret) {
- if (deleteFile) {
- unlink(fileName);
- }
- } else {
- unlink(tmpFileName->getCString());
- }
- delete tmpFileName;
- return ret;
-}
-
-#endif // HAVE_T1LIB_H
diff --git a/pdf/splash/SplashT1FontEngine.h b/pdf/splash/SplashT1FontEngine.h
deleted file mode 100644
index 57a0448..0000000
--- a/pdf/splash/SplashT1FontEngine.h
+++ /dev/null
@@ -1,53 +0,0 @@
-//========================================================================
-//
-// SplashT1FontEngine.h
-//
-//========================================================================
-
-#ifndef SPLASHT1FONTENGINE_H
-#define SPLASHT1FONTENGINE_H
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-class SplashFontFile;
-class SplashFontFileID;
-
-//------------------------------------------------------------------------
-// SplashT1FontEngine
-//------------------------------------------------------------------------
-
-class SplashT1FontEngine {
-public:
-
- static SplashT1FontEngine *init(GBool aaA);
-
- ~SplashT1FontEngine();
-
- // Load fonts.
- SplashFontFile *loadType1Font(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
- SplashFontFile *loadType1CFont(SplashFontFileID *idA, char *fileName,
- GBool deleteFile, char **enc);
-
-private:
-
- SplashT1FontEngine(GBool aaA);
-
- static int t1libInitCount;
- GBool aa;
-
- friend class SplashT1FontFile;
- friend class SplashT1Font;
-};
-
-#endif // HAVE_T1LIB_H
-
-#endif
diff --git a/pdf/splash/SplashT1FontFile.cc b/pdf/splash/SplashT1FontFile.cc
deleted file mode 100644
index 83eaec9..0000000
--- a/pdf/splash/SplashT1FontFile.cc
+++ /dev/null
@@ -1,96 +0,0 @@
-//========================================================================
-//
-// SplashT1FontFile.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include <t1lib.h>
-#include "gmem.h"
-#include "SplashT1FontEngine.h"
-#include "SplashT1Font.h"
-#include "SplashT1FontFile.h"
-
-//------------------------------------------------------------------------
-// SplashT1FontFile
-//------------------------------------------------------------------------
-
-SplashFontFile *SplashT1FontFile::loadType1Font(SplashT1FontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA,
- GBool deleteFileA,
- char **encA) {
- int t1libIDA;
- char **encTmp;
- char *encStrTmp;
- int encStrSize;
- char *encPtr;
- int i;
-
- // load the font file
- if ((t1libIDA = T1_AddFont(fileNameA)) < 0) {
- return NULL;
- }
- T1_LoadFont(t1libIDA);
-
- // reencode it
- encStrSize = 0;
- for (i = 0; i < 256; ++i) {
- if (encA[i]) {
- encStrSize += strlen(encA[i]) + 1;
- }
- }
- encTmp = (char **)gmalloc(257 * sizeof(char *));
- encStrTmp = (char *)gmalloc(encStrSize * sizeof(char));
- encPtr = encStrTmp;
- for (i = 0; i < 256; ++i) {
- if (encA[i]) {
- strcpy(encPtr, encA[i]);
- encTmp[i] = encPtr;
- encPtr += strlen(encPtr) + 1;
- } else {
- encTmp[i] = ".notdef";
- }
- }
- encTmp[256] = "custom";
- T1_ReencodeFont(t1libIDA, encTmp);
-
- return new SplashT1FontFile(engineA, idA, fileNameA, deleteFileA,
- t1libIDA, encTmp, encStrTmp);
-}
-
-SplashT1FontFile::SplashT1FontFile(SplashT1FontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA, GBool deleteFileA,
- int t1libIDA, char **encA, char *encStrA):
- SplashFontFile(idA, fileNameA, deleteFileA)
-{
- engine = engineA;
- t1libID = t1libIDA;
- enc = encA;
- encStr = encStrA;
-}
-
-SplashT1FontFile::~SplashT1FontFile() {
- gfree(encStr);
- gfree(enc);
- T1_DeleteFont(t1libID);
-}
-
-SplashFont *SplashT1FontFile::makeFont(SplashCoord *mat) {
- SplashFont *font;
-
- font = new SplashT1Font(this, mat);
- font->initCache();
- return font;
-}
-
-#endif // HAVE_T1LIB_H
diff --git a/pdf/splash/SplashT1FontFile.h b/pdf/splash/SplashT1FontFile.h
deleted file mode 100644
index c220c04..0000000
--- a/pdf/splash/SplashT1FontFile.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//========================================================================
-//
-// SplashT1FontFile.h
-//
-//========================================================================
-
-#ifndef SPLASHT1FONTFILE_H
-#define SPLASHT1FONTFILE_H
-
-#include <aconf.h>
-
-#if HAVE_T1LIB_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashFontFile.h"
-
-class SplashT1FontEngine;
-
-//------------------------------------------------------------------------
-// SplashT1FontFile
-//------------------------------------------------------------------------
-
-class SplashT1FontFile: public SplashFontFile {
-public:
-
- static SplashFontFile *loadType1Font(SplashT1FontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA, GBool deleteFileA,
- char **encA);
-
- virtual ~SplashT1FontFile();
-
- // Create a new SplashT1Font, i.e., a scaled instance of this font
- // file.
- virtual SplashFont *makeFont(SplashCoord *mat);
-
-private:
-
- SplashT1FontFile(SplashT1FontEngine *engineA,
- SplashFontFileID *idA,
- char *fileNameA, GBool deleteFileA,
- int t1libIDA, char **encA, char *encStrA);
-
- SplashT1FontEngine *engine;
- int t1libID; // t1lib font ID
- char **enc;
- char *encStr;
-
- friend class SplashT1Font;
-};
-
-#endif // HAVE_T1LIB_H
-
-#endif
diff --git a/pdf/splash/SplashTypes.h b/pdf/splash/SplashTypes.h
deleted file mode 100644
index 38c6775..0000000
--- a/pdf/splash/SplashTypes.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//========================================================================
-//
-// SplashTypes.h
-//
-//========================================================================
-
-#ifndef SPLASHTYPES_H
-#define SPLASHTYPES_H
-
-#include <aconf.h>
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-// coordinates
-//------------------------------------------------------------------------
-
-typedef double SplashCoord;
-
-//------------------------------------------------------------------------
-// colors
-//------------------------------------------------------------------------
-
-enum SplashColorMode {
- splashModeMono1,
- splashModeMono8,
- splashModeRGB8,
- splashModeRGB8Packed,
- splashModeBGR8Packed
-};
-
-// max number of components in any SplashColor
-#define splashMaxColorComps 3
-
-// 1-bit gray or alpha
-typedef Guchar SplashMono1;
-typedef Guchar SplashMono1P; // packed
-
-// 8-bit gray or alpha
-typedef Guchar SplashMono8;
-
-// 3x8-bit RGB: (MSB) 00RRGGBB (LSB)
-typedef Guint SplashRGB8;
-#define splashRGB8R(rgb8) (((rgb8) >> 16) & 0xff)
-#define splashRGB8G(rgb8) (((rgb8) >> 8) & 0xff)
-#define splashRGB8B(rgb8) ((rgb8) & 0xff)
-#define splashMakeRGB8(r, g, b) \
- ((((r) & 0xff) << 16) | (((g) & 0xff) << 8) | ((b) & 0xff))
-
-typedef Guchar SplashRGB8P; // packed
-
-// 3x8-bit RGB: (MSB) 00BBGGRR (LSB)
-typedef Guint SplashBGR8;
-typedef Guchar SplashBGR8P; // packed
-#define splashBGR8R(bgr8) ((bgr8) & 0xff)
-#define splashBGR8G(bgr8) (((bgr8) >> 8) & 0xff)
-#define splashBGR8B(bgr8) (((bgr8) >> 16) & 0xff)
-#define splashMakeBGR8(r, g, b) \
- ((((b) & 0xff) << 16) | (((g) & 0xff) << 8) | ((r) & 0xff))
-
-union SplashColor {
- SplashMono1 mono1;
- SplashMono8 mono8;
- SplashRGB8 rgb8;
- SplashBGR8 bgr8;
-};
-
-union SplashColorPtr {
- SplashMono1P *mono1;
- SplashMono8 *mono8;
- SplashRGB8 *rgb8;
- SplashRGB8P *rgb8p;
- SplashBGR8P *bgr8;
-};
-
-//------------------------------------------------------------------------
-// error results
-//------------------------------------------------------------------------
-
-typedef int SplashError;
-
-#endif
diff --git a/pdf/splash/SplashXPath.cc b/pdf/splash/SplashXPath.cc
deleted file mode 100644
index e1a3afb..0000000
--- a/pdf/splash/SplashXPath.cc
+++ /dev/null
@@ -1,417 +0,0 @@
-//========================================================================
-//
-// SplashXPath.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashPath.h"
-#include "SplashXPath.h"
-
-//------------------------------------------------------------------------
-
-#define maxCurveSplits (1 << 10)
-
-//------------------------------------------------------------------------
-// SplashXPath
-//------------------------------------------------------------------------
-
-SplashXPath::SplashXPath() {
- segs = NULL;
- length = size = 0;
-}
-
-SplashXPath::SplashXPath(SplashPath *path, SplashCoord flatness,
- GBool closeSubpaths) {
- SplashCoord xc, yc, dx, dy, r, x0, y0, x1, y1;
- int quad0, quad1, quad;
- int i, curSubpath;
- GBool last;
-
- segs = NULL;
- length = size = 0;
-
- i = 0;
- curSubpath = 0;
- while (i < path->length) {
-
- // first point in subpath - skip it
- if (path->flags[i] & splashPathFirst) {
- curSubpath = i;
- ++i;
-
- } else {
-
- // curve segment
- if (path->flags[i] & splashPathCurve) {
- addCurve(path->pts[i-1].x, path->pts[i-1].y,
- path->pts[i ].x, path->pts[i ].y,
- path->pts[i+1].x, path->pts[i+1].y,
- path->pts[i+2].x, path->pts[i+2].y,
- flatness,
- (path->flags[i-1] & splashPathFirst),
- (path->flags[i+2] & splashPathLast),
- !closeSubpaths &&
- (path->flags[i-1] & splashPathFirst) &&
- !(path->flags[i-1] & splashPathClosed),
- !closeSubpaths &&
- (path->flags[i+2] & splashPathLast) &&
- !(path->flags[i+2] & splashPathClosed));
- i += 3;
-
- // clockwise circular arc
- } else if (path->flags[i] & splashPathArcCW) {
- xc = path->pts[i].x;
- yc = path->pts[i].y;
- dx = path->pts[i+1].x - xc;
- dy = path->pts[i+1].y - yc;
- r = splashSqrt(dx * dx + dy * dy);
- if (path->pts[i-1].x < xc && path->pts[i-1].y <= yc) {
- quad0 = 0;
- } else if (path->pts[i-1].x >= xc && path->pts[i-1].y < yc) {
- quad0 = 1;
- } else if (path->pts[i-1].x > xc && path->pts[i-1].y >= yc) {
- quad0 = 2;
- } else {
- quad0 = 3;
- }
- if (path->pts[i+1].x <= xc && path->pts[i+1].y < yc) {
- quad1 = 0;
- } else if (path->pts[i+1].x > xc && path->pts[i+1].y <= yc) {
- quad1 = 1;
- } else if (path->pts[i+1].x >= xc && path->pts[i+1].y > yc) {
- quad1 = 2;
- } else {
- quad1 = 3;
- }
- x0 = path->pts[i-1].x;
- y0 = path->pts[i-1].y;
- x1 = y1 = 0; // make gcc happy
- quad = quad0;
- while (1) {
- switch (quad) {
- case 0: x1 = xc; y1 = yc - r; break;
- case 1: x1 = xc + r; y1 = yc; break;
- case 2: x1 = xc; y1 = yc + r; break;
- case 3: x1 = xc - r; y1 = yc; break;
- }
- last = gFalse;
- if (quad == quad1) {
- switch (quad) {
- case 0:
- case 1: last = path->pts[i+1].x > x0; break;
- case 2:
- case 3: last = path->pts[i+1].x < x0; break;
- }
- }
- if (last) {
- addArc(x0, y0, path->pts[i+1].x, path->pts[i+1].y,
- xc, yc, r, quad, flatness,
- quad == quad0 && (path->flags[i-1] & splashPathFirst),
- (path->flags[i+1] & splashPathLast),
- quad == quad0 && !closeSubpaths &&
- (path->flags[i-1] & splashPathFirst) &&
- !(path->flags[i-1] & splashPathClosed),
- !closeSubpaths &&
- (path->flags[i+1] & splashPathLast) &&
- !(path->flags[i+1] & splashPathClosed));
- break;
- } else {
- addArc(x0, y0, x1, y1,
- xc, yc, r, quad, flatness,
- quad == quad0 && (path->flags[i-1] & splashPathFirst),
- gFalse,
- quad == quad0 && !closeSubpaths &&
- (path->flags[i-1] & splashPathFirst) &&
- !(path->flags[i-1] & splashPathClosed),
- gFalse);
- x0 = x1;
- y0 = y1;
- quad = (quad + 1) & 3;
- }
- }
- i += 2;
-
- // line segment
- } else {
- addSegment(path->pts[i-1].x, path->pts[i-1].y,
- path->pts[i].x, path->pts[i].y,
- path->flags[i-1] & splashPathFirst,
- path->flags[i] & splashPathLast,
- !closeSubpaths &&
- (path->flags[i-1] & splashPathFirst) &&
- !(path->flags[i-1] & splashPathClosed),
- !closeSubpaths &&
- (path->flags[i] & splashPathLast) &&
- !(path->flags[i] & splashPathClosed));
- ++i;
- }
-
- // close a subpath
- if (closeSubpaths &&
- (path->flags[i-1] & splashPathLast) &&
- (path->pts[i-1].x != path->pts[curSubpath].x ||
- path->pts[i-1].y != path->pts[curSubpath]. y)) {
- addSegment(path->pts[i-1].x, path->pts[i-1].y,
- path->pts[curSubpath].x, path->pts[curSubpath].y,
- gFalse, gTrue, gFalse, gFalse);
- }
- }
- }
-}
-
-SplashXPath::SplashXPath(SplashXPath *xPath) {
- length = xPath->length;
- size = xPath->size;
- segs = (SplashXPathSeg *)gmalloc(size * sizeof(SplashXPathSeg));
- memcpy(segs, xPath->segs, length * sizeof(SplashXPathSeg));
-}
-
-SplashXPath::~SplashXPath() {
- gfree(segs);
-}
-
-// Add space for <nSegs> more segments
-void SplashXPath::grow(int nSegs) {
- if (length + nSegs > size) {
- if (size == 0) {
- size = 32;
- }
- while (size < length + nSegs) {
- size *= 2;
- }
- segs = (SplashXPathSeg *)grealloc(segs, size * sizeof(SplashXPathSeg));
- }
-}
-
-void SplashXPath::addCurve(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- SplashCoord x2, SplashCoord y2,
- SplashCoord x3, SplashCoord y3,
- SplashCoord flatness,
- GBool first, GBool last, GBool end0, GBool end1) {
- SplashCoord cx[maxCurveSplits + 1][3];
- SplashCoord cy[maxCurveSplits + 1][3];
- int cNext[maxCurveSplits + 1];
- SplashCoord xl0, xl1, xl2, xr0, xr1, xr2, xr3, xx1, xx2, xh;
- SplashCoord yl0, yl1, yl2, yr0, yr1, yr2, yr3, yy1, yy2, yh;
- SplashCoord dx, dy, mx, my, d1, d2, flatness2;
- int p1, p2, p3;
-
- flatness2 = flatness * flatness;
-
- // initial segment
- p1 = 0;
- p2 = maxCurveSplits;
- cx[p1][0] = x0; cy[p1][0] = y0;
- cx[p1][1] = x1; cy[p1][1] = y1;
- cx[p1][2] = x2; cy[p1][2] = y2;
- cx[p2][0] = x3; cy[p2][0] = y3;
- cNext[p1] = p2;
-
- while (p1 < maxCurveSplits) {
-
- // get the next segment
- xl0 = cx[p1][0]; yl0 = cy[p1][0];
- xx1 = cx[p1][1]; yy1 = cy[p1][1];
- xx2 = cx[p1][2]; yy2 = cy[p1][2];
- p2 = cNext[p1];
- xr3 = cx[p2][0]; yr3 = cy[p2][0];
-
- // compute the distances from the control points to the
- // midpoint of the straight line (this is a bit of a hack, but
- // it's much faster than computing the actual distances to the
- // line)
- mx = (xl0 + xr3) * 0.5;
- my = (yl0 + yr3) * 0.5;
- dx = xx1 - mx;
- dy = yy1 - my;
- d1 = dx*dx + dy*dy;
- dx = xx2 - mx;
- dy = yy2 - my;
- d2 = dx*dx + dy*dy;
-
- // if the curve is flat enough, or no more subdivisions are
- // allowed, add the straight line segment
- if (p2 - p1 == 1 || (d1 <= flatness2 && d2 <= flatness2)) {
- addSegment(xl0, yl0, xr3, yr3,
- p1 == 0 && first,
- p2 == maxCurveSplits && last,
- p1 == 0 && end0,
- p2 == maxCurveSplits && end1);
- p1 = p2;
-
- // otherwise, subdivide the curve
- } else {
- xl1 = (xl0 + xx1) * 0.5;
- yl1 = (yl0 + yy1) * 0.5;
- xh = (xx1 + xx2) * 0.5;
- yh = (yy1 + yy2) * 0.5;
- xl2 = (xl1 + xh) * 0.5;
- yl2 = (yl1 + yh) * 0.5;
- xr2 = (xx2 + xr3) * 0.5;
- yr2 = (yy2 + yr3) * 0.5;
- xr1 = (xh + xr2) * 0.5;
- yr1 = (yh + yr2) * 0.5;
- xr0 = (xl2 + xr1) * 0.5;
- yr0 = (yl2 + yr1) * 0.5;
- // add the new subdivision points
- p3 = (p1 + p2) / 2;
- cx[p1][1] = xl1; cy[p1][1] = yl1;
- cx[p1][2] = xl2; cy[p1][2] = yl2;
- cNext[p1] = p3;
- cx[p3][0] = xr0; cy[p3][0] = yr0;
- cx[p3][1] = xr1; cy[p3][1] = yr1;
- cx[p3][2] = xr2; cy[p3][2] = yr2;
- cNext[p3] = p2;
- }
- }
-}
-
-void SplashXPath::addArc(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- SplashCoord xc, SplashCoord yc,
- SplashCoord r, int quad,
- SplashCoord flatness,
- GBool first, GBool last, GBool end0, GBool end1) {
- SplashCoord px[maxCurveSplits + 1];
- SplashCoord py[maxCurveSplits + 1];
- int pNext[maxCurveSplits + 1];
- SplashCoord r2, flatness2;
- SplashCoord xx0, yy0, xx1, yy1, xm, ym, t, dx, dy;
- int p1, p2, p3;
-
- r2 = r * r;
- flatness2 = flatness * flatness;
-
- // initial segment
- p1 = 0;
- p2 = maxCurveSplits;
- px[p1] = x0; py[p1] = y0;
- px[p2] = x1; py[p2] = y1;
- pNext[p1] = p2;
-
- while (p1 < maxCurveSplits) {
-
- // get the next segment
- xx0 = px[p1]; yy0 = py[p1];
- p2 = pNext[p1];
- xx1 = px[p2]; yy1 = py[p2];
-
- // compute the arc midpoint
- t = (xx0 - xc) * (xx1 - xc) - (yy0 - yc) * (yy1 - yc);
- xm = splashSqrt(0.5 * (r2 + t));
- ym = splashSqrt(0.5 * (r2 - t));
- switch (quad) {
- case 0: xm = xc - xm; ym = yc - ym; break;
- case 1: xm = xc + xm; ym = yc - ym; break;
- case 2: xm = xc + xm; ym = yc + ym; break;
- case 3: xm = xc - xm; ym = yc + ym; break;
- }
-
- // compute distance from midpoint of straight segment to midpoint
- // of arc
- dx = 0.5 * (xx0 + xx1) - xm;
- dy = 0.5 * (yy0 + yy1) - ym;
-
- // if the arc is flat enough, or no more subdivisions are allowed,
- // add the straight line segment
- if (p2 - p1 == 1 || dx * dx + dy * dy <= flatness2) {
- addSegment(xx0, yy0, xx1, yy1,
- p1 == 0 && first,
- p2 == maxCurveSplits && last,
- p1 == 0 && end0,
- p2 == maxCurveSplits && end1);
- p1 = p2;
-
- // otherwise, subdivide the arc
- } else {
- p3 = (p1 + p2) / 2;
- px[p3] = xm;
- py[p3] = ym;
- pNext[p1] = p3;
- pNext[p3] = p2;
- }
- }
-}
-
-void SplashXPath::addSegment(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- GBool first, GBool last, GBool end0, GBool end1) {
- grow(1);
- segs[length].x0 = x0;
- segs[length].y0 = y0;
- segs[length].x1 = x1;
- segs[length].y1 = y1;
- segs[length].flags = 0;
- if (first) {
- segs[length].flags |= splashXPathFirst;
- }
- if (last) {
- segs[length].flags |= splashXPathLast;
- }
- if (end0) {
- segs[length].flags |= splashXPathEnd0;
- }
- if (end1) {
- segs[length].flags |= splashXPathEnd1;
- }
- if (y1 == y0) {
- segs[length].dxdy = segs[length].dydx = 0;
- segs[length].flags |= splashXPathHoriz;
- if (x1 == x0) {
- segs[length].flags |= splashXPathVert;
- }
- } else if (x1 == x0) {
- segs[length].dxdy = segs[length].dydx = 0;
- segs[length].flags |= splashXPathVert;
- } else {
- segs[length].dxdy = (x1 - x0) / (y1 - y0);
- segs[length].dydx = 1 / segs[length].dxdy;
- }
- if (y0 > y1) {
- segs[length].flags |= splashXPathFlip;
- }
- ++length;
-}
-
-static int cmpXPathSegs(const void *arg0, const void *arg1) {
- SplashXPathSeg *seg0 = (SplashXPathSeg *)arg0;
- SplashXPathSeg *seg1 = (SplashXPathSeg *)arg1;
- SplashCoord x0, y0, x1, y1;
-
- if (seg0->flags & splashXPathFlip) {
- x0 = seg0->x1;
- y0 = seg0->y1;
- } else {
- x0 = seg0->x0;
- y0 = seg0->y0;
- }
- if (seg1->flags & splashXPathFlip) {
- x1 = seg1->x1;
- y1 = seg1->y1;
- } else {
- x1 = seg1->x0;
- y1 = seg1->y0;
- }
- if (y0 != y1) {
- return (y0 > y1) ? 1 : -1;
- }
- if (x0 != x1) {
- return (x0 > x1) ? 1 : -1;
- }
- return 0;
-}
-
-void SplashXPath::sort() {
- qsort(segs, length, sizeof(SplashXPathSeg), &cmpXPathSegs);
-}
diff --git a/pdf/splash/SplashXPath.h b/pdf/splash/SplashXPath.h
deleted file mode 100644
index a9fe9a2..0000000
--- a/pdf/splash/SplashXPath.h
+++ /dev/null
@@ -1,92 +0,0 @@
-//========================================================================
-//
-// SplashXPath.h
-//
-//========================================================================
-
-#ifndef SPLASHXPATH_H
-#define SPLASHXPATH_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashPath;
-
-//------------------------------------------------------------------------
-// SplashXPathSeg
-//------------------------------------------------------------------------
-
-struct SplashXPathSeg {
- SplashCoord x0, y0; // first endpoint
- SplashCoord x1, y1; // second endpoint
- SplashCoord dxdy; // slope: delta-x / delta-y
- SplashCoord dydx; // slope: delta-y / delta-x
- Guint flags;
-};
-
-#define splashXPathFirst 0x01 // first segment of a subpath
-#define splashXPathLast 0x02 // last segment of a subpath
-#define splashXPathEnd0 0x04 // first endpoint is end of an open subpath
-#define splashXPathEnd1 0x08 // second endpoint is end of an open subpath
-#define splashXPathHoriz 0x10 // segment is vertical (y0 == y1)
- // (dxdy is undef)
-#define splashXPathVert 0x20 // segment is horizontal (x0 == x1)
- // (dydx is undef)
-#define splashXPathFlip 0x40 // y0 > y1
-
-//------------------------------------------------------------------------
-// SplashXPath
-//------------------------------------------------------------------------
-
-class SplashXPath {
-public:
-
- // Expands (converts to segments) and flattens (converts curves to
- // lines) <path>. If <closeSubpaths> is true, closes all open
- // subpaths.
- SplashXPath(SplashPath *path, SplashCoord flatness,
- GBool closeSubpaths);
-
- // Copy an expanded path.
- SplashXPath *copy() { return new SplashXPath(this); }
-
- ~SplashXPath();
-
- // Sort by upper coordinate (lower y), in y-major order.
- void sort();
-
-private:
-
- SplashXPath();
- SplashXPath(SplashXPath *xPath);
- void grow(int nSegs);
- void addCurve(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- SplashCoord x2, SplashCoord y2,
- SplashCoord x3, SplashCoord y3,
- SplashCoord flatness,
- GBool first, GBool last, GBool end0, GBool end1);
- void addArc(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- SplashCoord xc, SplashCoord yc,
- SplashCoord r, int quad,
- SplashCoord flatness,
- GBool first, GBool last, GBool end0, GBool end1);
- void addSegment(SplashCoord x0, SplashCoord y0,
- SplashCoord x1, SplashCoord y1,
- GBool first, GBool last, GBool end0, GBool end1);
-
- SplashXPathSeg *segs;
- int length, size; // length and size of segs array
-
- friend class SplashXPathScanner;
- friend class SplashClip;
- friend class Splash;
-};
-
-#endif
diff --git a/pdf/splash/SplashXPathScanner.cc b/pdf/splash/SplashXPathScanner.cc
deleted file mode 100644
index c93cc49..0000000
--- a/pdf/splash/SplashXPathScanner.cc
+++ /dev/null
@@ -1,271 +0,0 @@
-//========================================================================
-//
-// SplashXPathScanner.cc
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include "gmem.h"
-#include "SplashMath.h"
-#include "SplashXPath.h"
-#include "SplashXPathScanner.h"
-
-//------------------------------------------------------------------------
-
-struct SplashIntersect {
- int x0, x1; // intersection of segment with [y, y+1)
- int count; // EO/NZWN counter increment
-};
-
-static int cmpIntersect(const void *p0, const void *p1) {
- return ((SplashIntersect *)p0)->x0 - ((SplashIntersect *)p1)->x0;
-}
-
-//------------------------------------------------------------------------
-// SplashXPathScanner
-//------------------------------------------------------------------------
-
-SplashXPathScanner::SplashXPathScanner(SplashXPath *xPathA, GBool eoA) {
- SplashXPathSeg *seg;
- SplashCoord xMinFP, yMinFP, xMaxFP, yMaxFP;
- int i;
-
- xPath = xPathA;
- eo = eoA;
-
- // compute the bbox
- seg = &xPath->segs[0];
- if (seg->x0 <= seg->x1) {
- xMinFP = seg->x0;
- xMaxFP = seg->x1;
- } else {
- xMinFP = seg->x1;
- xMaxFP = seg->x0;
- }
- if (seg->flags & splashXPathFlip) {
- yMinFP = seg->y1;
- yMaxFP = seg->y0;
- } else {
- yMinFP = seg->y0;
- yMaxFP = seg->y1;
- }
- for (i = 1; i < xPath->length; ++i) {
- seg = &xPath->segs[i];
- if (seg->x0 < xMinFP) {
- xMinFP = seg->x0;
- } else if (seg->x0 > xMaxFP) {
- xMaxFP = seg->x0;
- }
- if (seg->x1 < xMinFP) {
- xMinFP = seg->x1;
- } else if (seg->x1 > xMaxFP) {
- xMaxFP = seg->x1;
- }
- if (seg->flags & splashXPathFlip) {
- if (seg->y0 > yMaxFP) {
- yMaxFP = seg->y0;
- }
- } else {
- if (seg->y1 > yMaxFP) {
- yMaxFP = seg->y1;
- }
- }
- }
- xMin = splashFloor(xMinFP);
- xMax = splashFloor(xMaxFP);
- yMin = splashFloor(yMinFP);
- yMax = splashFloor(yMaxFP);
-
- interY = 0;
- xPathIdx = 0;
- inter = NULL;
- interLen = interSize = 0;
- computeIntersections(yMin);
-}
-
-SplashXPathScanner::~SplashXPathScanner() {
- gfree(inter);
-}
-
-void SplashXPathScanner::getSpanBounds(int y, int *spanXMin, int *spanXMax) {
- if (interY != y) {
- computeIntersections(y);
- }
- if (interLen > 0) {
- *spanXMin = inter[0].x0;
- *spanXMax = inter[interLen - 1].x1;
- } else {
- *spanXMin = xMax + 1;
- *spanXMax = xMax;
- }
-}
-
-GBool SplashXPathScanner::test(int x, int y) {
- int count, i;
-
- if (interY != y) {
- computeIntersections(y);
- }
- count = 0;
- for (i = 0; i < interLen && inter[i].x0 <= x; ++i) {
- if (x <= inter[i].x1) {
- return gTrue;
- }
- count += inter[i].count;
- }
- return eo ? (count & 1) : (count != 0);
-}
-
-GBool SplashXPathScanner::testSpan(int x0, int x1, int y) {
- int count, xx1, i;
-
- if (interY != y) {
- computeIntersections(y);
- }
-
- count = 0;
- for (i = 0; i < interLen && inter[i].x1 < x0; ++i) {
- count += inter[i].count;
- }
-
- // invariant: the subspan [x0,xx1] is inside the path
- xx1 = x0 - 1;
- while (xx1 < x1) {
- if (i >= interLen) {
- return gFalse;
- }
- if (inter[i].x0 > xx1 + 1 &&
- !(eo ? (count & 1) : (count != 0))) {
- return gFalse;
- }
- if (inter[i].x1 > xx1) {
- xx1 = inter[i].x1;
- }
- count += inter[i].count;
- ++i;
- }
-
- return gTrue;
-}
-
-GBool SplashXPathScanner::getNextSpan(int y, int *x0, int *x1) {
- int xx0, xx1;
-
- if (interY != y) {
- computeIntersections(y);
- }
- if (interIdx >= interLen) {
- return gFalse;
- }
- xx0 = inter[interIdx].x0;
- xx1 = inter[interIdx].x1;
- interCount += inter[interIdx].count;
- ++interIdx;
- while (interIdx < interLen &&
- (inter[interIdx].x0 <= xx1 ||
- (eo ? (interCount & 1) : (interCount != 0)))) {
- if (inter[interIdx].x1 > xx1) {
- xx1 = inter[interIdx].x1;
- }
- interCount += inter[interIdx].count;
- ++interIdx;
- }
- *x0 = xx0;
- *x1 = xx1;
- return gTrue;
-}
-
-void SplashXPathScanner::computeIntersections(int y) {
- SplashCoord ySegMin, ySegMax, xx0, xx1;
- SplashXPathSeg *seg;
- int i, j;
-
- // find the first segment that intersects [y, y+1)
- i = (y >= interY) ? xPathIdx : 0;
- while (i < xPath->length &&
- xPath->segs[i].y0 < y && xPath->segs[i].y1 < y) {
- ++i;
- }
- xPathIdx = i;
-
- // find all of the segments that intersect [y, y+1) and create an
- // Intersect element for each one
- interLen = 0;
- for (j = i; j < xPath->length; ++j) {
- seg = &xPath->segs[j];
- if (seg->flags & splashXPathFlip) {
- ySegMin = seg->y1;
- ySegMax = seg->y0;
- } else {
- ySegMin = seg->y0;
- ySegMax = seg->y1;
- }
-
- // ensure that: ySegMin < y+1
- // y <= ySegMax
- if (ySegMin >= y + 1) {
- break;
- }
- if (ySegMax < y) {
- continue;
- }
-
- if (interLen == interSize) {
- if (interSize == 0) {
- interSize = 16;
- } else {
- interSize *= 2;
- }
- inter = (SplashIntersect *)grealloc(inter,
- interSize * sizeof(SplashIntersect));
- }
-
- if (seg->flags & splashXPathHoriz) {
- xx0 = seg->x0;
- xx1 = seg->x1;
- } else if (seg->flags & splashXPathVert) {
- xx0 = xx1 = seg->x0;
- } else {
- if (ySegMin <= y) {
- // intersection with top edge
- xx0 = seg->x0 + (y - seg->y0) * seg->dxdy;
- } else {
- // x coord of segment endpoint with min y coord
- xx0 = (seg->flags & splashXPathFlip) ? seg->x1 : seg->x0;
- }
- if (ySegMax >= y + 1) {
- // intersection with bottom edge
- xx1 = seg->x0 + (y + 1 - seg->y0) * seg->dxdy;
- } else {
- // x coord of segment endpoint with max y coord
- xx1 = (seg->flags & splashXPathFlip) ? seg->x0 : seg->x1;
- }
- }
- if (xx0 < xx1) {
- inter[interLen].x0 = splashFloor(xx0);
- inter[interLen].x1 = splashFloor(xx1);
- } else {
- inter[interLen].x0 = splashFloor(xx1);
- inter[interLen].x1 = splashFloor(xx0);
- }
- if (ySegMin <= y && y < ySegMax && !(seg->flags & splashXPathHoriz)) {
- inter[interLen].count = eo ? 1
- : (seg->flags & splashXPathFlip) ? 1 : -1;
- } else {
- inter[interLen].count = 0;
- }
- ++interLen;
- }
-
- qsort(inter, interLen, sizeof(SplashIntersect), &cmpIntersect);
-
- interY = y;
- interIdx = 0;
- interCount = 0;
-}
diff --git a/pdf/splash/SplashXPathScanner.h b/pdf/splash/SplashXPathScanner.h
deleted file mode 100644
index 62484ba..0000000
--- a/pdf/splash/SplashXPathScanner.h
+++ /dev/null
@@ -1,74 +0,0 @@
-//========================================================================
-//
-// SplashXPathScanner.h
-//
-//========================================================================
-
-#ifndef SPLASHXPATHSCANNER_H
-#define SPLASHXPATHSCANNER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "SplashTypes.h"
-
-class SplashXPath;
-struct SplashIntersect;
-
-//------------------------------------------------------------------------
-// SplashXPathScanner
-//------------------------------------------------------------------------
-
-class SplashXPathScanner {
-public:
-
- // Create a new SplashXPathScanner object. <xPathA> must be sorted.
- SplashXPathScanner(SplashXPath *xPathA, GBool eoA);
-
- ~SplashXPathScanner();
-
- // Return the path's bounding box.
- void getBBox(int *xMinA, int *yMinA, int *xMaxA, int *yMaxA)
- { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
-
- // Return the min/max x values for the span at <y>.
- void getSpanBounds(int y, int *spanXMin, int *spanXMax);
-
- // Returns true if (<x>,<y>) is inside the path.
- GBool test(int x, int y);
-
- // Returns true if the entire span ([<x0>,<x1>], <y>) is inside the
- // path.
- GBool testSpan(int x0, int x1, int y);
-
- // Returns the next span inside the path at <y>. If <y> is
- // different than the previous call to getNextSpan, this returns the
- // first span at <y>; otherwise it returns the next span (relative
- // to the previous call to getNextSpan). Returns false if there are
- // no more spans at <y>.
- GBool getNextSpan(int y, int *x0, int *x1);
-
-private:
-
- void computeIntersections(int y);
-
- SplashXPath *xPath;
- GBool eo;
- int xMin, yMin, xMax, yMax;
-
- int interY; // current y value
- int interIdx; // current index into <inter> - used by
- // getNextSpan
- int interCount; // current EO/NZWN counter - used by
- // getNextSpan
- int xPathIdx; // current index into <xPath> - used by
- // computeIntersections
- SplashIntersect *inter; // intersections array for <interY>
- int interLen; // number of intersections in <inter>
- int interSize; // size of the <inter> array
-};
-
-#endif
diff --git a/pdf/splash/vms_make.com b/pdf/splash/vms_make.com
deleted file mode 100644
index e69de29..0000000
--- a/pdf/splash/vms_make.com
+++ /dev/null
diff --git a/pdf/xpdf/test-gdk-output-dev.cc b/pdf/test-gdk-output-dev.cc
index df08aed..713cd24 100644
--- a/pdf/xpdf/test-gdk-output-dev.cc
+++ b/pdf/test-gdk-output-dev.cc
@@ -4,20 +4,15 @@
* Copyright 2004 Red Hat, Inc.
*/
-#include <config.h>
-
-#include <aconf.h>
#include <stdio.h>
#include <stdlib.h>
-#include "gpdf-g-switch.h"
#include <gtk/gtk.h>
-#include "gpdf-g-switch.h"
-#include "GlobalParams.h"
+#include <GlobalParams.h>
+#include <PDFDoc.h>
+#include <ErrorCodes.h>
#include "GDKSplashOutputDev.h"
-#include "PDFDoc.h"
-#include "ErrorCodes.h"
typedef struct
{
@@ -60,12 +55,12 @@ view_load (View *v,
{
PDFDoc *newDoc;
int err;
- GString *filename_g;
+ GooString *filename_g;
GtkAdjustment *hadj;
GtkAdjustment *vadj;
int w, h;
- filename_g = new GString (filename);
+ filename_g = new GooString (filename);
// open the PDF file
newDoc = new PDFDoc(filename_g, 0, 0);
diff --git a/pdf/xpdf/.cvsignore b/pdf/xpdf/.cvsignore
deleted file mode 100644
index 760a964..0000000
--- a/pdf/xpdf/.cvsignore
+++ /dev/null
@@ -1,21 +0,0 @@
-.deps
-.libs
-GNOME_PDF.server
-GNOME_PDF.server.in
-Makefile
-Makefile.in
-bonobo-application-x-pdf
-cachegrind.out.*
-gnome-pdf-viewer
-gpdf
-gpdf-marshal.c
-gpdf-marshal.h
-gpdf-properties-dialog.gladep
-pdfimages
-pdfinfo
-pdftopbm
-pdftops
-pdftotext
-semantic.cache
-test-gdk-output-dev
-xpdf
diff --git a/pdf/xpdf/Annot.cc b/pdf/xpdf/Annot.cc
deleted file mode 100644
index 42bf849..0000000
--- a/pdf/xpdf/Annot.cc
+++ /dev/null
@@ -1,137 +0,0 @@
-//========================================================================
-//
-// Annot.cc
-//
-// Copyright 2000-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "Object.h"
-#include "Gfx.h"
-#include "Annot.h"
-
-//------------------------------------------------------------------------
-// Annot
-//------------------------------------------------------------------------
-
-Annot::Annot(XRef *xrefA, Dict *dictA) {
- Object apObj, asObj, obj1, obj2;
- double t;
-
- ok = gFalse;
- xref = xrefA;
- dict = dictA;
- dict->incRef();
-
- dictA->lookup("Subtype", &subtype);
- if (dictA->lookup("AP", &apObj)->isDict()) {
- if (dictA->lookup("AS", &asObj)->isName()) {
- if (apObj.dictLookup("N", &obj1)->isDict()) {
- if (obj1.dictLookupNF(asObj.getName(), &obj2)->isRef()) {
- obj2.copy(&appearance);
- ok = gTrue;
- }
- obj2.free();
- }
- obj1.free();
- } else {
- if (apObj.dictLookupNF("N", &obj1)->isRef()) {
- obj1.copy(&appearance);
- ok = gTrue;
- }
- obj1.free();
- }
- asObj.free();
- }
- apObj.free();
-
- if (dictA->lookup("Rect", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- //~ should check object types here
- obj1.arrayGet(0, &obj2);
- xMin = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- yMin = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- xMax = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- yMax = obj2.getNum();
- obj2.free();
- if (xMin > xMax) {
- t = xMin; xMin = xMax; xMax = t;
- }
- if (yMin > yMax) {
- t = yMin; yMin = yMax; yMax = t;
- }
- } else {
- //~ this should return an error
- xMin = yMin = 0;
- xMax = yMax = 1;
- }
- obj1.free();
-}
-
-Annot::~Annot() {
- appearance.free();
-}
-
-void Annot::draw(Gfx *gfx) {
- Object obj;
-
- if (appearance.fetch(xref, &obj)->isStream()) {
- gfx->doAnnot(&obj, xMin, yMin, xMax, yMax);
- }
- obj.free();
-}
-
-//------------------------------------------------------------------------
-// Annots
-//------------------------------------------------------------------------
-
-Annots::Annots(XRef *xref, Object *annotsObj) {
- Annot *annot;
- Object obj1;
- int size;
- int i;
-
- annots = NULL;
- size = 0;
- nAnnots = 0;
-
- if (annotsObj->isArray()) {
- for (i = 0; i < annotsObj->arrayGetLength(); ++i) {
- if (annotsObj->arrayGet(i, &obj1)->isDict()) {
- annot = new Annot(xref, obj1.getDict());
- if (annot->isOk()) {
- if (nAnnots >= size) {
- size += 16;
- annots = (Annot **)grealloc(annots, size * sizeof(Annot *));
- }
- annots[nAnnots++] = annot;
- } else {
- delete annot;
- }
- }
- obj1.free();
- }
- }
-}
-
-Annots::~Annots() {
- int i;
-
- for (i = 0; i < nAnnots; ++i) {
- delete annots[i];
- }
- gfree(annots);
-}
diff --git a/pdf/xpdf/Annot.h b/pdf/xpdf/Annot.h
deleted file mode 100644
index 092b613..0000000
--- a/pdf/xpdf/Annot.h
+++ /dev/null
@@ -1,81 +0,0 @@
-//========================================================================
-//
-// Annot.h
-//
-// Copyright 2000-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ANNOT_H
-#define ANNOT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-class XRef;
-class Gfx;
-
-//------------------------------------------------------------------------
-// Annot
-//------------------------------------------------------------------------
-
-class Annot {
-public:
-
- Annot(XRef *xrefA, Dict *dict);
- ~Annot();
- GBool isOk() { return ok; }
-
- void draw(Gfx *gfx);
-
- // Get appearance object.
- Object *getAppearance(Object *obj) { return appearance.fetch(xref, obj); }
-
- // Get subtype object
- Object *getSubtype(Object *obj) {return subtype.copy(obj); };
-
- // Get dictionary
- Dict *getDict() {return dict; };
-
- // Get annot appearance ID
- int getRefNum() {return appearance.getRefNum();};
- int getRefGen() {return appearance.getRefGen();};
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- Dict *dict;
- Object subtype;
- Object appearance; // a reference to the Form XObject stream
- // for the normal appearance
- double xMin, yMin, // annotation rectangle
- xMax, yMax;
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// Annots
-//------------------------------------------------------------------------
-
-class Annots {
-public:
-
- // Extract non-link annotations from array of annotations.
- Annots(XRef *xref, Object *annotsObj);
-
- ~Annots();
-
- // Iterate through list of annotations.
- int getNumAnnots() { return nAnnots; }
- Annot *getAnnot(int i) { return annots[i]; }
-
-private:
-
- Annot **annots;
- int nAnnots;
-};
-
-#endif
diff --git a/pdf/xpdf/Array.cc b/pdf/xpdf/Array.cc
deleted file mode 100644
index a6c6db1..0000000
--- a/pdf/xpdf/Array.cc
+++ /dev/null
@@ -1,73 +0,0 @@
-//========================================================================
-//
-// Array.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Array.h"
-
-//------------------------------------------------------------------------
-// Array
-//------------------------------------------------------------------------
-
-Array::Array(XRef *xrefA) {
- xref = xrefA;
- elems = NULL;
- size = length = 0;
- ref = 1;
-}
-
-Array::~Array() {
- int i;
-
- for (i = 0; i < length; ++i)
- elems[i].free();
- gfree(elems);
-}
-
-void Array::add(Object *elem) {
- if (length == size) {
- if (length == 0) {
- size = 8;
- } else {
- size *= 2;
- }
- elems = (Object *)grealloc(elems, size * sizeof(Object));
- }
- elems[length] = *elem;
- ++length;
-}
-
-Object *Array::get(int i, Object *obj) {
- if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
- abort();
-#else
- return obj->initNull();
-#endif
- }
- return elems[i].fetch(xref, obj);
-}
-
-Object *Array::getNF(int i, Object *obj) {
- if (i < 0 || i >= length) {
-#ifdef DEBUG_MEM
- abort();
-#else
- return obj->initNull();
-#endif
- }
- return elems[i].copy(obj);
-}
diff --git a/pdf/xpdf/Array.h b/pdf/xpdf/Array.h
deleted file mode 100644
index 20ae05f..0000000
--- a/pdf/xpdf/Array.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//========================================================================
-//
-// Array.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ARRAY_H
-#define ARRAY_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-
-class XRef;
-
-//------------------------------------------------------------------------
-// Array
-//------------------------------------------------------------------------
-
-class Array {
-public:
-
- // Constructor.
- Array(XRef *xrefA);
-
- // Destructor.
- ~Array();
-
- // Reference counting.
- int incRef() { return ++ref; }
- int decRef() { return --ref; }
-
- // Get number of elements.
- int getLength() { return length; }
-
- // Add an element.
- void add(Object *elem);
-
- // Accessors.
- Object *get(int i, Object *obj);
- Object *getNF(int i, Object *obj);
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- Object *elems; // array of elements
- int size; // size of <elems> array
- int length; // number of elements in array
- int ref; // reference count
-};
-
-#endif
diff --git a/pdf/xpdf/BaseFile.h b/pdf/xpdf/BaseFile.h
deleted file mode 100644
index c596b42..0000000
--- a/pdf/xpdf/BaseFile.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//========================================================================
-//
-// BaseFile.h
-//
-// Copyright 1999 Derek B. Noonburg assigned by Michael Meeks.
-//
-//========================================================================
-
-#ifndef BASEFILE_H
-#define BASEFILE_H
-
-#include <stdio.h>
-#include <stdarg.h>
-
-#include "Error.h"
-
-//#ifdef BONOBO_IO
-# include "BonoboFile.h"
-/*#else
-
-typedef FILE * BaseFile;
-
-static inline BaseFile
-bxpdfopen (GString *fileName1)
-{
- GString *fileName2;
- // try to open file
- fileName2 = NULL;
- BaseFile file;
-
-#ifdef VMS
- if (!(file = fopen(fileName->getCString(), "rb", "ctx=stm"))) {
- error(-1, "Couldn't open file '%s'", fileName->getCString());
- return NULL;
- }
-#else
- if (!(file = fopen(fileName1->getCString(), "rb"))) {
- fileName2 = fileName1->copy();
- fileName2->lowerCase();
- if (!(file = fopen(fileName2->getCString(), "rb"))) {
- fileName2->upperCase();
- if (!(file = fopen(fileName2->getCString(), "rb"))) {
- error(-1, "Couldn't open file '%s'", fileName1->getCString());
- delete fileName2;
- return NULL;
- }
- }
- delete fileName2;
- }
-#endif
- return file;
-}
-
-static inline void
-bfclose (BaseFile file)
-{
- fclose (file);
-}
-
-static inline size_t
-bfread (void *ptr, size_t size, size_t nmemb, BaseFile file)
-{
- return fread (ptr, size, nmemb, file);
-}
-
-static inline int
-bfseek (BaseFile file, long offset, int whence)
-{
- return fseek (file, offset, whence);
-}
-
-static inline void
-brewind (BaseFile file)
-{
- rewind (file);
-}
-
-static inline long
-bftell (BaseFile file)
-{
- return ftell (file);
-}*/
-
-//#endif /* BONOBO_IO not defined */
-#endif /* BASEFILE_H */
-
-
diff --git a/pdf/xpdf/BuiltinFont.cc b/pdf/xpdf/BuiltinFont.cc
deleted file mode 100644
index a687e73..0000000
--- a/pdf/xpdf/BuiltinFont.cc
+++ /dev/null
@@ -1,65 +0,0 @@
-//========================================================================
-//
-// BuiltinFont.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include "gmem.h"
-#include "FontEncodingTables.h"
-#include "BuiltinFont.h"
-
-//------------------------------------------------------------------------
-
-BuiltinFontWidths::BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA) {
- int i, h;
-
- size = sizeA;
- tab = (BuiltinFontWidth **)gmalloc(size * sizeof(BuiltinFontWidth *));
- for (i = 0; i < size; ++i) {
- tab[i] = NULL;
- }
- for (i = 0; i < sizeA; ++i) {
- h = hash(widths[i].name);
- widths[i].next = tab[h];
- tab[h] = &widths[i];
- }
-}
-
-BuiltinFontWidths::~BuiltinFontWidths() {
- gfree(tab);
-}
-
-GBool BuiltinFontWidths::getWidth(char *name, Gushort *width) {
- int h;
- BuiltinFontWidth *p;
-
- h = hash(name);
- for (p = tab[h]; p; p = p->next) {
- if (!strcmp(p->name, name)) {
- *width = p->width;
- return gTrue;
- }
- }
- return gFalse;
-}
-
-int BuiltinFontWidths::hash(char *name) {
- char *p;
- unsigned int h;
-
- h = 0;
- for (p = name; *p; ++p) {
- h = 17 * h + (int)(*p & 0xff);
- }
- return (int)(h % size);
-}
diff --git a/pdf/xpdf/BuiltinFont.h b/pdf/xpdf/BuiltinFont.h
deleted file mode 100644
index 903ed19..0000000
--- a/pdf/xpdf/BuiltinFont.h
+++ /dev/null
@@ -1,57 +0,0 @@
-//========================================================================
-//
-// BuiltinFont.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef BUILTINFONT_H
-#define BUILTINFONT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-struct BuiltinFont;
-class BuiltinFontWidths;
-
-//------------------------------------------------------------------------
-
-struct BuiltinFont {
- char *name;
- char **defaultBaseEnc;
- short ascent;
- short descent;
- short bbox[4];
- BuiltinFontWidths *widths;
-};
-
-//------------------------------------------------------------------------
-
-struct BuiltinFontWidth {
- char *name;
- Gushort width;
- BuiltinFontWidth *next;
-};
-
-class BuiltinFontWidths {
-public:
-
- BuiltinFontWidths(BuiltinFontWidth *widths, int sizeA);
- ~BuiltinFontWidths();
- GBool getWidth(char *name, Gushort *width);
-
-private:
-
- int hash(char *name);
-
- BuiltinFontWidth **tab;
- int size;
-};
-
-#endif
diff --git a/pdf/xpdf/BuiltinFontTables.cc b/pdf/xpdf/BuiltinFontTables.cc
deleted file mode 100644
index 9c36238..0000000
--- a/pdf/xpdf/BuiltinFontTables.cc
+++ /dev/null
@@ -1,4284 +0,0 @@
-//========================================================================
-//
-// BuiltinFontTables.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdlib.h>
-#include "FontEncodingTables.h"
-#include "BuiltinFontTables.h"
-
-static BuiltinFontWidth courierWidthsTab[] = {
- { "Ntilde", 600, NULL },
- { "rcaron", 600, NULL },
- { "kcommaaccent", 600, NULL },
- { "Ncommaaccent", 600, NULL },
- { "Zacute", 600, NULL },
- { "comma", 600, NULL },
- { "cedilla", 600, NULL },
- { "plusminus", 600, NULL },
- { "circumflex", 600, NULL },
- { "dotaccent", 600, NULL },
- { "edotaccent", 600, NULL },
- { "asciitilde", 600, NULL },
- { "colon", 600, NULL },
- { "onehalf", 600, NULL },
- { "dollar", 600, NULL },
- { "Lcaron", 600, NULL },
- { "ntilde", 600, NULL },
- { "Aogonek", 600, NULL },
- { "ncommaaccent", 600, NULL },
- { "minus", 600, NULL },
- { "Iogonek", 600, NULL },
- { "zacute", 600, NULL },
- { "yen", 600, NULL },
- { "space", 600, NULL },
- { "Omacron", 600, NULL },
- { "questiondown", 600, NULL },
- { "emdash", 600, NULL },
- { "Agrave", 600, NULL },
- { "three", 600, NULL },
- { "numbersign", 600, NULL },
- { "lcaron", 600, NULL },
- { "A", 600, NULL },
- { "B", 600, NULL },
- { "C", 600, NULL },
- { "aogonek", 600, NULL },
- { "D", 600, NULL },
- { "E", 600, NULL },
- { "onequarter", 600, NULL },
- { "F", 600, NULL },
- { "G", 600, NULL },
- { "H", 600, NULL },
- { "I", 600, NULL },
- { "J", 600, NULL },
- { "K", 600, NULL },
- { "iogonek", 600, NULL },
- { "L", 600, NULL },
- { "backslash", 600, NULL },
- { "periodcentered", 600, NULL },
- { "M", 600, NULL },
- { "N", 600, NULL },
- { "omacron", 600, NULL },
- { "Tcommaaccent", 600, NULL },
- { "O", 600, NULL },
- { "P", 600, NULL },
- { "Q", 600, NULL },
- { "Uhungarumlaut", 600, NULL },
- { "R", 600, NULL },
- { "Aacute", 600, NULL },
- { "caron", 600, NULL },
- { "S", 600, NULL },
- { "T", 600, NULL },
- { "U", 600, NULL },
- { "agrave", 600, NULL },
- { "V", 600, NULL },
- { "W", 600, NULL },
- { "equal", 600, NULL },
- { "question", 600, NULL },
- { "X", 600, NULL },
- { "Y", 600, NULL },
- { "Z", 600, NULL },
- { "four", 600, NULL },
- { "a", 600, NULL },
- { "Gcommaaccent", 600, NULL },
- { "b", 600, NULL },
- { "c", 600, NULL },
- { "d", 600, NULL },
- { "e", 600, NULL },
- { "f", 600, NULL },
- { "g", 600, NULL },
- { "bullet", 600, NULL },
- { "h", 600, NULL },
- { "i", 600, NULL },
- { "Oslash", 600, NULL },
- { "dagger", 600, NULL },
- { "j", 600, NULL },
- { "k", 600, NULL },
- { "l", 600, NULL },
- { "m", 600, NULL },
- { "n", 600, NULL },
- { "tcommaaccent", 600, NULL },
- { "o", 600, NULL },
- { "ordfeminine", 600, NULL },
- { "ring", 600, NULL },
- { "p", 600, NULL },
- { "q", 600, NULL },
- { "uhungarumlaut", 600, NULL },
- { "r", 600, NULL },
- { "twosuperior", 600, NULL },
- { "aacute", 600, NULL },
- { "s", 600, NULL },
- { "OE", 600, NULL },
- { "t", 600, NULL },
- { "divide", 600, NULL },
- { "u", 600, NULL },
- { "Ccaron", 600, NULL },
- { "v", 600, NULL },
- { "w", 600, NULL },
- { "x", 600, NULL },
- { "y", 600, NULL },
- { "z", 600, NULL },
- { "Gbreve", 600, NULL },
- { "commaaccent", 600, NULL },
- { "hungarumlaut", 600, NULL },
- { "Idotaccent", 600, NULL },
- { "Nacute", 600, NULL },
- { "quotedbl", 600, NULL },
- { "gcommaaccent", 600, NULL },
- { "mu", 600, NULL },
- { "greaterequal", 600, NULL },
- { "Scaron", 600, NULL },
- { "Lslash", 600, NULL },
- { "semicolon", 600, NULL },
- { "oslash", 600, NULL },
- { "lessequal", 600, NULL },
- { "lozenge", 600, NULL },
- { "parenright", 600, NULL },
- { "ccaron", 600, NULL },
- { "Ecircumflex", 600, NULL },
- { "gbreve", 600, NULL },
- { "trademark", 600, NULL },
- { "daggerdbl", 600, NULL },
- { "nacute", 600, NULL },
- { "macron", 600, NULL },
- { "Otilde", 600, NULL },
- { "Emacron", 600, NULL },
- { "ellipsis", 600, NULL },
- { "scaron", 600, NULL },
- { "AE", 600, NULL },
- { "Ucircumflex", 600, NULL },
- { "lslash", 600, NULL },
- { "quotedblleft", 600, NULL },
- { "hyphen", 600, NULL },
- { "guilsinglright", 600, NULL },
- { "quotesingle", 600, NULL },
- { "eight", 600, NULL },
- { "exclamdown", 600, NULL },
- { "endash", 600, NULL },
- { "oe", 600, NULL },
- { "Abreve", 600, NULL },
- { "Umacron", 600, NULL },
- { "ecircumflex", 600, NULL },
- { "Adieresis", 600, NULL },
- { "copyright", 600, NULL },
- { "Egrave", 600, NULL },
- { "slash", 600, NULL },
- { "Edieresis", 600, NULL },
- { "otilde", 600, NULL },
- { "Idieresis", 600, NULL },
- { "parenleft", 600, NULL },
- { "one", 600, NULL },
- { "emacron", 600, NULL },
- { "Odieresis", 600, NULL },
- { "ucircumflex", 600, NULL },
- { "bracketleft", 600, NULL },
- { "Ugrave", 600, NULL },
- { "quoteright", 600, NULL },
- { "Udieresis", 600, NULL },
- { "perthousand", 600, NULL },
- { "Ydieresis", 600, NULL },
- { "umacron", 600, NULL },
- { "abreve", 600, NULL },
- { "Eacute", 600, NULL },
- { "adieresis", 600, NULL },
- { "egrave", 600, NULL },
- { "edieresis", 600, NULL },
- { "idieresis", 600, NULL },
- { "Eth", 600, NULL },
- { "ae", 600, NULL },
- { "asterisk", 600, NULL },
- { "odieresis", 600, NULL },
- { "Uacute", 600, NULL },
- { "ugrave", 600, NULL },
- { "five", 600, NULL },
- { "nine", 600, NULL },
- { "udieresis", 600, NULL },
- { "Zcaron", 600, NULL },
- { "Scommaaccent", 600, NULL },
- { "threequarters", 600, NULL },
- { "guillemotright", 600, NULL },
- { "Ccedilla", 600, NULL },
- { "ydieresis", 600, NULL },
- { "tilde", 600, NULL },
- { "at", 600, NULL },
- { "eacute", 600, NULL },
- { "underscore", 600, NULL },
- { "Euro", 600, NULL },
- { "Dcroat", 600, NULL },
- { "zero", 600, NULL },
- { "multiply", 600, NULL },
- { "eth", 600, NULL },
- { "Scedilla", 600, NULL },
- { "Racute", 600, NULL },
- { "Ograve", 600, NULL },
- { "partialdiff", 600, NULL },
- { "uacute", 600, NULL },
- { "braceleft", 600, NULL },
- { "Thorn", 600, NULL },
- { "zcaron", 600, NULL },
- { "scommaaccent", 600, NULL },
- { "ccedilla", 600, NULL },
- { "Dcaron", 600, NULL },
- { "dcroat", 600, NULL },
- { "scedilla", 600, NULL },
- { "Oacute", 600, NULL },
- { "Ocircumflex", 600, NULL },
- { "ogonek", 600, NULL },
- { "ograve", 600, NULL },
- { "racute", 600, NULL },
- { "Tcaron", 600, NULL },
- { "Eogonek", 600, NULL },
- { "thorn", 600, NULL },
- { "degree", 600, NULL },
- { "registered", 600, NULL },
- { "radical", 600, NULL },
- { "Aring", 600, NULL },
- { "percent", 600, NULL },
- { "six", 600, NULL },
- { "paragraph", 600, NULL },
- { "dcaron", 600, NULL },
- { "Uogonek", 600, NULL },
- { "two", 600, NULL },
- { "summation", 600, NULL },
- { "Igrave", 600, NULL },
- { "Lacute", 600, NULL },
- { "ocircumflex", 600, NULL },
- { "oacute", 600, NULL },
- { "Uring", 600, NULL },
- { "Lcommaaccent", 600, NULL },
- { "tcaron", 600, NULL },
- { "eogonek", 600, NULL },
- { "Delta", 600, NULL },
- { "Ohungarumlaut", 600, NULL },
- { "asciicircum", 600, NULL },
- { "aring", 600, NULL },
- { "grave", 600, NULL },
- { "uogonek", 600, NULL },
- { "bracketright", 600, NULL },
- { "ampersand", 600, NULL },
- { "Iacute", 600, NULL },
- { "lacute", 600, NULL },
- { "igrave", 600, NULL },
- { "Ncaron", 600, NULL },
- { "plus", 600, NULL },
- { "uring", 600, NULL },
- { "quotesinglbase", 600, NULL },
- { "lcommaaccent", 600, NULL },
- { "Yacute", 600, NULL },
- { "ohungarumlaut", 600, NULL },
- { "threesuperior", 600, NULL },
- { "acute", 600, NULL },
- { "section", 600, NULL },
- { "dieresis", 600, NULL },
- { "quotedblbase", 600, NULL },
- { "iacute", 600, NULL },
- { "ncaron", 600, NULL },
- { "florin", 600, NULL },
- { "yacute", 600, NULL },
- { "Rcommaaccent", 600, NULL },
- { "fi", 600, NULL },
- { "fl", 600, NULL },
- { "Acircumflex", 600, NULL },
- { "Cacute", 600, NULL },
- { "Icircumflex", 600, NULL },
- { "guillemotleft", 600, NULL },
- { "germandbls", 600, NULL },
- { "seven", 600, NULL },
- { "Amacron", 600, NULL },
- { "Sacute", 600, NULL },
- { "ordmasculine", 600, NULL },
- { "dotlessi", 600, NULL },
- { "sterling", 600, NULL },
- { "notequal", 600, NULL },
- { "Imacron", 600, NULL },
- { "rcommaaccent", 600, NULL },
- { "Zdotaccent", 600, NULL },
- { "acircumflex", 600, NULL },
- { "cacute", 600, NULL },
- { "Ecaron", 600, NULL },
- { "braceright", 600, NULL },
- { "icircumflex", 600, NULL },
- { "quotedblright", 600, NULL },
- { "amacron", 600, NULL },
- { "sacute", 600, NULL },
- { "imacron", 600, NULL },
- { "cent", 600, NULL },
- { "currency", 600, NULL },
- { "logicalnot", 600, NULL },
- { "zdotaccent", 600, NULL },
- { "Atilde", 600, NULL },
- { "breve", 600, NULL },
- { "bar", 600, NULL },
- { "fraction", 600, NULL },
- { "less", 600, NULL },
- { "ecaron", 600, NULL },
- { "guilsinglleft", 600, NULL },
- { "exclam", 600, NULL },
- { "period", 600, NULL },
- { "Rcaron", 600, NULL },
- { "Kcommaaccent", 600, NULL },
- { "greater", 600, NULL },
- { "atilde", 600, NULL },
- { "brokenbar", 600, NULL },
- { "quoteleft", 600, NULL },
- { "Edotaccent", 600, NULL },
- { "onesuperior", 600, NULL }
-};
-
-static BuiltinFontWidth courierBoldWidthsTab[] = {
- { "Ntilde", 600, NULL },
- { "rcaron", 600, NULL },
- { "kcommaaccent", 600, NULL },
- { "Ncommaaccent", 600, NULL },
- { "Zacute", 600, NULL },
- { "comma", 600, NULL },
- { "cedilla", 600, NULL },
- { "plusminus", 600, NULL },
- { "circumflex", 600, NULL },
- { "dotaccent", 600, NULL },
- { "edotaccent", 600, NULL },
- { "asciitilde", 600, NULL },
- { "colon", 600, NULL },
- { "onehalf", 600, NULL },
- { "dollar", 600, NULL },
- { "Lcaron", 600, NULL },
- { "ntilde", 600, NULL },
- { "Aogonek", 600, NULL },
- { "ncommaaccent", 600, NULL },
- { "minus", 600, NULL },
- { "Iogonek", 600, NULL },
- { "zacute", 600, NULL },
- { "yen", 600, NULL },
- { "space", 600, NULL },
- { "Omacron", 600, NULL },
- { "questiondown", 600, NULL },
- { "emdash", 600, NULL },
- { "Agrave", 600, NULL },
- { "three", 600, NULL },
- { "numbersign", 600, NULL },
- { "lcaron", 600, NULL },
- { "A", 600, NULL },
- { "B", 600, NULL },
- { "C", 600, NULL },
- { "aogonek", 600, NULL },
- { "D", 600, NULL },
- { "E", 600, NULL },
- { "onequarter", 600, NULL },
- { "F", 600, NULL },
- { "G", 600, NULL },
- { "H", 600, NULL },
- { "I", 600, NULL },
- { "J", 600, NULL },
- { "K", 600, NULL },
- { "iogonek", 600, NULL },
- { "backslash", 600, NULL },
- { "L", 600, NULL },
- { "periodcentered", 600, NULL },
- { "M", 600, NULL },
- { "N", 600, NULL },
- { "omacron", 600, NULL },
- { "Tcommaaccent", 600, NULL },
- { "O", 600, NULL },
- { "P", 600, NULL },
- { "Q", 600, NULL },
- { "Uhungarumlaut", 600, NULL },
- { "R", 600, NULL },
- { "Aacute", 600, NULL },
- { "caron", 600, NULL },
- { "S", 600, NULL },
- { "T", 600, NULL },
- { "U", 600, NULL },
- { "agrave", 600, NULL },
- { "V", 600, NULL },
- { "W", 600, NULL },
- { "X", 600, NULL },
- { "question", 600, NULL },
- { "equal", 600, NULL },
- { "Y", 600, NULL },
- { "Z", 600, NULL },
- { "four", 600, NULL },
- { "a", 600, NULL },
- { "Gcommaaccent", 600, NULL },
- { "b", 600, NULL },
- { "c", 600, NULL },
- { "d", 600, NULL },
- { "e", 600, NULL },
- { "f", 600, NULL },
- { "g", 600, NULL },
- { "bullet", 600, NULL },
- { "h", 600, NULL },
- { "i", 600, NULL },
- { "Oslash", 600, NULL },
- { "dagger", 600, NULL },
- { "j", 600, NULL },
- { "k", 600, NULL },
- { "l", 600, NULL },
- { "m", 600, NULL },
- { "n", 600, NULL },
- { "tcommaaccent", 600, NULL },
- { "o", 600, NULL },
- { "ordfeminine", 600, NULL },
- { "ring", 600, NULL },
- { "p", 600, NULL },
- { "q", 600, NULL },
- { "uhungarumlaut", 600, NULL },
- { "r", 600, NULL },
- { "twosuperior", 600, NULL },
- { "aacute", 600, NULL },
- { "s", 600, NULL },
- { "OE", 600, NULL },
- { "t", 600, NULL },
- { "divide", 600, NULL },
- { "u", 600, NULL },
- { "Ccaron", 600, NULL },
- { "v", 600, NULL },
- { "w", 600, NULL },
- { "x", 600, NULL },
- { "y", 600, NULL },
- { "z", 600, NULL },
- { "Gbreve", 600, NULL },
- { "commaaccent", 600, NULL },
- { "hungarumlaut", 600, NULL },
- { "Idotaccent", 600, NULL },
- { "Nacute", 600, NULL },
- { "quotedbl", 600, NULL },
- { "gcommaaccent", 600, NULL },
- { "mu", 600, NULL },
- { "greaterequal", 600, NULL },
- { "Scaron", 600, NULL },
- { "Lslash", 600, NULL },
- { "semicolon", 600, NULL },
- { "oslash", 600, NULL },
- { "lessequal", 600, NULL },
- { "lozenge", 600, NULL },
- { "parenright", 600, NULL },
- { "ccaron", 600, NULL },
- { "Ecircumflex", 600, NULL },
- { "gbreve", 600, NULL },
- { "trademark", 600, NULL },
- { "daggerdbl", 600, NULL },
- { "nacute", 600, NULL },
- { "macron", 600, NULL },
- { "Otilde", 600, NULL },
- { "Emacron", 600, NULL },
- { "ellipsis", 600, NULL },
- { "scaron", 600, NULL },
- { "AE", 600, NULL },
- { "Ucircumflex", 600, NULL },
- { "lslash", 600, NULL },
- { "quotedblleft", 600, NULL },
- { "guilsinglright", 600, NULL },
- { "hyphen", 600, NULL },
- { "quotesingle", 600, NULL },
- { "eight", 600, NULL },
- { "exclamdown", 600, NULL },
- { "endash", 600, NULL },
- { "oe", 600, NULL },
- { "Abreve", 600, NULL },
- { "Umacron", 600, NULL },
- { "ecircumflex", 600, NULL },
- { "Adieresis", 600, NULL },
- { "copyright", 600, NULL },
- { "Egrave", 600, NULL },
- { "slash", 600, NULL },
- { "Edieresis", 600, NULL },
- { "otilde", 600, NULL },
- { "Idieresis", 600, NULL },
- { "parenleft", 600, NULL },
- { "one", 600, NULL },
- { "emacron", 600, NULL },
- { "Odieresis", 600, NULL },
- { "ucircumflex", 600, NULL },
- { "bracketleft", 600, NULL },
- { "Ugrave", 600, NULL },
- { "quoteright", 600, NULL },
- { "Udieresis", 600, NULL },
- { "perthousand", 600, NULL },
- { "Ydieresis", 600, NULL },
- { "umacron", 600, NULL },
- { "abreve", 600, NULL },
- { "Eacute", 600, NULL },
- { "adieresis", 600, NULL },
- { "egrave", 600, NULL },
- { "edieresis", 600, NULL },
- { "idieresis", 600, NULL },
- { "Eth", 600, NULL },
- { "ae", 600, NULL },
- { "asterisk", 600, NULL },
- { "odieresis", 600, NULL },
- { "Uacute", 600, NULL },
- { "ugrave", 600, NULL },
- { "nine", 600, NULL },
- { "five", 600, NULL },
- { "udieresis", 600, NULL },
- { "Zcaron", 600, NULL },
- { "Scommaaccent", 600, NULL },
- { "threequarters", 600, NULL },
- { "guillemotright", 600, NULL },
- { "Ccedilla", 600, NULL },
- { "ydieresis", 600, NULL },
- { "tilde", 600, NULL },
- { "at", 600, NULL },
- { "eacute", 600, NULL },
- { "underscore", 600, NULL },
- { "Euro", 600, NULL },
- { "Dcroat", 600, NULL },
- { "multiply", 600, NULL },
- { "zero", 600, NULL },
- { "eth", 600, NULL },
- { "Scedilla", 600, NULL },
- { "Ograve", 600, NULL },
- { "Racute", 600, NULL },
- { "partialdiff", 600, NULL },
- { "uacute", 600, NULL },
- { "braceleft", 600, NULL },
- { "Thorn", 600, NULL },
- { "zcaron", 600, NULL },
- { "scommaaccent", 600, NULL },
- { "ccedilla", 600, NULL },
- { "Dcaron", 600, NULL },
- { "dcroat", 600, NULL },
- { "Ocircumflex", 600, NULL },
- { "Oacute", 600, NULL },
- { "scedilla", 600, NULL },
- { "ogonek", 600, NULL },
- { "ograve", 600, NULL },
- { "racute", 600, NULL },
- { "Tcaron", 600, NULL },
- { "Eogonek", 600, NULL },
- { "thorn", 600, NULL },
- { "degree", 600, NULL },
- { "registered", 600, NULL },
- { "radical", 600, NULL },
- { "Aring", 600, NULL },
- { "percent", 600, NULL },
- { "six", 600, NULL },
- { "paragraph", 600, NULL },
- { "dcaron", 600, NULL },
- { "Uogonek", 600, NULL },
- { "two", 600, NULL },
- { "summation", 600, NULL },
- { "Igrave", 600, NULL },
- { "Lacute", 600, NULL },
- { "ocircumflex", 600, NULL },
- { "oacute", 600, NULL },
- { "Uring", 600, NULL },
- { "Lcommaaccent", 600, NULL },
- { "tcaron", 600, NULL },
- { "eogonek", 600, NULL },
- { "Delta", 600, NULL },
- { "Ohungarumlaut", 600, NULL },
- { "asciicircum", 600, NULL },
- { "aring", 600, NULL },
- { "grave", 600, NULL },
- { "uogonek", 600, NULL },
- { "bracketright", 600, NULL },
- { "Iacute", 600, NULL },
- { "ampersand", 600, NULL },
- { "igrave", 600, NULL },
- { "lacute", 600, NULL },
- { "Ncaron", 600, NULL },
- { "plus", 600, NULL },
- { "uring", 600, NULL },
- { "quotesinglbase", 600, NULL },
- { "lcommaaccent", 600, NULL },
- { "Yacute", 600, NULL },
- { "ohungarumlaut", 600, NULL },
- { "threesuperior", 600, NULL },
- { "acute", 600, NULL },
- { "section", 600, NULL },
- { "dieresis", 600, NULL },
- { "iacute", 600, NULL },
- { "quotedblbase", 600, NULL },
- { "ncaron", 600, NULL },
- { "florin", 600, NULL },
- { "yacute", 600, NULL },
- { "Rcommaaccent", 600, NULL },
- { "fi", 600, NULL },
- { "fl", 600, NULL },
- { "Acircumflex", 600, NULL },
- { "Cacute", 600, NULL },
- { "Icircumflex", 600, NULL },
- { "guillemotleft", 600, NULL },
- { "germandbls", 600, NULL },
- { "Amacron", 600, NULL },
- { "seven", 600, NULL },
- { "Sacute", 600, NULL },
- { "ordmasculine", 600, NULL },
- { "dotlessi", 600, NULL },
- { "sterling", 600, NULL },
- { "notequal", 600, NULL },
- { "Imacron", 600, NULL },
- { "rcommaaccent", 600, NULL },
- { "Zdotaccent", 600, NULL },
- { "acircumflex", 600, NULL },
- { "cacute", 600, NULL },
- { "Ecaron", 600, NULL },
- { "icircumflex", 600, NULL },
- { "braceright", 600, NULL },
- { "quotedblright", 600, NULL },
- { "amacron", 600, NULL },
- { "sacute", 600, NULL },
- { "imacron", 600, NULL },
- { "cent", 600, NULL },
- { "currency", 600, NULL },
- { "logicalnot", 600, NULL },
- { "zdotaccent", 600, NULL },
- { "Atilde", 600, NULL },
- { "breve", 600, NULL },
- { "bar", 600, NULL },
- { "fraction", 600, NULL },
- { "less", 600, NULL },
- { "ecaron", 600, NULL },
- { "guilsinglleft", 600, NULL },
- { "exclam", 600, NULL },
- { "period", 600, NULL },
- { "Rcaron", 600, NULL },
- { "Kcommaaccent", 600, NULL },
- { "greater", 600, NULL },
- { "atilde", 600, NULL },
- { "brokenbar", 600, NULL },
- { "quoteleft", 600, NULL },
- { "Edotaccent", 600, NULL },
- { "onesuperior", 600, NULL }
-};
-
-static BuiltinFontWidth courierBoldObliqueWidthsTab[] = {
- { "Ntilde", 600, NULL },
- { "rcaron", 600, NULL },
- { "kcommaaccent", 600, NULL },
- { "Ncommaaccent", 600, NULL },
- { "Zacute", 600, NULL },
- { "comma", 600, NULL },
- { "cedilla", 600, NULL },
- { "plusminus", 600, NULL },
- { "circumflex", 600, NULL },
- { "dotaccent", 600, NULL },
- { "edotaccent", 600, NULL },
- { "asciitilde", 600, NULL },
- { "colon", 600, NULL },
- { "onehalf", 600, NULL },
- { "dollar", 600, NULL },
- { "Lcaron", 600, NULL },
- { "ntilde", 600, NULL },
- { "Aogonek", 600, NULL },
- { "ncommaaccent", 600, NULL },
- { "minus", 600, NULL },
- { "Iogonek", 600, NULL },
- { "zacute", 600, NULL },
- { "yen", 600, NULL },
- { "space", 600, NULL },
- { "Omacron", 600, NULL },
- { "questiondown", 600, NULL },
- { "emdash", 600, NULL },
- { "Agrave", 600, NULL },
- { "three", 600, NULL },
- { "numbersign", 600, NULL },
- { "lcaron", 600, NULL },
- { "A", 600, NULL },
- { "B", 600, NULL },
- { "C", 600, NULL },
- { "aogonek", 600, NULL },
- { "D", 600, NULL },
- { "E", 600, NULL },
- { "onequarter", 600, NULL },
- { "F", 600, NULL },
- { "G", 600, NULL },
- { "H", 600, NULL },
- { "I", 600, NULL },
- { "J", 600, NULL },
- { "K", 600, NULL },
- { "iogonek", 600, NULL },
- { "backslash", 600, NULL },
- { "L", 600, NULL },
- { "periodcentered", 600, NULL },
- { "M", 600, NULL },
- { "N", 600, NULL },
- { "omacron", 600, NULL },
- { "Tcommaaccent", 600, NULL },
- { "O", 600, NULL },
- { "P", 600, NULL },
- { "Q", 600, NULL },
- { "Uhungarumlaut", 600, NULL },
- { "R", 600, NULL },
- { "Aacute", 600, NULL },
- { "caron", 600, NULL },
- { "S", 600, NULL },
- { "T", 600, NULL },
- { "U", 600, NULL },
- { "agrave", 600, NULL },
- { "V", 600, NULL },
- { "W", 600, NULL },
- { "X", 600, NULL },
- { "question", 600, NULL },
- { "equal", 600, NULL },
- { "Y", 600, NULL },
- { "Z", 600, NULL },
- { "four", 600, NULL },
- { "a", 600, NULL },
- { "Gcommaaccent", 600, NULL },
- { "b", 600, NULL },
- { "c", 600, NULL },
- { "d", 600, NULL },
- { "e", 600, NULL },
- { "f", 600, NULL },
- { "g", 600, NULL },
- { "bullet", 600, NULL },
- { "h", 600, NULL },
- { "i", 600, NULL },
- { "Oslash", 600, NULL },
- { "dagger", 600, NULL },
- { "j", 600, NULL },
- { "k", 600, NULL },
- { "l", 600, NULL },
- { "m", 600, NULL },
- { "n", 600, NULL },
- { "tcommaaccent", 600, NULL },
- { "o", 600, NULL },
- { "ordfeminine", 600, NULL },
- { "ring", 600, NULL },
- { "p", 600, NULL },
- { "q", 600, NULL },
- { "uhungarumlaut", 600, NULL },
- { "r", 600, NULL },
- { "twosuperior", 600, NULL },
- { "aacute", 600, NULL },
- { "s", 600, NULL },
- { "OE", 600, NULL },
- { "t", 600, NULL },
- { "divide", 600, NULL },
- { "u", 600, NULL },
- { "Ccaron", 600, NULL },
- { "v", 600, NULL },
- { "w", 600, NULL },
- { "x", 600, NULL },
- { "y", 600, NULL },
- { "z", 600, NULL },
- { "Gbreve", 600, NULL },
- { "commaaccent", 600, NULL },
- { "hungarumlaut", 600, NULL },
- { "Idotaccent", 600, NULL },
- { "Nacute", 600, NULL },
- { "quotedbl", 600, NULL },
- { "gcommaaccent", 600, NULL },
- { "mu", 600, NULL },
- { "greaterequal", 600, NULL },
- { "Scaron", 600, NULL },
- { "Lslash", 600, NULL },
- { "semicolon", 600, NULL },
- { "oslash", 600, NULL },
- { "lessequal", 600, NULL },
- { "lozenge", 600, NULL },
- { "parenright", 600, NULL },
- { "ccaron", 600, NULL },
- { "Ecircumflex", 600, NULL },
- { "gbreve", 600, NULL },
- { "trademark", 600, NULL },
- { "daggerdbl", 600, NULL },
- { "nacute", 600, NULL },
- { "macron", 600, NULL },
- { "Otilde", 600, NULL },
- { "Emacron", 600, NULL },
- { "ellipsis", 600, NULL },
- { "scaron", 600, NULL },
- { "AE", 600, NULL },
- { "Ucircumflex", 600, NULL },
- { "lslash", 600, NULL },
- { "quotedblleft", 600, NULL },
- { "guilsinglright", 600, NULL },
- { "hyphen", 600, NULL },
- { "quotesingle", 600, NULL },
- { "eight", 600, NULL },
- { "exclamdown", 600, NULL },
- { "endash", 600, NULL },
- { "oe", 600, NULL },
- { "Abreve", 600, NULL },
- { "Umacron", 600, NULL },
- { "ecircumflex", 600, NULL },
- { "Adieresis", 600, NULL },
- { "copyright", 600, NULL },
- { "Egrave", 600, NULL },
- { "slash", 600, NULL },
- { "Edieresis", 600, NULL },
- { "otilde", 600, NULL },
- { "Idieresis", 600, NULL },
- { "parenleft", 600, NULL },
- { "one", 600, NULL },
- { "emacron", 600, NULL },
- { "Odieresis", 600, NULL },
- { "ucircumflex", 600, NULL },
- { "bracketleft", 600, NULL },
- { "Ugrave", 600, NULL },
- { "quoteright", 600, NULL },
- { "Udieresis", 600, NULL },
- { "perthousand", 600, NULL },
- { "Ydieresis", 600, NULL },
- { "umacron", 600, NULL },
- { "abreve", 600, NULL },
- { "Eacute", 600, NULL },
- { "adieresis", 600, NULL },
- { "egrave", 600, NULL },
- { "edieresis", 600, NULL },
- { "idieresis", 600, NULL },
- { "Eth", 600, NULL },
- { "ae", 600, NULL },
- { "asterisk", 600, NULL },
- { "odieresis", 600, NULL },
- { "Uacute", 600, NULL },
- { "ugrave", 600, NULL },
- { "nine", 600, NULL },
- { "five", 600, NULL },
- { "udieresis", 600, NULL },
- { "Zcaron", 600, NULL },
- { "Scommaaccent", 600, NULL },
- { "threequarters", 600, NULL },
- { "guillemotright", 600, NULL },
- { "Ccedilla", 600, NULL },
- { "ydieresis", 600, NULL },
- { "tilde", 600, NULL },
- { "at", 600, NULL },
- { "eacute", 600, NULL },
- { "underscore", 600, NULL },
- { "Euro", 600, NULL },
- { "Dcroat", 600, NULL },
- { "multiply", 600, NULL },
- { "zero", 600, NULL },
- { "eth", 600, NULL },
- { "Scedilla", 600, NULL },
- { "Ograve", 600, NULL },
- { "Racute", 600, NULL },
- { "partialdiff", 600, NULL },
- { "uacute", 600, NULL },
- { "braceleft", 600, NULL },
- { "Thorn", 600, NULL },
- { "zcaron", 600, NULL },
- { "scommaaccent", 600, NULL },
- { "ccedilla", 600, NULL },
- { "Dcaron", 600, NULL },
- { "dcroat", 600, NULL },
- { "Ocircumflex", 600, NULL },
- { "Oacute", 600, NULL },
- { "scedilla", 600, NULL },
- { "ogonek", 600, NULL },
- { "ograve", 600, NULL },
- { "racute", 600, NULL },
- { "Tcaron", 600, NULL },
- { "Eogonek", 600, NULL },
- { "thorn", 600, NULL },
- { "degree", 600, NULL },
- { "registered", 600, NULL },
- { "radical", 600, NULL },
- { "Aring", 600, NULL },
- { "percent", 600, NULL },
- { "six", 600, NULL },
- { "paragraph", 600, NULL },
- { "dcaron", 600, NULL },
- { "Uogonek", 600, NULL },
- { "two", 600, NULL },
- { "summation", 600, NULL },
- { "Igrave", 600, NULL },
- { "Lacute", 600, NULL },
- { "ocircumflex", 600, NULL },
- { "oacute", 600, NULL },
- { "Uring", 600, NULL },
- { "Lcommaaccent", 600, NULL },
- { "tcaron", 600, NULL },
- { "eogonek", 600, NULL },
- { "Delta", 600, NULL },
- { "Ohungarumlaut", 600, NULL },
- { "asciicircum", 600, NULL },
- { "aring", 600, NULL },
- { "grave", 600, NULL },
- { "uogonek", 600, NULL },
- { "bracketright", 600, NULL },
- { "Iacute", 600, NULL },
- { "ampersand", 600, NULL },
- { "igrave", 600, NULL },
- { "lacute", 600, NULL },
- { "Ncaron", 600, NULL },
- { "plus", 600, NULL },
- { "uring", 600, NULL },
- { "quotesinglbase", 600, NULL },
- { "lcommaaccent", 600, NULL },
- { "Yacute", 600, NULL },
- { "ohungarumlaut", 600, NULL },
- { "threesuperior", 600, NULL },
- { "acute", 600, NULL },
- { "section", 600, NULL },
- { "dieresis", 600, NULL },
- { "iacute", 600, NULL },
- { "quotedblbase", 600, NULL },
- { "ncaron", 600, NULL },
- { "florin", 600, NULL },
- { "yacute", 600, NULL },
- { "Rcommaaccent", 600, NULL },
- { "fi", 600, NULL },
- { "fl", 600, NULL },
- { "Acircumflex", 600, NULL },
- { "Cacute", 600, NULL },
- { "Icircumflex", 600, NULL },
- { "guillemotleft", 600, NULL },
- { "germandbls", 600, NULL },
- { "Amacron", 600, NULL },
- { "seven", 600, NULL },
- { "Sacute", 600, NULL },
- { "ordmasculine", 600, NULL },
- { "dotlessi", 600, NULL },
- { "sterling", 600, NULL },
- { "notequal", 600, NULL },
- { "Imacron", 600, NULL },
- { "rcommaaccent", 600, NULL },
- { "Zdotaccent", 600, NULL },
- { "acircumflex", 600, NULL },
- { "cacute", 600, NULL },
- { "Ecaron", 600, NULL },
- { "icircumflex", 600, NULL },
- { "braceright", 600, NULL },
- { "quotedblright", 600, NULL },
- { "amacron", 600, NULL },
- { "sacute", 600, NULL },
- { "imacron", 600, NULL },
- { "cent", 600, NULL },
- { "currency", 600, NULL },
- { "logicalnot", 600, NULL },
- { "zdotaccent", 600, NULL },
- { "Atilde", 600, NULL },
- { "breve", 600, NULL },
- { "bar", 600, NULL },
- { "fraction", 600, NULL },
- { "less", 600, NULL },
- { "ecaron", 600, NULL },
- { "guilsinglleft", 600, NULL },
- { "exclam", 600, NULL },
- { "period", 600, NULL },
- { "Rcaron", 600, NULL },
- { "Kcommaaccent", 600, NULL },
- { "greater", 600, NULL },
- { "atilde", 600, NULL },
- { "brokenbar", 600, NULL },
- { "quoteleft", 600, NULL },
- { "Edotaccent", 600, NULL },
- { "onesuperior", 600, NULL }
-};
-
-static BuiltinFontWidth courierObliqueWidthsTab[] = {
- { "Ntilde", 600, NULL },
- { "rcaron", 600, NULL },
- { "kcommaaccent", 600, NULL },
- { "Ncommaaccent", 600, NULL },
- { "Zacute", 600, NULL },
- { "comma", 600, NULL },
- { "cedilla", 600, NULL },
- { "plusminus", 600, NULL },
- { "circumflex", 600, NULL },
- { "dotaccent", 600, NULL },
- { "edotaccent", 600, NULL },
- { "asciitilde", 600, NULL },
- { "colon", 600, NULL },
- { "onehalf", 600, NULL },
- { "dollar", 600, NULL },
- { "Lcaron", 600, NULL },
- { "ntilde", 600, NULL },
- { "Aogonek", 600, NULL },
- { "ncommaaccent", 600, NULL },
- { "minus", 600, NULL },
- { "Iogonek", 600, NULL },
- { "zacute", 600, NULL },
- { "yen", 600, NULL },
- { "space", 600, NULL },
- { "Omacron", 600, NULL },
- { "questiondown", 600, NULL },
- { "emdash", 600, NULL },
- { "Agrave", 600, NULL },
- { "three", 600, NULL },
- { "numbersign", 600, NULL },
- { "lcaron", 600, NULL },
- { "A", 600, NULL },
- { "B", 600, NULL },
- { "C", 600, NULL },
- { "aogonek", 600, NULL },
- { "D", 600, NULL },
- { "E", 600, NULL },
- { "onequarter", 600, NULL },
- { "F", 600, NULL },
- { "G", 600, NULL },
- { "H", 600, NULL },
- { "I", 600, NULL },
- { "J", 600, NULL },
- { "K", 600, NULL },
- { "iogonek", 600, NULL },
- { "backslash", 600, NULL },
- { "L", 600, NULL },
- { "periodcentered", 600, NULL },
- { "M", 600, NULL },
- { "N", 600, NULL },
- { "omacron", 600, NULL },
- { "Tcommaaccent", 600, NULL },
- { "O", 600, NULL },
- { "P", 600, NULL },
- { "Q", 600, NULL },
- { "Uhungarumlaut", 600, NULL },
- { "R", 600, NULL },
- { "Aacute", 600, NULL },
- { "caron", 600, NULL },
- { "S", 600, NULL },
- { "T", 600, NULL },
- { "U", 600, NULL },
- { "agrave", 600, NULL },
- { "V", 600, NULL },
- { "W", 600, NULL },
- { "X", 600, NULL },
- { "question", 600, NULL },
- { "equal", 600, NULL },
- { "Y", 600, NULL },
- { "Z", 600, NULL },
- { "four", 600, NULL },
- { "a", 600, NULL },
- { "Gcommaaccent", 600, NULL },
- { "b", 600, NULL },
- { "c", 600, NULL },
- { "d", 600, NULL },
- { "e", 600, NULL },
- { "f", 600, NULL },
- { "g", 600, NULL },
- { "bullet", 600, NULL },
- { "h", 600, NULL },
- { "i", 600, NULL },
- { "Oslash", 600, NULL },
- { "dagger", 600, NULL },
- { "j", 600, NULL },
- { "k", 600, NULL },
- { "l", 600, NULL },
- { "m", 600, NULL },
- { "n", 600, NULL },
- { "tcommaaccent", 600, NULL },
- { "o", 600, NULL },
- { "ordfeminine", 600, NULL },
- { "ring", 600, NULL },
- { "p", 600, NULL },
- { "q", 600, NULL },
- { "uhungarumlaut", 600, NULL },
- { "r", 600, NULL },
- { "twosuperior", 600, NULL },
- { "aacute", 600, NULL },
- { "s", 600, NULL },
- { "OE", 600, NULL },
- { "t", 600, NULL },
- { "divide", 600, NULL },
- { "u", 600, NULL },
- { "Ccaron", 600, NULL },
- { "v", 600, NULL },
- { "w", 600, NULL },
- { "x", 600, NULL },
- { "y", 600, NULL },
- { "z", 600, NULL },
- { "Gbreve", 600, NULL },
- { "commaaccent", 600, NULL },
- { "hungarumlaut", 600, NULL },
- { "Idotaccent", 600, NULL },
- { "Nacute", 600, NULL },
- { "quotedbl", 600, NULL },
- { "gcommaaccent", 600, NULL },
- { "mu", 600, NULL },
- { "greaterequal", 600, NULL },
- { "Scaron", 600, NULL },
- { "Lslash", 600, NULL },
- { "semicolon", 600, NULL },
- { "oslash", 600, NULL },
- { "lessequal", 600, NULL },
- { "lozenge", 600, NULL },
- { "parenright", 600, NULL },
- { "ccaron", 600, NULL },
- { "Ecircumflex", 600, NULL },
- { "gbreve", 600, NULL },
- { "trademark", 600, NULL },
- { "daggerdbl", 600, NULL },
- { "nacute", 600, NULL },
- { "macron", 600, NULL },
- { "Otilde", 600, NULL },
- { "Emacron", 600, NULL },
- { "ellipsis", 600, NULL },
- { "scaron", 600, NULL },
- { "AE", 600, NULL },
- { "Ucircumflex", 600, NULL },
- { "lslash", 600, NULL },
- { "quotedblleft", 600, NULL },
- { "guilsinglright", 600, NULL },
- { "hyphen", 600, NULL },
- { "quotesingle", 600, NULL },
- { "eight", 600, NULL },
- { "exclamdown", 600, NULL },
- { "endash", 600, NULL },
- { "oe", 600, NULL },
- { "Abreve", 600, NULL },
- { "Umacron", 600, NULL },
- { "ecircumflex", 600, NULL },
- { "Adieresis", 600, NULL },
- { "copyright", 600, NULL },
- { "Egrave", 600, NULL },
- { "slash", 600, NULL },
- { "Edieresis", 600, NULL },
- { "otilde", 600, NULL },
- { "Idieresis", 600, NULL },
- { "parenleft", 600, NULL },
- { "one", 600, NULL },
- { "emacron", 600, NULL },
- { "Odieresis", 600, NULL },
- { "ucircumflex", 600, NULL },
- { "bracketleft", 600, NULL },
- { "Ugrave", 600, NULL },
- { "quoteright", 600, NULL },
- { "Udieresis", 600, NULL },
- { "perthousand", 600, NULL },
- { "Ydieresis", 600, NULL },
- { "umacron", 600, NULL },
- { "abreve", 600, NULL },
- { "Eacute", 600, NULL },
- { "adieresis", 600, NULL },
- { "egrave", 600, NULL },
- { "edieresis", 600, NULL },
- { "idieresis", 600, NULL },
- { "Eth", 600, NULL },
- { "ae", 600, NULL },
- { "asterisk", 600, NULL },
- { "odieresis", 600, NULL },
- { "Uacute", 600, NULL },
- { "ugrave", 600, NULL },
- { "nine", 600, NULL },
- { "five", 600, NULL },
- { "udieresis", 600, NULL },
- { "Zcaron", 600, NULL },
- { "Scommaaccent", 600, NULL },
- { "threequarters", 600, NULL },
- { "guillemotright", 600, NULL },
- { "Ccedilla", 600, NULL },
- { "ydieresis", 600, NULL },
- { "tilde", 600, NULL },
- { "at", 600, NULL },
- { "eacute", 600, NULL },
- { "underscore", 600, NULL },
- { "Euro", 600, NULL },
- { "Dcroat", 600, NULL },
- { "multiply", 600, NULL },
- { "zero", 600, NULL },
- { "eth", 600, NULL },
- { "Scedilla", 600, NULL },
- { "Ograve", 600, NULL },
- { "Racute", 600, NULL },
- { "partialdiff", 600, NULL },
- { "uacute", 600, NULL },
- { "braceleft", 600, NULL },
- { "Thorn", 600, NULL },
- { "zcaron", 600, NULL },
- { "scommaaccent", 600, NULL },
- { "ccedilla", 600, NULL },
- { "Dcaron", 600, NULL },
- { "dcroat", 600, NULL },
- { "Ocircumflex", 600, NULL },
- { "Oacute", 600, NULL },
- { "scedilla", 600, NULL },
- { "ogonek", 600, NULL },
- { "ograve", 600, NULL },
- { "racute", 600, NULL },
- { "Tcaron", 600, NULL },
- { "Eogonek", 600, NULL },
- { "thorn", 600, NULL },
- { "degree", 600, NULL },
- { "registered", 600, NULL },
- { "radical", 600, NULL },
- { "Aring", 600, NULL },
- { "percent", 600, NULL },
- { "six", 600, NULL },
- { "paragraph", 600, NULL },
- { "dcaron", 600, NULL },
- { "Uogonek", 600, NULL },
- { "two", 600, NULL },
- { "summation", 600, NULL },
- { "Igrave", 600, NULL },
- { "Lacute", 600, NULL },
- { "ocircumflex", 600, NULL },
- { "oacute", 600, NULL },
- { "Uring", 600, NULL },
- { "Lcommaaccent", 600, NULL },
- { "tcaron", 600, NULL },
- { "eogonek", 600, NULL },
- { "Delta", 600, NULL },
- { "Ohungarumlaut", 600, NULL },
- { "asciicircum", 600, NULL },
- { "aring", 600, NULL },
- { "grave", 600, NULL },
- { "uogonek", 600, NULL },
- { "bracketright", 600, NULL },
- { "Iacute", 600, NULL },
- { "ampersand", 600, NULL },
- { "igrave", 600, NULL },
- { "lacute", 600, NULL },
- { "Ncaron", 600, NULL },
- { "plus", 600, NULL },
- { "uring", 600, NULL },
- { "quotesinglbase", 600, NULL },
- { "lcommaaccent", 600, NULL },
- { "Yacute", 600, NULL },
- { "ohungarumlaut", 600, NULL },
- { "threesuperior", 600, NULL },
- { "acute", 600, NULL },
- { "section", 600, NULL },
- { "dieresis", 600, NULL },
- { "iacute", 600, NULL },
- { "quotedblbase", 600, NULL },
- { "ncaron", 600, NULL },
- { "florin", 600, NULL },
- { "yacute", 600, NULL },
- { "Rcommaaccent", 600, NULL },
- { "fi", 600, NULL },
- { "fl", 600, NULL },
- { "Acircumflex", 600, NULL },
- { "Cacute", 600, NULL },
- { "Icircumflex", 600, NULL },
- { "guillemotleft", 600, NULL },
- { "germandbls", 600, NULL },
- { "Amacron", 600, NULL },
- { "seven", 600, NULL },
- { "Sacute", 600, NULL },
- { "ordmasculine", 600, NULL },
- { "dotlessi", 600, NULL },
- { "sterling", 600, NULL },
- { "notequal", 600, NULL },
- { "Imacron", 600, NULL },
- { "rcommaaccent", 600, NULL },
- { "Zdotaccent", 600, NULL },
- { "acircumflex", 600, NULL },
- { "cacute", 600, NULL },
- { "Ecaron", 600, NULL },
- { "icircumflex", 600, NULL },
- { "braceright", 600, NULL },
- { "quotedblright", 600, NULL },
- { "amacron", 600, NULL },
- { "sacute", 600, NULL },
- { "imacron", 600, NULL },
- { "cent", 600, NULL },
- { "currency", 600, NULL },
- { "logicalnot", 600, NULL },
- { "zdotaccent", 600, NULL },
- { "Atilde", 600, NULL },
- { "breve", 600, NULL },
- { "bar", 600, NULL },
- { "fraction", 600, NULL },
- { "less", 600, NULL },
- { "ecaron", 600, NULL },
- { "guilsinglleft", 600, NULL },
- { "exclam", 600, NULL },
- { "period", 600, NULL },
- { "Rcaron", 600, NULL },
- { "Kcommaaccent", 600, NULL },
- { "greater", 600, NULL },
- { "atilde", 600, NULL },
- { "brokenbar", 600, NULL },
- { "quoteleft", 600, NULL },
- { "Edotaccent", 600, NULL },
- { "onesuperior", 600, NULL }
-};
-
-static BuiltinFontWidth helveticaWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 333, NULL },
- { "kcommaaccent", 500, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 278, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 584, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 556, NULL },
- { "asciitilde", 584, NULL },
- { "colon", 278, NULL },
- { "onehalf", 834, NULL },
- { "dollar", 556, NULL },
- { "Lcaron", 556, NULL },
- { "ntilde", 556, NULL },
- { "Aogonek", 667, NULL },
- { "ncommaaccent", 556, NULL },
- { "minus", 584, NULL },
- { "Iogonek", 278, NULL },
- { "zacute", 500, NULL },
- { "yen", 556, NULL },
- { "space", 278, NULL },
- { "Omacron", 778, NULL },
- { "questiondown", 611, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 667, NULL },
- { "three", 556, NULL },
- { "numbersign", 556, NULL },
- { "lcaron", 299, NULL },
- { "A", 667, NULL },
- { "B", 667, NULL },
- { "C", 722, NULL },
- { "aogonek", 556, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 834, NULL },
- { "F", 611, NULL },
- { "G", 778, NULL },
- { "H", 722, NULL },
- { "I", 278, NULL },
- { "J", 500, NULL },
- { "K", 667, NULL },
- { "iogonek", 222, NULL },
- { "backslash", 278, NULL },
- { "L", 556, NULL },
- { "periodcentered", 278, NULL },
- { "M", 833, NULL },
- { "N", 722, NULL },
- { "omacron", 556, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 778, NULL },
- { "P", 667, NULL },
- { "Q", 778, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 722, NULL },
- { "Aacute", 667, NULL },
- { "caron", 333, NULL },
- { "S", 667, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 556, NULL },
- { "V", 667, NULL },
- { "W", 944, NULL },
- { "X", 667, NULL },
- { "question", 556, NULL },
- { "equal", 584, NULL },
- { "Y", 667, NULL },
- { "Z", 611, NULL },
- { "four", 556, NULL },
- { "a", 556, NULL },
- { "Gcommaaccent", 778, NULL },
- { "b", 556, NULL },
- { "c", 500, NULL },
- { "d", 556, NULL },
- { "e", 556, NULL },
- { "f", 278, NULL },
- { "g", 556, NULL },
- { "bullet", 350, NULL },
- { "h", 556, NULL },
- { "i", 222, NULL },
- { "Oslash", 778, NULL },
- { "dagger", 556, NULL },
- { "j", 222, NULL },
- { "k", 500, NULL },
- { "l", 222, NULL },
- { "m", 833, NULL },
- { "n", 556, NULL },
- { "tcommaaccent", 278, NULL },
- { "o", 556, NULL },
- { "ordfeminine", 370, NULL },
- { "ring", 333, NULL },
- { "p", 556, NULL },
- { "q", 556, NULL },
- { "uhungarumlaut", 556, NULL },
- { "r", 333, NULL },
- { "twosuperior", 333, NULL },
- { "aacute", 556, NULL },
- { "s", 500, NULL },
- { "OE", 1000, NULL },
- { "t", 278, NULL },
- { "divide", 584, NULL },
- { "u", 556, NULL },
- { "Ccaron", 722, NULL },
- { "v", 500, NULL },
- { "w", 722, NULL },
- { "x", 500, NULL },
- { "y", 500, NULL },
- { "z", 500, NULL },
- { "Gbreve", 778, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 278, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 355, NULL },
- { "gcommaaccent", 556, NULL },
- { "mu", 556, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 667, NULL },
- { "Lslash", 556, NULL },
- { "semicolon", 278, NULL },
- { "oslash", 611, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 471, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 500, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 556, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 556, NULL },
- { "nacute", 556, NULL },
- { "macron", 333, NULL },
- { "Otilde", 778, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 500, NULL },
- { "AE", 1000, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 222, NULL },
- { "quotedblleft", 333, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 191, NULL },
- { "eight", 556, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 556, NULL },
- { "oe", 944, NULL },
- { "Abreve", 667, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 556, NULL },
- { "Adieresis", 667, NULL },
- { "copyright", 737, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 556, NULL },
- { "Idieresis", 278, NULL },
- { "parenleft", 333, NULL },
- { "one", 556, NULL },
- { "emacron", 556, NULL },
- { "Odieresis", 778, NULL },
- { "ucircumflex", 556, NULL },
- { "bracketleft", 278, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 222, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 667, NULL },
- { "umacron", 556, NULL },
- { "abreve", 556, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 556, NULL },
- { "egrave", 556, NULL },
- { "edieresis", 556, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 889, NULL },
- { "asterisk", 389, NULL },
- { "odieresis", 556, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 556, NULL },
- { "nine", 556, NULL },
- { "five", 556, NULL },
- { "udieresis", 556, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 667, NULL },
- { "threequarters", 834, NULL },
- { "guillemotright", 556, NULL },
- { "Ccedilla", 722, NULL },
- { "ydieresis", 500, NULL },
- { "tilde", 333, NULL },
- { "at", 1015, NULL },
- { "eacute", 556, NULL },
- { "underscore", 556, NULL },
- { "Euro", 556, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 584, NULL },
- { "zero", 556, NULL },
- { "eth", 556, NULL },
- { "Scedilla", 667, NULL },
- { "Ograve", 778, NULL },
- { "Racute", 722, NULL },
- { "partialdiff", 476, NULL },
- { "uacute", 556, NULL },
- { "braceleft", 334, NULL },
- { "Thorn", 667, NULL },
- { "zcaron", 500, NULL },
- { "scommaaccent", 500, NULL },
- { "ccedilla", 500, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 556, NULL },
- { "Ocircumflex", 778, NULL },
- { "Oacute", 778, NULL },
- { "scedilla", 500, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 556, NULL },
- { "racute", 333, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 556, NULL },
- { "degree", 400, NULL },
- { "registered", 737, NULL },
- { "radical", 453, NULL },
- { "Aring", 667, NULL },
- { "percent", 889, NULL },
- { "six", 556, NULL },
- { "paragraph", 537, NULL },
- { "dcaron", 643, NULL },
- { "Uogonek", 722, NULL },
- { "two", 556, NULL },
- { "summation", 600, NULL },
- { "Igrave", 278, NULL },
- { "Lacute", 556, NULL },
- { "ocircumflex", 556, NULL },
- { "oacute", 556, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 556, NULL },
- { "tcaron", 317, NULL },
- { "eogonek", 556, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 778, NULL },
- { "asciicircum", 469, NULL },
- { "aring", 556, NULL },
- { "grave", 333, NULL },
- { "uogonek", 556, NULL },
- { "bracketright", 278, NULL },
- { "Iacute", 278, NULL },
- { "ampersand", 667, NULL },
- { "igrave", 278, NULL },
- { "lacute", 222, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 584, NULL },
- { "uring", 556, NULL },
- { "quotesinglbase", 222, NULL },
- { "lcommaaccent", 222, NULL },
- { "Yacute", 667, NULL },
- { "ohungarumlaut", 556, NULL },
- { "threesuperior", 333, NULL },
- { "acute", 333, NULL },
- { "section", 556, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 333, NULL },
- { "ncaron", 556, NULL },
- { "florin", 556, NULL },
- { "yacute", 500, NULL },
- { "Rcommaaccent", 722, NULL },
- { "fi", 500, NULL },
- { "fl", 500, NULL },
- { "Acircumflex", 667, NULL },
- { "Cacute", 722, NULL },
- { "Icircumflex", 278, NULL },
- { "guillemotleft", 556, NULL },
- { "germandbls", 611, NULL },
- { "Amacron", 667, NULL },
- { "seven", 556, NULL },
- { "Sacute", 667, NULL },
- { "ordmasculine", 365, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 556, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 278, NULL },
- { "rcommaaccent", 333, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 556, NULL },
- { "cacute", 500, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 334, NULL },
- { "quotedblright", 333, NULL },
- { "amacron", 556, NULL },
- { "sacute", 500, NULL },
- { "imacron", 278, NULL },
- { "cent", 556, NULL },
- { "currency", 556, NULL },
- { "logicalnot", 584, NULL },
- { "zdotaccent", 500, NULL },
- { "Atilde", 667, NULL },
- { "breve", 333, NULL },
- { "bar", 260, NULL },
- { "fraction", 167, NULL },
- { "less", 584, NULL },
- { "ecaron", 556, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 278, NULL },
- { "period", 278, NULL },
- { "Rcaron", 722, NULL },
- { "Kcommaaccent", 667, NULL },
- { "greater", 584, NULL },
- { "atilde", 556, NULL },
- { "brokenbar", 260, NULL },
- { "quoteleft", 222, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 333, NULL }
-};
-
-static BuiltinFontWidth helveticaBoldWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 389, NULL },
- { "kcommaaccent", 556, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 278, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 584, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 556, NULL },
- { "asciitilde", 584, NULL },
- { "colon", 333, NULL },
- { "onehalf", 834, NULL },
- { "dollar", 556, NULL },
- { "Lcaron", 611, NULL },
- { "ntilde", 611, NULL },
- { "Aogonek", 722, NULL },
- { "ncommaaccent", 611, NULL },
- { "minus", 584, NULL },
- { "Iogonek", 278, NULL },
- { "zacute", 500, NULL },
- { "yen", 556, NULL },
- { "space", 278, NULL },
- { "Omacron", 778, NULL },
- { "questiondown", 611, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 722, NULL },
- { "three", 556, NULL },
- { "numbersign", 556, NULL },
- { "lcaron", 400, NULL },
- { "A", 722, NULL },
- { "B", 722, NULL },
- { "C", 722, NULL },
- { "aogonek", 556, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 834, NULL },
- { "F", 611, NULL },
- { "G", 778, NULL },
- { "H", 722, NULL },
- { "I", 278, NULL },
- { "J", 556, NULL },
- { "K", 722, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 611, NULL },
- { "periodcentered", 278, NULL },
- { "M", 833, NULL },
- { "N", 722, NULL },
- { "omacron", 611, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 778, NULL },
- { "P", 667, NULL },
- { "Q", 778, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 722, NULL },
- { "Aacute", 722, NULL },
- { "caron", 333, NULL },
- { "S", 667, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 556, NULL },
- { "V", 667, NULL },
- { "W", 944, NULL },
- { "X", 667, NULL },
- { "question", 611, NULL },
- { "equal", 584, NULL },
- { "Y", 667, NULL },
- { "Z", 611, NULL },
- { "four", 556, NULL },
- { "a", 556, NULL },
- { "Gcommaaccent", 778, NULL },
- { "b", 611, NULL },
- { "c", 556, NULL },
- { "d", 611, NULL },
- { "e", 556, NULL },
- { "f", 333, NULL },
- { "g", 611, NULL },
- { "bullet", 350, NULL },
- { "h", 611, NULL },
- { "i", 278, NULL },
- { "Oslash", 778, NULL },
- { "dagger", 556, NULL },
- { "j", 278, NULL },
- { "k", 556, NULL },
- { "l", 278, NULL },
- { "m", 889, NULL },
- { "n", 611, NULL },
- { "tcommaaccent", 333, NULL },
- { "o", 611, NULL },
- { "ordfeminine", 370, NULL },
- { "ring", 333, NULL },
- { "p", 611, NULL },
- { "q", 611, NULL },
- { "uhungarumlaut", 611, NULL },
- { "r", 389, NULL },
- { "twosuperior", 333, NULL },
- { "aacute", 556, NULL },
- { "s", 556, NULL },
- { "OE", 1000, NULL },
- { "t", 333, NULL },
- { "divide", 584, NULL },
- { "u", 611, NULL },
- { "Ccaron", 722, NULL },
- { "v", 556, NULL },
- { "w", 778, NULL },
- { "x", 556, NULL },
- { "y", 556, NULL },
- { "z", 500, NULL },
- { "Gbreve", 778, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 278, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 474, NULL },
- { "gcommaaccent", 611, NULL },
- { "mu", 611, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 667, NULL },
- { "Lslash", 611, NULL },
- { "semicolon", 333, NULL },
- { "oslash", 611, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 494, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 556, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 611, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 556, NULL },
- { "nacute", 611, NULL },
- { "macron", 333, NULL },
- { "Otilde", 778, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 556, NULL },
- { "AE", 1000, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 500, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 238, NULL },
- { "eight", 556, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 556, NULL },
- { "oe", 944, NULL },
- { "Abreve", 722, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 556, NULL },
- { "Adieresis", 722, NULL },
- { "copyright", 737, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 611, NULL },
- { "Idieresis", 278, NULL },
- { "parenleft", 333, NULL },
- { "one", 556, NULL },
- { "emacron", 556, NULL },
- { "Odieresis", 778, NULL },
- { "ucircumflex", 611, NULL },
- { "bracketleft", 333, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 278, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 667, NULL },
- { "umacron", 611, NULL },
- { "abreve", 556, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 556, NULL },
- { "egrave", 556, NULL },
- { "edieresis", 556, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 889, NULL },
- { "asterisk", 389, NULL },
- { "odieresis", 611, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 611, NULL },
- { "nine", 556, NULL },
- { "five", 556, NULL },
- { "udieresis", 611, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 667, NULL },
- { "threequarters", 834, NULL },
- { "guillemotright", 556, NULL },
- { "Ccedilla", 722, NULL },
- { "ydieresis", 556, NULL },
- { "tilde", 333, NULL },
- { "dbldaggerumlaut", 556, NULL },
- { "at", 975, NULL },
- { "eacute", 556, NULL },
- { "underscore", 556, NULL },
- { "Euro", 556, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 584, NULL },
- { "zero", 556, NULL },
- { "eth", 611, NULL },
- { "Scedilla", 667, NULL },
- { "Ograve", 778, NULL },
- { "Racute", 722, NULL },
- { "partialdiff", 494, NULL },
- { "uacute", 611, NULL },
- { "braceleft", 389, NULL },
- { "Thorn", 667, NULL },
- { "zcaron", 500, NULL },
- { "scommaaccent", 556, NULL },
- { "ccedilla", 556, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 611, NULL },
- { "Ocircumflex", 778, NULL },
- { "Oacute", 778, NULL },
- { "scedilla", 556, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 611, NULL },
- { "racute", 389, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 611, NULL },
- { "degree", 400, NULL },
- { "registered", 737, NULL },
- { "radical", 549, NULL },
- { "Aring", 722, NULL },
- { "percent", 889, NULL },
- { "six", 556, NULL },
- { "paragraph", 556, NULL },
- { "dcaron", 743, NULL },
- { "Uogonek", 722, NULL },
- { "two", 556, NULL },
- { "summation", 600, NULL },
- { "Igrave", 278, NULL },
- { "Lacute", 611, NULL },
- { "ocircumflex", 611, NULL },
- { "oacute", 611, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 611, NULL },
- { "tcaron", 389, NULL },
- { "eogonek", 556, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 778, NULL },
- { "asciicircum", 584, NULL },
- { "aring", 556, NULL },
- { "grave", 333, NULL },
- { "uogonek", 611, NULL },
- { "bracketright", 333, NULL },
- { "Iacute", 278, NULL },
- { "ampersand", 722, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 584, NULL },
- { "uring", 611, NULL },
- { "quotesinglbase", 278, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 667, NULL },
- { "ohungarumlaut", 611, NULL },
- { "threesuperior", 333, NULL },
- { "acute", 333, NULL },
- { "section", 556, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 500, NULL },
- { "ncaron", 611, NULL },
- { "florin", 556, NULL },
- { "yacute", 556, NULL },
- { "Rcommaaccent", 722, NULL },
- { "fi", 611, NULL },
- { "fl", 611, NULL },
- { "Acircumflex", 722, NULL },
- { "Cacute", 722, NULL },
- { "Icircumflex", 278, NULL },
- { "guillemotleft", 556, NULL },
- { "germandbls", 611, NULL },
- { "Amacron", 722, NULL },
- { "seven", 556, NULL },
- { "Sacute", 667, NULL },
- { "ordmasculine", 365, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 556, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 278, NULL },
- { "rcommaaccent", 389, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 556, NULL },
- { "cacute", 556, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 389, NULL },
- { "quotedblright", 500, NULL },
- { "amacron", 556, NULL },
- { "sacute", 556, NULL },
- { "imacron", 278, NULL },
- { "cent", 556, NULL },
- { "currency", 556, NULL },
- { "logicalnot", 584, NULL },
- { "zdotaccent", 500, NULL },
- { "Atilde", 722, NULL },
- { "breve", 333, NULL },
- { "bar", 280, NULL },
- { "fraction", 167, NULL },
- { "less", 584, NULL },
- { "ecaron", 556, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 333, NULL },
- { "period", 278, NULL },
- { "Rcaron", 722, NULL },
- { "Kcommaaccent", 722, NULL },
- { "greater", 584, NULL },
- { "atilde", 556, NULL },
- { "brokenbar", 280, NULL },
- { "quoteleft", 278, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 333, NULL }
-};
-
-static BuiltinFontWidth helveticaBoldObliqueWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 389, NULL },
- { "kcommaaccent", 556, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 278, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 584, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 556, NULL },
- { "asciitilde", 584, NULL },
- { "colon", 333, NULL },
- { "onehalf", 834, NULL },
- { "dollar", 556, NULL },
- { "Lcaron", 611, NULL },
- { "ntilde", 611, NULL },
- { "Aogonek", 722, NULL },
- { "ncommaaccent", 611, NULL },
- { "minus", 584, NULL },
- { "Iogonek", 278, NULL },
- { "zacute", 500, NULL },
- { "yen", 556, NULL },
- { "space", 278, NULL },
- { "Omacron", 778, NULL },
- { "questiondown", 611, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 722, NULL },
- { "three", 556, NULL },
- { "numbersign", 556, NULL },
- { "lcaron", 400, NULL },
- { "A", 722, NULL },
- { "B", 722, NULL },
- { "C", 722, NULL },
- { "aogonek", 556, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 834, NULL },
- { "F", 611, NULL },
- { "G", 778, NULL },
- { "H", 722, NULL },
- { "I", 278, NULL },
- { "J", 556, NULL },
- { "K", 722, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 611, NULL },
- { "periodcentered", 278, NULL },
- { "M", 833, NULL },
- { "N", 722, NULL },
- { "omacron", 611, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 778, NULL },
- { "P", 667, NULL },
- { "Q", 778, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 722, NULL },
- { "Aacute", 722, NULL },
- { "caron", 333, NULL },
- { "S", 667, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 556, NULL },
- { "V", 667, NULL },
- { "W", 944, NULL },
- { "X", 667, NULL },
- { "question", 611, NULL },
- { "equal", 584, NULL },
- { "Y", 667, NULL },
- { "Z", 611, NULL },
- { "four", 556, NULL },
- { "a", 556, NULL },
- { "Gcommaaccent", 778, NULL },
- { "b", 611, NULL },
- { "c", 556, NULL },
- { "d", 611, NULL },
- { "e", 556, NULL },
- { "f", 333, NULL },
- { "g", 611, NULL },
- { "bullet", 350, NULL },
- { "h", 611, NULL },
- { "i", 278, NULL },
- { "Oslash", 778, NULL },
- { "dagger", 556, NULL },
- { "j", 278, NULL },
- { "k", 556, NULL },
- { "l", 278, NULL },
- { "m", 889, NULL },
- { "n", 611, NULL },
- { "tcommaaccent", 333, NULL },
- { "o", 611, NULL },
- { "ordfeminine", 370, NULL },
- { "ring", 333, NULL },
- { "p", 611, NULL },
- { "q", 611, NULL },
- { "uhungarumlaut", 611, NULL },
- { "r", 389, NULL },
- { "twosuperior", 333, NULL },
- { "aacute", 556, NULL },
- { "s", 556, NULL },
- { "OE", 1000, NULL },
- { "t", 333, NULL },
- { "divide", 584, NULL },
- { "u", 611, NULL },
- { "Ccaron", 722, NULL },
- { "v", 556, NULL },
- { "w", 778, NULL },
- { "x", 556, NULL },
- { "y", 556, NULL },
- { "z", 500, NULL },
- { "Gbreve", 778, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 278, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 474, NULL },
- { "gcommaaccent", 611, NULL },
- { "mu", 611, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 667, NULL },
- { "Lslash", 611, NULL },
- { "semicolon", 333, NULL },
- { "oslash", 611, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 494, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 556, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 611, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 556, NULL },
- { "nacute", 611, NULL },
- { "macron", 333, NULL },
- { "Otilde", 778, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 556, NULL },
- { "AE", 1000, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 500, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 238, NULL },
- { "eight", 556, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 556, NULL },
- { "oe", 944, NULL },
- { "Abreve", 722, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 556, NULL },
- { "Adieresis", 722, NULL },
- { "copyright", 737, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 611, NULL },
- { "Idieresis", 278, NULL },
- { "parenleft", 333, NULL },
- { "one", 556, NULL },
- { "emacron", 556, NULL },
- { "Odieresis", 778, NULL },
- { "ucircumflex", 611, NULL },
- { "bracketleft", 333, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 278, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 667, NULL },
- { "umacron", 611, NULL },
- { "abreve", 556, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 556, NULL },
- { "egrave", 556, NULL },
- { "edieresis", 556, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 889, NULL },
- { "asterisk", 389, NULL },
- { "odieresis", 611, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 611, NULL },
- { "nine", 556, NULL },
- { "five", 556, NULL },
- { "udieresis", 611, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 667, NULL },
- { "threequarters", 834, NULL },
- { "guillemotright", 556, NULL },
- { "Ccedilla", 722, NULL },
- { "ydieresis", 556, NULL },
- { "tilde", 333, NULL },
- { "at", 975, NULL },
- { "eacute", 556, NULL },
- { "underscore", 556, NULL },
- { "Euro", 556, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 584, NULL },
- { "zero", 556, NULL },
- { "eth", 611, NULL },
- { "Scedilla", 667, NULL },
- { "Ograve", 778, NULL },
- { "Racute", 722, NULL },
- { "partialdiff", 494, NULL },
- { "uacute", 611, NULL },
- { "braceleft", 389, NULL },
- { "Thorn", 667, NULL },
- { "zcaron", 500, NULL },
- { "scommaaccent", 556, NULL },
- { "ccedilla", 556, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 611, NULL },
- { "Ocircumflex", 778, NULL },
- { "Oacute", 778, NULL },
- { "scedilla", 556, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 611, NULL },
- { "racute", 389, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 611, NULL },
- { "degree", 400, NULL },
- { "registered", 737, NULL },
- { "radical", 549, NULL },
- { "Aring", 722, NULL },
- { "percent", 889, NULL },
- { "six", 556, NULL },
- { "paragraph", 556, NULL },
- { "dcaron", 743, NULL },
- { "Uogonek", 722, NULL },
- { "two", 556, NULL },
- { "summation", 600, NULL },
- { "Igrave", 278, NULL },
- { "Lacute", 611, NULL },
- { "ocircumflex", 611, NULL },
- { "oacute", 611, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 611, NULL },
- { "tcaron", 389, NULL },
- { "eogonek", 556, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 778, NULL },
- { "asciicircum", 584, NULL },
- { "aring", 556, NULL },
- { "grave", 333, NULL },
- { "uogonek", 611, NULL },
- { "bracketright", 333, NULL },
- { "Iacute", 278, NULL },
- { "ampersand", 722, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 584, NULL },
- { "uring", 611, NULL },
- { "quotesinglbase", 278, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 667, NULL },
- { "ohungarumlaut", 611, NULL },
- { "threesuperior", 333, NULL },
- { "acute", 333, NULL },
- { "section", 556, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 500, NULL },
- { "ncaron", 611, NULL },
- { "florin", 556, NULL },
- { "yacute", 556, NULL },
- { "Rcommaaccent", 722, NULL },
- { "fi", 611, NULL },
- { "fl", 611, NULL },
- { "Acircumflex", 722, NULL },
- { "Cacute", 722, NULL },
- { "Icircumflex", 278, NULL },
- { "guillemotleft", 556, NULL },
- { "germandbls", 611, NULL },
- { "Amacron", 722, NULL },
- { "seven", 556, NULL },
- { "Sacute", 667, NULL },
- { "ordmasculine", 365, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 556, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 278, NULL },
- { "rcommaaccent", 389, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 556, NULL },
- { "cacute", 556, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 389, NULL },
- { "quotedblright", 500, NULL },
- { "amacron", 556, NULL },
- { "sacute", 556, NULL },
- { "imacron", 278, NULL },
- { "cent", 556, NULL },
- { "currency", 556, NULL },
- { "logicalnot", 584, NULL },
- { "zdotaccent", 500, NULL },
- { "Atilde", 722, NULL },
- { "breve", 333, NULL },
- { "bar", 280, NULL },
- { "fraction", 167, NULL },
- { "less", 584, NULL },
- { "ecaron", 556, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 333, NULL },
- { "period", 278, NULL },
- { "Rcaron", 722, NULL },
- { "Kcommaaccent", 722, NULL },
- { "greater", 584, NULL },
- { "atilde", 556, NULL },
- { "brokenbar", 280, NULL },
- { "quoteleft", 278, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 333, NULL }
-};
-
-static BuiltinFontWidth helveticaObliqueWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 333, NULL },
- { "kcommaaccent", 500, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 278, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 584, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 556, NULL },
- { "asciitilde", 584, NULL },
- { "colon", 278, NULL },
- { "onehalf", 834, NULL },
- { "dollar", 556, NULL },
- { "Lcaron", 556, NULL },
- { "ntilde", 556, NULL },
- { "Aogonek", 667, NULL },
- { "ncommaaccent", 556, NULL },
- { "minus", 584, NULL },
- { "Iogonek", 278, NULL },
- { "zacute", 500, NULL },
- { "yen", 556, NULL },
- { "space", 278, NULL },
- { "Omacron", 778, NULL },
- { "questiondown", 611, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 667, NULL },
- { "three", 556, NULL },
- { "numbersign", 556, NULL },
- { "lcaron", 299, NULL },
- { "A", 667, NULL },
- { "B", 667, NULL },
- { "C", 722, NULL },
- { "aogonek", 556, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 834, NULL },
- { "F", 611, NULL },
- { "G", 778, NULL },
- { "H", 722, NULL },
- { "I", 278, NULL },
- { "J", 500, NULL },
- { "K", 667, NULL },
- { "iogonek", 222, NULL },
- { "backslash", 278, NULL },
- { "L", 556, NULL },
- { "periodcentered", 278, NULL },
- { "M", 833, NULL },
- { "N", 722, NULL },
- { "omacron", 556, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 778, NULL },
- { "P", 667, NULL },
- { "Q", 778, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 722, NULL },
- { "Aacute", 667, NULL },
- { "caron", 333, NULL },
- { "S", 667, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 556, NULL },
- { "V", 667, NULL },
- { "W", 944, NULL },
- { "X", 667, NULL },
- { "question", 556, NULL },
- { "equal", 584, NULL },
- { "Y", 667, NULL },
- { "Z", 611, NULL },
- { "four", 556, NULL },
- { "a", 556, NULL },
- { "Gcommaaccent", 778, NULL },
- { "b", 556, NULL },
- { "c", 500, NULL },
- { "d", 556, NULL },
- { "e", 556, NULL },
- { "f", 278, NULL },
- { "g", 556, NULL },
- { "bullet", 350, NULL },
- { "h", 556, NULL },
- { "i", 222, NULL },
- { "Oslash", 778, NULL },
- { "dagger", 556, NULL },
- { "j", 222, NULL },
- { "k", 500, NULL },
- { "l", 222, NULL },
- { "m", 833, NULL },
- { "n", 556, NULL },
- { "tcommaaccent", 278, NULL },
- { "o", 556, NULL },
- { "ordfeminine", 370, NULL },
- { "ring", 333, NULL },
- { "p", 556, NULL },
- { "q", 556, NULL },
- { "uhungarumlaut", 556, NULL },
- { "r", 333, NULL },
- { "twosuperior", 333, NULL },
- { "aacute", 556, NULL },
- { "s", 500, NULL },
- { "OE", 1000, NULL },
- { "t", 278, NULL },
- { "divide", 584, NULL },
- { "u", 556, NULL },
- { "Ccaron", 722, NULL },
- { "v", 500, NULL },
- { "w", 722, NULL },
- { "x", 500, NULL },
- { "y", 500, NULL },
- { "z", 500, NULL },
- { "Gbreve", 778, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 278, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 355, NULL },
- { "gcommaaccent", 556, NULL },
- { "mu", 556, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 667, NULL },
- { "Lslash", 556, NULL },
- { "semicolon", 278, NULL },
- { "oslash", 611, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 471, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 500, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 556, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 556, NULL },
- { "nacute", 556, NULL },
- { "macron", 333, NULL },
- { "Otilde", 778, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 500, NULL },
- { "AE", 1000, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 222, NULL },
- { "quotedblleft", 333, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 191, NULL },
- { "eight", 556, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 556, NULL },
- { "oe", 944, NULL },
- { "Abreve", 667, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 556, NULL },
- { "Adieresis", 667, NULL },
- { "copyright", 737, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 556, NULL },
- { "Idieresis", 278, NULL },
- { "parenleft", 333, NULL },
- { "one", 556, NULL },
- { "emacron", 556, NULL },
- { "Odieresis", 778, NULL },
- { "ucircumflex", 556, NULL },
- { "bracketleft", 278, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 222, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 667, NULL },
- { "umacron", 556, NULL },
- { "abreve", 556, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 556, NULL },
- { "egrave", 556, NULL },
- { "edieresis", 556, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 889, NULL },
- { "asterisk", 389, NULL },
- { "odieresis", 556, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 556, NULL },
- { "nine", 556, NULL },
- { "five", 556, NULL },
- { "udieresis", 556, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 667, NULL },
- { "threequarters", 834, NULL },
- { "guillemotright", 556, NULL },
- { "Ccedilla", 722, NULL },
- { "ydieresis", 500, NULL },
- { "tilde", 333, NULL },
- { "at", 1015, NULL },
- { "eacute", 556, NULL },
- { "underscore", 556, NULL },
- { "Euro", 556, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 584, NULL },
- { "zero", 556, NULL },
- { "eth", 556, NULL },
- { "Scedilla", 667, NULL },
- { "Ograve", 778, NULL },
- { "Racute", 722, NULL },
- { "partialdiff", 476, NULL },
- { "uacute", 556, NULL },
- { "braceleft", 334, NULL },
- { "Thorn", 667, NULL },
- { "zcaron", 500, NULL },
- { "scommaaccent", 500, NULL },
- { "ccedilla", 500, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 556, NULL },
- { "Ocircumflex", 778, NULL },
- { "Oacute", 778, NULL },
- { "scedilla", 500, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 556, NULL },
- { "racute", 333, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 556, NULL },
- { "degree", 400, NULL },
- { "registered", 737, NULL },
- { "radical", 453, NULL },
- { "Aring", 667, NULL },
- { "percent", 889, NULL },
- { "six", 556, NULL },
- { "paragraph", 537, NULL },
- { "dcaron", 643, NULL },
- { "Uogonek", 722, NULL },
- { "two", 556, NULL },
- { "summation", 600, NULL },
- { "Igrave", 278, NULL },
- { "Lacute", 556, NULL },
- { "ocircumflex", 556, NULL },
- { "oacute", 556, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 556, NULL },
- { "tcaron", 317, NULL },
- { "eogonek", 556, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 778, NULL },
- { "asciicircum", 469, NULL },
- { "aring", 556, NULL },
- { "grave", 333, NULL },
- { "uogonek", 556, NULL },
- { "bracketright", 278, NULL },
- { "Iacute", 278, NULL },
- { "ampersand", 667, NULL },
- { "igrave", 278, NULL },
- { "lacute", 222, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 584, NULL },
- { "uring", 556, NULL },
- { "quotesinglbase", 222, NULL },
- { "lcommaaccent", 222, NULL },
- { "Yacute", 667, NULL },
- { "ohungarumlaut", 556, NULL },
- { "threesuperior", 333, NULL },
- { "acute", 333, NULL },
- { "section", 556, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 333, NULL },
- { "ncaron", 556, NULL },
- { "florin", 556, NULL },
- { "yacute", 500, NULL },
- { "Rcommaaccent", 722, NULL },
- { "fi", 500, NULL },
- { "fl", 500, NULL },
- { "Acircumflex", 667, NULL },
- { "Cacute", 722, NULL },
- { "Icircumflex", 278, NULL },
- { "guillemotleft", 556, NULL },
- { "germandbls", 611, NULL },
- { "Amacron", 667, NULL },
- { "seven", 556, NULL },
- { "Sacute", 667, NULL },
- { "ordmasculine", 365, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 556, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 278, NULL },
- { "rcommaaccent", 333, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 556, NULL },
- { "cacute", 500, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 334, NULL },
- { "quotedblright", 333, NULL },
- { "amacron", 556, NULL },
- { "sacute", 500, NULL },
- { "imacron", 278, NULL },
- { "cent", 556, NULL },
- { "currency", 556, NULL },
- { "logicalnot", 584, NULL },
- { "zdotaccent", 500, NULL },
- { "Atilde", 667, NULL },
- { "breve", 333, NULL },
- { "bar", 260, NULL },
- { "fraction", 167, NULL },
- { "less", 584, NULL },
- { "ecaron", 556, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 278, NULL },
- { "period", 278, NULL },
- { "Rcaron", 722, NULL },
- { "Kcommaaccent", 667, NULL },
- { "greater", 584, NULL },
- { "atilde", 556, NULL },
- { "brokenbar", 260, NULL },
- { "quoteleft", 222, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 333, NULL }
-};
-
-static BuiltinFontWidth symbolWidthsTab[] = {
- { "bracketleftex", 384, NULL },
- { "alpha", 631, NULL },
- { "union", 768, NULL },
- { "infinity", 713, NULL },
- { "comma", 250, NULL },
- { "copyrightsans", 790, NULL },
- { "plusminus", 549, NULL },
- { "arrowup", 603, NULL },
- { "apple", 790, NULL },
- { "parenleftbt", 384, NULL },
- { "notelement", 713, NULL },
- { "colon", 278, NULL },
- { "beta", 549, NULL },
- { "braceleftbt", 494, NULL },
- { "Lambda", 686, NULL },
- { "Phi", 763, NULL },
- { "minus", 549, NULL },
- { "space", 250, NULL },
- { "Sigma", 592, NULL },
- { "approxequal", 549, NULL },
- { "minute", 247, NULL },
- { "circleplus", 768, NULL },
- { "Omicron", 722, NULL },
- { "three", 500, NULL },
- { "numbersign", 500, NULL },
- { "lambda", 549, NULL },
- { "phi", 521, NULL },
- { "aleph", 823, NULL },
- { "Tau", 611, NULL },
- { "spade", 753, NULL },
- { "logicaland", 603, NULL },
- { "sigma", 603, NULL },
- { "propersuperset", 713, NULL },
- { "omicron", 549, NULL },
- { "question", 444, NULL },
- { "equal", 549, NULL },
- { "Epsilon", 611, NULL },
- { "emptyset", 823, NULL },
- { "diamond", 753, NULL },
- { "four", 500, NULL },
- { "Mu", 889, NULL },
- { "parenlefttp", 384, NULL },
- { "club", 753, NULL },
- { "bullet", 460, NULL },
- { "Omega", 768, NULL },
- { "tau", 439, NULL },
- { "Upsilon", 690, NULL },
- { "bracelefttp", 494, NULL },
- { "heart", 753, NULL },
- { "divide", 549, NULL },
- { "epsilon", 439, NULL },
- { "logicalor", 603, NULL },
- { "parenleftex", 384, NULL },
- { "greaterequal", 549, NULL },
- { "mu", 576, NULL },
- { "Nu", 722, NULL },
- { "therefore", 863, NULL },
- { "notsubset", 713, NULL },
- { "omega", 686, NULL },
- { "semicolon", 278, NULL },
- { "element", 713, NULL },
- { "upsilon", 576, NULL },
- { "existential", 549, NULL },
- { "integralbt", 686, NULL },
- { "lessequal", 549, NULL },
- { "phi1", 603, NULL },
- { "lozenge", 494, NULL },
- { "trademarkserif", 890, NULL },
- { "parenright", 333, NULL },
- { "reflexsuperset", 713, NULL },
- { "sigma1", 439, NULL },
- { "nu", 521, NULL },
- { "Gamma", 603, NULL },
- { "angleright", 329, NULL },
- { "ellipsis", 1000, NULL },
- { "Rho", 556, NULL },
- { "parenrightbt", 384, NULL },
- { "radicalex", 500, NULL },
- { "eight", 500, NULL },
- { "angleleft", 329, NULL },
- { "arrowdbldown", 603, NULL },
- { "congruent", 549, NULL },
- { "Theta", 741, NULL },
- { "intersection", 768, NULL },
- { "Pi", 768, NULL },
- { "slash", 278, NULL },
- { "registerserif", 790, NULL },
- { "parenleft", 333, NULL },
- { "one", 500, NULL },
- { "gamma", 411, NULL },
- { "bracketleft", 333, NULL },
- { "rho", 549, NULL },
- { "circlemultiply", 768, NULL },
- { "Chi", 722, NULL },
- { "theta", 521, NULL },
- { "pi", 549, NULL },
- { "integraltp", 686, NULL },
- { "Eta", 722, NULL },
- { "product", 823, NULL },
- { "nine", 500, NULL },
- { "five", 500, NULL },
- { "propersubset", 713, NULL },
- { "bracketrightbt", 384, NULL },
- { "trademarksans", 786, NULL },
- { "dotmath", 250, NULL },
- { "integralex", 686, NULL },
- { "chi", 549, NULL },
- { "parenrighttp", 384, NULL },
- { "eta", 603, NULL },
- { "underscore", 500, NULL },
- { "Euro", 750, NULL },
- { "multiply", 549, NULL },
- { "zero", 500, NULL },
- { "partialdiff", 494, NULL },
- { "angle", 768, NULL },
- { "arrowdblleft", 987, NULL },
- { "braceleft", 480, NULL },
- { "parenrightex", 384, NULL },
- { "Rfraktur", 795, NULL },
- { "Zeta", 611, NULL },
- { "braceex", 494, NULL },
- { "arrowdblup", 603, NULL },
- { "arrowdown", 603, NULL },
- { "Ifraktur", 686, NULL },
- { "degree", 400, NULL },
- { "Iota", 333, NULL },
- { "perpendicular", 658, NULL },
- { "radical", 549, NULL },
- { "asteriskmath", 500, NULL },
- { "percent", 833, NULL },
- { "zeta", 494, NULL },
- { "six", 500, NULL },
- { "two", 500, NULL },
- { "weierstrass", 987, NULL },
- { "summation", 713, NULL },
- { "bracketrighttp", 384, NULL },
- { "carriagereturn", 658, NULL },
- { "suchthat", 439, NULL },
- { "arrowvertex", 603, NULL },
- { "Delta", 612, NULL },
- { "iota", 329, NULL },
- { "arrowhorizex", 1000, NULL },
- { "bracketrightex", 384, NULL },
- { "bracketright", 333, NULL },
- { "ampersand", 778, NULL },
- { "plus", 549, NULL },
- { "proportional", 713, NULL },
- { "delta", 494, NULL },
- { "copyrightserif", 790, NULL },
- { "bracerightmid", 494, NULL },
- { "arrowleft", 987, NULL },
- { "second", 411, NULL },
- { "arrowdblboth", 1042, NULL },
- { "florin", 500, NULL },
- { "Psi", 795, NULL },
- { "bracerightbt", 494, NULL },
- { "bracketleftbt", 384, NULL },
- { "seven", 500, NULL },
- { "braceleftmid", 494, NULL },
- { "notequal", 549, NULL },
- { "psi", 686, NULL },
- { "equivalence", 549, NULL },
- { "universal", 713, NULL },
- { "arrowdblright", 987, NULL },
- { "braceright", 480, NULL },
- { "reflexsubset", 713, NULL },
- { "Xi", 645, NULL },
- { "theta1", 631, NULL },
- { "logicalnot", 713, NULL },
- { "Kappa", 722, NULL },
- { "similar", 549, NULL },
- { "bar", 200, NULL },
- { "fraction", 167, NULL },
- { "less", 549, NULL },
- { "registersans", 790, NULL },
- { "omega1", 713, NULL },
- { "exclam", 333, NULL },
- { "Upsilon1", 620, NULL },
- { "bracerighttp", 494, NULL },
- { "xi", 493, NULL },
- { "period", 250, NULL },
- { "Alpha", 722, NULL },
- { "arrowright", 987, NULL },
- { "greater", 549, NULL },
- { "bracketlefttp", 384, NULL },
- { "kappa", 549, NULL },
- { "gradient", 713, NULL },
- { "integral", 274, NULL },
- { "arrowboth", 1042, NULL },
- { "Beta", 667, NULL }
-};
-
-static BuiltinFontWidth timesBoldWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 444, NULL },
- { "kcommaaccent", 556, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 667, NULL },
- { "comma", 250, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 570, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 444, NULL },
- { "asciitilde", 520, NULL },
- { "colon", 333, NULL },
- { "onehalf", 750, NULL },
- { "dollar", 500, NULL },
- { "Lcaron", 667, NULL },
- { "ntilde", 556, NULL },
- { "Aogonek", 722, NULL },
- { "ncommaaccent", 556, NULL },
- { "minus", 570, NULL },
- { "Iogonek", 389, NULL },
- { "zacute", 444, NULL },
- { "yen", 500, NULL },
- { "space", 250, NULL },
- { "Omacron", 778, NULL },
- { "questiondown", 500, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 722, NULL },
- { "three", 500, NULL },
- { "numbersign", 500, NULL },
- { "lcaron", 394, NULL },
- { "A", 722, NULL },
- { "B", 667, NULL },
- { "C", 722, NULL },
- { "aogonek", 500, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 750, NULL },
- { "F", 611, NULL },
- { "G", 778, NULL },
- { "H", 778, NULL },
- { "I", 389, NULL },
- { "J", 500, NULL },
- { "K", 778, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 667, NULL },
- { "periodcentered", 250, NULL },
- { "M", 944, NULL },
- { "N", 722, NULL },
- { "omacron", 500, NULL },
- { "Tcommaaccent", 667, NULL },
- { "O", 778, NULL },
- { "P", 611, NULL },
- { "Q", 778, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 722, NULL },
- { "Aacute", 722, NULL },
- { "caron", 333, NULL },
- { "S", 556, NULL },
- { "T", 667, NULL },
- { "U", 722, NULL },
- { "agrave", 500, NULL },
- { "V", 722, NULL },
- { "W", 1000, NULL },
- { "X", 722, NULL },
- { "question", 500, NULL },
- { "equal", 570, NULL },
- { "Y", 722, NULL },
- { "Z", 667, NULL },
- { "four", 500, NULL },
- { "a", 500, NULL },
- { "Gcommaaccent", 778, NULL },
- { "b", 556, NULL },
- { "c", 444, NULL },
- { "d", 556, NULL },
- { "e", 444, NULL },
- { "f", 333, NULL },
- { "g", 500, NULL },
- { "bullet", 350, NULL },
- { "h", 556, NULL },
- { "i", 278, NULL },
- { "Oslash", 778, NULL },
- { "dagger", 500, NULL },
- { "j", 333, NULL },
- { "k", 556, NULL },
- { "l", 278, NULL },
- { "m", 833, NULL },
- { "n", 556, NULL },
- { "tcommaaccent", 333, NULL },
- { "o", 500, NULL },
- { "ordfeminine", 300, NULL },
- { "ring", 333, NULL },
- { "p", 556, NULL },
- { "q", 556, NULL },
- { "uhungarumlaut", 556, NULL },
- { "r", 444, NULL },
- { "twosuperior", 300, NULL },
- { "aacute", 500, NULL },
- { "s", 389, NULL },
- { "OE", 1000, NULL },
- { "t", 333, NULL },
- { "divide", 570, NULL },
- { "u", 556, NULL },
- { "Ccaron", 722, NULL },
- { "v", 500, NULL },
- { "w", 722, NULL },
- { "x", 500, NULL },
- { "y", 500, NULL },
- { "z", 444, NULL },
- { "Gbreve", 778, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 389, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 555, NULL },
- { "gcommaaccent", 500, NULL },
- { "mu", 556, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 556, NULL },
- { "Lslash", 667, NULL },
- { "semicolon", 333, NULL },
- { "oslash", 500, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 494, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 444, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 500, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 500, NULL },
- { "nacute", 556, NULL },
- { "macron", 333, NULL },
- { "Otilde", 778, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 389, NULL },
- { "AE", 1000, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 500, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 278, NULL },
- { "eight", 500, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 500, NULL },
- { "oe", 722, NULL },
- { "Abreve", 722, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 444, NULL },
- { "Adieresis", 722, NULL },
- { "copyright", 747, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 500, NULL },
- { "Idieresis", 389, NULL },
- { "parenleft", 333, NULL },
- { "one", 500, NULL },
- { "emacron", 444, NULL },
- { "Odieresis", 778, NULL },
- { "ucircumflex", 556, NULL },
- { "bracketleft", 333, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 333, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 722, NULL },
- { "umacron", 556, NULL },
- { "abreve", 500, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 500, NULL },
- { "egrave", 444, NULL },
- { "edieresis", 444, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 722, NULL },
- { "asterisk", 500, NULL },
- { "odieresis", 500, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 556, NULL },
- { "nine", 500, NULL },
- { "five", 500, NULL },
- { "udieresis", 556, NULL },
- { "Zcaron", 667, NULL },
- { "Scommaaccent", 556, NULL },
- { "threequarters", 750, NULL },
- { "guillemotright", 500, NULL },
- { "Ccedilla", 722, NULL },
- { "ydieresis", 500, NULL },
- { "tilde", 333, NULL },
- { "at", 930, NULL },
- { "eacute", 444, NULL },
- { "underscore", 500, NULL },
- { "Euro", 500, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 570, NULL },
- { "zero", 500, NULL },
- { "eth", 500, NULL },
- { "Scedilla", 556, NULL },
- { "Ograve", 778, NULL },
- { "Racute", 722, NULL },
- { "partialdiff", 494, NULL },
- { "uacute", 556, NULL },
- { "braceleft", 394, NULL },
- { "Thorn", 611, NULL },
- { "zcaron", 444, NULL },
- { "scommaaccent", 389, NULL },
- { "ccedilla", 444, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 556, NULL },
- { "Ocircumflex", 778, NULL },
- { "Oacute", 778, NULL },
- { "scedilla", 389, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 500, NULL },
- { "racute", 444, NULL },
- { "Tcaron", 667, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 556, NULL },
- { "degree", 400, NULL },
- { "registered", 747, NULL },
- { "radical", 549, NULL },
- { "Aring", 722, NULL },
- { "percent", 1000, NULL },
- { "six", 500, NULL },
- { "paragraph", 540, NULL },
- { "dcaron", 672, NULL },
- { "Uogonek", 722, NULL },
- { "two", 500, NULL },
- { "summation", 600, NULL },
- { "Igrave", 389, NULL },
- { "Lacute", 667, NULL },
- { "ocircumflex", 500, NULL },
- { "oacute", 500, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 667, NULL },
- { "tcaron", 416, NULL },
- { "eogonek", 444, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 778, NULL },
- { "asciicircum", 581, NULL },
- { "aring", 500, NULL },
- { "grave", 333, NULL },
- { "uogonek", 556, NULL },
- { "bracketright", 333, NULL },
- { "Iacute", 389, NULL },
- { "ampersand", 833, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 570, NULL },
- { "uring", 556, NULL },
- { "quotesinglbase", 333, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 722, NULL },
- { "ohungarumlaut", 500, NULL },
- { "threesuperior", 300, NULL },
- { "acute", 333, NULL },
- { "section", 500, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 500, NULL },
- { "ncaron", 556, NULL },
- { "florin", 500, NULL },
- { "yacute", 500, NULL },
- { "Rcommaaccent", 722, NULL },
- { "fi", 556, NULL },
- { "fl", 556, NULL },
- { "Acircumflex", 722, NULL },
- { "Cacute", 722, NULL },
- { "Icircumflex", 389, NULL },
- { "guillemotleft", 500, NULL },
- { "germandbls", 556, NULL },
- { "Amacron", 722, NULL },
- { "seven", 500, NULL },
- { "Sacute", 556, NULL },
- { "ordmasculine", 330, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 500, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 389, NULL },
- { "rcommaaccent", 444, NULL },
- { "Zdotaccent", 667, NULL },
- { "acircumflex", 500, NULL },
- { "cacute", 444, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 394, NULL },
- { "quotedblright", 500, NULL },
- { "amacron", 500, NULL },
- { "sacute", 389, NULL },
- { "imacron", 278, NULL },
- { "cent", 500, NULL },
- { "currency", 500, NULL },
- { "logicalnot", 570, NULL },
- { "zdotaccent", 444, NULL },
- { "Atilde", 722, NULL },
- { "breve", 333, NULL },
- { "bar", 220, NULL },
- { "fraction", 167, NULL },
- { "less", 570, NULL },
- { "ecaron", 444, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 333, NULL },
- { "period", 250, NULL },
- { "Rcaron", 722, NULL },
- { "Kcommaaccent", 778, NULL },
- { "greater", 570, NULL },
- { "atilde", 500, NULL },
- { "brokenbar", 220, NULL },
- { "quoteleft", 333, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 300, NULL }
-};
-
-static BuiltinFontWidth timesBoldItalicWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 389, NULL },
- { "kcommaaccent", 500, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 250, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 570, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 444, NULL },
- { "asciitilde", 570, NULL },
- { "colon", 333, NULL },
- { "onehalf", 750, NULL },
- { "dollar", 500, NULL },
- { "Lcaron", 611, NULL },
- { "ntilde", 556, NULL },
- { "Aogonek", 667, NULL },
- { "ncommaaccent", 556, NULL },
- { "minus", 606, NULL },
- { "Iogonek", 389, NULL },
- { "zacute", 389, NULL },
- { "yen", 500, NULL },
- { "space", 250, NULL },
- { "Omacron", 722, NULL },
- { "questiondown", 500, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 667, NULL },
- { "three", 500, NULL },
- { "numbersign", 500, NULL },
- { "lcaron", 382, NULL },
- { "A", 667, NULL },
- { "B", 667, NULL },
- { "C", 667, NULL },
- { "aogonek", 500, NULL },
- { "D", 722, NULL },
- { "E", 667, NULL },
- { "onequarter", 750, NULL },
- { "F", 667, NULL },
- { "G", 722, NULL },
- { "H", 778, NULL },
- { "I", 389, NULL },
- { "J", 500, NULL },
- { "K", 667, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 611, NULL },
- { "periodcentered", 250, NULL },
- { "M", 889, NULL },
- { "N", 722, NULL },
- { "omacron", 500, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 722, NULL },
- { "P", 611, NULL },
- { "Q", 722, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 667, NULL },
- { "Aacute", 667, NULL },
- { "caron", 333, NULL },
- { "S", 556, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 500, NULL },
- { "V", 667, NULL },
- { "W", 889, NULL },
- { "X", 667, NULL },
- { "question", 500, NULL },
- { "equal", 570, NULL },
- { "Y", 611, NULL },
- { "Z", 611, NULL },
- { "four", 500, NULL },
- { "a", 500, NULL },
- { "Gcommaaccent", 722, NULL },
- { "b", 500, NULL },
- { "c", 444, NULL },
- { "d", 500, NULL },
- { "e", 444, NULL },
- { "f", 333, NULL },
- { "g", 500, NULL },
- { "bullet", 350, NULL },
- { "h", 556, NULL },
- { "i", 278, NULL },
- { "Oslash", 722, NULL },
- { "dagger", 500, NULL },
- { "j", 278, NULL },
- { "k", 500, NULL },
- { "l", 278, NULL },
- { "m", 778, NULL },
- { "n", 556, NULL },
- { "tcommaaccent", 278, NULL },
- { "o", 500, NULL },
- { "ordfeminine", 266, NULL },
- { "ring", 333, NULL },
- { "p", 500, NULL },
- { "q", 500, NULL },
- { "uhungarumlaut", 556, NULL },
- { "r", 389, NULL },
- { "twosuperior", 300, NULL },
- { "aacute", 500, NULL },
- { "s", 389, NULL },
- { "OE", 944, NULL },
- { "t", 278, NULL },
- { "divide", 570, NULL },
- { "u", 556, NULL },
- { "Ccaron", 667, NULL },
- { "v", 444, NULL },
- { "w", 667, NULL },
- { "x", 500, NULL },
- { "y", 444, NULL },
- { "z", 389, NULL },
- { "Gbreve", 722, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 389, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 555, NULL },
- { "gcommaaccent", 500, NULL },
- { "mu", 576, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 556, NULL },
- { "Lslash", 611, NULL },
- { "semicolon", 333, NULL },
- { "oslash", 500, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 494, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 444, NULL },
- { "Ecircumflex", 667, NULL },
- { "gbreve", 500, NULL },
- { "trademark", 1000, NULL },
- { "daggerdbl", 500, NULL },
- { "nacute", 556, NULL },
- { "macron", 333, NULL },
- { "Otilde", 722, NULL },
- { "Emacron", 667, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 389, NULL },
- { "AE", 944, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 500, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 278, NULL },
- { "eight", 500, NULL },
- { "exclamdown", 389, NULL },
- { "endash", 500, NULL },
- { "oe", 722, NULL },
- { "Abreve", 667, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 444, NULL },
- { "Adieresis", 667, NULL },
- { "copyright", 747, NULL },
- { "Egrave", 667, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 667, NULL },
- { "otilde", 500, NULL },
- { "Idieresis", 389, NULL },
- { "parenleft", 333, NULL },
- { "one", 500, NULL },
- { "emacron", 444, NULL },
- { "Odieresis", 722, NULL },
- { "ucircumflex", 556, NULL },
- { "bracketleft", 333, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 333, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 611, NULL },
- { "umacron", 556, NULL },
- { "abreve", 500, NULL },
- { "Eacute", 667, NULL },
- { "adieresis", 500, NULL },
- { "egrave", 444, NULL },
- { "edieresis", 444, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 722, NULL },
- { "asterisk", 500, NULL },
- { "odieresis", 500, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 556, NULL },
- { "nine", 500, NULL },
- { "five", 500, NULL },
- { "udieresis", 556, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 556, NULL },
- { "threequarters", 750, NULL },
- { "guillemotright", 500, NULL },
- { "Ccedilla", 667, NULL },
- { "ydieresis", 444, NULL },
- { "tilde", 333, NULL },
- { "at", 832, NULL },
- { "eacute", 444, NULL },
- { "underscore", 500, NULL },
- { "Euro", 500, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 570, NULL },
- { "zero", 500, NULL },
- { "eth", 500, NULL },
- { "Scedilla", 556, NULL },
- { "Ograve", 722, NULL },
- { "Racute", 667, NULL },
- { "partialdiff", 494, NULL },
- { "uacute", 556, NULL },
- { "braceleft", 348, NULL },
- { "Thorn", 611, NULL },
- { "zcaron", 389, NULL },
- { "scommaaccent", 389, NULL },
- { "ccedilla", 444, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 500, NULL },
- { "Ocircumflex", 722, NULL },
- { "Oacute", 722, NULL },
- { "scedilla", 389, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 500, NULL },
- { "racute", 389, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 667, NULL },
- { "thorn", 500, NULL },
- { "degree", 400, NULL },
- { "registered", 747, NULL },
- { "radical", 549, NULL },
- { "Aring", 667, NULL },
- { "percent", 833, NULL },
- { "six", 500, NULL },
- { "paragraph", 500, NULL },
- { "dcaron", 608, NULL },
- { "Uogonek", 722, NULL },
- { "two", 500, NULL },
- { "summation", 600, NULL },
- { "Igrave", 389, NULL },
- { "Lacute", 611, NULL },
- { "ocircumflex", 500, NULL },
- { "oacute", 500, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 611, NULL },
- { "tcaron", 366, NULL },
- { "eogonek", 444, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 722, NULL },
- { "asciicircum", 570, NULL },
- { "aring", 500, NULL },
- { "grave", 333, NULL },
- { "uogonek", 556, NULL },
- { "bracketright", 333, NULL },
- { "Iacute", 389, NULL },
- { "ampersand", 778, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 570, NULL },
- { "uring", 556, NULL },
- { "quotesinglbase", 333, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 611, NULL },
- { "ohungarumlaut", 500, NULL },
- { "threesuperior", 300, NULL },
- { "acute", 333, NULL },
- { "section", 500, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 500, NULL },
- { "ncaron", 556, NULL },
- { "florin", 500, NULL },
- { "yacute", 444, NULL },
- { "Rcommaaccent", 667, NULL },
- { "fi", 556, NULL },
- { "fl", 556, NULL },
- { "Acircumflex", 667, NULL },
- { "Cacute", 667, NULL },
- { "Icircumflex", 389, NULL },
- { "guillemotleft", 500, NULL },
- { "germandbls", 500, NULL },
- { "Amacron", 667, NULL },
- { "seven", 500, NULL },
- { "Sacute", 556, NULL },
- { "ordmasculine", 300, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 500, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 389, NULL },
- { "rcommaaccent", 389, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 500, NULL },
- { "cacute", 444, NULL },
- { "Ecaron", 667, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 348, NULL },
- { "quotedblright", 500, NULL },
- { "amacron", 500, NULL },
- { "sacute", 389, NULL },
- { "imacron", 278, NULL },
- { "cent", 500, NULL },
- { "currency", 500, NULL },
- { "logicalnot", 606, NULL },
- { "zdotaccent", 389, NULL },
- { "Atilde", 667, NULL },
- { "breve", 333, NULL },
- { "bar", 220, NULL },
- { "fraction", 167, NULL },
- { "less", 570, NULL },
- { "ecaron", 444, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 389, NULL },
- { "period", 250, NULL },
- { "Rcaron", 667, NULL },
- { "Kcommaaccent", 667, NULL },
- { "greater", 570, NULL },
- { "atilde", 500, NULL },
- { "brokenbar", 220, NULL },
- { "quoteleft", 333, NULL },
- { "Edotaccent", 667, NULL },
- { "onesuperior", 300, NULL }
-};
-
-static BuiltinFontWidth timesItalicWidthsTab[] = {
- { "Ntilde", 667, NULL },
- { "rcaron", 389, NULL },
- { "kcommaaccent", 444, NULL },
- { "Ncommaaccent", 667, NULL },
- { "Zacute", 556, NULL },
- { "comma", 250, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 675, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 444, NULL },
- { "asciitilde", 541, NULL },
- { "colon", 333, NULL },
- { "onehalf", 750, NULL },
- { "dollar", 500, NULL },
- { "Lcaron", 611, NULL },
- { "ntilde", 500, NULL },
- { "Aogonek", 611, NULL },
- { "ncommaaccent", 500, NULL },
- { "minus", 675, NULL },
- { "Iogonek", 333, NULL },
- { "zacute", 389, NULL },
- { "yen", 500, NULL },
- { "space", 250, NULL },
- { "Omacron", 722, NULL },
- { "questiondown", 500, NULL },
- { "emdash", 889, NULL },
- { "Agrave", 611, NULL },
- { "three", 500, NULL },
- { "numbersign", 500, NULL },
- { "lcaron", 300, NULL },
- { "A", 611, NULL },
- { "B", 611, NULL },
- { "C", 667, NULL },
- { "aogonek", 500, NULL },
- { "D", 722, NULL },
- { "E", 611, NULL },
- { "onequarter", 750, NULL },
- { "F", 611, NULL },
- { "G", 722, NULL },
- { "H", 722, NULL },
- { "I", 333, NULL },
- { "J", 444, NULL },
- { "K", 667, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 556, NULL },
- { "periodcentered", 250, NULL },
- { "M", 833, NULL },
- { "N", 667, NULL },
- { "omacron", 500, NULL },
- { "Tcommaaccent", 556, NULL },
- { "O", 722, NULL },
- { "P", 611, NULL },
- { "Q", 722, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 611, NULL },
- { "Aacute", 611, NULL },
- { "caron", 333, NULL },
- { "S", 500, NULL },
- { "T", 556, NULL },
- { "U", 722, NULL },
- { "agrave", 500, NULL },
- { "V", 611, NULL },
- { "W", 833, NULL },
- { "X", 611, NULL },
- { "question", 500, NULL },
- { "equal", 675, NULL },
- { "Y", 556, NULL },
- { "Z", 556, NULL },
- { "four", 500, NULL },
- { "a", 500, NULL },
- { "Gcommaaccent", 722, NULL },
- { "b", 500, NULL },
- { "c", 444, NULL },
- { "d", 500, NULL },
- { "e", 444, NULL },
- { "f", 278, NULL },
- { "g", 500, NULL },
- { "bullet", 350, NULL },
- { "h", 500, NULL },
- { "i", 278, NULL },
- { "Oslash", 722, NULL },
- { "dagger", 500, NULL },
- { "j", 278, NULL },
- { "k", 444, NULL },
- { "l", 278, NULL },
- { "m", 722, NULL },
- { "n", 500, NULL },
- { "tcommaaccent", 278, NULL },
- { "o", 500, NULL },
- { "ordfeminine", 276, NULL },
- { "ring", 333, NULL },
- { "p", 500, NULL },
- { "q", 500, NULL },
- { "uhungarumlaut", 500, NULL },
- { "r", 389, NULL },
- { "twosuperior", 300, NULL },
- { "aacute", 500, NULL },
- { "s", 389, NULL },
- { "OE", 944, NULL },
- { "t", 278, NULL },
- { "divide", 675, NULL },
- { "u", 500, NULL },
- { "Ccaron", 667, NULL },
- { "v", 444, NULL },
- { "w", 667, NULL },
- { "x", 444, NULL },
- { "y", 444, NULL },
- { "z", 389, NULL },
- { "Gbreve", 722, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 333, NULL },
- { "Nacute", 667, NULL },
- { "quotedbl", 420, NULL },
- { "gcommaaccent", 500, NULL },
- { "mu", 500, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 500, NULL },
- { "Lslash", 556, NULL },
- { "semicolon", 333, NULL },
- { "oslash", 500, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 471, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 444, NULL },
- { "Ecircumflex", 611, NULL },
- { "gbreve", 500, NULL },
- { "trademark", 980, NULL },
- { "daggerdbl", 500, NULL },
- { "nacute", 500, NULL },
- { "macron", 333, NULL },
- { "Otilde", 722, NULL },
- { "Emacron", 611, NULL },
- { "ellipsis", 889, NULL },
- { "scaron", 389, NULL },
- { "AE", 889, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 556, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 214, NULL },
- { "eight", 500, NULL },
- { "exclamdown", 389, NULL },
- { "endash", 500, NULL },
- { "oe", 667, NULL },
- { "Abreve", 611, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 444, NULL },
- { "Adieresis", 611, NULL },
- { "copyright", 760, NULL },
- { "Egrave", 611, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 611, NULL },
- { "otilde", 500, NULL },
- { "Idieresis", 333, NULL },
- { "parenleft", 333, NULL },
- { "one", 500, NULL },
- { "emacron", 444, NULL },
- { "Odieresis", 722, NULL },
- { "ucircumflex", 500, NULL },
- { "bracketleft", 389, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 333, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 556, NULL },
- { "umacron", 500, NULL },
- { "abreve", 500, NULL },
- { "Eacute", 611, NULL },
- { "adieresis", 500, NULL },
- { "egrave", 444, NULL },
- { "edieresis", 444, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 667, NULL },
- { "asterisk", 500, NULL },
- { "odieresis", 500, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 500, NULL },
- { "nine", 500, NULL },
- { "five", 500, NULL },
- { "udieresis", 500, NULL },
- { "Zcaron", 556, NULL },
- { "Scommaaccent", 500, NULL },
- { "threequarters", 750, NULL },
- { "guillemotright", 500, NULL },
- { "Ccedilla", 667, NULL },
- { "ydieresis", 444, NULL },
- { "tilde", 333, NULL },
- { "at", 920, NULL },
- { "eacute", 444, NULL },
- { "underscore", 500, NULL },
- { "Euro", 500, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 675, NULL },
- { "zero", 500, NULL },
- { "eth", 500, NULL },
- { "Scedilla", 500, NULL },
- { "Ograve", 722, NULL },
- { "Racute", 611, NULL },
- { "partialdiff", 476, NULL },
- { "uacute", 500, NULL },
- { "braceleft", 400, NULL },
- { "Thorn", 611, NULL },
- { "zcaron", 389, NULL },
- { "scommaaccent", 389, NULL },
- { "ccedilla", 444, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 500, NULL },
- { "Ocircumflex", 722, NULL },
- { "Oacute", 722, NULL },
- { "scedilla", 389, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 500, NULL },
- { "racute", 389, NULL },
- { "Tcaron", 556, NULL },
- { "Eogonek", 611, NULL },
- { "thorn", 500, NULL },
- { "degree", 400, NULL },
- { "registered", 760, NULL },
- { "radical", 453, NULL },
- { "Aring", 611, NULL },
- { "percent", 833, NULL },
- { "six", 500, NULL },
- { "paragraph", 523, NULL },
- { "dcaron", 544, NULL },
- { "Uogonek", 722, NULL },
- { "two", 500, NULL },
- { "summation", 600, NULL },
- { "Igrave", 333, NULL },
- { "Lacute", 556, NULL },
- { "ocircumflex", 500, NULL },
- { "oacute", 500, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 556, NULL },
- { "tcaron", 300, NULL },
- { "eogonek", 444, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 722, NULL },
- { "asciicircum", 422, NULL },
- { "aring", 500, NULL },
- { "grave", 333, NULL },
- { "uogonek", 500, NULL },
- { "bracketright", 389, NULL },
- { "Iacute", 333, NULL },
- { "ampersand", 778, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 667, NULL },
- { "plus", 675, NULL },
- { "uring", 500, NULL },
- { "quotesinglbase", 333, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 556, NULL },
- { "ohungarumlaut", 500, NULL },
- { "threesuperior", 300, NULL },
- { "acute", 333, NULL },
- { "section", 500, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 556, NULL },
- { "ncaron", 500, NULL },
- { "florin", 500, NULL },
- { "yacute", 444, NULL },
- { "Rcommaaccent", 611, NULL },
- { "fi", 500, NULL },
- { "fl", 500, NULL },
- { "Acircumflex", 611, NULL },
- { "Cacute", 667, NULL },
- { "Icircumflex", 333, NULL },
- { "guillemotleft", 500, NULL },
- { "germandbls", 500, NULL },
- { "Amacron", 611, NULL },
- { "seven", 500, NULL },
- { "Sacute", 500, NULL },
- { "ordmasculine", 310, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 500, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 333, NULL },
- { "rcommaaccent", 389, NULL },
- { "Zdotaccent", 556, NULL },
- { "acircumflex", 500, NULL },
- { "cacute", 444, NULL },
- { "Ecaron", 611, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 400, NULL },
- { "quotedblright", 556, NULL },
- { "amacron", 500, NULL },
- { "sacute", 389, NULL },
- { "imacron", 278, NULL },
- { "cent", 500, NULL },
- { "currency", 500, NULL },
- { "logicalnot", 675, NULL },
- { "zdotaccent", 389, NULL },
- { "Atilde", 611, NULL },
- { "breve", 333, NULL },
- { "bar", 275, NULL },
- { "fraction", 167, NULL },
- { "less", 675, NULL },
- { "ecaron", 444, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 333, NULL },
- { "period", 250, NULL },
- { "Rcaron", 611, NULL },
- { "Kcommaaccent", 667, NULL },
- { "greater", 675, NULL },
- { "atilde", 500, NULL },
- { "brokenbar", 275, NULL },
- { "quoteleft", 333, NULL },
- { "Edotaccent", 611, NULL },
- { "onesuperior", 300, NULL }
-};
-
-static BuiltinFontWidth timesRomanWidthsTab[] = {
- { "Ntilde", 722, NULL },
- { "rcaron", 333, NULL },
- { "kcommaaccent", 500, NULL },
- { "Ncommaaccent", 722, NULL },
- { "Zacute", 611, NULL },
- { "comma", 250, NULL },
- { "cedilla", 333, NULL },
- { "plusminus", 564, NULL },
- { "circumflex", 333, NULL },
- { "dotaccent", 333, NULL },
- { "edotaccent", 444, NULL },
- { "asciitilde", 541, NULL },
- { "colon", 278, NULL },
- { "onehalf", 750, NULL },
- { "dollar", 500, NULL },
- { "Lcaron", 611, NULL },
- { "ntilde", 500, NULL },
- { "Aogonek", 722, NULL },
- { "ncommaaccent", 500, NULL },
- { "minus", 564, NULL },
- { "Iogonek", 333, NULL },
- { "zacute", 444, NULL },
- { "yen", 500, NULL },
- { "space", 250, NULL },
- { "Omacron", 722, NULL },
- { "questiondown", 444, NULL },
- { "emdash", 1000, NULL },
- { "Agrave", 722, NULL },
- { "three", 500, NULL },
- { "numbersign", 500, NULL },
- { "lcaron", 344, NULL },
- { "A", 722, NULL },
- { "B", 667, NULL },
- { "C", 667, NULL },
- { "aogonek", 444, NULL },
- { "D", 722, NULL },
- { "E", 611, NULL },
- { "onequarter", 750, NULL },
- { "F", 556, NULL },
- { "G", 722, NULL },
- { "H", 722, NULL },
- { "I", 333, NULL },
- { "J", 389, NULL },
- { "K", 722, NULL },
- { "iogonek", 278, NULL },
- { "backslash", 278, NULL },
- { "L", 611, NULL },
- { "periodcentered", 250, NULL },
- { "M", 889, NULL },
- { "N", 722, NULL },
- { "omacron", 500, NULL },
- { "Tcommaaccent", 611, NULL },
- { "O", 722, NULL },
- { "P", 556, NULL },
- { "Q", 722, NULL },
- { "Uhungarumlaut", 722, NULL },
- { "R", 667, NULL },
- { "Aacute", 722, NULL },
- { "caron", 333, NULL },
- { "S", 556, NULL },
- { "T", 611, NULL },
- { "U", 722, NULL },
- { "agrave", 444, NULL },
- { "V", 722, NULL },
- { "W", 944, NULL },
- { "X", 722, NULL },
- { "question", 444, NULL },
- { "equal", 564, NULL },
- { "Y", 722, NULL },
- { "Z", 611, NULL },
- { "four", 500, NULL },
- { "a", 444, NULL },
- { "Gcommaaccent", 722, NULL },
- { "b", 500, NULL },
- { "c", 444, NULL },
- { "d", 500, NULL },
- { "e", 444, NULL },
- { "f", 333, NULL },
- { "g", 500, NULL },
- { "bullet", 350, NULL },
- { "h", 500, NULL },
- { "i", 278, NULL },
- { "Oslash", 722, NULL },
- { "dagger", 500, NULL },
- { "j", 278, NULL },
- { "k", 500, NULL },
- { "l", 278, NULL },
- { "m", 778, NULL },
- { "n", 500, NULL },
- { "tcommaaccent", 278, NULL },
- { "o", 500, NULL },
- { "ordfeminine", 276, NULL },
- { "ring", 333, NULL },
- { "p", 500, NULL },
- { "q", 500, NULL },
- { "uhungarumlaut", 500, NULL },
- { "r", 333, NULL },
- { "twosuperior", 300, NULL },
- { "aacute", 444, NULL },
- { "s", 389, NULL },
- { "OE", 889, NULL },
- { "t", 278, NULL },
- { "divide", 564, NULL },
- { "u", 500, NULL },
- { "Ccaron", 667, NULL },
- { "v", 500, NULL },
- { "w", 722, NULL },
- { "x", 500, NULL },
- { "y", 500, NULL },
- { "z", 444, NULL },
- { "Gbreve", 722, NULL },
- { "commaaccent", 250, NULL },
- { "hungarumlaut", 333, NULL },
- { "Idotaccent", 333, NULL },
- { "Nacute", 722, NULL },
- { "quotedbl", 408, NULL },
- { "gcommaaccent", 500, NULL },
- { "mu", 500, NULL },
- { "greaterequal", 549, NULL },
- { "Scaron", 556, NULL },
- { "Lslash", 611, NULL },
- { "semicolon", 278, NULL },
- { "oslash", 500, NULL },
- { "lessequal", 549, NULL },
- { "lozenge", 471, NULL },
- { "parenright", 333, NULL },
- { "ccaron", 444, NULL },
- { "Ecircumflex", 611, NULL },
- { "gbreve", 500, NULL },
- { "trademark", 980, NULL },
- { "daggerdbl", 500, NULL },
- { "nacute", 500, NULL },
- { "macron", 333, NULL },
- { "Otilde", 722, NULL },
- { "Emacron", 611, NULL },
- { "ellipsis", 1000, NULL },
- { "scaron", 389, NULL },
- { "AE", 889, NULL },
- { "Ucircumflex", 722, NULL },
- { "lslash", 278, NULL },
- { "quotedblleft", 444, NULL },
- { "guilsinglright", 333, NULL },
- { "hyphen", 333, NULL },
- { "quotesingle", 180, NULL },
- { "eight", 500, NULL },
- { "exclamdown", 333, NULL },
- { "endash", 500, NULL },
- { "oe", 722, NULL },
- { "Abreve", 722, NULL },
- { "Umacron", 722, NULL },
- { "ecircumflex", 444, NULL },
- { "Adieresis", 722, NULL },
- { "copyright", 760, NULL },
- { "Egrave", 611, NULL },
- { "slash", 278, NULL },
- { "Edieresis", 611, NULL },
- { "otilde", 500, NULL },
- { "Idieresis", 333, NULL },
- { "parenleft", 333, NULL },
- { "one", 500, NULL },
- { "emacron", 444, NULL },
- { "Odieresis", 722, NULL },
- { "ucircumflex", 500, NULL },
- { "bracketleft", 333, NULL },
- { "Ugrave", 722, NULL },
- { "quoteright", 333, NULL },
- { "Udieresis", 722, NULL },
- { "perthousand", 1000, NULL },
- { "Ydieresis", 722, NULL },
- { "umacron", 500, NULL },
- { "abreve", 444, NULL },
- { "Eacute", 611, NULL },
- { "adieresis", 444, NULL },
- { "egrave", 444, NULL },
- { "edieresis", 444, NULL },
- { "idieresis", 278, NULL },
- { "Eth", 722, NULL },
- { "ae", 667, NULL },
- { "asterisk", 500, NULL },
- { "odieresis", 500, NULL },
- { "Uacute", 722, NULL },
- { "ugrave", 500, NULL },
- { "nine", 500, NULL },
- { "five", 500, NULL },
- { "udieresis", 500, NULL },
- { "Zcaron", 611, NULL },
- { "Scommaaccent", 556, NULL },
- { "threequarters", 750, NULL },
- { "guillemotright", 500, NULL },
- { "Ccedilla", 667, NULL },
- { "ydieresis", 500, NULL },
- { "tilde", 333, NULL },
- { "at", 921, NULL },
- { "eacute", 444, NULL },
- { "underscore", 500, NULL },
- { "Euro", 500, NULL },
- { "Dcroat", 722, NULL },
- { "multiply", 564, NULL },
- { "zero", 500, NULL },
- { "eth", 500, NULL },
- { "Scedilla", 556, NULL },
- { "Ograve", 722, NULL },
- { "Racute", 667, NULL },
- { "partialdiff", 476, NULL },
- { "uacute", 500, NULL },
- { "braceleft", 480, NULL },
- { "Thorn", 556, NULL },
- { "zcaron", 444, NULL },
- { "scommaaccent", 389, NULL },
- { "ccedilla", 444, NULL },
- { "Dcaron", 722, NULL },
- { "dcroat", 500, NULL },
- { "Ocircumflex", 722, NULL },
- { "Oacute", 722, NULL },
- { "scedilla", 389, NULL },
- { "ogonek", 333, NULL },
- { "ograve", 500, NULL },
- { "racute", 333, NULL },
- { "Tcaron", 611, NULL },
- { "Eogonek", 611, NULL },
- { "thorn", 500, NULL },
- { "degree", 400, NULL },
- { "registered", 760, NULL },
- { "radical", 453, NULL },
- { "Aring", 722, NULL },
- { "percent", 833, NULL },
- { "six", 500, NULL },
- { "paragraph", 453, NULL },
- { "dcaron", 588, NULL },
- { "Uogonek", 722, NULL },
- { "two", 500, NULL },
- { "summation", 600, NULL },
- { "Igrave", 333, NULL },
- { "Lacute", 611, NULL },
- { "ocircumflex", 500, NULL },
- { "oacute", 500, NULL },
- { "Uring", 722, NULL },
- { "Lcommaaccent", 611, NULL },
- { "tcaron", 326, NULL },
- { "eogonek", 444, NULL },
- { "Delta", 612, NULL },
- { "Ohungarumlaut", 722, NULL },
- { "asciicircum", 469, NULL },
- { "aring", 444, NULL },
- { "grave", 333, NULL },
- { "uogonek", 500, NULL },
- { "bracketright", 333, NULL },
- { "Iacute", 333, NULL },
- { "ampersand", 778, NULL },
- { "igrave", 278, NULL },
- { "lacute", 278, NULL },
- { "Ncaron", 722, NULL },
- { "plus", 564, NULL },
- { "uring", 500, NULL },
- { "quotesinglbase", 333, NULL },
- { "lcommaaccent", 278, NULL },
- { "Yacute", 722, NULL },
- { "ohungarumlaut", 500, NULL },
- { "threesuperior", 300, NULL },
- { "acute", 333, NULL },
- { "section", 500, NULL },
- { "dieresis", 333, NULL },
- { "iacute", 278, NULL },
- { "quotedblbase", 444, NULL },
- { "ncaron", 500, NULL },
- { "florin", 500, NULL },
- { "yacute", 500, NULL },
- { "Rcommaaccent", 667, NULL },
- { "fi", 556, NULL },
- { "fl", 556, NULL },
- { "Acircumflex", 722, NULL },
- { "Cacute", 667, NULL },
- { "Icircumflex", 333, NULL },
- { "guillemotleft", 500, NULL },
- { "germandbls", 500, NULL },
- { "Amacron", 722, NULL },
- { "seven", 500, NULL },
- { "Sacute", 556, NULL },
- { "ordmasculine", 310, NULL },
- { "dotlessi", 278, NULL },
- { "sterling", 500, NULL },
- { "notequal", 549, NULL },
- { "Imacron", 333, NULL },
- { "rcommaaccent", 333, NULL },
- { "Zdotaccent", 611, NULL },
- { "acircumflex", 444, NULL },
- { "cacute", 444, NULL },
- { "Ecaron", 611, NULL },
- { "icircumflex", 278, NULL },
- { "braceright", 480, NULL },
- { "quotedblright", 444, NULL },
- { "amacron", 444, NULL },
- { "sacute", 389, NULL },
- { "imacron", 278, NULL },
- { "cent", 500, NULL },
- { "currency", 500, NULL },
- { "logicalnot", 564, NULL },
- { "zdotaccent", 444, NULL },
- { "Atilde", 722, NULL },
- { "breve", 333, NULL },
- { "bar", 200, NULL },
- { "fraction", 167, NULL },
- { "less", 564, NULL },
- { "ecaron", 444, NULL },
- { "guilsinglleft", 333, NULL },
- { "exclam", 333, NULL },
- { "period", 250, NULL },
- { "Rcaron", 667, NULL },
- { "Kcommaaccent", 722, NULL },
- { "greater", 564, NULL },
- { "atilde", 444, NULL },
- { "brokenbar", 200, NULL },
- { "quoteleft", 333, NULL },
- { "Edotaccent", 611, NULL },
- { "onesuperior", 300, NULL }
-};
-
-static BuiltinFontWidth zapfDingbatsWidthsTab[] = {
- { "a81", 438, NULL },
- { "a82", 138, NULL },
- { "a83", 277, NULL },
- { "a84", 415, NULL },
- { "a85", 509, NULL },
- { "a86", 410, NULL },
- { "a87", 234, NULL },
- { "a88", 234, NULL },
- { "a89", 390, NULL },
- { "a140", 788, NULL },
- { "a141", 788, NULL },
- { "a142", 788, NULL },
- { "a143", 788, NULL },
- { "a144", 788, NULL },
- { "a145", 788, NULL },
- { "a146", 788, NULL },
- { "a147", 788, NULL },
- { "a148", 788, NULL },
- { "a149", 788, NULL },
- { "a90", 390, NULL },
- { "a91", 276, NULL },
- { "a92", 276, NULL },
- { "space", 278, NULL },
- { "a93", 317, NULL },
- { "a94", 317, NULL },
- { "a95", 334, NULL },
- { "a96", 334, NULL },
- { "a97", 392, NULL },
- { "a98", 392, NULL },
- { "a99", 668, NULL },
- { "a150", 788, NULL },
- { "a151", 788, NULL },
- { "a152", 788, NULL },
- { "a153", 788, NULL },
- { "a154", 788, NULL },
- { "a155", 788, NULL },
- { "a156", 788, NULL },
- { "a157", 788, NULL },
- { "a158", 788, NULL },
- { "a159", 788, NULL },
- { "a160", 894, NULL },
- { "a161", 838, NULL },
- { "a162", 924, NULL },
- { "a163", 1016, NULL },
- { "a164", 458, NULL },
- { "a165", 924, NULL },
- { "a166", 918, NULL },
- { "a167", 927, NULL },
- { "a168", 928, NULL },
- { "a169", 928, NULL },
- { "a170", 834, NULL },
- { "a171", 873, NULL },
- { "a172", 828, NULL },
- { "a173", 924, NULL },
- { "a174", 917, NULL },
- { "a175", 930, NULL },
- { "a176", 931, NULL },
- { "a177", 463, NULL },
- { "a178", 883, NULL },
- { "a179", 836, NULL },
- { "a180", 867, NULL },
- { "a181", 696, NULL },
- { "a182", 874, NULL },
- { "a183", 760, NULL },
- { "a184", 946, NULL },
- { "a185", 865, NULL },
- { "a186", 967, NULL },
- { "a187", 831, NULL },
- { "a188", 873, NULL },
- { "a189", 927, NULL },
- { "a1", 974, NULL },
- { "a2", 961, NULL },
- { "a3", 980, NULL },
- { "a4", 719, NULL },
- { "a5", 789, NULL },
- { "a6", 494, NULL },
- { "a7", 552, NULL },
- { "a8", 537, NULL },
- { "a9", 577, NULL },
- { "a190", 970, NULL },
- { "a191", 918, NULL },
- { "a192", 748, NULL },
- { "a193", 836, NULL },
- { "a194", 771, NULL },
- { "a195", 888, NULL },
- { "a196", 748, NULL },
- { "a197", 771, NULL },
- { "a198", 888, NULL },
- { "a199", 867, NULL },
- { "a10", 692, NULL },
- { "a11", 960, NULL },
- { "a12", 939, NULL },
- { "a13", 549, NULL },
- { "a14", 855, NULL },
- { "a15", 911, NULL },
- { "a16", 933, NULL },
- { "a17", 945, NULL },
- { "a18", 974, NULL },
- { "a19", 755, NULL },
- { "a20", 846, NULL },
- { "a21", 762, NULL },
- { "a22", 761, NULL },
- { "a23", 571, NULL },
- { "a24", 677, NULL },
- { "a25", 763, NULL },
- { "a26", 760, NULL },
- { "a27", 759, NULL },
- { "a28", 754, NULL },
- { "a29", 786, NULL },
- { "a30", 788, NULL },
- { "a31", 788, NULL },
- { "a32", 790, NULL },
- { "a33", 793, NULL },
- { "a34", 794, NULL },
- { "a35", 816, NULL },
- { "a36", 823, NULL },
- { "a37", 789, NULL },
- { "a38", 841, NULL },
- { "a39", 823, NULL },
- { "a40", 833, NULL },
- { "a41", 816, NULL },
- { "a42", 831, NULL },
- { "a43", 923, NULL },
- { "a44", 744, NULL },
- { "a45", 723, NULL },
- { "a46", 749, NULL },
- { "a47", 790, NULL },
- { "a48", 792, NULL },
- { "a49", 695, NULL },
- { "a100", 668, NULL },
- { "a101", 732, NULL },
- { "a102", 544, NULL },
- { "a103", 544, NULL },
- { "a104", 910, NULL },
- { "a105", 911, NULL },
- { "a106", 667, NULL },
- { "a107", 760, NULL },
- { "a108", 760, NULL },
- { "a109", 626, NULL },
- { "a50", 776, NULL },
- { "a51", 768, NULL },
- { "a52", 792, NULL },
- { "a53", 759, NULL },
- { "a54", 707, NULL },
- { "a55", 708, NULL },
- { "a56", 682, NULL },
- { "a57", 701, NULL },
- { "a58", 826, NULL },
- { "a59", 815, NULL },
- { "a110", 694, NULL },
- { "a111", 595, NULL },
- { "a112", 776, NULL },
- { "a117", 690, NULL },
- { "a118", 791, NULL },
- { "a119", 790, NULL },
- { "a60", 789, NULL },
- { "a61", 789, NULL },
- { "a62", 707, NULL },
- { "a63", 687, NULL },
- { "a64", 696, NULL },
- { "a65", 689, NULL },
- { "a66", 786, NULL },
- { "a67", 787, NULL },
- { "a68", 713, NULL },
- { "a69", 791, NULL },
- { "a200", 696, NULL },
- { "a201", 874, NULL },
- { "a120", 788, NULL },
- { "a121", 788, NULL },
- { "a202", 974, NULL },
- { "a122", 788, NULL },
- { "a203", 762, NULL },
- { "a123", 788, NULL },
- { "a204", 759, NULL },
- { "a124", 788, NULL },
- { "a205", 509, NULL },
- { "a125", 788, NULL },
- { "a206", 410, NULL },
- { "a126", 788, NULL },
- { "a127", 788, NULL },
- { "a128", 788, NULL },
- { "a129", 788, NULL },
- { "a70", 785, NULL },
- { "a71", 791, NULL },
- { "a72", 873, NULL },
- { "a73", 761, NULL },
- { "a74", 762, NULL },
- { "a75", 759, NULL },
- { "a76", 892, NULL },
- { "a77", 892, NULL },
- { "a78", 788, NULL },
- { "a79", 784, NULL },
- { "a130", 788, NULL },
- { "a131", 788, NULL },
- { "a132", 788, NULL },
- { "a133", 788, NULL },
- { "a134", 788, NULL },
- { "a135", 788, NULL },
- { "a136", 788, NULL },
- { "a137", 788, NULL },
- { "a138", 788, NULL },
- { "a139", 788, NULL }
-};
-
-BuiltinFont builtinFonts[] = {
- { "Courier", standardEncoding, 629, -157, { -23, -250, 715, 805}, NULL },
- { "Courier-Bold", standardEncoding, 629, -157, {-113, -250, 749, 801}, NULL },
- { "Courier-BoldOblique", standardEncoding, 629, -157, { -57, -250, 869, 801}, NULL },
- { "Courier-Oblique", standardEncoding, 629, -157, { -27, -250, 849, 805}, NULL },
- { "Helvetica", standardEncoding, 718, -207, {-166, -225, 1000, 931}, NULL },
- { "Helvetica-Bold", standardEncoding, 718, -207, {-170, -228, 1003, 962}, NULL },
- { "Helvetica-BoldOblique", standardEncoding, 718, -207, {-174, -228, 1114, 962}, NULL },
- { "Helvetica-Oblique", standardEncoding, 718, -207, {-170, -225, 1116, 931}, NULL },
- { "Symbol", symbolEncoding, 1010, -293, {-180, -293, 1090, 1010}, NULL },
- { "Times-Bold", standardEncoding, 683, -217, {-168, -218, 1000, 935}, NULL },
- { "Times-BoldItalic", standardEncoding, 683, -217, {-200, -218, 996, 921}, NULL },
- { "Times-Italic", standardEncoding, 683, -217, {-169, -217, 1010, 883}, NULL },
- { "Times-Roman", standardEncoding, 683, -217, {-168, -218, 1000, 898}, NULL },
- { "ZapfDingbats", zapfDingbatsEncoding, 820, -143, { -1, -143, 981, 820}, NULL }
-};
-
-BuiltinFont *builtinFontSubst[] = {
- &builtinFonts[0],
- &builtinFonts[3],
- &builtinFonts[1],
- &builtinFonts[2],
- &builtinFonts[4],
- &builtinFonts[7],
- &builtinFonts[5],
- &builtinFonts[6],
- &builtinFonts[12],
- &builtinFonts[11],
- &builtinFonts[9],
- &builtinFonts[10]
-};
-
-void initBuiltinFontTables() {
- builtinFonts[0].widths = new BuiltinFontWidths(courierWidthsTab, 315);
- builtinFonts[1].widths = new BuiltinFontWidths(courierBoldWidthsTab, 315);
- builtinFonts[2].widths = new BuiltinFontWidths(courierBoldObliqueWidthsTab, 315);
- builtinFonts[3].widths = new BuiltinFontWidths(courierObliqueWidthsTab, 315);
- builtinFonts[4].widths = new BuiltinFontWidths(helveticaWidthsTab, 315);
- builtinFonts[5].widths = new BuiltinFontWidths(helveticaBoldWidthsTab, 316);
- builtinFonts[6].widths = new BuiltinFontWidths(helveticaBoldObliqueWidthsTab, 315);
- builtinFonts[7].widths = new BuiltinFontWidths(helveticaObliqueWidthsTab, 315);
- builtinFonts[8].widths = new BuiltinFontWidths(symbolWidthsTab, 190);
- builtinFonts[9].widths = new BuiltinFontWidths(timesBoldWidthsTab, 315);
- builtinFonts[10].widths = new BuiltinFontWidths(timesBoldItalicWidthsTab, 315);
- builtinFonts[11].widths = new BuiltinFontWidths(timesItalicWidthsTab, 315);
- builtinFonts[12].widths = new BuiltinFontWidths(timesRomanWidthsTab, 315);
- builtinFonts[13].widths = new BuiltinFontWidths(zapfDingbatsWidthsTab, 202);
-}
-
-void freeBuiltinFontTables() {
- int i;
-
- for (i = 0; i < 14; ++i) {
- delete builtinFonts[i].widths;
- }
-}
diff --git a/pdf/xpdf/BuiltinFontTables.h b/pdf/xpdf/BuiltinFontTables.h
deleted file mode 100644
index eb45549..0000000
--- a/pdf/xpdf/BuiltinFontTables.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//========================================================================
-//
-// BuiltinFontTables.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef BUILTINFONTTABLES_H
-#define BUILTINFONTTABLES_H
-
-#include "BuiltinFont.h"
-
-#define nBuiltinFonts 14
-#define nBuiltinFontSubsts 12
-
-extern BuiltinFont builtinFonts[nBuiltinFonts];
-extern BuiltinFont *builtinFontSubst[nBuiltinFontSubsts];
-
-extern void initBuiltinFontTables();
-extern void freeBuiltinFontTables();
-
-#endif
diff --git a/pdf/xpdf/CMap.cc b/pdf/xpdf/CMap.cc
deleted file mode 100644
index 25f3af7..0000000
--- a/pdf/xpdf/CMap.cc
+++ /dev/null
@@ -1,384 +0,0 @@
-//========================================================================
-//
-// CMap.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include "gmem.h"
-#include "gfile.h"
-#include "GString.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "PSTokenizer.h"
-#include "CMap.h"
-
-//------------------------------------------------------------------------
-
-struct CMapVectorEntry {
- GBool isVector;
- union {
- CMapVectorEntry *vector;
- CID cid;
- };
-};
-
-//------------------------------------------------------------------------
-
-static int getCharFromFile(void *data) {
- return fgetc((FILE *)data);
-}
-
-//------------------------------------------------------------------------
-
-CMap *CMap::parse(CMapCache *cache, GString *collectionA,
- GString *cMapNameA) {
- FILE *f;
- CMap *cmap;
- PSTokenizer *pst;
- char tok1[256], tok2[256], tok3[256];
- int n1, n2, n3;
- Guint start, end;
-
- if (!(f = globalParams->findCMapFile(collectionA, cMapNameA))) {
-
- // Check for an identity CMap.
- if (!cMapNameA->cmp("Identity") || !cMapNameA->cmp("Identity-H")) {
- return new CMap(collectionA->copy(), cMapNameA->copy(), 0);
- }
- if (!cMapNameA->cmp("Identity-V")) {
- return new CMap(collectionA->copy(), cMapNameA->copy(), 1);
- }
-
- error(-1, "Couldn't find '%s' CMap file for '%s' collection",
- cMapNameA->getCString(), collectionA->getCString());
- return NULL;
- }
-
- cmap = new CMap(collectionA->copy(), cMapNameA->copy());
-
- pst = new PSTokenizer(&getCharFromFile, f);
- pst->getToken(tok1, sizeof(tok1), &n1);
- while (pst->getToken(tok2, sizeof(tok2), &n2)) {
- if (!strcmp(tok2, "usecmap")) {
- if (tok1[0] == '/') {
- cmap->useCMap(cache, tok1 + 1);
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else if (!strcmp(tok1, "/WMode")) {
- cmap->wMode = atoi(tok2);
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else if (!strcmp(tok2, "begincodespacerange")) {
- while (pst->getToken(tok1, sizeof(tok1), &n1)) {
- if (!strcmp(tok1, "endcodespacerange")) {
- break;
- }
- if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
- !strcmp(tok2, "endcodespacerange")) {
- error(-1, "Illegal entry in codespacerange block in CMap");
- break;
- }
- if (tok1[0] == '<' && tok2[0] == '<' &&
- n1 == n2 && n1 >= 4 && (n1 & 1) == 0) {
- tok1[n1 - 1] = tok2[n1 - 1] = '\0';
- sscanf(tok1 + 1, "%x", &start);
- sscanf(tok2 + 1, "%x", &end);
- n1 = (n1 - 2) / 2;
- cmap->addCodeSpace(cmap->vector, start, end, n1);
- }
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else if (!strcmp(tok2, "begincidrange")) {
- while (pst->getToken(tok1, sizeof(tok1), &n1)) {
- if (!strcmp(tok1, "endcidrange")) {
- break;
- }
- if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
- !strcmp(tok2, "endcidrange") ||
- !pst->getToken(tok3, sizeof(tok3), &n3) ||
- !strcmp(tok3, "endcidrange")) {
- error(-1, "Illegal entry in cidrange block in CMap");
- break;
- }
- if (tok1[0] == '<' && tok2[0] == '<' &&
- n1 == n2 && n1 >= 4 && (n1 & 1) == 0) {
- tok1[n1 - 1] = tok2[n1 - 1] = '\0';
- sscanf(tok1 + 1, "%x", &start);
- sscanf(tok2 + 1, "%x", &end);
- n1 = (n1 - 2) / 2;
- cmap->addCIDs(start, end, n1, (CID)atoi(tok3));
- }
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else {
- strcpy(tok1, tok2);
- }
- }
- delete pst;
-
- fclose(f);
-
- return cmap;
-}
-
-CMap::CMap(GString *collectionA, GString *cMapNameA) {
- int i;
-
- collection = collectionA;
- cMapName = cMapNameA;
- wMode = 0;
- vector = (CMapVectorEntry *)gmalloc(256 * sizeof(CMapVectorEntry));
- for (i = 0; i < 256; ++i) {
- vector[i].isVector = gFalse;
- vector[i].cid = 0;
- }
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-CMap::CMap(GString *collectionA, GString *cMapNameA, int wModeA) {
- collection = collectionA;
- cMapName = cMapNameA;
- wMode = wModeA;
- vector = NULL;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-void CMap::useCMap(CMapCache *cache, char *useName) {
- GString *useNameStr;
- CMap *subCMap;
-
- useNameStr = new GString(useName);
- subCMap = cache->getCMap(collection, useNameStr);
- delete useNameStr;
- if (!subCMap) {
- return;
- }
- copyVector(vector, subCMap->vector);
- subCMap->decRefCnt();
-}
-
-void CMap::copyVector(CMapVectorEntry *dest, CMapVectorEntry *src) {
- int i, j;
-
- for (i = 0; i < 256; ++i) {
- if (src[i].isVector) {
- if (!dest[i].isVector) {
- dest[i].isVector = gTrue;
- dest[i].vector =
- (CMapVectorEntry *)gmalloc(256 * sizeof(CMapVectorEntry));
- for (j = 0; j < 256; ++j) {
- dest[i].vector[j].isVector = gFalse;
- dest[i].vector[j].cid = 0;
- }
- }
- copyVector(dest[i].vector, src[i].vector);
- } else {
- if (dest[i].isVector) {
- error(-1, "Collision in usecmap");
- } else {
- dest[i].cid = src[i].cid;
- }
- }
- }
-}
-
-void CMap::addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end,
- Guint nBytes) {
- Guint start2, end2;
- int startByte, endByte, i, j;
-
- if (nBytes > 1) {
- startByte = (start >> (8 * (nBytes - 1))) & 0xff;
- endByte = (end >> (8 * (nBytes - 1))) & 0xff;
- start2 = start & ((1 << (8 * (nBytes - 1))) - 1);
- end2 = end & ((1 << (8 * (nBytes - 1))) - 1);
- for (i = startByte; i <= endByte; ++i) {
- if (!vec[i].isVector) {
- vec[i].isVector = gTrue;
- vec[i].vector =
- (CMapVectorEntry *)gmalloc(256 * sizeof(CMapVectorEntry));
- for (j = 0; j < 256; ++j) {
- vec[i].vector[j].isVector = gFalse;
- vec[i].vector[j].cid = 0;
- }
- }
- addCodeSpace(vec[i].vector, start2, end2, nBytes - 1);
- }
- }
-}
-
-void CMap::addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID) {
- CMapVectorEntry *vec;
- CID cid;
- int byte;
- Guint i;
-
- vec = vector;
- for (i = nBytes - 1; i >= 1; --i) {
- byte = (start >> (8 * i)) & 0xff;
- if (!vec[byte].isVector) {
- error(-1, "Invalid CID (%*x - %*x) in CMap",
- 2*nBytes, start, 2*nBytes, end);
- return;
- }
- vec = vec[byte].vector;
- }
- cid = firstCID;
- for (byte = (int)(start & 0xff); byte <= (int)(end & 0xff); ++byte) {
- if (vec[byte].isVector) {
- error(-1, "Invalid CID (%*x - %*x) in CMap",
- 2*nBytes, start, 2*nBytes, end);
- } else {
- vec[byte].cid = cid;
- }
- ++cid;
- }
-}
-
-CMap::~CMap() {
- delete collection;
- delete cMapName;
- if (vector) {
- freeCMapVector(vector);
- }
-#if MULTITHREADED
- gDestroyMutex(&mutex);
-#endif
-}
-
-void CMap::freeCMapVector(CMapVectorEntry *vec) {
- int i;
-
- for (i = 0; i < 256; ++i) {
- if (vec[i].isVector) {
- freeCMapVector(vec[i].vector);
- }
- }
- gfree(vec);
-}
-
-void CMap::incRefCnt() {
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- ++refCnt;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
-}
-
-void CMap::decRefCnt() {
- GBool done;
-
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- done = --refCnt == 0;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
- if (done) {
- delete this;
- }
-}
-
-GBool CMap::match(GString *collectionA, GString *cMapNameA) {
- return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA);
-}
-
-CID CMap::getCID(char *s, int len, int *nUsed) {
- CMapVectorEntry *vec;
- int n, i;
-
- if (!(vec = vector)) {
- // identity CMap
- *nUsed = 2;
- if (len < 2) {
- return 0;
- }
- return ((s[0] & 0xff) << 8) + (s[1] & 0xff);
- }
- n = 0;
- while (1) {
- if (n >= len) {
- *nUsed = n;
- return 0;
- }
- i = s[n++] & 0xff;
- if (!vec[i].isVector) {
- *nUsed = n;
- return vec[i].cid;
- }
- vec = vec[i].vector;
- }
-}
-
-//------------------------------------------------------------------------
-
-CMapCache::CMapCache() {
- int i;
-
- for (i = 0; i < cMapCacheSize; ++i) {
- cache[i] = NULL;
- }
-}
-
-CMapCache::~CMapCache() {
- int i;
-
- for (i = 0; i < cMapCacheSize; ++i) {
- if (cache[i]) {
- cache[i]->decRefCnt();
- }
- }
-}
-
-CMap *CMapCache::getCMap(GString *collection, GString *cMapName) {
- CMap *cmap;
- int i, j;
-
- if (cache[0] && cache[0]->match(collection, cMapName)) {
- cache[0]->incRefCnt();
- return cache[0];
- }
- for (i = 1; i < cMapCacheSize; ++i) {
- if (cache[i] && cache[i]->match(collection, cMapName)) {
- cmap = cache[i];
- for (j = i; j >= 1; --j) {
- cache[j] = cache[j - 1];
- }
- cache[0] = cmap;
- cmap->incRefCnt();
- return cmap;
- }
- }
- if ((cmap = CMap::parse(this, collection, cMapName))) {
- if (cache[cMapCacheSize - 1]) {
- cache[cMapCacheSize - 1]->decRefCnt();
- }
- for (j = cMapCacheSize - 1; j >= 1; --j) {
- cache[j] = cache[j - 1];
- }
- cache[0] = cmap;
- cmap->incRefCnt();
- return cmap;
- }
- return NULL;
-}
diff --git a/pdf/xpdf/CMap.h b/pdf/xpdf/CMap.h
deleted file mode 100644
index eff2a81..0000000
--- a/pdf/xpdf/CMap.h
+++ /dev/null
@@ -1,102 +0,0 @@
-//========================================================================
-//
-// CMap.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef CMAP_H
-#define CMAP_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "CharTypes.h"
-
-#if MULTITHREADED
-#include "GMutex.h"
-#endif
-
-class GString;
-struct CMapVectorEntry;
-class CMapCache;
-
-//------------------------------------------------------------------------
-
-class CMap {
-public:
-
- // Create the CMap specified by <collection> and <cMapName>. Sets
- // the initial reference count to 1. Returns NULL on failure.
- static CMap *parse(CMapCache *cache, GString *collectionA,
- GString *cMapNameA);
-
- ~CMap();
-
- void incRefCnt();
- void decRefCnt();
-
- // Return collection name (<registry>-<ordering>).
- GString *getCollection() { return collection; }
-
- // Return true if this CMap matches the specified <collectionA>, and
- // <cMapNameA>.
- GBool match(GString *collectionA, GString *cMapNameA);
-
- // Return the CID corresponding to the character code starting at
- // <s>, which contains <len> bytes. Sets *<nUsed> to the number of
- // bytes used by the char code.
- CID getCID(char *s, int len, int *nUsed);
-
- // Return the writing mode (0=horizontal, 1=vertical).
- int getWMode() { return wMode; }
-
-private:
-
- CMap(GString *collectionA, GString *cMapNameA);
- CMap(GString *collectionA, GString *cMapNameA, int wModeA);
- void useCMap(CMapCache *cache, char *useName);
- void copyVector(CMapVectorEntry *dest, CMapVectorEntry *src);
- void addCodeSpace(CMapVectorEntry *vec, Guint start, Guint end,
- Guint nBytes);
- void addCIDs(Guint start, Guint end, Guint nBytes, CID firstCID);
- void freeCMapVector(CMapVectorEntry *vec);
-
- GString *collection;
- GString *cMapName;
- int wMode; // writing mode (0=horizontal, 1=vertical)
- CMapVectorEntry *vector; // vector for first byte (NULL for
- // identity CMap)
- int refCnt;
-#ifdef MULTITHREADED
- GMutex mutex;
-#endif
-};
-
-//------------------------------------------------------------------------
-
-#define cMapCacheSize 4
-
-class CMapCache {
-public:
-
- CMapCache();
- ~CMapCache();
-
- // Get the <cMapName> CMap for the specified character collection.
- // Increments its reference count; there will be one reference for
- // the cache plus one for the caller of this function. Returns NULL
- // on failure.
- CMap *getCMap(GString *collection, GString *cMapName);
-
-private:
-
- CMap *cache[cMapCacheSize];
-};
-
-#endif
diff --git a/pdf/xpdf/Catalog.cc b/pdf/xpdf/Catalog.cc
deleted file mode 100644
index 787a496..0000000
--- a/pdf/xpdf/Catalog.cc
+++ /dev/null
@@ -1,364 +0,0 @@
-//========================================================================
-//
-// Catalog.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include "gmem.h"
-#include "Object.h"
-#include "XRef.h"
-#include "Array.h"
-#include "Dict.h"
-#include "Page.h"
-#include "Error.h"
-#include "Link.h"
-#include "Catalog.h"
-
-//------------------------------------------------------------------------
-// Catalog
-//------------------------------------------------------------------------
-
-Catalog::Catalog(XRef *xrefA) {
- Object catDict, pagesDict;
- Object obj, obj2;
- int numPages0;
- int i;
-
- ok = gTrue;
- xref = xrefA;
- pages = NULL;
- pageRefs = NULL;
- numPages = pagesSize = 0;
- baseURI = NULL;
-
- xref->getCatalog(&catDict);
- if (!catDict.isDict()) {
- error(-1, "Catalog object is wrong type (%s)", catDict.getTypeName());
- goto err1;
- }
-
- // read page tree
- catDict.dictLookup("Pages", &pagesDict);
- // This should really be isDict("Pages"), but I've seen at least one
- // PDF file where the /Type entry is missing.
- if (!pagesDict.isDict()) {
- error(-1, "Top-level pages object is wrong type (%s)",
- pagesDict.getTypeName());
- goto err2;
- }
- pagesDict.dictLookup("Count", &obj);
- // some PDF files actually use real numbers here ("/Count 9.0")
- if (!obj.isNum()) {
- error(-1, "Page count in top-level pages object is wrong type (%s)",
- obj.getTypeName());
- goto err3;
- }
- pagesSize = numPages0 = (int)obj.getNum();
- obj.free();
- // The gcc doesnt optimize this away, so this check is ok,
- // even if it looks like a pagesSize != pagesSize check
- if (pagesSize*(int)sizeof(Page *)/sizeof(Page *) != pagesSize ||
- pagesSize*(int)sizeof(Ref)/sizeof(Ref) != pagesSize) {
- error(-1, "Invalid 'pagesSize'");
- ok = gFalse;
- return;
- }
-
- pages = (Page **)gmalloc(pagesSize * sizeof(Page *));
- pageRefs = (Ref *)gmalloc(pagesSize * sizeof(Ref));
- for (i = 0; i < pagesSize; ++i) {
- pages[i] = NULL;
- pageRefs[i].num = -1;
- pageRefs[i].gen = -1;
- }
- numPages = readPageTree(pagesDict.getDict(), NULL, 0);
- if (numPages != numPages0) {
- error(-1, "Page count in top-level pages object is incorrect");
- }
- pagesDict.free();
-
- // read named destination dictionary
- catDict.dictLookup("Dests", &dests);
-
- // read root of named destination tree
- if (catDict.dictLookup("Names", &obj)->isDict())
- obj.dictLookup("Dests", &nameTree);
- else
- nameTree.initNull();
- obj.free();
-
- // read base URI
- if (catDict.dictLookup("URI", &obj)->isDict()) {
- if (obj.dictLookup("Base", &obj2)->isString()) {
- baseURI = obj2.getString()->copy();
- }
- obj2.free();
- }
- obj.free();
-
- // get the metadata stream
- catDict.dictLookup("Metadata", &metadata);
-
- // get the structure tree root
- catDict.dictLookup("StructTreeRoot", &structTreeRoot);
-
- // get the outline dictionary
- catDict.dictLookup("Outlines", &outline);
-
- catDict.free();
- return;
-
- err3:
- obj.free();
- err2:
- pagesDict.free();
- err1:
- catDict.free();
- dests.initNull();
- nameTree.initNull();
- ok = gFalse;
-}
-
-Catalog::~Catalog() {
- int i;
-
- if (pages) {
- for (i = 0; i < pagesSize; ++i) {
- if (pages[i]) {
- delete pages[i];
- }
- }
- gfree(pages);
- gfree(pageRefs);
- }
- dests.free();
- nameTree.free();
- if (baseURI) {
- delete baseURI;
- }
- metadata.free();
- structTreeRoot.free();
- outline.free();
-}
-
-GString *Catalog::readMetadata() {
- GString *s;
- Dict *dict;
- Object obj;
- int c;
-
- if (!metadata.isStream()) {
- return NULL;
- }
- dict = metadata.streamGetDict();
- if (!dict->lookup("Subtype", &obj)->isName("XML")) {
- error(-1, "Unknown Metadata type: '%s'",
- obj.isName() ? obj.getName() : "???");
- }
- obj.free();
- s = new GString();
- metadata.streamReset();
- while ((c = metadata.streamGetChar()) != EOF) {
- s->append(c);
- }
- metadata.streamClose();
- return s;
-}
-
-int Catalog::readPageTree(Dict *pagesDict, PageAttrs *attrs, int start) {
- Object kids;
- Object kid;
- Object kidRef;
- PageAttrs *attrs1, *attrs2;
- Page *page;
- int i, j;
-
- attrs1 = new PageAttrs(attrs, pagesDict);
- pagesDict->lookup("Kids", &kids);
- if (!kids.isArray()) {
- error(-1, "Kids object (page %d) is wrong type (%s)",
- start+1, kids.getTypeName());
- goto err1;
- }
- for (i = 0; i < kids.arrayGetLength(); ++i) {
- kids.arrayGet(i, &kid);
- if (kid.isDict("Page")) {
- attrs2 = new PageAttrs(attrs1, kid.getDict());
- page = new Page(xref, start+1, kid.getDict(), attrs2);
- if (!page->isOk()) {
- ++start;
- goto err3;
- }
- if (start >= pagesSize) {
- pagesSize += 32;
- if (pagesSize*(int)sizeof(Page *)/sizeof(Page *) != pagesSize ||
- pagesSize*(int)sizeof(Ref)/sizeof(Ref) != pagesSize) {
- error(-1, "Invalid 'pagesSize' parameter.");
- goto err3;
- }
- pages = (Page **)grealloc(pages, pagesSize * sizeof(Page *));
- pageRefs = (Ref *)grealloc(pageRefs, pagesSize * sizeof(Ref));
- for (j = pagesSize - 32; j < pagesSize; ++j) {
- pages[j] = NULL;
- pageRefs[j].num = -1;
- pageRefs[j].gen = -1;
- }
- }
- pages[start] = page;
- kids.arrayGetNF(i, &kidRef);
- if (kidRef.isRef()) {
- pageRefs[start].num = kidRef.getRefNum();
- pageRefs[start].gen = kidRef.getRefGen();
- }
- kidRef.free();
- ++start;
- // This should really be isDict("Pages"), but I've seen at least one
- // PDF file where the /Type entry is missing.
- } else if (kid.isDict()) {
- if ((start = readPageTree(kid.getDict(), attrs1, start))
- < 0)
- goto err2;
- } else {
- error(-1, "Kid object (page %d) is wrong type (%s)",
- start+1, kid.getTypeName());
- goto err2;
- }
- kid.free();
- }
- delete attrs1;
- kids.free();
- return start;
-
- err3:
- delete page;
- err2:
- kid.free();
- err1:
- kids.free();
- delete attrs1;
- ok = gFalse;
- return -1;
-}
-
-int Catalog::findPage(int num, int gen) {
- int i;
-
- for (i = 0; i < numPages; ++i) {
- if (pageRefs[i].num == num && pageRefs[i].gen == gen)
- return i + 1;
- }
- return 0;
-}
-
-LinkDest *Catalog::findDest(GString *name) {
- LinkDest *dest;
- Object obj1, obj2;
- GBool found;
-
- // try named destination dictionary then name tree
- found = gFalse;
- if (dests.isDict()) {
- if (!dests.dictLookup(name->getCString(), &obj1)->isNull())
- found = gTrue;
- else
- obj1.free();
- }
- if (!found && nameTree.isDict()) {
- if (!findDestInTree(&nameTree, name, &obj1)->isNull())
- found = gTrue;
- else
- obj1.free();
- }
- if (!found)
- return NULL;
-
- // construct LinkDest
- dest = NULL;
- if (obj1.isArray()) {
- dest = new LinkDest(obj1.getArray());
- } else if (obj1.isDict()) {
- if (obj1.dictLookup("D", &obj2)->isArray())
- dest = new LinkDest(obj2.getArray());
- else
- error(-1, "Bad named destination value");
- obj2.free();
- } else {
- error(-1, "Bad named destination value");
- }
- obj1.free();
- if (dest && !dest->isOk()) {
- delete dest;
- dest = NULL;
- }
-
- return dest;
-}
-
-Object *Catalog::findDestInTree(Object *tree, GString *name, Object *obj) {
- Object names, name1;
- Object kids, kid, limits, low, high;
- GBool done, found;
- int cmp, i;
-
- // leaf node
- if (tree->dictLookup("Names", &names)->isArray()) {
- done = found = gFalse;
- for (i = 0; !done && i < names.arrayGetLength(); i += 2) {
- if (names.arrayGet(i, &name1)->isString()) {
- cmp = name->cmp(name1.getString());
- if (cmp == 0) {
- names.arrayGet(i+1, obj);
- found = gTrue;
- done = gTrue;
- } else if (cmp < 0) {
- done = gTrue;
- }
- }
- name1.free();
- }
- names.free();
- if (!found)
- obj->initNull();
- return obj;
- }
- names.free();
-
- // root or intermediate node
- done = gFalse;
- if (tree->dictLookup("Kids", &kids)->isArray()) {
- for (i = 0; !done && i < kids.arrayGetLength(); ++i) {
- if (kids.arrayGet(i, &kid)->isDict()) {
- if (kid.dictLookup("Limits", &limits)->isArray()) {
- if (limits.arrayGet(0, &low)->isString() &&
- name->cmp(low.getString()) >= 0) {
- if (limits.arrayGet(1, &high)->isString() &&
- name->cmp(high.getString()) <= 0) {
- findDestInTree(&kid, name, obj);
- done = gTrue;
- }
- high.free();
- }
- low.free();
- }
- limits.free();
- }
- kid.free();
- }
- }
- kids.free();
-
- // name was outside of ranges of all kids
- if (!done)
- obj->initNull();
-
- return obj;
-}
diff --git a/pdf/xpdf/Catalog.h b/pdf/xpdf/Catalog.h
deleted file mode 100644
index 8ab7c61..0000000
--- a/pdf/xpdf/Catalog.h
+++ /dev/null
@@ -1,89 +0,0 @@
-//========================================================================
-//
-// Catalog.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef CATALOG_H
-#define CATALOG_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-class XRef;
-class Object;
-class Page;
-class PageAttrs;
-struct Ref;
-class LinkDest;
-
-//------------------------------------------------------------------------
-// Catalog
-//------------------------------------------------------------------------
-
-class Catalog {
-public:
-
- // Constructor.
- Catalog(XRef *xrefA);
-
- // Destructor.
- ~Catalog();
-
- // Is catalog valid?
- GBool isOk() { return ok; }
-
- // Get number of pages.
- int getNumPages() { return numPages; }
-
- // Get a page.
- Page *getPage(int i) { return pages[i-1]; }
-
- // Get the reference for a page object.
- Ref *getPageRef(int i) { return &pageRefs[i-1]; }
-
- // Return base URI, or NULL if none.
- GString *getBaseURI() { return baseURI; }
-
- // Return the contents of the metadata stream, or NULL if there is
- // no metadata.
- GString *readMetadata();
-
- // Return the structure tree root object.
- Object *getStructTreeRoot() { return &structTreeRoot; }
-
- // Find a page, given its object ID. Returns page number, or 0 if
- // not found.
- int findPage(int num, int gen);
-
- // Find a named destination. Returns the link destination, or
- // NULL if <name> is not a destination.
- LinkDest *findDest(GString *name);
-
- Object *getOutline() { return &outline; }
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- Page **pages; // array of pages
- Ref *pageRefs; // object ID for each page
- int numPages; // number of pages
- int pagesSize; // size of pages array
- Object dests; // named destination dictionary
- Object nameTree; // name tree
- GString *baseURI; // base URI for URI-type links
- Object metadata; // metadata stream
- Object structTreeRoot; // structure tree root dictionary
- Object outline; // outline dictionary
- GBool ok; // true if catalog is valid
-
- int readPageTree(Dict *pages, PageAttrs *attrs, int start);
- Object *findDestInTree(Object *tree, GString *name, Object *obj);
-};
-
-#endif
diff --git a/pdf/xpdf/CharCodeToUnicode.cc b/pdf/xpdf/CharCodeToUnicode.cc
deleted file mode 100644
index 2e2ad47..0000000
--- a/pdf/xpdf/CharCodeToUnicode.cc
+++ /dev/null
@@ -1,533 +0,0 @@
-//========================================================================
-//
-// CharCodeToUnicode.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "gmem.h"
-#include "gfile.h"
-#include "GString.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "PSTokenizer.h"
-#include "CharCodeToUnicode.h"
-
-//------------------------------------------------------------------------
-
-#define maxUnicodeString 8
-
-struct CharCodeToUnicodeString {
- CharCode c;
- Unicode u[maxUnicodeString];
- int len;
-};
-
-//------------------------------------------------------------------------
-
-static int getCharFromString(void *data) {
- char *p;
- int c;
-
- p = *(char **)data;
- if (*p) {
- c = *p++;
- *(char **)data = p;
- } else {
- c = EOF;
- }
- return c;
-}
-
-static int getCharFromFile(void *data) {
- return fgetc((FILE *)data);
-}
-
-//------------------------------------------------------------------------
-
-CharCodeToUnicode *CharCodeToUnicode::parseCIDToUnicode(GString *fileName,
- GString *collection) {
- FILE *f;
- Unicode *mapA;
- CharCode size, mapLenA;
- char buf[64];
- Unicode u;
- CharCodeToUnicode *ctu;
-
- if (!(f = fopen(fileName->getCString(), "r"))) {
- error(-1, "Couldn't open cidToUnicode file '%s'",
- fileName->getCString());
- return NULL;
- }
-
- size = 32768;
- mapA = (Unicode *)gmalloc(size * sizeof(Unicode));
- mapLenA = 0;
-
- while (getLine(buf, sizeof(buf), f)) {
- if (mapLenA == size) {
- size *= 2;
- mapA = (Unicode *)grealloc(mapA, size * sizeof(Unicode));
- }
- if (sscanf(buf, "%x", &u) == 1) {
- mapA[mapLenA] = u;
- } else {
- error(-1, "Bad line (%d) in cidToUnicode file '%s'",
- (int)(mapLenA + 1), fileName->getCString());
- mapA[mapLenA] = 0;
- }
- ++mapLenA;
- }
- fclose(f);
-
- ctu = new CharCodeToUnicode(collection->copy(), mapA, mapLenA, gTrue,
- NULL, 0, 0);
- gfree(mapA);
- return ctu;
-}
-
-CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
- GString *fileName) {
- FILE *f;
- Unicode *mapA;
- CharCodeToUnicodeString *sMapA;
- CharCode size, oldSize, len, sMapSizeA, sMapLenA;
- char buf[256];
- char *tok;
- Unicode u0;
- Unicode uBuf[maxUnicodeString];
- CharCodeToUnicode *ctu;
- int line, n, i;
-
- if (!(f = fopen(fileName->getCString(), "r"))) {
- error(-1, "Couldn't open unicodeToUnicode file '%s'",
- fileName->getCString());
- return NULL;
- }
-
- size = 4096;
- mapA = (Unicode *)gmalloc(size * sizeof(Unicode));
- memset(mapA, 0, size * sizeof(Unicode));
- len = 0;
- sMapA = NULL;
- sMapSizeA = sMapLenA = 0;
-
- line = 0;
- while (getLine(buf, sizeof(buf), f)) {
- ++line;
- if (!(tok = strtok(buf, " \t\r\n")) ||
- sscanf(tok, "%x", &u0) != 1) {
- error(-1, "Bad line (%d) in unicodeToUnicode file '%s'",
- line, fileName->getCString());
- continue;
- }
- n = 0;
- while (n < maxUnicodeString) {
- if (!(tok = strtok(NULL, " \t\r\n"))) {
- break;
- }
- if (sscanf(tok, "%x", &uBuf[n]) != 1) {
- error(-1, "Bad line (%d) in unicodeToUnicode file '%s'",
- line, fileName->getCString());
- break;
- }
- ++n;
- }
- if (n < 1) {
- error(-1, "Bad line (%d) in unicodeToUnicode file '%s'",
- line, fileName->getCString());
- continue;
- }
- if (u0 >= size) {
- oldSize = size;
- while (u0 >= size) {
- size *= 2;
- }
- mapA = (Unicode *)grealloc(mapA, size * sizeof(Unicode));
- memset(mapA + oldSize, 0, (size - oldSize) * sizeof(Unicode));
- }
- if (n == 1) {
- mapA[u0] = uBuf[0];
- } else {
- mapA[u0] = 0;
- if (sMapLenA == sMapSizeA) {
- sMapSizeA += 16;
- sMapA = (CharCodeToUnicodeString *)
- grealloc(sMapA, sMapSizeA * sizeof(CharCodeToUnicodeString));
- }
- sMapA[sMapLenA].c = u0;
- for (i = 0; i < n; ++i) {
- sMapA[sMapLenA].u[i] = uBuf[i];
- }
- sMapA[sMapLenA].len = n;
- ++sMapLenA;
- }
- if (u0 >= len) {
- len = u0 + 1;
- }
- }
- fclose(f);
-
- ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue,
- sMapA, sMapLenA, sMapSizeA);
- gfree(mapA);
- return ctu;
-}
-
-CharCodeToUnicode *CharCodeToUnicode::make8BitToUnicode(Unicode *toUnicode) {
- return new CharCodeToUnicode(NULL, toUnicode, 256, gTrue, NULL, 0, 0);
-}
-
-CharCodeToUnicode *CharCodeToUnicode::parseCMap(GString *buf, int nBits) {
- CharCodeToUnicode *ctu;
- char *p;
-
- ctu = new CharCodeToUnicode(NULL);
- p = buf->getCString();
- ctu->parseCMap1(&getCharFromString, &p, nBits);
- return ctu;
-}
-
-void CharCodeToUnicode::mergeCMap(GString *buf, int nBits) {
- char *p;
-
- p = buf->getCString();
- parseCMap1(&getCharFromString, &p, nBits);
-}
-
-void CharCodeToUnicode::parseCMap1(int (*getCharFunc)(void *), void *data,
- int nBits) {
- PSTokenizer *pst;
- char tok1[256], tok2[256], tok3[256];
- int nDigits, n1, n2, n3;
- CharCode i;
- CharCode code1, code2;
- GString *name;
- FILE *f;
-
- nDigits = nBits / 4;
- pst = new PSTokenizer(getCharFunc, data);
- pst->getToken(tok1, sizeof(tok1), &n1);
- while (pst->getToken(tok2, sizeof(tok2), &n2)) {
- if (!strcmp(tok2, "usecmap")) {
- if (tok1[0] == '/') {
- name = new GString(tok1 + 1);
- if ((f = globalParams->findToUnicodeFile(name))) {
- parseCMap1(&getCharFromFile, f, nBits);
- fclose(f);
- } else {
- error(-1, "Couldn't find ToUnicode CMap file for '%s'",
- name->getCString());
- }
- delete name;
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else if (!strcmp(tok2, "beginbfchar")) {
- while (pst->getToken(tok1, sizeof(tok1), &n1)) {
- if (!strcmp(tok1, "endbfchar")) {
- break;
- }
- if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
- !strcmp(tok2, "endbfchar")) {
- error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
- break;
- }
- if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
- tok2[0] == '<' && tok2[n2 - 1] == '>')) {
- error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
- continue;
- }
- tok1[n1 - 1] = tok2[n2 - 1] = '\0';
- if (sscanf(tok1 + 1, "%x", &code1) != 1) {
- error(-1, "Illegal entry in bfchar block in ToUnicode CMap");
- continue;
- }
- addMapping(code1, tok2 + 1, n2 - 1, 0);
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else if (!strcmp(tok2, "beginbfrange")) {
- while (pst->getToken(tok1, sizeof(tok1), &n1)) {
- if (!strcmp(tok1, "endbfrange")) {
- break;
- }
- if (!pst->getToken(tok2, sizeof(tok2), &n2) ||
- !strcmp(tok2, "endbfrange") ||
- !pst->getToken(tok3, sizeof(tok3), &n3) ||
- !strcmp(tok3, "endbfrange")) {
- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
- break;
- }
- if (!(n1 == 2 + nDigits && tok1[0] == '<' && tok1[n1 - 1] == '>' &&
- n2 == 2 + nDigits && tok2[0] == '<' && tok2[n2 - 1] == '>')) {
- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
- continue;
- }
- tok1[n1 - 1] = tok2[n2 - 1] = '\0';
- if (sscanf(tok1 + 1, "%x", &code1) != 1 ||
- sscanf(tok2 + 1, "%x", &code2) != 1) {
- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
- continue;
- }
- if (!strcmp(tok3, "[")) {
- i = 0;
- while (pst->getToken(tok1, sizeof(tok1), &n1) &&
- code1 + i <= code2) {
- if (!strcmp(tok1, "]")) {
- break;
- }
- if (tok1[0] == '<' && tok1[n1 - 1] == '>') {
- tok1[n1 - 1] = '\0';
- addMapping(code1 + i, tok1 + 1, n1 - 2, 0);
- } else {
- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
- }
- ++i;
- }
- } else if (tok3[0] == '<' && tok3[n3 - 1] == '>') {
- tok3[n3 - 1] = '\0';
- for (i = 0; code1 <= code2; ++code1, ++i) {
- addMapping(code1, tok3 + 1, n3 - 2, i);
- }
-
- } else {
- error(-1, "Illegal entry in bfrange block in ToUnicode CMap");
- }
- }
- pst->getToken(tok1, sizeof(tok1), &n1);
- } else {
- strcpy(tok1, tok2);
- }
- }
- delete pst;
-}
-
-void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n,
- int offset) {
- CharCode oldLen, i;
- Unicode u;
- char uHex[5];
- int j;
-
- if (code >= mapLen) {
- oldLen = mapLen;
- mapLen = (code + 256) & ~255;
- map = (Unicode *)grealloc(map, mapLen * sizeof(Unicode));
- for (i = oldLen; i < mapLen; ++i) {
- map[i] = 0;
- }
- }
- if (n <= 4) {
- if (sscanf(uStr, "%x", &u) != 1) {
- error(-1, "Illegal entry in ToUnicode CMap");
- return;
- }
- map[code] = u + offset;
- } else {
- if (sMapLen >= sMapSize) {
- sMapSize = sMapSize + 16;
- sMap = (CharCodeToUnicodeString *)
- grealloc(sMap, sMapSize * sizeof(CharCodeToUnicodeString));
- }
- map[code] = 0;
- sMap[sMapLen].c = code;
- sMap[sMapLen].len = n / 4;
- for (j = 0; j < sMap[sMapLen].len && j < maxUnicodeString; ++j) {
- strncpy(uHex, uStr + j*4, 4);
- uHex[4] = '\0';
- if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) {
- error(-1, "Illegal entry in ToUnicode CMap");
- }
- }
- sMap[sMapLen].u[sMap[sMapLen].len - 1] += offset;
- ++sMapLen;
- }
-}
-
-CharCodeToUnicode::CharCodeToUnicode(GString *tagA) {
- CharCode i;
-
- tag = tagA;
- mapLen = 256;
- map = (Unicode *)gmalloc(mapLen * sizeof(Unicode));
- for (i = 0; i < mapLen; ++i) {
- map[i] = 0;
- }
- sMap = NULL;
- sMapLen = sMapSize = 0;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-CharCodeToUnicode::CharCodeToUnicode(GString *tagA, Unicode *mapA,
- CharCode mapLenA, GBool copyMap,
- CharCodeToUnicodeString *sMapA,
- int sMapLenA, int sMapSizeA) {
- tag = tagA;
- mapLen = mapLenA;
- if (copyMap) {
- map = (Unicode *)gmalloc(mapLen * sizeof(Unicode));
- memcpy(map, mapA, mapLen * sizeof(Unicode));
- } else {
- map = mapA;
- }
- sMap = sMapA;
- sMapLen = sMapLenA;
- sMapSize = sMapSizeA;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-CharCodeToUnicode::~CharCodeToUnicode() {
- if (tag) {
- delete tag;
- }
- gfree(map);
- if (sMap) {
- gfree(sMap);
- }
-#if MULTITHREADED
- gDestroyMutex(&mutex);
-#endif
-}
-
-void CharCodeToUnicode::incRefCnt() {
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- ++refCnt;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
-}
-
-void CharCodeToUnicode::decRefCnt() {
- GBool done;
-
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- done = --refCnt == 0;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
- if (done) {
- delete this;
- }
-}
-
-GBool CharCodeToUnicode::match(GString *tagA) {
- return tag && !tag->cmp(tagA);
-}
-
-void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) {
- int i;
-
- if (len == 1) {
- map[c] = u[0];
- } else {
- map[c] = 0;
- if (sMapLen == sMapSize) {
- sMapSize += 8;
- sMap = (CharCodeToUnicodeString *)
- grealloc(sMap, sMapSize * sizeof(CharCodeToUnicodeString));
- }
- sMap[sMapLen].c = c;
- sMap[sMapLen].len = len;
- for (i = 0; i < len && i < maxUnicodeString; ++i) {
- sMap[sMapLen].u[i] = u[i];
- }
- ++sMapLen;
- }
-}
-
-int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode *u, int size) {
- int i, j;
-
- if (c >= mapLen) {
- return 0;
- }
- if (map[c]) {
- u[0] = map[c];
- return 1;
- }
- for (i = 0; i < sMapLen; ++i) {
- if (sMap[i].c == c) {
- for (j = 0; j < sMap[i].len && j < size; ++j) {
- u[j] = sMap[i].u[j];
- }
- return j;
- }
- }
- return 0;
-}
-
-//------------------------------------------------------------------------
-
-CharCodeToUnicodeCache::CharCodeToUnicodeCache(int sizeA) {
- int i;
-
- size = sizeA;
- cache = (CharCodeToUnicode **)gmalloc(size * sizeof(CharCodeToUnicode *));
- for (i = 0; i < size; ++i) {
- cache[i] = NULL;
- }
-}
-
-CharCodeToUnicodeCache::~CharCodeToUnicodeCache() {
- int i;
-
- for (i = 0; i < size; ++i) {
- if (cache[i]) {
- cache[i]->decRefCnt();
- }
- }
- gfree(cache);
-}
-
-CharCodeToUnicode *CharCodeToUnicodeCache::getCharCodeToUnicode(GString *tag) {
- CharCodeToUnicode *ctu;
- int i, j;
-
- if (cache[0] && cache[0]->match(tag)) {
- cache[0]->incRefCnt();
- return cache[0];
- }
- for (i = 1; i < size; ++i) {
- if (cache[i] && cache[i]->match(tag)) {
- ctu = cache[i];
- for (j = i; j >= 1; --j) {
- cache[j] = cache[j - 1];
- }
- cache[0] = ctu;
- ctu->incRefCnt();
- return ctu;
- }
- }
- return NULL;
-}
-
-void CharCodeToUnicodeCache::add(CharCodeToUnicode *ctu) {
- int i;
-
- if (cache[size - 1]) {
- cache[size - 1]->decRefCnt();
- }
- for (i = size - 1; i >= 1; --i) {
- cache[i] = cache[i - 1];
- }
- cache[0] = ctu;
- ctu->incRefCnt();
-}
diff --git a/pdf/xpdf/CharCodeToUnicode.h b/pdf/xpdf/CharCodeToUnicode.h
deleted file mode 100644
index 605e2bd..0000000
--- a/pdf/xpdf/CharCodeToUnicode.h
+++ /dev/null
@@ -1,113 +0,0 @@
-//========================================================================
-//
-// CharCodeToUnicode.h
-//
-// Mapping from character codes to Unicode.
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef CHARCODETOUNICODE_H
-#define CHARCODETOUNICODE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "CharTypes.h"
-
-#if MULTITHREADED
-#include "GMutex.h"
-#endif
-
-struct CharCodeToUnicodeString;
-
-//------------------------------------------------------------------------
-
-class CharCodeToUnicode {
-public:
-
- // Read the CID-to-Unicode mapping for <collection> from the file
- // specified by <fileName>. Sets the initial reference count to 1.
- // Returns NULL on failure.
- static CharCodeToUnicode *parseCIDToUnicode(GString *fileName,
- GString *collection);
-
- // Create a Unicode-to-Unicode mapping from the file specified by
- // <fileName>. Sets the initial reference count to 1. Returns NULL
- // on failure.
- static CharCodeToUnicode *parseUnicodeToUnicode(GString *fileName);
-
- // Create the CharCode-to-Unicode mapping for an 8-bit font.
- // <toUnicode> is an array of 256 Unicode indexes. Sets the initial
- // reference count to 1.
- static CharCodeToUnicode *make8BitToUnicode(Unicode *toUnicode);
-
- // Parse a ToUnicode CMap for an 8- or 16-bit font.
- static CharCodeToUnicode *parseCMap(GString *buf, int nBits);
-
- // Parse a ToUnicode CMap for an 8- or 16-bit font, merging it into
- // <this>.
- void mergeCMap(GString *buf, int nBits);
-
- ~CharCodeToUnicode();
-
- void incRefCnt();
- void decRefCnt();
-
- // Return true if this mapping matches the specified <tagA>.
- GBool match(GString *tagA);
-
- // Set the mapping for <c>.
- void setMapping(CharCode c, Unicode *u, int len);
-
- // Map a CharCode to Unicode.
- int mapToUnicode(CharCode c, Unicode *u, int size);
-
-private:
-
- void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits);
- void addMapping(CharCode code, char *uStr, int n, int offset);
- CharCodeToUnicode(GString *tagA);
- CharCodeToUnicode(GString *tagA, Unicode *mapA,
- CharCode mapLenA, GBool copyMap,
- CharCodeToUnicodeString *sMapA,
- int sMapLenA, int sMapSizeA);
-
- GString *tag;
- Unicode *map;
- CharCode mapLen;
- CharCodeToUnicodeString *sMap;
- int sMapLen, sMapSize;
- int refCnt;
-#ifdef MULTITHREADED
- GMutex mutex;
-#endif
-};
-
-//------------------------------------------------------------------------
-
-class CharCodeToUnicodeCache {
-public:
-
- CharCodeToUnicodeCache(int sizeA);
- ~CharCodeToUnicodeCache();
-
- // Get the CharCodeToUnicode object for <tag>. Increments its
- // reference count; there will be one reference for the cache plus
- // one for the caller of this function. Returns NULL on failure.
- CharCodeToUnicode *getCharCodeToUnicode(GString *tag);
-
- // Insert <ctu> into the cache, in the most-recently-used position.
- void add(CharCodeToUnicode *ctu);
-
-private:
-
- CharCodeToUnicode **cache;
- int size;
-};
-
-#endif
diff --git a/pdf/xpdf/CharTypes.h b/pdf/xpdf/CharTypes.h
deleted file mode 100644
index d0df630..0000000
--- a/pdf/xpdf/CharTypes.h
+++ /dev/null
@@ -1,24 +0,0 @@
-//========================================================================
-//
-// CharTypes.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef CHARTYPES_H
-#define CHARTYPES_H
-
-// Unicode character.
-typedef unsigned int Unicode;
-
-// Character ID for CID character collections.
-typedef unsigned int CID;
-
-// This is large enough to hold any of the following:
-// - 8-bit char code
-// - 16-bit CID
-// - Unicode
-typedef unsigned int CharCode;
-
-#endif
diff --git a/pdf/xpdf/CompactFontTables.h b/pdf/xpdf/CompactFontTables.h
deleted file mode 100644
index 28e16e7..0000000
--- a/pdf/xpdf/CompactFontTables.h
+++ /dev/null
@@ -1,464 +0,0 @@
-//========================================================================
-//
-// CompactFontTables.h
-//
-// Copyright 1999-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef COMPACTFONTINFO_H
-#define COMPACTFONTINFO_H
-
-static char *type1CStdStrings[391] = {
- ".notdef",
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quoteright",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "quoteleft",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- "exclamdown",
- "cent",
- "sterling",
- "fraction",
- "yen",
- "florin",
- "section",
- "currency",
- "quotesingle",
- "quotedblleft",
- "guillemotleft",
- "guilsinglleft",
- "guilsinglright",
- "fi",
- "fl",
- "endash",
- "dagger",
- "daggerdbl",
- "periodcentered",
- "paragraph",
- "bullet",
- "quotesinglbase",
- "quotedblbase",
- "quotedblright",
- "guillemotright",
- "ellipsis",
- "perthousand",
- "questiondown",
- "grave",
- "acute",
- "circumflex",
- "tilde",
- "macron",
- "breve",
- "dotaccent",
- "dieresis",
- "ring",
- "cedilla",
- "hungarumlaut",
- "ogonek",
- "caron",
- "emdash",
- "AE",
- "ordfeminine",
- "Lslash",
- "Oslash",
- "OE",
- "ordmasculine",
- "ae",
- "dotlessi",
- "lslash",
- "oslash",
- "oe",
- "germandbls",
- "onesuperior",
- "logicalnot",
- "mu",
- "trademark",
- "Eth",
- "onehalf",
- "plusminus",
- "Thorn",
- "onequarter",
- "divide",
- "brokenbar",
- "degree",
- "thorn",
- "threequarters",
- "twosuperior",
- "registered",
- "minus",
- "eth",
- "multiply",
- "threesuperior",
- "copyright",
- "Aacute",
- "Acircumflex",
- "Adieresis",
- "Agrave",
- "Aring",
- "Atilde",
- "Ccedilla",
- "Eacute",
- "Ecircumflex",
- "Edieresis",
- "Egrave",
- "Iacute",
- "Icircumflex",
- "Idieresis",
- "Igrave",
- "Ntilde",
- "Oacute",
- "Ocircumflex",
- "Odieresis",
- "Ograve",
- "Otilde",
- "Scaron",
- "Uacute",
- "Ucircumflex",
- "Udieresis",
- "Ugrave",
- "Yacute",
- "Ydieresis",
- "Zcaron",
- "aacute",
- "acircumflex",
- "adieresis",
- "agrave",
- "aring",
- "atilde",
- "ccedilla",
- "eacute",
- "ecircumflex",
- "edieresis",
- "egrave",
- "iacute",
- "icircumflex",
- "idieresis",
- "igrave",
- "ntilde",
- "oacute",
- "ocircumflex",
- "odieresis",
- "ograve",
- "otilde",
- "scaron",
- "uacute",
- "ucircumflex",
- "udieresis",
- "ugrave",
- "yacute",
- "ydieresis",
- "zcaron",
- "exclamsmall",
- "Hungarumlautsmall",
- "dollaroldstyle",
- "dollarsuperior",
- "ampersandsmall",
- "Acutesmall",
- "parenleftsuperior",
- "parenrightsuperior",
- "twodotenleader",
- "onedotenleader",
- "zerooldstyle",
- "oneoldstyle",
- "twooldstyle",
- "threeoldstyle",
- "fouroldstyle",
- "fiveoldstyle",
- "sixoldstyle",
- "sevenoldstyle",
- "eightoldstyle",
- "nineoldstyle",
- "commasuperior",
- "threequartersemdash",
- "periodsuperior",
- "questionsmall",
- "asuperior",
- "bsuperior",
- "centsuperior",
- "dsuperior",
- "esuperior",
- "isuperior",
- "lsuperior",
- "msuperior",
- "nsuperior",
- "osuperior",
- "rsuperior",
- "ssuperior",
- "tsuperior",
- "ff",
- "ffi",
- "ffl",
- "parenleftinferior",
- "parenrightinferior",
- "Circumflexsmall",
- "hyphensuperior",
- "Gravesmall",
- "Asmall",
- "Bsmall",
- "Csmall",
- "Dsmall",
- "Esmall",
- "Fsmall",
- "Gsmall",
- "Hsmall",
- "Ismall",
- "Jsmall",
- "Ksmall",
- "Lsmall",
- "Msmall",
- "Nsmall",
- "Osmall",
- "Psmall",
- "Qsmall",
- "Rsmall",
- "Ssmall",
- "Tsmall",
- "Usmall",
- "Vsmall",
- "Wsmall",
- "Xsmall",
- "Ysmall",
- "Zsmall",
- "colonmonetary",
- "onefitted",
- "rupiah",
- "Tildesmall",
- "exclamdownsmall",
- "centoldstyle",
- "Lslashsmall",
- "Scaronsmall",
- "Zcaronsmall",
- "Dieresissmall",
- "Brevesmall",
- "Caronsmall",
- "Dotaccentsmall",
- "Macronsmall",
- "figuredash",
- "hypheninferior",
- "Ogoneksmall",
- "Ringsmall",
- "Cedillasmall",
- "questiondownsmall",
- "oneeighth",
- "threeeighths",
- "fiveeighths",
- "seveneighths",
- "onethird",
- "twothirds",
- "zerosuperior",
- "foursuperior",
- "fivesuperior",
- "sixsuperior",
- "sevensuperior",
- "eightsuperior",
- "ninesuperior",
- "zeroinferior",
- "oneinferior",
- "twoinferior",
- "threeinferior",
- "fourinferior",
- "fiveinferior",
- "sixinferior",
- "seveninferior",
- "eightinferior",
- "nineinferior",
- "centinferior",
- "dollarinferior",
- "periodinferior",
- "commainferior",
- "Agravesmall",
- "Aacutesmall",
- "Acircumflexsmall",
- "Atildesmall",
- "Adieresissmall",
- "Aringsmall",
- "AEsmall",
- "Ccedillasmall",
- "Egravesmall",
- "Eacutesmall",
- "Ecircumflexsmall",
- "Edieresissmall",
- "Igravesmall",
- "Iacutesmall",
- "Icircumflexsmall",
- "Idieresissmall",
- "Ethsmall",
- "Ntildesmall",
- "Ogravesmall",
- "Oacutesmall",
- "Ocircumflexsmall",
- "Otildesmall",
- "Odieresissmall",
- "OEsmall",
- "Oslashsmall",
- "Ugravesmall",
- "Uacutesmall",
- "Ucircumflexsmall",
- "Udieresissmall",
- "Yacutesmall",
- "Thornsmall",
- "Ydieresissmall",
- "001.000",
- "001.001",
- "001.002",
- "001.003",
- "Black",
- "Bold",
- "Book",
- "Light",
- "Medium",
- "Regular",
- "Roman",
- "Semibold"
-};
-
-static Gushort type1CISOAdobeCharset[229] = {
- 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
- 10, 11, 12, 13, 14, 15, 16, 17, 18, 19,
- 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
- 40, 41, 42, 43, 44, 45, 46, 47, 48, 49,
- 50, 51, 52, 53, 54, 55, 56, 57, 58, 59,
- 60, 61, 62, 63, 64, 65, 66, 67, 68, 69,
- 70, 71, 72, 73, 74, 75, 76, 77, 78, 79,
- 80, 81, 82, 83, 84, 85, 86, 87, 88, 89,
- 90, 91, 92, 93, 94, 95, 96, 97, 98, 99,
- 100, 101, 102, 103, 104, 105, 106, 107, 108, 109,
- 110, 111, 112, 113, 114, 115, 116, 117, 118, 119,
- 120, 121, 122, 123, 124, 125, 126, 127, 128, 129,
- 130, 131, 132, 133, 134, 135, 136, 137, 138, 139,
- 140, 141, 142, 143, 144, 145, 146, 147, 148, 149,
- 150, 151, 152, 153, 154, 155, 156, 157, 158, 159,
- 160, 161, 162, 163, 164, 165, 166, 167, 168, 169,
- 170, 171, 172, 173, 174, 175, 176, 177, 178, 179,
- 180, 181, 182, 183, 184, 185, 186, 187, 188, 189,
- 190, 191, 192, 193, 194, 195, 196, 197, 198, 199,
- 200, 201, 202, 203, 204, 205, 206, 207, 208, 209,
- 210, 211, 212, 213, 214, 215, 216, 217, 218, 219,
- 220, 221, 222, 223, 224, 225, 226, 227, 228
-};
-
-static Gushort type1CExpertCharset[166] = {
- 0, 1, 229, 230, 231, 232, 233, 234, 235, 236,
- 237, 238, 13, 14, 15, 99, 239, 240, 241, 242,
- 243, 244, 245, 246, 247, 248, 27, 28, 249, 250,
- 251, 252, 253, 254, 255, 256, 257, 258, 259, 260,
- 261, 262, 263, 264, 265, 266, 109, 110, 267, 268,
- 269, 270, 271, 272, 273, 274, 275, 276, 277, 278,
- 279, 280, 281, 282, 283, 284, 285, 286, 287, 288,
- 289, 290, 291, 292, 293, 294, 295, 296, 297, 298,
- 299, 300, 301, 302, 303, 304, 305, 306, 307, 308,
- 309, 310, 311, 312, 313, 314, 315, 316, 317, 318,
- 158, 155, 163, 319, 320, 321, 322, 323, 324, 325,
- 326, 150, 164, 169, 327, 328, 329, 330, 331, 332,
- 333, 334, 335, 336, 337, 338, 339, 340, 341, 342,
- 343, 344, 345, 346, 347, 348, 349, 350, 351, 352,
- 353, 354, 355, 356, 357, 358, 359, 360, 361, 362,
- 363, 364, 365, 366, 367, 368, 369, 370, 371, 372,
- 373, 374, 375, 376, 377, 378
-};
-
-static Gushort type1CExpertSubsetCharset[87] = {
- 0, 1, 231, 232, 235, 236, 237, 238, 13, 14,
- 15, 99, 239, 240, 241, 242, 243, 244, 245, 246,
- 247, 248, 27, 28, 249, 250, 251, 253, 254, 255,
- 256, 257, 258, 259, 260, 261, 262, 263, 264, 265,
- 266, 109, 110, 267, 268, 269, 270, 272, 300, 301,
- 302, 305, 314, 315, 158, 155, 163, 320, 321, 322,
- 323, 324, 325, 326, 150, 164, 169, 327, 328, 329,
- 330, 331, 332, 333, 334, 335, 336, 337, 338, 339,
- 340, 341, 342, 343, 344, 345, 346
-};
-
-#endif
diff --git a/pdf/xpdf/Decrypt.cc b/pdf/xpdf/Decrypt.cc
deleted file mode 100644
index dab0750..0000000
--- a/pdf/xpdf/Decrypt.cc
+++ /dev/null
@@ -1,399 +0,0 @@
-//========================================================================
-//
-// Decrypt.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "Decrypt.h"
-
-static void rc4InitKey(Guchar *key, int keyLen, Guchar *state);
-static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c);
-static void md5(Guchar *msg, int msgLen, Guchar *digest);
-
-static Guchar passwordPad[32] = {
- 0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
- 0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08,
- 0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80,
- 0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
-};
-
-//------------------------------------------------------------------------
-// Decrypt
-//------------------------------------------------------------------------
-
-Decrypt::Decrypt(Guchar *fileKey, int keyLength, int objNum, int objGen) {
- int i;
-
- // construct object key
- for (i = 0; i < keyLength; ++i) {
- objKey[i] = fileKey[i];
- }
- objKey[keyLength] = objNum & 0xff;
- objKey[keyLength + 1] = (objNum >> 8) & 0xff;
- objKey[keyLength + 2] = (objNum >> 16) & 0xff;
- objKey[keyLength + 3] = objGen & 0xff;
- objKey[keyLength + 4] = (objGen >> 8) & 0xff;
- md5(objKey, keyLength + 5, objKey);
-
- // set up for decryption
- x = y = 0;
- if ((objKeyLength = keyLength + 5) > 16) {
- objKeyLength = 16;
- }
- rc4InitKey(objKey, objKeyLength, state);
-}
-
-void Decrypt::reset() {
- x = y = 0;
- rc4InitKey(objKey, objKeyLength, state);
-}
-
-Guchar Decrypt::decryptByte(Guchar c) {
- return rc4DecryptByte(state, &x, &y, c);
-}
-
-GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength,
- GString *ownerKey, GString *userKey,
- int permissions, GString *fileID,
- GString *ownerPassword, GString *userPassword,
- Guchar *fileKey, GBool *ownerPasswordOk) {
- Guchar test[32], test2[32];
- GString *userPassword2;
- Guchar fState[256];
- Guchar tmpKey[16];
- Guchar fx, fy;
- int len, i, j;
-
- // try using the supplied owner password to generate the user password
- *ownerPasswordOk = gFalse;
- if (ownerPassword) {
- len = ownerPassword->getLength();
- if (len < 32) {
- memcpy(test, ownerPassword->getCString(), len);
- memcpy(test + len, passwordPad, 32 - len);
- } else {
- memcpy(test, ownerPassword->getCString(), 32);
- }
- md5(test, 32, test);
- if (encRevision == 3) {
- for (i = 0; i < 50; ++i) {
- md5(test, 16, test);
- }
- }
- if (encRevision == 2) {
- rc4InitKey(test, keyLength, fState);
- fx = fy = 0;
- for (i = 0; i < 32; ++i) {
- test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
- }
- } else {
- memcpy(test2, ownerKey->getCString(), 32);
- for (i = 19; i >= 0; --i) {
- for (j = 0; j < keyLength; ++j) {
- tmpKey[j] = test[j] ^ i;
- }
- rc4InitKey(tmpKey, keyLength, fState);
- fx = fy = 0;
- for (j = 0; j < 32; ++j) {
- test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]);
- }
- }
- }
- userPassword2 = new GString((char *)test2, 32);
- if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
- permissions, fileID, userPassword2, fileKey)) {
- *ownerPasswordOk = gTrue;
- delete userPassword2;
- return gTrue;
- }
- delete userPassword2;
- }
-
- // try using the supplied user password
- return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
- permissions, fileID, userPassword, fileKey);
-}
-
-GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength,
- GString *ownerKey, GString *userKey,
- int permissions, GString *fileID,
- GString *userPassword, Guchar *fileKey) {
- Guchar *buf;
- Guchar test[32];
- Guchar fState[256];
- Guchar tmpKey[16];
- Guchar fx, fy;
- int len, i, j;
- GBool ok;
-
- // generate file key
- buf = (Guchar *)gmalloc(68 + fileID->getLength());
- if (userPassword) {
- len = userPassword->getLength();
- if (len < 32) {
- memcpy(buf, userPassword->getCString(), len);
- memcpy(buf + len, passwordPad, 32 - len);
- } else {
- memcpy(buf, userPassword->getCString(), 32);
- }
- } else {
- memcpy(buf, passwordPad, 32);
- }
- memcpy(buf + 32, ownerKey->getCString(), 32);
- buf[64] = permissions & 0xff;
- buf[65] = (permissions >> 8) & 0xff;
- buf[66] = (permissions >> 16) & 0xff;
- buf[67] = (permissions >> 24) & 0xff;
- memcpy(buf + 68, fileID->getCString(), fileID->getLength());
- md5(buf, 68 + fileID->getLength(), fileKey);
- if (encRevision == 3) {
- for (i = 0; i < 50; ++i) {
- md5(fileKey, keyLength, fileKey);
- }
- }
-
- // test user password
- if (encRevision == 2) {
- rc4InitKey(fileKey, keyLength, fState);
- fx = fy = 0;
- for (i = 0; i < 32; ++i) {
- test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i));
- }
- ok = memcmp(test, passwordPad, 32) == 0;
- } else if (encRevision == 3) {
- memcpy(test, userKey->getCString(), 32);
- for (i = 19; i >= 0; --i) {
- for (j = 0; j < keyLength; ++j) {
- tmpKey[j] = fileKey[j] ^ i;
- }
- rc4InitKey(tmpKey, keyLength, fState);
- fx = fy = 0;
- for (j = 0; j < 32; ++j) {
- test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]);
- }
- }
- memcpy(buf, passwordPad, 32);
- memcpy(buf + 32, fileID->getCString(), fileID->getLength());
- md5(buf, 32 + fileID->getLength(), buf);
- ok = memcmp(test, buf, 16) == 0;
- } else {
- ok = gFalse;
- }
-
- gfree(buf);
- return ok;
-}
-
-//------------------------------------------------------------------------
-// RC4-compatible decryption
-//------------------------------------------------------------------------
-
-static void rc4InitKey(Guchar *key, int keyLen, Guchar *state) {
- Guchar index1, index2;
- Guchar t;
- int i;
-
- for (i = 0; i < 256; ++i)
- state[i] = i;
- index1 = index2 = 0;
- for (i = 0; i < 256; ++i) {
- index2 = (key[index1] + state[i] + index2) % 256;
- t = state[i];
- state[i] = state[index2];
- state[index2] = t;
- index1 = (index1 + 1) % keyLen;
- }
-}
-
-static Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) {
- Guchar x1, y1, tx, ty;
-
- x1 = *x = (*x + 1) % 256;
- y1 = *y = (state[*x] + *y) % 256;
- tx = state[x1];
- ty = state[y1];
- state[x1] = ty;
- state[y1] = tx;
- return c ^ state[(tx + ty) % 256];
-}
-
-//------------------------------------------------------------------------
-// MD5 message digest
-//------------------------------------------------------------------------
-
-// this works around a bug in older Sun compilers
-static inline Gulong rotateLeft(Gulong x, int r) {
- x &= 0xffffffff;
- return ((x << r) | (x >> (32 - r))) & 0xffffffff;
-}
-
-static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d,
- Gulong Xk, Gulong s, Gulong Ti) {
- return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s);
-}
-
-static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d,
- Gulong Xk, Gulong s, Gulong Ti) {
- return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s);
-}
-
-static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d,
- Gulong Xk, Gulong s, Gulong Ti) {
- return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s);
-}
-
-static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d,
- Gulong Xk, Gulong s, Gulong Ti) {
- return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s);
-}
-
-static void md5(Guchar *msg, int msgLen, Guchar *digest) {
- Gulong x[16];
- Gulong a, b, c, d, aa, bb, cc, dd;
- int n64;
- int i, j, k;
-
- // compute number of 64-byte blocks
- // (length + pad byte (0x80) + 8 bytes for length)
- n64 = (msgLen + 1 + 8 + 63) / 64;
-
- // initialize a, b, c, d
- a = 0x67452301;
- b = 0xefcdab89;
- c = 0x98badcfe;
- d = 0x10325476;
-
- // loop through blocks
- k = 0;
- for (i = 0; i < n64; ++i) {
-
- // grab a 64-byte block
- for (j = 0; j < 16 && k < msgLen - 3; ++j, k += 4)
- x[j] = (((((msg[k+3] << 8) + msg[k+2]) << 8) + msg[k+1]) << 8) + msg[k];
- if (i == n64 - 1) {
- if (k == msgLen - 3)
- x[j] = 0x80000000 + (((msg[k+2] << 8) + msg[k+1]) << 8) + msg[k];
- else if (k == msgLen - 2)
- x[j] = 0x800000 + (msg[k+1] << 8) + msg[k];
- else if (k == msgLen - 1)
- x[j] = 0x8000 + msg[k];
- else
- x[j] = 0x80;
- ++j;
- while (j < 16)
- x[j++] = 0;
- x[14] = msgLen << 3;
- }
-
- // save a, b, c, d
- aa = a;
- bb = b;
- cc = c;
- dd = d;
-
- // round 1
- a = md5Round1(a, b, c, d, x[0], 7, 0xd76aa478);
- d = md5Round1(d, a, b, c, x[1], 12, 0xe8c7b756);
- c = md5Round1(c, d, a, b, x[2], 17, 0x242070db);
- b = md5Round1(b, c, d, a, x[3], 22, 0xc1bdceee);
- a = md5Round1(a, b, c, d, x[4], 7, 0xf57c0faf);
- d = md5Round1(d, a, b, c, x[5], 12, 0x4787c62a);
- c = md5Round1(c, d, a, b, x[6], 17, 0xa8304613);
- b = md5Round1(b, c, d, a, x[7], 22, 0xfd469501);
- a = md5Round1(a, b, c, d, x[8], 7, 0x698098d8);
- d = md5Round1(d, a, b, c, x[9], 12, 0x8b44f7af);
- c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1);
- b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be);
- a = md5Round1(a, b, c, d, x[12], 7, 0x6b901122);
- d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193);
- c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e);
- b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821);
-
- // round 2
- a = md5Round2(a, b, c, d, x[1], 5, 0xf61e2562);
- d = md5Round2(d, a, b, c, x[6], 9, 0xc040b340);
- c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51);
- b = md5Round2(b, c, d, a, x[0], 20, 0xe9b6c7aa);
- a = md5Round2(a, b, c, d, x[5], 5, 0xd62f105d);
- d = md5Round2(d, a, b, c, x[10], 9, 0x02441453);
- c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681);
- b = md5Round2(b, c, d, a, x[4], 20, 0xe7d3fbc8);
- a = md5Round2(a, b, c, d, x[9], 5, 0x21e1cde6);
- d = md5Round2(d, a, b, c, x[14], 9, 0xc33707d6);
- c = md5Round2(c, d, a, b, x[3], 14, 0xf4d50d87);
- b = md5Round2(b, c, d, a, x[8], 20, 0x455a14ed);
- a = md5Round2(a, b, c, d, x[13], 5, 0xa9e3e905);
- d = md5Round2(d, a, b, c, x[2], 9, 0xfcefa3f8);
- c = md5Round2(c, d, a, b, x[7], 14, 0x676f02d9);
- b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a);
-
- // round 3
- a = md5Round3(a, b, c, d, x[5], 4, 0xfffa3942);
- d = md5Round3(d, a, b, c, x[8], 11, 0x8771f681);
- c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122);
- b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c);
- a = md5Round3(a, b, c, d, x[1], 4, 0xa4beea44);
- d = md5Round3(d, a, b, c, x[4], 11, 0x4bdecfa9);
- c = md5Round3(c, d, a, b, x[7], 16, 0xf6bb4b60);
- b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70);
- a = md5Round3(a, b, c, d, x[13], 4, 0x289b7ec6);
- d = md5Round3(d, a, b, c, x[0], 11, 0xeaa127fa);
- c = md5Round3(c, d, a, b, x[3], 16, 0xd4ef3085);
- b = md5Round3(b, c, d, a, x[6], 23, 0x04881d05);
- a = md5Round3(a, b, c, d, x[9], 4, 0xd9d4d039);
- d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5);
- c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8);
- b = md5Round3(b, c, d, a, x[2], 23, 0xc4ac5665);
-
- // round 4
- a = md5Round4(a, b, c, d, x[0], 6, 0xf4292244);
- d = md5Round4(d, a, b, c, x[7], 10, 0x432aff97);
- c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7);
- b = md5Round4(b, c, d, a, x[5], 21, 0xfc93a039);
- a = md5Round4(a, b, c, d, x[12], 6, 0x655b59c3);
- d = md5Round4(d, a, b, c, x[3], 10, 0x8f0ccc92);
- c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d);
- b = md5Round4(b, c, d, a, x[1], 21, 0x85845dd1);
- a = md5Round4(a, b, c, d, x[8], 6, 0x6fa87e4f);
- d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0);
- c = md5Round4(c, d, a, b, x[6], 15, 0xa3014314);
- b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1);
- a = md5Round4(a, b, c, d, x[4], 6, 0xf7537e82);
- d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235);
- c = md5Round4(c, d, a, b, x[2], 15, 0x2ad7d2bb);
- b = md5Round4(b, c, d, a, x[9], 21, 0xeb86d391);
-
- // increment a, b, c, d
- a += aa;
- b += bb;
- c += cc;
- d += dd;
- }
-
- // break digest into bytes
- digest[0] = (Guchar)(a & 0xff);
- digest[1] = (Guchar)((a >>= 8) & 0xff);
- digest[2] = (Guchar)((a >>= 8) & 0xff);
- digest[3] = (Guchar)((a >>= 8) & 0xff);
- digest[4] = (Guchar)(b & 0xff);
- digest[5] = (Guchar)((b >>= 8) & 0xff);
- digest[6] = (Guchar)((b >>= 8) & 0xff);
- digest[7] = (Guchar)((b >>= 8) & 0xff);
- digest[8] = (Guchar)(c & 0xff);
- digest[9] = (Guchar)((c >>= 8) & 0xff);
- digest[10] = (Guchar)((c >>= 8) & 0xff);
- digest[11] = (Guchar)((c >>= 8) & 0xff);
- digest[12] = (Guchar)(d & 0xff);
- digest[13] = (Guchar)((d >>= 8) & 0xff);
- digest[14] = (Guchar)((d >>= 8) & 0xff);
- digest[15] = (Guchar)((d >>= 8) & 0xff);
-}
diff --git a/pdf/xpdf/Decrypt.h b/pdf/xpdf/Decrypt.h
deleted file mode 100644
index 71f9457..0000000
--- a/pdf/xpdf/Decrypt.h
+++ /dev/null
@@ -1,61 +0,0 @@
-//========================================================================
-//
-// Decrypt.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef DECRYPT_H
-#define DECRYPT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "GString.h"
-
-//------------------------------------------------------------------------
-// Decrypt
-//------------------------------------------------------------------------
-
-class Decrypt {
-public:
-
- // Initialize the decryptor object.
- Decrypt(Guchar *fileKey, int keyLength, int objNum, int objGen);
-
- // Reset decryption.
- void reset();
-
- // Decrypt one byte.
- Guchar decryptByte(Guchar c);
-
- // Generate a file key. The <fileKey> buffer must have space for at
- // least 16 bytes. Checks <ownerPassword> and then <userPassword>
- // and returns true if either is correct. Sets <ownerPasswordOk> if
- // the owner password was correct. Either or both of the passwords
- // may be NULL, which is treated as an empty string.
- static GBool makeFileKey(int encVersion, int encRevision, int keyLength,
- GString *ownerKey, GString *userKey,
- int permissions, GString *fileID,
- GString *ownerPassword, GString *userPassword,
- Guchar *fileKey, GBool *ownerPasswordOk);
-
-private:
-
- static GBool makeFileKey2(int encVersion, int encRevision, int keyLength,
- GString *ownerKey, GString *userKey,
- int permissions, GString *fileID,
- GString *userPassword, Guchar *fileKey);
-
- int objKeyLength;
- Guchar objKey[21];
- Guchar state[256];
- Guchar x, y;
-};
-
-#endif
diff --git a/pdf/xpdf/Dict.cc b/pdf/xpdf/Dict.cc
deleted file mode 100644
index 6274590..0000000
--- a/pdf/xpdf/Dict.cc
+++ /dev/null
@@ -1,95 +0,0 @@
-//========================================================================
-//
-// Dict.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include "gmem.h"
-#include "Object.h"
-#include "XRef.h"
-#include "Dict.h"
-
-//------------------------------------------------------------------------
-// Dict
-//------------------------------------------------------------------------
-
-Dict::Dict(XRef *xrefA) {
- xref = xrefA;
- entries = NULL;
- size = length = 0;
- ref = 1;
-}
-
-Dict::~Dict() {
- int i;
-
- for (i = 0; i < length; ++i) {
- gfree(entries[i].key);
- entries[i].val.free();
- }
- gfree(entries);
-}
-
-void Dict::add(char *key, Object *val) {
- if (length == size) {
- if (length == 0) {
- size = 8;
- } else {
- size *= 2;
- }
- entries = (DictEntry *)grealloc(entries, size * sizeof(DictEntry));
- }
- entries[length].key = key;
- entries[length].val = *val;
- ++length;
-}
-
-inline DictEntry *Dict::find(char *key) {
- int i;
-
- for (i = 0; i < length; ++i) {
- if (!strcmp(key, entries[i].key))
- return &entries[i];
- }
- return NULL;
-}
-
-GBool Dict::is(char *type) {
- DictEntry *e;
-
- return (e = find("Type")) && e->val.isName(type);
-}
-
-Object *Dict::lookup(char *key, Object *obj) {
- DictEntry *e;
-
- return (e = find(key)) ? e->val.fetch(xref, obj) : obj->initNull();
-}
-
-Object *Dict::lookupNF(char *key, Object *obj) {
- DictEntry *e;
-
- return (e = find(key)) ? e->val.copy(obj) : obj->initNull();
-}
-
-char *Dict::getKey(int i) {
- return entries[i].key;
-}
-
-Object *Dict::getVal(int i, Object *obj) {
- return entries[i].val.fetch(xref, obj);
-}
-
-Object *Dict::getValNF(int i, Object *obj) {
- return entries[i].val.copy(obj);
-}
diff --git a/pdf/xpdf/Dict.h b/pdf/xpdf/Dict.h
deleted file mode 100644
index 08f55ec..0000000
--- a/pdf/xpdf/Dict.h
+++ /dev/null
@@ -1,77 +0,0 @@
-//========================================================================
-//
-// Dict.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef DICT_H
-#define DICT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-
-//------------------------------------------------------------------------
-// Dict
-//------------------------------------------------------------------------
-
-struct DictEntry {
- char *key;
- Object val;
-};
-
-class Dict {
-public:
-
- // Constructor.
- Dict(XRef *xrefA);
-
- // Destructor.
- ~Dict();
-
- // Reference counting.
- int incRef() { return ++ref; }
- int decRef() { return --ref; }
-
- // Get number of entries.
- int getLength() { return length; }
-
- // Add an entry. NB: does not copy key.
- void add(char *key, Object *val);
-
- // Check if dictionary is of specified type.
- GBool is(char *type);
-
- // Look up an entry and return the value. Returns a null object
- // if <key> is not in the dictionary.
- Object *lookup(char *key, Object *obj);
- Object *lookupNF(char *key, Object *obj);
-
- // Iterative accessors.
- char *getKey(int i);
- Object *getVal(int i, Object *obj);
- Object *getValNF(int i, Object *obj);
-
- // Set the xref pointer. This is only used in one special case: the
- // trailer dictionary, which is read before the xref table is
- // parsed.
- void setXRef(XRef *xrefA) { xref = xrefA; }
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- DictEntry *entries; // array of entries
- int size; // size of <entries> array
- int length; // number of entries in dictionary
- int ref; // reference count
-
- DictEntry *find(char *key);
-};
-
-#endif
diff --git a/pdf/xpdf/Error.cc b/pdf/xpdf/Error.cc
deleted file mode 100644
index c03f75f..0000000
--- a/pdf/xpdf/Error.cc
+++ /dev/null
@@ -1,38 +0,0 @@
-//========================================================================
-//
-// Error.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdarg.h>
-#include "GlobalParams.h"
-#include "Error.h"
-
-void CDECL error(int pos, char *msg, ...) {
- va_list args;
-
- // NB: this can be called before the globalParams object is created
- if (globalParams && globalParams->getErrQuiet()) {
- return;
- }
- if (pos >= 0) {
- fprintf(stderr, "Error (%d): ", pos);
- } else {
- fprintf(stderr, "Error: ");
- }
- va_start(args, msg);
- vfprintf(stderr, msg, args);
- va_end(args);
- fprintf(stderr, "\n");
- fflush(stderr);
-}
diff --git a/pdf/xpdf/Error.h b/pdf/xpdf/Error.h
deleted file mode 100644
index da2f831..0000000
--- a/pdf/xpdf/Error.h
+++ /dev/null
@@ -1,23 +0,0 @@
-//========================================================================
-//
-// Error.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ERROR_H
-#define ERROR_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include "xpdfconfig.h"
-
-extern void CDECL error(int pos, char *msg, ...);
-
-#endif
diff --git a/pdf/xpdf/ErrorCodes.h b/pdf/xpdf/ErrorCodes.h
deleted file mode 100644
index b28528d..0000000
--- a/pdf/xpdf/ErrorCodes.h
+++ /dev/null
@@ -1,36 +0,0 @@
-//========================================================================
-//
-// ErrorCodes.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef ERRORCODES_H
-#define ERRORCODES_H
-
-#define errNone 0 // no error
-
-#define errOpenFile 1 // couldn't open the PDF file
-
-#define errBadCatalog 2 // couldn't read the page catalog
-
-#define errDamaged 3 // PDF file was damaged and couldn't be
- // repaired
-
-#define errEncrypted 4 // file was encrypted and password was
- // incorrect or not supplied
-
-#define errHighlightFile 5 // nonexistent or invalid highlight file
-
-#define errBadPrinter 6 // invalid printer
-
-#define errPrinting 7 // error during printing
-
-#define errPermission 8 // PDF file doesn't allow that operation
-
-#define errBadPageNum 9 // invalid page number
-
-#define errFileIO 10 // file I/O error
-
-#endif
diff --git a/pdf/xpdf/FontEncodingTables.cc b/pdf/xpdf/FontEncodingTables.cc
deleted file mode 100644
index f3b9280..0000000
--- a/pdf/xpdf/FontEncodingTables.cc
+++ /dev/null
@@ -1,1824 +0,0 @@
-//========================================================================
-//
-// FontEncodingTables.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdlib.h>
-#include "FontEncodingTables.h"
-
-char *macRomanEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quotesingle",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "grave",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- NULL,
- "Adieresis",
- "Aring",
- "Ccedilla",
- "Eacute",
- "Ntilde",
- "Odieresis",
- "Udieresis",
- "aacute",
- "agrave",
- "acircumflex",
- "adieresis",
- "atilde",
- "aring",
- "ccedilla",
- "eacute",
- "egrave",
- "ecircumflex",
- "edieresis",
- "iacute",
- "igrave",
- "icircumflex",
- "idieresis",
- "ntilde",
- "oacute",
- "ograve",
- "ocircumflex",
- "odieresis",
- "otilde",
- "uacute",
- "ugrave",
- "ucircumflex",
- "udieresis",
- "dagger",
- "degree",
- "cent",
- "sterling",
- "section",
- "bullet",
- "paragraph",
- "germandbls",
- "registered",
- "copyright",
- "trademark",
- "acute",
- "dieresis",
- "notequal",
- "AE",
- "Oslash",
- "infinity",
- "plusminus",
- "lessequal",
- "greaterequal",
- "yen",
- "mu",
- "partialdiff",
- "summation",
- "product",
- "pi",
- "integral",
- "ordfeminine",
- "ordmasculine",
- "Omega",
- "ae",
- "oslash",
- "questiondown",
- "exclamdown",
- "logicalnot",
- "radical",
- "florin",
- "approxequal",
- "Delta",
- "guillemotleft",
- "guillemotright",
- "ellipsis",
- "space",
- "Agrave",
- "Atilde",
- "Otilde",
- "OE",
- "oe",
- "endash",
- "emdash",
- "quotedblleft",
- "quotedblright",
- "quoteleft",
- "quoteright",
- "divide",
- "lozenge",
- "ydieresis",
- "Ydieresis",
- "fraction",
- "currency",
- "guilsinglleft",
- "guilsinglright",
- "fi",
- "fl",
- "daggerdbl",
- "periodcentered",
- "quotesinglbase",
- "quotedblbase",
- "perthousand",
- "Acircumflex",
- "Ecircumflex",
- "Aacute",
- "Edieresis",
- "Egrave",
- "Iacute",
- "Icircumflex",
- "Idieresis",
- "Igrave",
- "Oacute",
- "Ocircumflex",
- "apple",
- "Ograve",
- "Uacute",
- "Ucircumflex",
- "Ugrave",
- "dotlessi",
- "circumflex",
- "tilde",
- "macron",
- "breve",
- "dotaccent",
- "ring",
- "cedilla",
- "hungarumlaut",
- "ogonek",
- "caron"
-};
-
-char *macExpertEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclamsmall",
- "Hungarumlautsmall",
- "centoldstyle",
- "dollaroldstyle",
- "dollarsuperior",
- "ampersandsmall",
- "Acutesmall",
- "parenleftsuperior",
- "parenrightsuperior",
- "twodotenleader",
- "onedotenleader",
- "comma",
- "hyphen",
- "period",
- "fraction",
- "zerooldstyle",
- "oneoldstyle",
- "twooldstyle",
- "threeoldstyle",
- "fouroldstyle",
- "fiveoldstyle",
- "sixoldstyle",
- "sevenoldstyle",
- "eightoldstyle",
- "nineoldstyle",
- "colon",
- "semicolon",
- NULL,
- "threequartersemdash",
- NULL,
- "questionsmall",
- NULL,
- NULL,
- NULL,
- NULL,
- "Ethsmall",
- NULL,
- NULL,
- "onequarter",
- "onehalf",
- "threequarters",
- "oneeighth",
- "threeeighths",
- "fiveeighths",
- "seveneighths",
- "onethird",
- "twothirds",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "ff",
- "fi",
- "fl",
- "ffi",
- "ffl",
- "parenleftinferior",
- NULL,
- "parenrightinferior",
- "Circumflexsmall",
- "hypheninferior",
- "Gravesmall",
- "Asmall",
- "Bsmall",
- "Csmall",
- "Dsmall",
- "Esmall",
- "Fsmall",
- "Gsmall",
- "Hsmall",
- "Ismall",
- "Jsmall",
- "Ksmall",
- "Lsmall",
- "Msmall",
- "Nsmall",
- "Osmall",
- "Psmall",
- "Qsmall",
- "Rsmall",
- "Ssmall",
- "Tsmall",
- "Usmall",
- "Vsmall",
- "Wsmall",
- "Xsmall",
- "Ysmall",
- "Zsmall",
- "colonmonetary",
- "onefitted",
- "rupiah",
- "Tildesmall",
- NULL,
- NULL,
- "asuperior",
- "centsuperior",
- NULL,
- NULL,
- NULL,
- NULL,
- "Aacutesmall",
- "Agravesmall",
- "Acircumflexsmall",
- "Adieresissmall",
- "Atildesmall",
- "Aringsmall",
- "Ccedillasmall",
- "Eacutesmall",
- "Egravesmall",
- "Ecircumflexsmall",
- "Edieresissmall",
- "Iacutesmall",
- "Igravesmall",
- "Icircumflexsmall",
- "Idieresissmall",
- "Ntildesmall",
- "Oacutesmall",
- "Ogravesmall",
- "Ocircumflexsmall",
- "Odieresissmall",
- "Otildesmall",
- "Uacutesmall",
- "Ugravesmall",
- "Ucircumflexsmall",
- "Udieresissmall",
- NULL,
- "eightsuperior",
- "fourinferior",
- "threeinferior",
- "sixinferior",
- "eightinferior",
- "seveninferior",
- "Scaronsmall",
- NULL,
- "centinferior",
- "twoinferior",
- NULL,
- "Dieresissmall",
- NULL,
- "Caronsmall",
- "osuperior",
- "fiveinferior",
- NULL,
- "commainferior",
- "periodinferior",
- "Yacutesmall",
- NULL,
- "dollarinferior",
- NULL,
- NULL,
- "Thornsmall",
- NULL,
- "nineinferior",
- "zeroinferior",
- "Zcaronsmall",
- "AEsmall",
- "Oslashsmall",
- "questiondownsmall",
- "oneinferior",
- "Lslashsmall",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "Cedillasmall",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "OEsmall",
- "figuredash",
- "hyphensuperior",
- NULL,
- NULL,
- NULL,
- NULL,
- "exclamdownsmall",
- NULL,
- "Ydieresissmall",
- NULL,
- "onesuperior",
- "twosuperior",
- "threesuperior",
- "foursuperior",
- "fivesuperior",
- "sixsuperior",
- "sevensuperior",
- "ninesuperior",
- "zerosuperior",
- NULL,
- "esuperior",
- "rsuperior",
- "tsuperior",
- NULL,
- NULL,
- "isuperior",
- "ssuperior",
- "dsuperior",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "lsuperior",
- "Ogoneksmall",
- "Brevesmall",
- "Macronsmall",
- "bsuperior",
- "nsuperior",
- "msuperior",
- "commasuperior",
- "periodsuperior",
- "Dotaccentsmall",
- "Ringsmall",
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-char *winAnsiEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quotesingle",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "grave",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- "bullet",
- "Euro",
- "bullet",
- "quotesinglbase",
- "florin",
- "quotedblbase",
- "ellipsis",
- "dagger",
- "daggerdbl",
- "circumflex",
- "perthousand",
- "Scaron",
- "guilsinglleft",
- "OE",
- "bullet",
- "Zcaron",
- "bullet",
- "bullet",
- "quoteleft",
- "quoteright",
- "quotedblleft",
- "quotedblright",
- "bullet",
- "endash",
- "emdash",
- "tilde",
- "trademark",
- "scaron",
- "guilsinglright",
- "oe",
- "bullet",
- "zcaron",
- "Ydieresis",
- "space",
- "exclamdown",
- "cent",
- "sterling",
- "currency",
- "yen",
- "brokenbar",
- "section",
- "dieresis",
- "copyright",
- "ordfeminine",
- "guillemotleft",
- "logicalnot",
- "hyphen",
- "registered",
- "macron",
- "degree",
- "plusminus",
- "twosuperior",
- "threesuperior",
- "acute",
- "mu",
- "paragraph",
- "periodcentered",
- "cedilla",
- "onesuperior",
- "ordmasculine",
- "guillemotright",
- "onequarter",
- "onehalf",
- "threequarters",
- "questiondown",
- "Agrave",
- "Aacute",
- "Acircumflex",
- "Atilde",
- "Adieresis",
- "Aring",
- "AE",
- "Ccedilla",
- "Egrave",
- "Eacute",
- "Ecircumflex",
- "Edieresis",
- "Igrave",
- "Iacute",
- "Icircumflex",
- "Idieresis",
- "Eth",
- "Ntilde",
- "Ograve",
- "Oacute",
- "Ocircumflex",
- "Otilde",
- "Odieresis",
- "multiply",
- "Oslash",
- "Ugrave",
- "Uacute",
- "Ucircumflex",
- "Udieresis",
- "Yacute",
- "Thorn",
- "germandbls",
- "agrave",
- "aacute",
- "acircumflex",
- "atilde",
- "adieresis",
- "aring",
- "ae",
- "ccedilla",
- "egrave",
- "eacute",
- "ecircumflex",
- "edieresis",
- "igrave",
- "iacute",
- "icircumflex",
- "idieresis",
- "eth",
- "ntilde",
- "ograve",
- "oacute",
- "ocircumflex",
- "otilde",
- "odieresis",
- "divide",
- "oslash",
- "ugrave",
- "uacute",
- "ucircumflex",
- "udieresis",
- "yacute",
- "thorn",
- "ydieresis"
-};
-
-char *standardEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclam",
- "quotedbl",
- "numbersign",
- "dollar",
- "percent",
- "ampersand",
- "quoteright",
- "parenleft",
- "parenright",
- "asterisk",
- "plus",
- "comma",
- "hyphen",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "at",
- "A",
- "B",
- "C",
- "D",
- "E",
- "F",
- "G",
- "H",
- "I",
- "J",
- "K",
- "L",
- "M",
- "N",
- "O",
- "P",
- "Q",
- "R",
- "S",
- "T",
- "U",
- "V",
- "W",
- "X",
- "Y",
- "Z",
- "bracketleft",
- "backslash",
- "bracketright",
- "asciicircum",
- "underscore",
- "quoteleft",
- "a",
- "b",
- "c",
- "d",
- "e",
- "f",
- "g",
- "h",
- "i",
- "j",
- "k",
- "l",
- "m",
- "n",
- "o",
- "p",
- "q",
- "r",
- "s",
- "t",
- "u",
- "v",
- "w",
- "x",
- "y",
- "z",
- "braceleft",
- "bar",
- "braceright",
- "asciitilde",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "exclamdown",
- "cent",
- "sterling",
- "fraction",
- "yen",
- "florin",
- "section",
- "currency",
- "quotesingle",
- "quotedblleft",
- "guillemotleft",
- "guilsinglleft",
- "guilsinglright",
- "fi",
- "fl",
- NULL,
- "endash",
- "dagger",
- "daggerdbl",
- "periodcentered",
- NULL,
- "paragraph",
- "bullet",
- "quotesinglbase",
- "quotedblbase",
- "quotedblright",
- "guillemotright",
- "ellipsis",
- "perthousand",
- NULL,
- "questiondown",
- NULL,
- "grave",
- "acute",
- "circumflex",
- "tilde",
- "macron",
- "breve",
- "dotaccent",
- "dieresis",
- NULL,
- "ring",
- "cedilla",
- NULL,
- "hungarumlaut",
- "ogonek",
- "caron",
- "emdash",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "AE",
- NULL,
- "ordfeminine",
- NULL,
- NULL,
- NULL,
- NULL,
- "Lslash",
- "Oslash",
- "OE",
- "ordmasculine",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "ae",
- NULL,
- NULL,
- NULL,
- "dotlessi",
- NULL,
- NULL,
- "lslash",
- "oslash",
- "oe",
- "germandbls",
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-char *expertEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclamsmall",
- "Hungarumlautsmall",
- NULL,
- "dollaroldstyle",
- "dollarsuperior",
- "ampersandsmall",
- "Acutesmall",
- "parenleftsuperior",
- "parenrightsuperior",
- "twodotenleader",
- "onedotenleader",
- "comma",
- "hyphen",
- "period",
- "fraction",
- "zerooldstyle",
- "oneoldstyle",
- "twooldstyle",
- "threeoldstyle",
- "fouroldstyle",
- "fiveoldstyle",
- "sixoldstyle",
- "sevenoldstyle",
- "eightoldstyle",
- "nineoldstyle",
- "colon",
- "semicolon",
- "commasuperior",
- "threequartersemdash",
- "periodsuperior",
- "questionsmall",
- NULL,
- "asuperior",
- "bsuperior",
- "centsuperior",
- "dsuperior",
- "esuperior",
- NULL,
- NULL,
- NULL,
- "isuperior",
- NULL,
- NULL,
- "lsuperior",
- "msuperior",
- "nsuperior",
- "osuperior",
- NULL,
- NULL,
- "rsuperior",
- "ssuperior",
- "tsuperior",
- NULL,
- "ff",
- "fi",
- "fl",
- "ffi",
- "ffl",
- "parenleftinferior",
- NULL,
- "parenrightinferior",
- "Circumflexsmall",
- "hyphensuperior",
- "Gravesmall",
- "Asmall",
- "Bsmall",
- "Csmall",
- "Dsmall",
- "Esmall",
- "Fsmall",
- "Gsmall",
- "Hsmall",
- "Ismall",
- "Jsmall",
- "Ksmall",
- "Lsmall",
- "Msmall",
- "Nsmall",
- "Osmall",
- "Psmall",
- "Qsmall",
- "Rsmall",
- "Ssmall",
- "Tsmall",
- "Usmall",
- "Vsmall",
- "Wsmall",
- "Xsmall",
- "Ysmall",
- "Zsmall",
- "colonmonetary",
- "onefitted",
- "rupiah",
- "Tildesmall",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "exclamdownsmall",
- "centoldstyle",
- "Lslashsmall",
- NULL,
- NULL,
- "Scaronsmall",
- "Zcaronsmall",
- "Dieresissmall",
- "Brevesmall",
- "Caronsmall",
- NULL,
- "Dotaccentsmall",
- NULL,
- NULL,
- "Macronsmall",
- NULL,
- NULL,
- "figuredash",
- "hypheninferior",
- NULL,
- NULL,
- "Ogoneksmall",
- "Ringsmall",
- "Cedillasmall",
- NULL,
- NULL,
- NULL,
- "onequarter",
- "onehalf",
- "threequarters",
- "questiondownsmall",
- "oneeighth",
- "threeeighths",
- "fiveeighths",
- "seveneighths",
- "onethird",
- "twothirds",
- NULL,
- NULL,
- "zerosuperior",
- "onesuperior",
- "twosuperior",
- "threesuperior",
- "foursuperior",
- "fivesuperior",
- "sixsuperior",
- "sevensuperior",
- "eightsuperior",
- "ninesuperior",
- "zeroinferior",
- "oneinferior",
- "twoinferior",
- "threeinferior",
- "fourinferior",
- "fiveinferior",
- "sixinferior",
- "seveninferior",
- "eightinferior",
- "nineinferior",
- "centinferior",
- "dollarinferior",
- "periodinferior",
- "commainferior",
- "Agravesmall",
- "Aacutesmall",
- "Acircumflexsmall",
- "Atildesmall",
- "Adieresissmall",
- "Aringsmall",
- "AEsmall",
- "Ccedillasmall",
- "Egravesmall",
- "Eacutesmall",
- "Ecircumflexsmall",
- "Edieresissmall",
- "Igravesmall",
- "Iacutesmall",
- "Icircumflexsmall",
- "Idieresissmall",
- "Ethsmall",
- "Ntildesmall",
- "Ogravesmall",
- "Oacutesmall",
- "Ocircumflexsmall",
- "Otildesmall",
- "Odieresissmall",
- "OEsmall",
- "Oslashsmall",
- "Ugravesmall",
- "Uacutesmall",
- "Ucircumflexsmall",
- "Udieresissmall",
- "Yacutesmall",
- "Thornsmall",
- "Ydieresissmall"
-};
-
-char *symbolEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "exclam",
- "universal",
- "numbersign",
- "existential",
- "percent",
- "ampersand",
- "suchthat",
- "parenleft",
- "parenright",
- "asteriskmath",
- "plus",
- "comma",
- "minus",
- "period",
- "slash",
- "zero",
- "one",
- "two",
- "three",
- "four",
- "five",
- "six",
- "seven",
- "eight",
- "nine",
- "colon",
- "semicolon",
- "less",
- "equal",
- "greater",
- "question",
- "congruent",
- "Alpha",
- "Beta",
- "Chi",
- "Delta",
- "Epsilon",
- "Phi",
- "Gamma",
- "Eta",
- "Iota",
- "theta1",
- "Kappa",
- "Lambda",
- "Mu",
- "Nu",
- "Omicron",
- "Pi",
- "Theta",
- "Rho",
- "Sigma",
- "Tau",
- "Upsilon",
- "sigma1",
- "Omega",
- "Xi",
- "Psi",
- "Zeta",
- "bracketleft",
- "therefore",
- "bracketright",
- "perpendicular",
- "underscore",
- "radicalex",
- "alpha",
- "beta",
- "chi",
- "delta",
- "epsilon",
- "phi",
- "gamma",
- "eta",
- "iota",
- "phi1",
- "kappa",
- "lambda",
- "mu",
- "nu",
- "omicron",
- "pi",
- "theta",
- "rho",
- "sigma",
- "tau",
- "upsilon",
- "omega1",
- "omega",
- "xi",
- "psi",
- "zeta",
- "braceleft",
- "bar",
- "braceright",
- "similar",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "Upsilon1",
- "minute",
- "lessequal",
- "fraction",
- "infinity",
- "florin",
- "club",
- "diamond",
- "heart",
- "spade",
- "arrowboth",
- "arrowleft",
- "arrowup",
- "arrowright",
- "arrowdown",
- "degree",
- "plusminus",
- "second",
- "greaterequal",
- "multiply",
- "proportional",
- "partialdiff",
- "bullet",
- "divide",
- "notequal",
- "equivalence",
- "approxequal",
- "ellipsis",
- "arrowvertex",
- "arrowhorizex",
- "carriagereturn",
- "aleph",
- "Ifraktur",
- "Rfraktur",
- "weierstrass",
- "circlemultiply",
- "circleplus",
- "emptyset",
- "intersection",
- "union",
- "propersuperset",
- "reflexsuperset",
- "notsubset",
- "propersubset",
- "reflexsubset",
- "element",
- "notelement",
- "angle",
- "gradient",
- "registerserif",
- "copyrightserif",
- "trademarkserif",
- "product",
- "radical",
- "dotmath",
- "logicalnot",
- "logicaland",
- "logicalor",
- "arrowdblboth",
- "arrowdblleft",
- "arrowdblup",
- "arrowdblright",
- "arrowdbldown",
- "lozenge",
- "angleleft",
- "registersans",
- "copyrightsans",
- "trademarksans",
- "summation",
- "parenlefttp",
- "parenleftex",
- "parenleftbt",
- "bracketlefttp",
- "bracketleftex",
- "bracketleftbt",
- "bracelefttp",
- "braceleftmid",
- "braceleftbt",
- "braceex",
- NULL,
- "angleright",
- "integral",
- "integraltp",
- "integralex",
- "integralbt",
- "parenrighttp",
- "parenrightex",
- "parenrightbt",
- "bracketrighttp",
- "bracketrightex",
- "bracketrightbt",
- "bracerighttp",
- "bracerightmid",
- "bracerightbt",
- NULL
-};
-
-char *zapfDingbatsEncoding[256] = {
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "space",
- "a1",
- "a2",
- "a202",
- "a3",
- "a4",
- "a5",
- "a119",
- "a118",
- "a117",
- "a11",
- "a12",
- "a13",
- "a14",
- "a15",
- "a16",
- "a105",
- "a17",
- "a18",
- "a19",
- "a20",
- "a21",
- "a22",
- "a23",
- "a24",
- "a25",
- "a26",
- "a27",
- "a28",
- "a6",
- "a7",
- "a8",
- "a9",
- "a10",
- "a29",
- "a30",
- "a31",
- "a32",
- "a33",
- "a34",
- "a35",
- "a36",
- "a37",
- "a38",
- "a39",
- "a40",
- "a41",
- "a42",
- "a43",
- "a44",
- "a45",
- "a46",
- "a47",
- "a48",
- "a49",
- "a50",
- "a51",
- "a52",
- "a53",
- "a54",
- "a55",
- "a56",
- "a57",
- "a58",
- "a59",
- "a60",
- "a61",
- "a62",
- "a63",
- "a64",
- "a65",
- "a66",
- "a67",
- "a68",
- "a69",
- "a70",
- "a71",
- "a72",
- "a73",
- "a74",
- "a203",
- "a75",
- "a204",
- "a76",
- "a77",
- "a78",
- "a79",
- "a81",
- "a82",
- "a83",
- "a84",
- "a97",
- "a98",
- "a99",
- "a100",
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- NULL,
- "a101",
- "a102",
- "a103",
- "a104",
- "a106",
- "a107",
- "a108",
- "a112",
- "a111",
- "a110",
- "a109",
- "a120",
- "a121",
- "a122",
- "a123",
- "a124",
- "a125",
- "a126",
- "a127",
- "a128",
- "a129",
- "a130",
- "a131",
- "a132",
- "a133",
- "a134",
- "a135",
- "a136",
- "a137",
- "a138",
- "a139",
- "a140",
- "a141",
- "a142",
- "a143",
- "a144",
- "a145",
- "a146",
- "a147",
- "a148",
- "a149",
- "a150",
- "a151",
- "a152",
- "a153",
- "a154",
- "a155",
- "a156",
- "a157",
- "a158",
- "a159",
- "a160",
- "a161",
- "a163",
- "a164",
- "a196",
- "a165",
- "a192",
- "a166",
- "a167",
- "a168",
- "a169",
- "a170",
- "a171",
- "a172",
- "a173",
- "a162",
- "a174",
- "a175",
- "a176",
- "a177",
- "a178",
- "a179",
- "a193",
- "a180",
- "a199",
- "a181",
- "a200",
- "a182",
- NULL,
- "a201",
- "a183",
- "a184",
- "a197",
- "a185",
- "a194",
- "a198",
- "a186",
- "a195",
- "a187",
- "a188",
- "a189",
- "a190",
- "a191",
- NULL
-};
diff --git a/pdf/xpdf/FontEncodingTables.h b/pdf/xpdf/FontEncodingTables.h
deleted file mode 100644
index 8b0a1e7..0000000
--- a/pdf/xpdf/FontEncodingTables.h
+++ /dev/null
@@ -1,20 +0,0 @@
-//========================================================================
-//
-// FontEncodingTables.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FONTENCODINGTABLES_H
-#define FONTENCODINGTABLES_H
-
-extern char *macRomanEncoding[];
-extern char *macExpertEncoding[];
-extern char *winAnsiEncoding[];
-extern char *standardEncoding[];
-extern char *expertEncoding[];
-extern char *symbolEncoding[];
-extern char *zapfDingbatsEncoding[];
-
-#endif
diff --git a/pdf/xpdf/Function.cc b/pdf/xpdf/Function.cc
deleted file mode 100644
index d9d4a93..0000000
--- a/pdf/xpdf/Function.cc
+++ /dev/null
@@ -1,1525 +0,0 @@
-//========================================================================
-//
-// Function.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <locale.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <math.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Dict.h"
-#include "Stream.h"
-#include "Error.h"
-#include "Function.h"
-
-//------------------------------------------------------------------------
-// Function
-//------------------------------------------------------------------------
-
-Function::Function() {
-}
-
-Function::~Function() {
-}
-
-Function *Function::parse(Object *funcObj) {
- Function *func;
- Dict *dict;
- int funcType;
- Object obj1;
-
- if (funcObj->isStream()) {
- dict = funcObj->streamGetDict();
- } else if (funcObj->isDict()) {
- dict = funcObj->getDict();
- } else if (funcObj->isName("Identity")) {
- return new IdentityFunction();
- } else {
- error(-1, "Expected function dictionary or stream");
- return NULL;
- }
-
- if (!dict->lookup("FunctionType", &obj1)->isInt()) {
- error(-1, "Function type is missing or wrong type");
- obj1.free();
- return NULL;
- }
- funcType = obj1.getInt();
- obj1.free();
-
- if (funcType == 0) {
- func = new SampledFunction(funcObj, dict);
- } else if (funcType == 2) {
- func = new ExponentialFunction(funcObj, dict);
- } else if (funcType == 3) {
- func = new StitchingFunction(funcObj, dict);
- } else if (funcType == 4) {
- func = new PostScriptFunction(funcObj, dict);
- } else {
- error(-1, "Unimplemented function type (%d)", funcType);
- return NULL;
- }
- if (!func->isOk()) {
- delete func;
- return NULL;
- }
-
- return func;
-}
-
-GBool Function::init(Dict *dict) {
- Object obj1, obj2;
- int i;
-
- //----- Domain
- if (!dict->lookup("Domain", &obj1)->isArray()) {
- error(-1, "Function is missing domain");
- goto err2;
- }
- m = obj1.arrayGetLength() / 2;
- if (m > funcMaxInputs) {
- error(-1, "Functions with more than %d inputs are unsupported",
- funcMaxInputs);
- goto err2;
- }
- for (i = 0; i < m; ++i) {
- obj1.arrayGet(2*i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function domain array");
- goto err1;
- }
- domain[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function domain array");
- goto err1;
- }
- domain[i][1] = obj2.getNum();
- obj2.free();
- }
- obj1.free();
-
- //----- Range
- hasRange = gFalse;
- n = 0;
- if (dict->lookup("Range", &obj1)->isArray()) {
- hasRange = gTrue;
- n = obj1.arrayGetLength() / 2;
- if (n > funcMaxOutputs) {
- error(-1, "Functions with more than %d outputs are unsupported",
- funcMaxOutputs);
- goto err2;
- }
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(2*i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function range array");
- goto err1;
- }
- range[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function range array");
- goto err1;
- }
- range[i][1] = obj2.getNum();
- obj2.free();
- }
- }
- obj1.free();
-
- return gTrue;
-
- err1:
- obj2.free();
- err2:
- obj1.free();
- return gFalse;
-}
-
-//------------------------------------------------------------------------
-// IdentityFunction
-//------------------------------------------------------------------------
-
-IdentityFunction::IdentityFunction() {
- int i;
-
- // fill these in with arbitrary values just in case they get used
- // somewhere
- m = funcMaxInputs;
- n = funcMaxOutputs;
- for (i = 0; i < funcMaxInputs; ++i) {
- domain[i][0] = 0;
- domain[i][1] = 1;
- }
- hasRange = gFalse;
-}
-
-IdentityFunction::~IdentityFunction() {
-}
-
-void IdentityFunction::transform(double *in, double *out) {
- int i;
-
- for (i = 0; i < funcMaxOutputs; ++i) {
- out[i] = in[i];
- }
-}
-
-//------------------------------------------------------------------------
-// SampledFunction
-//------------------------------------------------------------------------
-
-SampledFunction::SampledFunction(Object *funcObj, Dict *dict) {
- Stream *str;
- int nSamples, sampleBits;
- double sampleMul;
- Object obj1, obj2;
- Guint buf, bitMask;
- int bits;
- int s;
- int i;
-
- samples = NULL;
- ok = gFalse;
-
- //----- initialize the generic stuff
- if (!init(dict)) {
- goto err1;
- }
- if (!hasRange) {
- error(-1, "Type 0 function is missing range");
- goto err1;
- }
-
- //----- get the stream
- if (!funcObj->isStream()) {
- error(-1, "Type 0 function isn't a stream");
- goto err1;
- }
- str = funcObj->getStream();
-
- //----- Size
- if (!dict->lookup("Size", &obj1)->isArray() ||
- obj1.arrayGetLength() != m) {
- error(-1, "Function has missing or invalid size array");
- goto err2;
- }
- for (i = 0; i < m; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!obj2.isInt()) {
- error(-1, "Illegal value in function size array");
- goto err3;
- }
- sampleSize[i] = obj2.getInt();
- obj2.free();
- }
- obj1.free();
-
- //----- BitsPerSample
- if (!dict->lookup("BitsPerSample", &obj1)->isInt()) {
- error(-1, "Function has missing or invalid BitsPerSample");
- goto err2;
- }
- sampleBits = obj1.getInt();
- sampleMul = 1.0 / (double)((1 << sampleBits) - 1);
- obj1.free();
-
- //----- Encode
- if (dict->lookup("Encode", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2*m) {
- for (i = 0; i < m; ++i) {
- obj1.arrayGet(2*i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function encode array");
- goto err3;
- }
- encode[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function encode array");
- goto err3;
- }
- encode[i][1] = obj2.getNum();
- obj2.free();
- }
- } else {
- for (i = 0; i < m; ++i) {
- encode[i][0] = 0;
- encode[i][1] = sampleSize[i] - 1;
- }
- }
- obj1.free();
-
- //----- Decode
- if (dict->lookup("Decode", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2*n) {
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(2*i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function decode array");
- goto err3;
- }
- decode[i][0] = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2*i+1, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function decode array");
- goto err3;
- }
- decode[i][1] = obj2.getNum();
- obj2.free();
- }
- } else {
- for (i = 0; i < n; ++i) {
- decode[i][0] = range[i][0];
- decode[i][1] = range[i][1];
- }
- }
- obj1.free();
-
- //----- samples
- nSamples = n;
- for (i = 0; i < m; ++i)
- nSamples *= sampleSize[i];
- samples = (double *)gmalloc(nSamples * sizeof(double));
- buf = 0;
- bits = 0;
- bitMask = (1 << sampleBits) - 1;
- str->reset();
- for (i = 0; i < nSamples; ++i) {
- if (sampleBits == 8) {
- s = str->getChar();
- } else if (sampleBits == 16) {
- s = str->getChar();
- s = (s << 8) + str->getChar();
- } else if (sampleBits == 32) {
- s = str->getChar();
- s = (s << 8) + str->getChar();
- s = (s << 8) + str->getChar();
- s = (s << 8) + str->getChar();
- } else {
- while (bits < sampleBits) {
- buf = (buf << 8) | (str->getChar() & 0xff);
- bits += 8;
- }
- s = (buf >> (bits - sampleBits)) & bitMask;
- bits -= sampleBits;
- }
- samples[i] = (double)s * sampleMul;
- }
- str->close();
-
- ok = gTrue;
- return;
-
- err3:
- obj2.free();
- err2:
- obj1.free();
- err1:
- return;
-}
-
-SampledFunction::~SampledFunction() {
- if (samples) {
- gfree(samples);
- }
-}
-
-SampledFunction::SampledFunction(SampledFunction *func) {
- int nSamples, i;
-
- memcpy(this, func, sizeof(SampledFunction));
-
- nSamples = n;
- for (i = 0; i < m; ++i) {
- nSamples *= sampleSize[i];
- }
- samples = (double *)gmalloc(nSamples * sizeof(double));
- memcpy(samples, func->samples, nSamples * sizeof(double));
-}
-
-void SampledFunction::transform(double *in, double *out) {
- double x;
- int e[2][funcMaxInputs];
- double efrac[funcMaxInputs];
- double s0[1 << funcMaxInputs], s1[1 << funcMaxInputs];
- int i, j, k, idx;
-
- // map input values into sample array
- for (i = 0; i < m; ++i) {
- x = ((in[i] - domain[i][0]) / (domain[i][1] - domain[i][0])) *
- (encode[i][1] - encode[i][0]) + encode[i][0];
- if (x < 0) {
- x = 0;
- } else if (x > sampleSize[i] - 1) {
- x = sampleSize[i] - 1;
- }
- e[0][i] = (int)floor(x);
- e[1][i] = (int)ceil(x);
- efrac[i] = x - e[0][i];
- }
-
- // for each output, do m-linear interpolation
- for (i = 0; i < n; ++i) {
-
- // pull 2^m values out of the sample array
- for (j = 0; j < (1<<m); ++j) {
- idx = 0;
- for (k = m - 1; k >= 0; --k) {
- idx = idx * sampleSize[k] + e[(j >> k) & 1][k];
- }
- idx = idx * n + i;
- s0[j] = samples[idx];
- }
-
- // do m sets of interpolations
- for (j = 0; j < m; ++j) {
- for (k = 0; k < (1 << (m - j)); k += 2) {
- s1[k >> 1] = (1 - efrac[j]) * s0[k] + efrac[j] * s0[k+1];
- }
- memcpy(s0, s1, (1 << (m - j - 1)) * sizeof(double));
- }
-
- // map output value to range
- out[i] = s0[0] * (decode[i][1] - decode[i][0]) + decode[i][0];
- if (out[i] < range[i][0]) {
- out[i] = range[i][0];
- } else if (out[i] > range[i][1]) {
- out[i] = range[i][1];
- }
- }
-}
-
-//------------------------------------------------------------------------
-// ExponentialFunction
-//------------------------------------------------------------------------
-
-ExponentialFunction::ExponentialFunction(Object *funcObj, Dict *dict) {
- Object obj1, obj2;
- int i;
-
- ok = gFalse;
-
- //----- initialize the generic stuff
- if (!init(dict)) {
- goto err1;
- }
- if (m != 1) {
- error(-1, "Exponential function with more than one input");
- goto err1;
- }
-
- //----- C0
- if (dict->lookup("C0", &obj1)->isArray()) {
- if (hasRange && obj1.arrayGetLength() != n) {
- error(-1, "Function's C0 array is wrong length");
- goto err2;
- }
- n = obj1.arrayGetLength();
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function C0 array");
- goto err3;
- }
- c0[i] = obj2.getNum();
- obj2.free();
- }
- } else {
- if (hasRange && n != 1) {
- error(-1, "Function's C0 array is wrong length");
- goto err2;
- }
- n = 1;
- c0[0] = 0;
- }
- obj1.free();
-
- //----- C1
- if (dict->lookup("C1", &obj1)->isArray()) {
- if (obj1.arrayGetLength() != n) {
- error(-1, "Function's C1 array is wrong length");
- goto err2;
- }
- for (i = 0; i < n; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!obj2.isNum()) {
- error(-1, "Illegal value in function C1 array");
- goto err3;
- }
- c1[i] = obj2.getNum();
- obj2.free();
- }
- } else {
- if (n != 1) {
- error(-1, "Function's C1 array is wrong length");
- goto err2;
- }
- c1[0] = 1;
- }
- obj1.free();
-
- //----- N (exponent)
- if (!dict->lookup("N", &obj1)->isNum()) {
- error(-1, "Function has missing or invalid N");
- goto err2;
- }
- e = obj1.getNum();
- obj1.free();
-
- ok = gTrue;
- return;
-
- err3:
- obj2.free();
- err2:
- obj1.free();
- err1:
- return;
-}
-
-ExponentialFunction::~ExponentialFunction() {
-}
-
-ExponentialFunction::ExponentialFunction(ExponentialFunction *func) {
- memcpy(this, func, sizeof(ExponentialFunction));
-}
-
-void ExponentialFunction::transform(double *in, double *out) {
- double x;
- int i;
-
- if (in[0] < domain[0][0]) {
- x = domain[0][0];
- } else if (in[0] > domain[0][1]) {
- x = domain[0][1];
- } else {
- x = in[0];
- }
- for (i = 0; i < n; ++i) {
- out[i] = c0[i] + pow(x, e) * (c1[i] - c0[i]);
- if (hasRange) {
- if (out[i] < range[i][0]) {
- out[i] = range[i][0];
- } else if (out[i] > range[i][1]) {
- out[i] = range[i][1];
- }
- }
- }
- return;
-}
-
-//------------------------------------------------------------------------
-// StitchingFunction
-//------------------------------------------------------------------------
-
-StitchingFunction::StitchingFunction(Object *funcObj, Dict *dict) {
- Object obj1, obj2;
- int i;
-
- ok = gFalse;
- funcs = NULL;
- bounds = NULL;
- encode = NULL;
-
- //----- initialize the generic stuff
- if (!init(dict)) {
- goto err1;
- }
- if (m != 1) {
- error(-1, "Stitching function with more than one input");
- goto err1;
- }
-
- //----- Functions
- if (!dict->lookup("Functions", &obj1)->isArray()) {
- error(-1, "Missing 'Functions' entry in stitching function");
- goto err1;
- }
- k = obj1.arrayGetLength();
- funcs = (Function **)gmalloc(k * sizeof(Function *));
- bounds = (double *)gmalloc((k + 1) * sizeof(double));
- encode = (double *)gmalloc(2 * k * sizeof(double));
- for (i = 0; i < k; ++i) {
- funcs[i] = NULL;
- }
- for (i = 0; i < k; ++i) {
- if (!(funcs[i] = Function::parse(obj1.arrayGet(i, &obj2)))) {
- goto err2;
- }
- if (i > 0 && (funcs[i]->getInputSize() != 1 ||
- funcs[i]->getOutputSize() != funcs[0]->getOutputSize())) {
- error(-1, "Incompatible subfunctions in stitching function");
- goto err2;
- }
- obj2.free();
- }
- obj1.free();
-
- //----- Bounds
- if (!dict->lookup("Bounds", &obj1)->isArray() ||
- obj1.arrayGetLength() != k - 1) {
- error(-1, "Missing or invalid 'Bounds' entry in stitching function");
- goto err1;
- }
- bounds[0] = domain[0][0];
- for (i = 1; i < k; ++i) {
- if (!obj1.arrayGet(i - 1, &obj2)->isNum()) {
- error(-1, "Invalid type in 'Bounds' array in stitching function");
- goto err2;
- }
- bounds[i] = obj2.getNum();
- obj2.free();
- }
- bounds[k] = domain[0][1];
- obj1.free();
-
- //----- Encode
- if (!dict->lookup("Encode", &obj1)->isArray() ||
- obj1.arrayGetLength() != 2 * k) {
- error(-1, "Missing or invalid 'Encode' entry in stitching function");
- goto err1;
- }
- for (i = 0; i < 2 * k; ++i) {
- if (!obj1.arrayGet(i, &obj2)->isNum()) {
- error(-1, "Invalid type in 'Encode' array in stitching function");
- goto err2;
- }
- encode[i] = obj2.getNum();
- obj2.free();
- }
- obj1.free();
-
- ok = gTrue;
- return;
-
- err2:
- obj2.free();
- err1:
- obj1.free();
-}
-
-StitchingFunction::StitchingFunction(StitchingFunction *func) {
- int i;
-
- k = func->k;
- funcs = (Function **)gmalloc(k * sizeof(Function *));
- for (i = 0; i < k; ++i) {
- funcs[i] = func->funcs[i]->copy();
- }
- bounds = (double *)gmalloc((k + 1) * sizeof(double));
- memcpy(bounds, func->bounds, (k + 1) * sizeof(double));
- encode = (double *)gmalloc(2 * k * sizeof(double));
- memcpy(encode, func->encode, 2 * k * sizeof(double));
- ok = gTrue;
-}
-
-StitchingFunction::~StitchingFunction() {
- int i;
-
- if (funcs) {
- for (i = 0; i < k; ++i) {
- if (funcs[i]) {
- delete funcs[i];
- }
- }
- }
- gfree(funcs);
- gfree(bounds);
- gfree(encode);
-}
-
-void StitchingFunction::transform(double *in, double *out) {
- double x;
- int i;
-
- if (in[0] < domain[0][0]) {
- x = domain[0][0];
- } else if (in[0] > domain[0][1]) {
- x = domain[0][1];
- } else {
- x = in[0];
- }
- for (i = 0; i < k - 1; ++i) {
- if (x < bounds[i+1]) {
- break;
- }
- }
- x = encode[2*i] + ((x - bounds[i]) / (bounds[i+1] - bounds[i])) *
- (encode[2*i+1] - encode[2*i]);
- funcs[i]->transform(&x, out);
-}
-
-//------------------------------------------------------------------------
-// PostScriptFunction
-//------------------------------------------------------------------------
-
-enum PSOp {
- psOpAbs,
- psOpAdd,
- psOpAnd,
- psOpAtan,
- psOpBitshift,
- psOpCeiling,
- psOpCopy,
- psOpCos,
- psOpCvi,
- psOpCvr,
- psOpDiv,
- psOpDup,
- psOpEq,
- psOpExch,
- psOpExp,
- psOpFalse,
- psOpFloor,
- psOpGe,
- psOpGt,
- psOpIdiv,
- psOpIndex,
- psOpLe,
- psOpLn,
- psOpLog,
- psOpLt,
- psOpMod,
- psOpMul,
- psOpNe,
- psOpNeg,
- psOpNot,
- psOpOr,
- psOpPop,
- psOpRoll,
- psOpRound,
- psOpSin,
- psOpSqrt,
- psOpSub,
- psOpTrue,
- psOpTruncate,
- psOpXor,
- psOpIf,
- psOpIfelse,
- psOpReturn
-};
-
-// Note: 'if' and 'ifelse' are parsed separately.
-// The rest are listed here in alphabetical order.
-// The index in this table is equivalent to the entry in PSOp.
-char *psOpNames[] = {
- "abs",
- "add",
- "and",
- "atan",
- "bitshift",
- "ceiling",
- "copy",
- "cos",
- "cvi",
- "cvr",
- "div",
- "dup",
- "eq",
- "exch",
- "exp",
- "false",
- "floor",
- "ge",
- "gt",
- "idiv",
- "index",
- "le",
- "ln",
- "log",
- "lt",
- "mod",
- "mul",
- "ne",
- "neg",
- "not",
- "or",
- "pop",
- "roll",
- "round",
- "sin",
- "sqrt",
- "sub",
- "true",
- "truncate",
- "xor"
-};
-
-#define nPSOps (sizeof(psOpNames) / sizeof(char *))
-
-enum PSObjectType {
- psBool,
- psInt,
- psReal,
- psOperator,
- psBlock
-};
-
-// In the code array, 'if'/'ifelse' operators take up three slots
-// plus space for the code in the subclause(s).
-//
-// +---------------------------------+
-// | psOperator: psOpIf / psOpIfelse |
-// +---------------------------------+
-// | psBlock: ptr=<A> |
-// +---------------------------------+
-// | psBlock: ptr=<B> |
-// +---------------------------------+
-// | if clause |
-// | ... |
-// | psOperator: psOpReturn |
-// +---------------------------------+
-// <A> | else clause |
-// | ... |
-// | psOperator: psOpReturn |
-// +---------------------------------+
-// <B> | ... |
-//
-// For 'if', pointer <A> is present in the code stream but unused.
-
-struct PSObject {
- PSObjectType type;
- union {
- GBool booln; // boolean (stack only)
- int intg; // integer (stack and code)
- double real; // real (stack and code)
- PSOp op; // operator (code only)
- int blk; // if/ifelse block pointer (code only)
- };
-};
-
-#define psStackSize 100
-
-class PSStack {
-public:
-
- PSStack() { sp = psStackSize; }
- void pushBool(GBool booln);
- void pushInt(int intg);
- void pushReal(double real);
- GBool popBool();
- int popInt();
- double popNum();
- GBool empty() { return sp == psStackSize; }
- GBool topIsInt() { return sp < psStackSize && stack[sp].type == psInt; }
- GBool topTwoAreInts()
- { return sp < psStackSize - 1 &&
- stack[sp].type == psInt &&
- stack[sp+1].type == psInt; }
- GBool topIsReal() { return sp < psStackSize && stack[sp].type == psReal; }
- GBool topTwoAreNums()
- { return sp < psStackSize - 1 &&
- (stack[sp].type == psInt || stack[sp].type == psReal) &&
- (stack[sp+1].type == psInt || stack[sp+1].type == psReal); }
- void copy(int n);
- void roll(int n, int j);
- void index(int i);
- void pop();
-
-private:
-
- GBool checkOverflow(int n = 1);
- GBool checkUnderflow();
- GBool checkType(PSObjectType t1, PSObjectType t2);
-
- PSObject stack[psStackSize];
- int sp;
-};
-
-GBool PSStack::checkOverflow(int n) {
- if (sp - n < 0) {
- error(-1, "Stack overflow in PostScript function");
- return gFalse;
- }
- return gTrue;
-}
-
-GBool PSStack::checkUnderflow() {
- if (sp == psStackSize) {
- error(-1, "Stack underflow in PostScript function");
- return gFalse;
- }
- return gTrue;
-}
-
-GBool PSStack::checkType(PSObjectType t1, PSObjectType t2) {
- if (stack[sp].type != t1 && stack[sp].type != t2) {
- error(-1, "Type mismatch in PostScript function");
- return gFalse;
- }
- return gTrue;
-}
-
-void PSStack::pushBool(GBool booln) {
- if (checkOverflow()) {
- stack[--sp].type = psBool;
- stack[sp].booln = booln;
- }
-}
-
-void PSStack::pushInt(int intg) {
- if (checkOverflow()) {
- stack[--sp].type = psInt;
- stack[sp].intg = intg;
- }
-}
-
-void PSStack::pushReal(double real) {
- if (checkOverflow()) {
- stack[--sp].type = psReal;
- stack[sp].real = real;
- }
-}
-
-GBool PSStack::popBool() {
- if (checkUnderflow() && checkType(psBool, psBool)) {
- return stack[sp++].booln;
- }
- return gFalse;
-}
-
-int PSStack::popInt() {
- if (checkUnderflow() && checkType(psInt, psInt)) {
- return stack[sp++].intg;
- }
- return 0;
-}
-
-double PSStack::popNum() {
- double ret;
-
- if (checkUnderflow() && checkType(psInt, psReal)) {
- ret = (stack[sp].type == psInt) ? (double)stack[sp].intg : stack[sp].real;
- ++sp;
- return ret;
- }
- return 0;
-}
-
-void PSStack::copy(int n) {
- int i;
-
- if (!checkOverflow(n)) {
- return;
- }
- for (i = sp + n - 1; i <= sp; ++i) {
- stack[i - n] = stack[i];
- }
- sp -= n;
-}
-
-void PSStack::roll(int n, int j) {
- PSObject obj;
- int i, k;
-
- if (j >= 0) {
- j %= n;
- } else {
- j = -j % n;
- if (j != 0) {
- j = n - j;
- }
- }
- if (n <= 0 || j == 0) {
- return;
- }
- for (i = 0; i < j; ++i) {
- obj = stack[sp];
- for (k = sp; k < sp + n - 1; ++k) {
- stack[k] = stack[k+1];
- }
- stack[sp + n - 1] = obj;
- }
-}
-
-void PSStack::index(int i) {
- if (!checkOverflow()) {
- return;
- }
- --sp;
- stack[sp] = stack[sp + 1 + i];
-}
-
-void PSStack::pop() {
- if (!checkUnderflow()) {
- return;
- }
- ++sp;
-}
-
-PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) {
- Stream *str;
- int codePtr;
- GString *tok;
-
- code = NULL;
- codeSize = 0;
- ok = gFalse;
-
- //----- initialize the generic stuff
- if (!init(dict)) {
- goto err1;
- }
- if (!hasRange) {
- error(-1, "Type 4 function is missing range");
- goto err1;
- }
-
- //----- get the stream
- if (!funcObj->isStream()) {
- error(-1, "Type 4 function isn't a stream");
- goto err1;
- }
- str = funcObj->getStream();
-
- //----- parse the function
- str->reset();
- if (!(tok = getToken(str)) || tok->cmp("{")) {
- error(-1, "Expected '{' at start of PostScript function");
- if (tok) {
- delete tok;
- }
- goto err1;
- }
- delete tok;
- codePtr = 0;
- if (!parseCode(str, &codePtr)) {
- goto err2;
- }
- str->close();
-
- ok = gTrue;
-
- err2:
- str->close();
- err1:
- return;
-}
-
-PostScriptFunction::PostScriptFunction(PostScriptFunction *func) {
- memcpy(this, func, sizeof(PostScriptFunction));
- code = (PSObject *)gmalloc(codeSize * sizeof(PSObject));
- memcpy(code, func->code, codeSize * sizeof(PSObject));
-}
-
-PostScriptFunction::~PostScriptFunction() {
- gfree(code);
-}
-
-void PostScriptFunction::transform(double *in, double *out) {
- PSStack *stack;
- int i;
-
- stack = new PSStack();
- for (i = 0; i < m; ++i) {
- //~ may need to check for integers here
- stack->pushReal(in[i]);
- }
- exec(stack, 0);
- for (i = n - 1; i >= 0; --i) {
- out[i] = stack->popNum();
- if (out[i] < range[i][0]) {
- out[i] = range[i][0];
- } else if (out[i] > range[i][1]) {
- out[i] = range[i][1];
- }
- }
- // if (!stack->empty()) {
- // error(-1, "Extra values on stack at end of PostScript function");
- // }
- delete stack;
-}
-
-GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) {
- GString *tok;
- char *p;
- GBool isReal;
- int opPtr, elsePtr;
- int a, b, mid, cmp;
-
- while (1) {
- if (!(tok = getToken(str))) {
- error(-1, "Unexpected end of PostScript function stream");
- return gFalse;
- }
- p = tok->getCString();
- if (isdigit(*p) || *p == '.' || *p == '-') {
- isReal = gFalse;
- for (++p; *p; ++p) {
- if (*p == '.') {
- isReal = gTrue;
- break;
- }
- }
- resizeCode(*codePtr);
- if (isReal) {
- code[*codePtr].type = psReal;
- {
- char *theLocale = setlocale(LC_NUMERIC, "C");
- code[*codePtr].real = atof(tok->getCString());
- setlocale(LC_NUMERIC, theLocale);
- }
- } else {
- code[*codePtr].type = psInt;
- code[*codePtr].intg = atoi(tok->getCString());
- }
- ++*codePtr;
- delete tok;
- } else if (!tok->cmp("{")) {
- delete tok;
- opPtr = *codePtr;
- *codePtr += 3;
- resizeCode(opPtr + 2);
- if (!parseCode(str, codePtr)) {
- return gFalse;
- }
- if (!(tok = getToken(str))) {
- error(-1, "Unexpected end of PostScript function stream");
- return gFalse;
- }
- if (!tok->cmp("{")) {
- elsePtr = *codePtr;
- if (!parseCode(str, codePtr)) {
- return gFalse;
- }
- delete tok;
- if (!(tok = getToken(str))) {
- error(-1, "Unexpected end of PostScript function stream");
- return gFalse;
- }
- } else {
- elsePtr = -1;
- }
- if (!tok->cmp("if")) {
- if (elsePtr >= 0) {
- error(-1, "Got 'if' operator with two blocks in PostScript function");
- return gFalse;
- }
- code[opPtr].type = psOperator;
- code[opPtr].op = psOpIf;
- code[opPtr+2].type = psBlock;
- code[opPtr+2].blk = *codePtr;
- } else if (!tok->cmp("ifelse")) {
- if (elsePtr < 0) {
- error(-1, "Got 'ifelse' operator with one blocks in PostScript function");
- return gFalse;
- }
- code[opPtr].type = psOperator;
- code[opPtr].op = psOpIfelse;
- code[opPtr+1].type = psBlock;
- code[opPtr+1].blk = elsePtr;
- code[opPtr+2].type = psBlock;
- code[opPtr+2].blk = *codePtr;
- } else {
- error(-1, "Expected if/ifelse operator in PostScript function");
- delete tok;
- return gFalse;
- }
- delete tok;
- } else if (!tok->cmp("}")) {
- delete tok;
- resizeCode(*codePtr);
- code[*codePtr].type = psOperator;
- code[*codePtr].op = psOpReturn;
- ++*codePtr;
- break;
- } else {
- a = -1;
- b = nPSOps;
- // invariant: psOpNames[a] < tok < psOpNames[b]
- while (b - a > 1) {
- mid = (a + b) / 2;
- cmp = tok->cmp(psOpNames[mid]);
- if (cmp > 0) {
- a = mid;
- } else if (cmp < 0) {
- b = mid;
- } else {
- a = b = mid;
- }
- }
- if (cmp != 0) {
- error(-1, "Unknown operator '%s' in PostScript function",
- tok->getCString());
- delete tok;
- return gFalse;
- }
- delete tok;
- resizeCode(*codePtr);
- code[*codePtr].type = psOperator;
- code[*codePtr].op = (PSOp)a;
- ++*codePtr;
- }
- }
- return gTrue;
-}
-
-GString *PostScriptFunction::getToken(Stream *str) {
- GString *s;
- int c;
-
- s = new GString();
- do {
- c = str->getChar();
- } while (c != EOF && isspace(c));
- if (c == '{' || c == '}') {
- s->append((char)c);
- } else if (isdigit(c) || c == '.' || c == '-') {
- while (1) {
- s->append((char)c);
- c = str->lookChar();
- if (c == EOF || !(isdigit(c) || c == '.' || c == '-')) {
- break;
- }
- str->getChar();
- }
- } else {
- while (1) {
- s->append((char)c);
- c = str->lookChar();
- if (c == EOF || !isalnum(c)) {
- break;
- }
- str->getChar();
- }
- }
- return s;
-}
-
-void PostScriptFunction::resizeCode(int newSize) {
- if (newSize >= codeSize) {
- codeSize += 64;
- code = (PSObject *)grealloc(code, codeSize * sizeof(PSObject));
- }
-}
-
-void PostScriptFunction::exec(PSStack *stack, int codePtr) {
- int i1, i2;
- double r1, r2;
- GBool b1, b2;
-
- while (1) {
- switch (code[codePtr].type) {
- case psInt:
- stack->pushInt(code[codePtr++].intg);
- break;
- case psReal:
- stack->pushReal(code[codePtr++].real);
- break;
- case psOperator:
- switch (code[codePtr++].op) {
- case psOpAbs:
- if (stack->topIsInt()) {
- stack->pushInt(abs(stack->popInt()));
- } else {
- stack->pushReal(fabs(stack->popNum()));
- }
- break;
- case psOpAdd:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 + i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(r1 + r2);
- }
- break;
- case psOpAnd:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 & i2);
- } else {
- b2 = stack->popBool();
- b1 = stack->popBool();
- stack->pushBool(b1 && b2);
- }
- break;
- case psOpAtan:
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(atan2(r1, r2));
- break;
- case psOpBitshift:
- i2 = stack->popInt();
- i1 = stack->popInt();
- if (i2 > 0) {
- stack->pushInt(i1 << i2);
- } else if (i2 < 0) {
- stack->pushInt((int)((Guint)i1 >> i2));
- } else {
- stack->pushInt(i1);
- }
- break;
- case psOpCeiling:
- if (!stack->topIsInt()) {
- stack->pushReal(ceil(stack->popNum()));
- }
- break;
- case psOpCopy:
- stack->copy(stack->popInt());
- break;
- case psOpCos:
- stack->pushReal(cos(stack->popNum()));
- break;
- case psOpCvi:
- if (!stack->topIsInt()) {
- stack->pushInt((int)stack->popNum());
- }
- break;
- case psOpCvr:
- if (!stack->topIsReal()) {
- stack->pushReal(stack->popNum());
- }
- break;
- case psOpDiv:
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(r1 / r2);
- break;
- case psOpDup:
- stack->copy(1);
- break;
- case psOpEq:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 == i2);
- } else if (stack->topTwoAreNums()) {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 == r2);
- } else {
- b2 = stack->popBool();
- b1 = stack->popBool();
- stack->pushBool(b1 == b2);
- }
- break;
- case psOpExch:
- stack->roll(2, 1);
- break;
- case psOpExp:
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(pow(r1, r2));
- break;
- case psOpFalse:
- stack->pushBool(gFalse);
- break;
- case psOpFloor:
- if (!stack->topIsInt()) {
- stack->pushReal(floor(stack->popNum()));
- }
- break;
- case psOpGe:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 >= i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 >= r2);
- }
- break;
- case psOpGt:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 > i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 > r2);
- }
- break;
- case psOpIdiv:
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 / i2);
- break;
- case psOpIndex:
- stack->index(stack->popInt());
- break;
- case psOpLe:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 <= i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 <= r2);
- }
- break;
- case psOpLn:
- stack->pushReal(log(stack->popNum()));
- break;
- case psOpLog:
- stack->pushReal(log10(stack->popNum()));
- break;
- case psOpLt:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 < i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 < r2);
- }
- break;
- case psOpMod:
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 % i2);
- break;
- case psOpMul:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- //~ should check for out-of-range, and push a real instead
- stack->pushInt(i1 * i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(r1 * r2);
- }
- break;
- case psOpNe:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushBool(i1 != i2);
- } else if (stack->topTwoAreNums()) {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushBool(r1 != r2);
- } else {
- b2 = stack->popBool();
- b1 = stack->popBool();
- stack->pushBool(b1 != b2);
- }
- break;
- case psOpNeg:
- if (stack->topIsInt()) {
- stack->pushInt(-stack->popInt());
- } else {
- stack->pushReal(-stack->popNum());
- }
- break;
- case psOpNot:
- if (stack->topIsInt()) {
- stack->pushInt(~stack->popInt());
- } else {
- stack->pushBool(!stack->popBool());
- }
- break;
- case psOpOr:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 | i2);
- } else {
- b2 = stack->popBool();
- b1 = stack->popBool();
- stack->pushBool(b1 || b2);
- }
- break;
- case psOpPop:
- stack->pop();
- break;
- case psOpRoll:
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->roll(i1, i2);
- break;
- case psOpRound:
- if (!stack->topIsInt()) {
- r1 = stack->popNum();
- stack->pushReal((r1 >= 0) ? floor(r1 + 0.5) : ceil(r1 - 0.5));
- }
- break;
- case psOpSin:
- stack->pushReal(sin(stack->popNum()));
- break;
- case psOpSqrt:
- stack->pushReal(sqrt(stack->popNum()));
- break;
- case psOpSub:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 - i2);
- } else {
- r2 = stack->popNum();
- r1 = stack->popNum();
- stack->pushReal(r1 - r2);
- }
- break;
- case psOpTrue:
- stack->pushBool(gTrue);
- break;
- case psOpTruncate:
- if (!stack->topIsInt()) {
- r1 = stack->popNum();
- stack->pushReal((r1 >= 0) ? floor(r1) : ceil(r1));
- }
- break;
- case psOpXor:
- if (stack->topTwoAreInts()) {
- i2 = stack->popInt();
- i1 = stack->popInt();
- stack->pushInt(i1 ^ i2);
- } else {
- b2 = stack->popBool();
- b1 = stack->popBool();
- stack->pushBool(b1 ^ b2);
- }
- break;
- case psOpIf:
- b1 = stack->popBool();
- if (b1) {
- exec(stack, codePtr + 2);
- }
- codePtr = code[codePtr + 1].blk;
- break;
- case psOpIfelse:
- b1 = stack->popBool();
- if (b1) {
- exec(stack, codePtr + 2);
- } else {
- exec(stack, code[codePtr].blk);
- }
- codePtr = code[codePtr + 1].blk;
- break;
- case psOpReturn:
- return;
- }
- break;
- default:
- error(-1, "Internal: bad object in PostScript function code");
- break;
- }
- }
-}
diff --git a/pdf/xpdf/Function.h b/pdf/xpdf/Function.h
deleted file mode 100644
index 0ceb035..0000000
--- a/pdf/xpdf/Function.h
+++ /dev/null
@@ -1,183 +0,0 @@
-//========================================================================
-//
-// Function.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef FUNCTION_H
-#define FUNCTION_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-
-class Dict;
-class Stream;
-struct PSObject;
-class PSStack;
-
-//------------------------------------------------------------------------
-// Function
-//------------------------------------------------------------------------
-
-#define funcMaxInputs 8
-#define funcMaxOutputs 32
-
-class Function {
-public:
-
- Function();
-
- virtual ~Function();
-
- // Construct a function. Returns NULL if unsuccessful.
- static Function *parse(Object *funcObj);
-
- // Initialize the entries common to all function types.
- GBool init(Dict *dict);
-
- virtual Function *copy() = 0;
-
- // Return size of input and output tuples.
- int getInputSize() { return m; }
- int getOutputSize() { return n; }
-
- // Transform an input tuple into an output tuple.
- virtual void transform(double *in, double *out) = 0;
-
- virtual GBool isOk() = 0;
-
-protected:
-
- int m, n; // size of input and output tuples
- double // min and max values for function domain
- domain[funcMaxInputs][2];
- double // min and max values for function range
- range[funcMaxOutputs][2];
- GBool hasRange; // set if range is defined
-};
-
-//------------------------------------------------------------------------
-// IdentityFunction
-//------------------------------------------------------------------------
-
-class IdentityFunction: public Function {
-public:
-
- IdentityFunction();
- virtual ~IdentityFunction();
- virtual Function *copy() { return new IdentityFunction(); }
- virtual void transform(double *in, double *out);
- virtual GBool isOk() { return gTrue; }
-
-private:
-};
-
-//------------------------------------------------------------------------
-// SampledFunction
-//------------------------------------------------------------------------
-
-class SampledFunction: public Function {
-public:
-
- SampledFunction(Object *funcObj, Dict *dict);
- virtual ~SampledFunction();
- virtual Function *copy() { return new SampledFunction(this); }
- virtual void transform(double *in, double *out);
- virtual GBool isOk() { return ok; }
-
-private:
-
- SampledFunction(SampledFunction *func);
-
- int // number of samples for each domain element
- sampleSize[funcMaxInputs];
- double // min and max values for domain encoder
- encode[funcMaxInputs][2];
- double // min and max values for range decoder
- decode[funcMaxOutputs][2];
- double *samples; // the samples
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// ExponentialFunction
-//------------------------------------------------------------------------
-
-class ExponentialFunction: public Function {
-public:
-
- ExponentialFunction(Object *funcObj, Dict *dict);
- virtual ~ExponentialFunction();
- virtual Function *copy() { return new ExponentialFunction(this); }
- virtual void transform(double *in, double *out);
- virtual GBool isOk() { return ok; }
-
-private:
-
- ExponentialFunction(ExponentialFunction *func);
-
- double c0[funcMaxOutputs];
- double c1[funcMaxOutputs];
- double e;
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// StitchingFunction
-//------------------------------------------------------------------------
-
-class StitchingFunction: public Function {
-public:
-
- StitchingFunction(Object *funcObj, Dict *dict);
- virtual ~StitchingFunction();
- virtual Function *copy() { return new StitchingFunction(this); }
- virtual void transform(double *in, double *out);
- virtual GBool isOk() { return ok; }
-
-private:
-
- StitchingFunction(StitchingFunction *func);
-
- int k;
- Function **funcs;
- double *bounds;
- double *encode;
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// PostScriptFunction
-//------------------------------------------------------------------------
-
-class PostScriptFunction: public Function {
-public:
-
- PostScriptFunction(Object *funcObj, Dict *dict);
- virtual ~PostScriptFunction();
- virtual Function *copy() { return new PostScriptFunction(this); }
- virtual void transform(double *in, double *out);
- virtual GBool isOk() { return ok; }
-
-private:
-
- PostScriptFunction(PostScriptFunction *func);
- GBool parseCode(Stream *str, int *codePtr);
- GString *getToken(Stream *str);
- void resizeCode(int newSize);
- void exec(PSStack *stack, int codePtr);
-
- PSObject *code;
- int codeSize;
- GBool ok;
-};
-
-#endif
diff --git a/pdf/xpdf/Gfx.cc b/pdf/xpdf/Gfx.cc
deleted file mode 100644
index e530213..0000000
--- a/pdf/xpdf/Gfx.cc
+++ /dev/null
@@ -1,3079 +0,0 @@
-//========================================================================
-//
-// Gfx.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stddef.h>
-#include <string.h>
-#include <math.h>
-#include "gmem.h"
-#include "GlobalParams.h"
-#include "CharTypes.h"
-#include "Object.h"
-#include "Array.h"
-#include "Dict.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "GfxFont.h"
-#include "GfxState.h"
-#include "OutputDev.h"
-#include "Page.h"
-#include "Error.h"
-#include "Gfx.h"
-
-// the MSVC math.h doesn't define this
-#ifndef M_PI
-#define M_PI 3.14159265358979323846
-#endif
-
-//------------------------------------------------------------------------
-// constants
-//------------------------------------------------------------------------
-
-// Max recursive depth for a function shading fill.
-#define functionMaxDepth 6
-
-// Max delta allowed in any color component for a function shading fill.
-#define functionColorDelta (1 / 256.0)
-
-// Max number of splits along the t axis for an axial shading fill.
-#define axialMaxSplits 256
-
-// Max delta allowed in any color component for an axial shading fill.
-#define axialColorDelta (1 / 256.0)
-
-// Max number of splits along the t axis for a radial shading fill.
-#define radialMaxSplits 256
-
-// Max delta allowed in any color component for a radial shading fill.
-#define radialColorDelta (1 / 256.0)
-
-//------------------------------------------------------------------------
-// Operator table
-//------------------------------------------------------------------------
-
-#ifdef WIN32 // this works around a bug in the VC7 compiler
-# pragma optimize("",off)
-#endif
-
-Operator Gfx::opTab[] = {
- {"\"", 3, {tchkNum, tchkNum, tchkString},
- &Gfx::opMoveSetShowText},
- {"'", 1, {tchkString},
- &Gfx::opMoveShowText},
- {"B", 0, {tchkNone},
- &Gfx::opFillStroke},
- {"B*", 0, {tchkNone},
- &Gfx::opEOFillStroke},
- {"BDC", 2, {tchkName, tchkProps},
- &Gfx::opBeginMarkedContent},
- {"BI", 0, {tchkNone},
- &Gfx::opBeginImage},
- {"BMC", 1, {tchkName},
- &Gfx::opBeginMarkedContent},
- {"BT", 0, {tchkNone},
- &Gfx::opBeginText},
- {"BX", 0, {tchkNone},
- &Gfx::opBeginIgnoreUndef},
- {"CS", 1, {tchkName},
- &Gfx::opSetStrokeColorSpace},
- {"DP", 2, {tchkName, tchkProps},
- &Gfx::opMarkPoint},
- {"Do", 1, {tchkName},
- &Gfx::opXObject},
- {"EI", 0, {tchkNone},
- &Gfx::opEndImage},
- {"EMC", 0, {tchkNone},
- &Gfx::opEndMarkedContent},
- {"ET", 0, {tchkNone},
- &Gfx::opEndText},
- {"EX", 0, {tchkNone},
- &Gfx::opEndIgnoreUndef},
- {"F", 0, {tchkNone},
- &Gfx::opFill},
- {"G", 1, {tchkNum},
- &Gfx::opSetStrokeGray},
- {"ID", 0, {tchkNone},
- &Gfx::opImageData},
- {"J", 1, {tchkInt},
- &Gfx::opSetLineCap},
- {"K", 4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opSetStrokeCMYKColor},
- {"M", 1, {tchkNum},
- &Gfx::opSetMiterLimit},
- {"MP", 1, {tchkName},
- &Gfx::opMarkPoint},
- {"Q", 0, {tchkNone},
- &Gfx::opRestore},
- {"RG", 3, {tchkNum, tchkNum, tchkNum},
- &Gfx::opSetStrokeRGBColor},
- {"S", 0, {tchkNone},
- &Gfx::opStroke},
- {"SC", -4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opSetStrokeColor},
- {"SCN", -5, {tchkSCN, tchkSCN, tchkSCN, tchkSCN,
- tchkSCN},
- &Gfx::opSetStrokeColorN},
- {"T*", 0, {tchkNone},
- &Gfx::opTextNextLine},
- {"TD", 2, {tchkNum, tchkNum},
- &Gfx::opTextMoveSet},
- {"TJ", 1, {tchkArray},
- &Gfx::opShowSpaceText},
- {"TL", 1, {tchkNum},
- &Gfx::opSetTextLeading},
- {"Tc", 1, {tchkNum},
- &Gfx::opSetCharSpacing},
- {"Td", 2, {tchkNum, tchkNum},
- &Gfx::opTextMove},
- {"Tf", 2, {tchkName, tchkNum},
- &Gfx::opSetFont},
- {"Tj", 1, {tchkString},
- &Gfx::opShowText},
- {"Tm", 6, {tchkNum, tchkNum, tchkNum, tchkNum,
- tchkNum, tchkNum},
- &Gfx::opSetTextMatrix},
- {"Tr", 1, {tchkInt},
- &Gfx::opSetTextRender},
- {"Ts", 1, {tchkNum},
- &Gfx::opSetTextRise},
- {"Tw", 1, {tchkNum},
- &Gfx::opSetWordSpacing},
- {"Tz", 1, {tchkNum},
- &Gfx::opSetHorizScaling},
- {"W", 0, {tchkNone},
- &Gfx::opClip},
- {"W*", 0, {tchkNone},
- &Gfx::opEOClip},
- {"b", 0, {tchkNone},
- &Gfx::opCloseFillStroke},
- {"b*", 0, {tchkNone},
- &Gfx::opCloseEOFillStroke},
- {"c", 6, {tchkNum, tchkNum, tchkNum, tchkNum,
- tchkNum, tchkNum},
- &Gfx::opCurveTo},
- {"cm", 6, {tchkNum, tchkNum, tchkNum, tchkNum,
- tchkNum, tchkNum},
- &Gfx::opConcat},
- {"cs", 1, {tchkName},
- &Gfx::opSetFillColorSpace},
- {"d", 2, {tchkArray, tchkNum},
- &Gfx::opSetDash},
- {"d0", 2, {tchkNum, tchkNum},
- &Gfx::opSetCharWidth},
- {"d1", 6, {tchkNum, tchkNum, tchkNum, tchkNum,
- tchkNum, tchkNum},
- &Gfx::opSetCacheDevice},
- {"f", 0, {tchkNone},
- &Gfx::opFill},
- {"f*", 0, {tchkNone},
- &Gfx::opEOFill},
- {"g", 1, {tchkNum},
- &Gfx::opSetFillGray},
- {"gs", 1, {tchkName},
- &Gfx::opSetExtGState},
- {"h", 0, {tchkNone},
- &Gfx::opClosePath},
- {"i", 1, {tchkNum},
- &Gfx::opSetFlat},
- {"j", 1, {tchkInt},
- &Gfx::opSetLineJoin},
- {"k", 4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opSetFillCMYKColor},
- {"l", 2, {tchkNum, tchkNum},
- &Gfx::opLineTo},
- {"m", 2, {tchkNum, tchkNum},
- &Gfx::opMoveTo},
- {"n", 0, {tchkNone},
- &Gfx::opEndPath},
- {"q", 0, {tchkNone},
- &Gfx::opSave},
- {"re", 4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opRectangle},
- {"rg", 3, {tchkNum, tchkNum, tchkNum},
- &Gfx::opSetFillRGBColor},
- {"ri", 1, {tchkName},
- &Gfx::opSetRenderingIntent},
- {"s", 0, {tchkNone},
- &Gfx::opCloseStroke},
- {"sc", -4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opSetFillColor},
- {"scn", -5, {tchkSCN, tchkSCN, tchkSCN, tchkSCN,
- tchkSCN},
- &Gfx::opSetFillColorN},
- {"sh", 1, {tchkName},
- &Gfx::opShFill},
- {"v", 4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opCurveTo1},
- {"w", 1, {tchkNum},
- &Gfx::opSetLineWidth},
- {"y", 4, {tchkNum, tchkNum, tchkNum, tchkNum},
- &Gfx::opCurveTo2},
-};
-
-#ifdef WIN32 // this works around a bug in the VC7 compiler
-# pragma optimize("",on)
-#endif
-
-#define numOps (sizeof(opTab) / sizeof(Operator))
-
-//------------------------------------------------------------------------
-// GfxResources
-//------------------------------------------------------------------------
-
-GfxResources::GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA) {
- Object obj1, obj2;
- Ref r;
-
- if (resDict) {
-
- // build font dictionary
- fonts = NULL;
- resDict->lookupNF("Font", &obj1);
- if (obj1.isRef()) {
- obj1.fetch(xref, &obj2);
- if (obj2.isDict()) {
- r = obj1.getRef();
- fonts = new GfxFontDict(xref, &r, obj2.getDict());
- }
- obj2.free();
- } else if (obj1.isDict()) {
- fonts = new GfxFontDict(xref, NULL, obj1.getDict());
- }
- obj1.free();
-
- // get XObject dictionary
- resDict->lookup("XObject", &xObjDict);
-
- // get color space dictionary
- resDict->lookup("ColorSpace", &colorSpaceDict);
-
- // get pattern dictionary
- resDict->lookup("Pattern", &patternDict);
-
- // get shading dictionary
- resDict->lookup("Shading", &shadingDict);
-
- // get graphics state parameter dictionary
- resDict->lookup("ExtGState", &gStateDict);
-
- } else {
- fonts = NULL;
- xObjDict.initNull();
- colorSpaceDict.initNull();
- patternDict.initNull();
- shadingDict.initNull();
- gStateDict.initNull();
- }
-
- next = nextA;
-}
-
-GfxResources::~GfxResources() {
- if (fonts) {
- delete fonts;
- }
- xObjDict.free();
- colorSpaceDict.free();
- patternDict.free();
- shadingDict.free();
- gStateDict.free();
-}
-
-GfxFont *GfxResources::lookupFont(char *name) {
- GfxFont *font;
- GfxResources *resPtr;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->fonts) {
- if ((font = resPtr->fonts->lookup(name)))
- return font;
- }
- }
- error(-1, "Unknown font tag '%s'", name);
- return NULL;
-}
-
-GBool GfxResources::lookupXObject(char *name, Object *obj) {
- GfxResources *resPtr;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->xObjDict.isDict()) {
- if (!resPtr->xObjDict.dictLookup(name, obj)->isNull())
- return gTrue;
- obj->free();
- }
- }
- error(-1, "XObject '%s' is unknown", name);
- return gFalse;
-}
-
-GBool GfxResources::lookupXObjectNF(char *name, Object *obj) {
- GfxResources *resPtr;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->xObjDict.isDict()) {
- if (!resPtr->xObjDict.dictLookupNF(name, obj)->isNull())
- return gTrue;
- obj->free();
- }
- }
- error(-1, "XObject '%s' is unknown", name);
- return gFalse;
-}
-
-void GfxResources::lookupColorSpace(char *name, Object *obj) {
- GfxResources *resPtr;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->colorSpaceDict.isDict()) {
- if (!resPtr->colorSpaceDict.dictLookup(name, obj)->isNull()) {
- return;
- }
- obj->free();
- }
- }
- obj->initNull();
-}
-
-GfxPattern *GfxResources::lookupPattern(char *name) {
- GfxResources *resPtr;
- GfxPattern *pattern;
- Object obj;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->patternDict.isDict()) {
- if (!resPtr->patternDict.dictLookup(name, &obj)->isNull()) {
- pattern = GfxPattern::parse(&obj);
- obj.free();
- return pattern;
- }
- obj.free();
- }
- }
- error(-1, "Unknown pattern '%s'", name);
- return NULL;
-}
-
-GfxShading *GfxResources::lookupShading(char *name) {
- GfxResources *resPtr;
- GfxShading *shading;
- Object obj;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->shadingDict.isDict()) {
- if (!resPtr->shadingDict.dictLookup(name, &obj)->isNull()) {
- shading = GfxShading::parse(&obj);
- obj.free();
- return shading;
- }
- obj.free();
- }
- }
- error(-1, "Unknown shading '%s'", name);
- return NULL;
-}
-
-GBool GfxResources::lookupGState(char *name, Object *obj) {
- GfxResources *resPtr;
-
- for (resPtr = this; resPtr; resPtr = resPtr->next) {
- if (resPtr->gStateDict.isDict()) {
- if (!resPtr->gStateDict.dictLookup(name, obj)->isNull()) {
- return gTrue;
- }
- obj->free();
- }
- }
- error(-1, "ExtGState '%s' is unknown", name);
- return gFalse;
-}
-
-//------------------------------------------------------------------------
-// Gfx
-//------------------------------------------------------------------------
-
-Gfx::Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict,
- double hDPI, double vDPI, PDFRectangle *box, GBool crop,
- PDFRectangle *cropBox, int rotate,
- GBool (*abortCheckCbkA)(void *data),
- void *abortCheckCbkDataA) {
- int i;
-
- xref = xrefA;
- subPage = gFalse;
- printCommands = globalParams->getPrintCommands();
-
- // start the resource stack
- res = new GfxResources(xref, resDict, NULL);
-
- // initialize
- out = outA;
- state = new GfxState(hDPI, vDPI, box, rotate, out->upsideDown());
- fontChanged = gFalse;
- clip = clipNone;
- ignoreUndef = 0;
- out->startPage(pageNum, state);
- out->setDefaultCTM(state->getCTM());
- out->updateAll(state);
- for (i = 0; i < 6; ++i) {
- baseMatrix[i] = state->getCTM()[i];
- }
- formDepth = 0;
- abortCheckCbk = abortCheckCbkA;
- abortCheckCbkData = abortCheckCbkDataA;
-
- // set crop box
- if (crop) {
- state->moveTo(cropBox->x1, cropBox->y1);
- state->lineTo(cropBox->x2, cropBox->y1);
- state->lineTo(cropBox->x2, cropBox->y2);
- state->lineTo(cropBox->x1, cropBox->y2);
- state->closePath();
- state->clip();
- out->clip(state);
- state->clearPath();
- }
-}
-
-Gfx::Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict,
- PDFRectangle *box, GBool crop, PDFRectangle *cropBox,
- GBool (*abortCheckCbkA)(void *data),
- void *abortCheckCbkDataA) {
- int i;
-
- xref = xrefA;
- subPage = gTrue;
- printCommands = globalParams->getPrintCommands();
-
- // start the resource stack
- res = new GfxResources(xref, resDict, NULL);
-
- // initialize
- out = outA;
- state = new GfxState(72, 72, box, 0, gFalse);
- fontChanged = gFalse;
- clip = clipNone;
- ignoreUndef = 0;
- for (i = 0; i < 6; ++i) {
- baseMatrix[i] = state->getCTM()[i];
- }
- formDepth = 0;
- abortCheckCbk = abortCheckCbkA;
- abortCheckCbkData = abortCheckCbkDataA;
-
- // set crop box
- if (crop) {
- state->moveTo(cropBox->x1, cropBox->y1);
- state->lineTo(cropBox->x2, cropBox->y1);
- state->lineTo(cropBox->x2, cropBox->y2);
- state->lineTo(cropBox->x1, cropBox->y2);
- state->closePath();
- state->clip();
- out->clip(state);
- state->clearPath();
- }
-}
-
-Gfx::~Gfx() {
- while (state->hasSaves()) {
- restoreState();
- }
- if (!subPage) {
- out->endPage();
- }
- while (res) {
- popResources();
- }
- if (state) {
- delete state;
- }
-}
-
-void Gfx::display(Object *obj, GBool topLevel) {
- Object obj2;
- int i;
-
- if (obj->isArray()) {
- for (i = 0; i < obj->arrayGetLength(); ++i) {
- obj->arrayGet(i, &obj2);
- if (!obj2.isStream()) {
- error(-1, "Weird page contents");
- obj2.free();
- return;
- }
- obj2.free();
- }
- } else if (!obj->isStream()) {
- error(-1, "Weird page contents");
- return;
- }
- parser = new Parser(xref, new Lexer(xref, obj));
- go(topLevel);
- delete parser;
- parser = NULL;
-}
-
-void Gfx::go(GBool topLevel) {
- Object obj;
- Object args[maxArgs];
- int numArgs, i;
- int lastAbortCheck;
-
- // scan a sequence of objects
- updateLevel = lastAbortCheck = 0;
- numArgs = 0;
- parser->getObj(&obj);
- while (!obj.isEOF()) {
-
- // got a command - execute it
- if (obj.isCmd()) {
- if (printCommands) {
- obj.print(stdout);
- for (i = 0; i < numArgs; ++i) {
- printf(" ");
- args[i].print(stdout);
- }
- printf("\n");
- fflush(stdout);
- }
- execOp(&obj, args, numArgs);
- obj.free();
- for (i = 0; i < numArgs; ++i)
- args[i].free();
- numArgs = 0;
-
- // periodically update display
- if (++updateLevel >= 20000) {
- out->dump();
- updateLevel = 0;
- }
-
- // check for an abort
- if (abortCheckCbk) {
- if (updateLevel - lastAbortCheck > 10) {
- if ((*abortCheckCbk)(abortCheckCbkData)) {
- break;
- }
- lastAbortCheck = updateLevel;
- }
- }
-
- // got an argument - save it
- } else if (numArgs < maxArgs) {
- args[numArgs++] = obj;
-
- // too many arguments - something is wrong
- } else {
- error(getPos(), "Too many args in content stream");
- if (printCommands) {
- printf("throwing away arg: ");
- obj.print(stdout);
- printf("\n");
- fflush(stdout);
- }
- obj.free();
- }
-
- // grab the next object
- parser->getObj(&obj);
- }
- obj.free();
-
- // args at end with no command
- if (numArgs > 0) {
- error(getPos(), "Leftover args in content stream");
- if (printCommands) {
- printf("%d leftovers:", numArgs);
- for (i = 0; i < numArgs; ++i) {
- printf(" ");
- args[i].print(stdout);
- }
- printf("\n");
- fflush(stdout);
- }
- for (i = 0; i < numArgs; ++i)
- args[i].free();
- }
-
- // update display
- if (topLevel && updateLevel > 0) {
- out->dump();
- }
-}
-
-void Gfx::execOp(Object *cmd, Object args[], int numArgs) {
- Operator *op;
- char *name;
- Object *argPtr;
- int i;
-
- // find operator
- name = cmd->getCmd();
- if (!(op = findOp(name))) {
- if (ignoreUndef == 0)
- error(getPos(), "Unknown operator '%s'", name);
- return;
- }
-
- // type check args
- argPtr = args;
- if (op->numArgs >= 0) {
- if (numArgs < op->numArgs) {
- error(getPos(), "Too few (%d) args to '%s' operator", numArgs, name);
- return;
- }
- if (numArgs > op->numArgs) {
-#if 0
- error(getPos(), "Too many (%d) args to '%s' operator", numArgs, name);
-#endif
- argPtr += numArgs - op->numArgs;
- numArgs = op->numArgs;
- }
- } else {
- if (numArgs > -op->numArgs) {
- error(getPos(), "Too many (%d) args to '%s' operator",
- numArgs, name);
- return;
- }
- }
- for (i = 0; i < numArgs; ++i) {
- if (!checkArg(&argPtr[i], op->tchk[i])) {
- error(getPos(), "Arg #%d to '%s' operator is wrong type (%s)",
- i, name, argPtr[i].getTypeName());
- return;
- }
- }
-
- // do it
- (this->*op->func)(argPtr, numArgs);
-}
-
-Operator *Gfx::findOp(char *name) {
- int a, b, m, cmp;
-
- a = -1;
- b = numOps;
- // invariant: opTab[a] < name < opTab[b]
- while (b - a > 1) {
- m = (a + b) / 2;
- cmp = strcmp(opTab[m].name, name);
- if (cmp < 0)
- a = m;
- else if (cmp > 0)
- b = m;
- else
- a = b = m;
- }
- if (cmp != 0)
- return NULL;
- return &opTab[a];
-}
-
-GBool Gfx::checkArg(Object *arg, TchkType type) {
- switch (type) {
- case tchkBool: return arg->isBool();
- case tchkInt: return arg->isInt();
- case tchkNum: return arg->isNum();
- case tchkString: return arg->isString();
- case tchkName: return arg->isName();
- case tchkArray: return arg->isArray();
- case tchkProps: return arg->isDict() || arg->isName();
- case tchkSCN: return arg->isNum() || arg->isName();
- case tchkNone: return gFalse;
- }
- return gFalse;
-}
-
-int Gfx::getPos() {
- return parser ? parser->getPos() : -1;
-}
-
-//------------------------------------------------------------------------
-// graphics state operators
-//------------------------------------------------------------------------
-
-void Gfx::opSave(Object args[], int numArgs) {
- saveState();
-}
-
-void Gfx::opRestore(Object args[], int numArgs) {
- restoreState();
-}
-
-void Gfx::opConcat(Object args[], int numArgs) {
- state->concatCTM(args[0].getNum(), args[1].getNum(),
- args[2].getNum(), args[3].getNum(),
- args[4].getNum(), args[5].getNum());
- out->updateCTM(state, args[0].getNum(), args[1].getNum(),
- args[2].getNum(), args[3].getNum(),
- args[4].getNum(), args[5].getNum());
- fontChanged = gTrue;
-}
-
-void Gfx::opSetDash(Object args[], int numArgs) {
- Array *a;
- int length;
- Object obj;
- double *dash;
- int i;
-
- a = args[0].getArray();
- length = a->getLength();
- if (length == 0) {
- dash = NULL;
- } else {
- dash = (double *)gmalloc(length * sizeof(double));
- for (i = 0; i < length; ++i) {
- dash[i] = a->get(i, &obj)->getNum();
- obj.free();
- }
- }
- state->setLineDash(dash, length, args[1].getNum());
- out->updateLineDash(state);
-}
-
-void Gfx::opSetFlat(Object args[], int numArgs) {
- state->setFlatness((int)args[0].getNum());
- out->updateFlatness(state);
-}
-
-void Gfx::opSetLineJoin(Object args[], int numArgs) {
- state->setLineJoin(args[0].getInt());
- out->updateLineJoin(state);
-}
-
-void Gfx::opSetLineCap(Object args[], int numArgs) {
- state->setLineCap(args[0].getInt());
- out->updateLineCap(state);
-}
-
-void Gfx::opSetMiterLimit(Object args[], int numArgs) {
- state->setMiterLimit(args[0].getNum());
- out->updateMiterLimit(state);
-}
-
-void Gfx::opSetLineWidth(Object args[], int numArgs) {
- state->setLineWidth(args[0].getNum());
- out->updateLineWidth(state);
-}
-
-void Gfx::opSetExtGState(Object args[], int numArgs) {
- Object obj1, obj2;
-
- if (!res->lookupGState(args[0].getName(), &obj1)) {
- return;
- }
- if (!obj1.isDict()) {
- error(getPos(), "ExtGState '%s' is wrong type", args[0].getName());
- obj1.free();
- return;
- }
- if (obj1.dictLookup("ca", &obj2)->isNum()) {
- state->setFillOpacity(obj2.getNum());
- out->updateFillOpacity(state);
- }
- obj2.free();
- if (obj1.dictLookup("CA", &obj2)->isNum()) {
- state->setStrokeOpacity(obj2.getNum());
- out->updateStrokeOpacity(state);
- }
- obj2.free();
- obj1.free();
-}
-
-void Gfx::opSetRenderingIntent(Object args[], int numArgs) {
-}
-
-//------------------------------------------------------------------------
-// color operators
-//------------------------------------------------------------------------
-
-void Gfx::opSetFillGray(Object args[], int numArgs) {
- GfxColor color;
-
- state->setFillPattern(NULL);
- state->setFillColorSpace(new GfxDeviceGrayColorSpace());
- color.c[0] = args[0].getNum();
- state->setFillColor(&color);
- out->updateFillColor(state);
-}
-
-void Gfx::opSetStrokeGray(Object args[], int numArgs) {
- GfxColor color;
-
- state->setStrokePattern(NULL);
- state->setStrokeColorSpace(new GfxDeviceGrayColorSpace());
- color.c[0] = args[0].getNum();
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
-}
-
-void Gfx::opSetFillCMYKColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setFillPattern(NULL);
- state->setFillColorSpace(new GfxDeviceCMYKColorSpace());
- for (i = 0; i < 4; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
-}
-
-void Gfx::opSetStrokeCMYKColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setStrokePattern(NULL);
- state->setStrokeColorSpace(new GfxDeviceCMYKColorSpace());
- for (i = 0; i < 4; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
-}
-
-void Gfx::opSetFillRGBColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setFillPattern(NULL);
- state->setFillColorSpace(new GfxDeviceRGBColorSpace());
- for (i = 0; i < 3; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
-}
-
-void Gfx::opSetStrokeRGBColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setStrokePattern(NULL);
- state->setStrokeColorSpace(new GfxDeviceRGBColorSpace());
- for (i = 0; i < 3; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
-}
-
-void Gfx::opSetFillColorSpace(Object args[], int numArgs) {
- Object obj;
- GfxColorSpace *colorSpace;
- GfxColor color;
- int i;
-
- state->setFillPattern(NULL);
- res->lookupColorSpace(args[0].getName(), &obj);
- if (obj.isNull()) {
- colorSpace = GfxColorSpace::parse(&args[0]);
- } else {
- colorSpace = GfxColorSpace::parse(&obj);
- }
- obj.free();
- if (colorSpace) {
- state->setFillColorSpace(colorSpace);
- } else {
- error(getPos(), "Bad color space (fill)");
- }
- for (i = 0; i < gfxColorMaxComps; ++i) {
- color.c[i] = 0;
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
-}
-
-void Gfx::opSetStrokeColorSpace(Object args[], int numArgs) {
- Object obj;
- GfxColorSpace *colorSpace;
- GfxColor color;
- int i;
-
- state->setStrokePattern(NULL);
- res->lookupColorSpace(args[0].getName(), &obj);
- if (obj.isNull()) {
- colorSpace = GfxColorSpace::parse(&args[0]);
- } else {
- colorSpace = GfxColorSpace::parse(&obj);
- }
- obj.free();
- if (colorSpace) {
- state->setStrokeColorSpace(colorSpace);
- } else {
- error(getPos(), "Bad color space (stroke)");
- }
- for (i = 0; i < gfxColorMaxComps; ++i) {
- color.c[i] = 0;
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
-}
-
-void Gfx::opSetFillColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setFillPattern(NULL);
- for (i = 0; i < numArgs; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
-}
-
-void Gfx::opSetStrokeColor(Object args[], int numArgs) {
- GfxColor color;
- int i;
-
- state->setStrokePattern(NULL);
- for (i = 0; i < numArgs; ++i) {
- color.c[i] = args[i].getNum();
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
-}
-
-void Gfx::opSetFillColorN(Object args[], int numArgs) {
- GfxColor color;
- GfxPattern *pattern;
- int i;
-
- if (state->getFillColorSpace()->getMode() == csPattern) {
- if (numArgs > 1) {
- for (i = 0; i < numArgs && i < 4; ++i) {
- if (args[i].isNum()) {
- color.c[i] = args[i].getNum();
- }
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
- }
- if (args[numArgs-1].isName() &&
- (pattern = res->lookupPattern(args[numArgs-1].getName()))) {
- state->setFillPattern(pattern);
- }
-
- } else {
- state->setFillPattern(NULL);
- for (i = 0; i < numArgs && i < 4; ++i) {
- if (args[i].isNum()) {
- color.c[i] = args[i].getNum();
- }
- }
- state->setFillColor(&color);
- out->updateFillColor(state);
- }
-}
-
-void Gfx::opSetStrokeColorN(Object args[], int numArgs) {
- GfxColor color;
- GfxPattern *pattern;
- int i;
-
- if (state->getStrokeColorSpace()->getMode() == csPattern) {
- if (numArgs > 1) {
- for (i = 0; i < numArgs && i < 4; ++i) {
- if (args[i].isNum()) {
- color.c[i] = args[i].getNum();
- }
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
- }
- if (args[numArgs-1].isName() &&
- (pattern = res->lookupPattern(args[numArgs-1].getName()))) {
- state->setStrokePattern(pattern);
- }
-
- } else {
- state->setStrokePattern(NULL);
- for (i = 0; i < numArgs && i < 4; ++i) {
- if (args[i].isNum()) {
- color.c[i] = args[i].getNum();
- }
- }
- state->setStrokeColor(&color);
- out->updateStrokeColor(state);
- }
-}
-
-//------------------------------------------------------------------------
-// path segment operators
-//------------------------------------------------------------------------
-
-void Gfx::opMoveTo(Object args[], int numArgs) {
- state->moveTo(args[0].getNum(), args[1].getNum());
-}
-
-void Gfx::opLineTo(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- error(getPos(), "No current point in lineto");
- return;
- }
- state->lineTo(args[0].getNum(), args[1].getNum());
-}
-
-void Gfx::opCurveTo(Object args[], int numArgs) {
- double x1, y1, x2, y2, x3, y3;
-
- if (!state->isCurPt()) {
- error(getPos(), "No current point in curveto");
- return;
- }
- x1 = args[0].getNum();
- y1 = args[1].getNum();
- x2 = args[2].getNum();
- y2 = args[3].getNum();
- x3 = args[4].getNum();
- y3 = args[5].getNum();
- state->curveTo(x1, y1, x2, y2, x3, y3);
-}
-
-void Gfx::opCurveTo1(Object args[], int numArgs) {
- double x1, y1, x2, y2, x3, y3;
-
- if (!state->isCurPt()) {
- error(getPos(), "No current point in curveto1");
- return;
- }
- x1 = state->getCurX();
- y1 = state->getCurY();
- x2 = args[0].getNum();
- y2 = args[1].getNum();
- x3 = args[2].getNum();
- y3 = args[3].getNum();
- state->curveTo(x1, y1, x2, y2, x3, y3);
-}
-
-void Gfx::opCurveTo2(Object args[], int numArgs) {
- double x1, y1, x2, y2, x3, y3;
-
- if (!state->isCurPt()) {
- error(getPos(), "No current point in curveto2");
- return;
- }
- x1 = args[0].getNum();
- y1 = args[1].getNum();
- x2 = args[2].getNum();
- y2 = args[3].getNum();
- x3 = x2;
- y3 = y2;
- state->curveTo(x1, y1, x2, y2, x3, y3);
-}
-
-void Gfx::opRectangle(Object args[], int numArgs) {
- double x, y, w, h;
-
- x = args[0].getNum();
- y = args[1].getNum();
- w = args[2].getNum();
- h = args[3].getNum();
- state->moveTo(x, y);
- state->lineTo(x + w, y);
- state->lineTo(x + w, y + h);
- state->lineTo(x, y + h);
- state->closePath();
-}
-
-void Gfx::opClosePath(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- error(getPos(), "No current point in closepath");
- return;
- }
- state->closePath();
-}
-
-//------------------------------------------------------------------------
-// path painting operators
-//------------------------------------------------------------------------
-
-void Gfx::opEndPath(Object args[], int numArgs) {
- doEndPath();
-}
-
-void Gfx::opStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in stroke");
- return;
- }
- if (state->isPath())
- out->stroke(state);
- doEndPath();
-}
-
-void Gfx::opCloseStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in closepath/stroke");
- return;
- }
- if (state->isPath()) {
- state->closePath();
- out->stroke(state);
- }
- doEndPath();
-}
-
-void Gfx::opFill(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in fill");
- return;
- }
- if (state->isPath()) {
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gFalse);
- } else {
- out->fill(state);
- }
- }
- doEndPath();
-}
-
-void Gfx::opEOFill(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in eofill");
- return;
- }
- if (state->isPath()) {
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gTrue);
- } else {
- out->eoFill(state);
- }
- }
- doEndPath();
-}
-
-void Gfx::opFillStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in fill/stroke");
- return;
- }
- if (state->isPath()) {
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gFalse);
- } else {
- out->fill(state);
- }
- out->stroke(state);
- }
- doEndPath();
-}
-
-void Gfx::opCloseFillStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in closepath/fill/stroke");
- return;
- }
- if (state->isPath()) {
- state->closePath();
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gFalse);
- } else {
- out->fill(state);
- }
- out->stroke(state);
- }
- doEndPath();
-}
-
-void Gfx::opEOFillStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in eofill/stroke");
- return;
- }
- if (state->isPath()) {
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gTrue);
- } else {
- out->eoFill(state);
- }
- out->stroke(state);
- }
- doEndPath();
-}
-
-void Gfx::opCloseEOFillStroke(Object args[], int numArgs) {
- if (!state->isCurPt()) {
- //error(getPos(), "No path in closepath/eofill/stroke");
- return;
- }
- if (state->isPath()) {
- state->closePath();
- if (state->getFillColorSpace()->getMode() == csPattern) {
- doPatternFill(gTrue);
- } else {
- out->eoFill(state);
- }
- out->stroke(state);
- }
- doEndPath();
-}
-
-void Gfx::doPatternFill(GBool eoFill) {
- GfxPattern *pattern;
-
- // this is a bit of a kludge -- patterns can be really slow, so we
- // skip them if we're only doing text extraction, since they almost
- // certainly don't contain any text
- if (!out->needNonText()) {
- return;
- }
-
- if (!(pattern = state->getFillPattern())) {
- return;
- }
- switch (pattern->getType()) {
- case 1:
- doTilingPatternFill((GfxTilingPattern *)pattern, eoFill);
- break;
- case 2:
- doShadingPatternFill((GfxShadingPattern *)pattern, eoFill);
- break;
- default:
- error(getPos(), "Unimplemented pattern type (%d) in fill",
- pattern->getType());
- break;
- }
-}
-
-void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, GBool eoFill) {
- GfxPatternColorSpace *patCS;
- GfxColorSpace *cs;
- GfxPath *savedPath;
- double xMin, yMin, xMax, yMax, x, y, x1, y1;
- double cxMin, cyMin, cxMax, cyMax;
- int xi0, yi0, xi1, yi1, xi, yi;
- double *ctm, *btm, *ptm;
- double m[6], ictm[6], m1[6], imb[6];
- double det;
- double xstep, ystep;
- int i;
-
- // get color space
- patCS = (GfxPatternColorSpace *)state->getFillColorSpace();
-
- // construct a (pattern space) -> (current space) transform matrix
- ctm = state->getCTM();
- btm = baseMatrix;
- ptm = tPat->getMatrix();
- // iCTM = invert CTM
- det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
- ictm[0] = ctm[3] * det;
- ictm[1] = -ctm[1] * det;
- ictm[2] = -ctm[2] * det;
- ictm[3] = ctm[0] * det;
- ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
- ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
- // m1 = PTM * BTM = PTM * base transform matrix
- m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2];
- m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3];
- m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2];
- m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3];
- m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4];
- m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5];
- // m = m1 * iCTM = (PTM * BTM) * (iCTM)
- m[0] = m1[0] * ictm[0] + m1[1] * ictm[2];
- m[1] = m1[0] * ictm[1] + m1[1] * ictm[3];
- m[2] = m1[2] * ictm[0] + m1[3] * ictm[2];
- m[3] = m1[2] * ictm[1] + m1[3] * ictm[3];
- m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4];
- m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5];
-
- // construct a (base space) -> (pattern space) transform matrix
- det = 1 / (m1[0] * m1[3] - m1[1] * m1[2]);
- imb[0] = m1[3] * det;
- imb[1] = -m1[1] * det;
- imb[2] = -m1[2] * det;
- imb[3] = m1[0] * det;
- imb[4] = (m1[2] * m1[5] - m1[3] * m1[4]) * det;
- imb[5] = (m1[1] * m1[4] - m1[0] * m1[5]) * det;
-
- // save current graphics state
- savedPath = state->getPath()->copy();
- saveState();
-
- // set underlying color space (for uncolored tiling patterns); set
- // various other parameters (stroke color, line width) to match
- // Adobe's behavior
- if (tPat->getPaintType() == 2 && (cs = patCS->getUnder())) {
- state->setFillColorSpace(cs->copy());
- state->setStrokeColorSpace(cs->copy());
- state->setStrokeColor(state->getFillColor());
- } else {
- state->setFillColorSpace(new GfxDeviceGrayColorSpace());
- state->setStrokeColorSpace(new GfxDeviceGrayColorSpace());
- }
- state->setFillPattern(NULL);
- out->updateFillColor(state);
- state->setStrokePattern(NULL);
- out->updateStrokeColor(state);
- state->setLineWidth(0);
- out->updateLineWidth(state);
-
- // clip to current path
- state->clip();
- if (eoFill) {
- out->eoClip(state);
- } else {
- out->clip(state);
- }
- state->clearPath();
-
- // transform clip region bbox to pattern space
- state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax);
- xMin = xMax = cxMin * imb[0] + cyMin * imb[2] + imb[4];
- yMin = yMax = cxMin * imb[1] + cyMin * imb[3] + imb[5];
- x1 = cxMin * imb[0] + cyMax * imb[2] + imb[4];
- y1 = cxMin * imb[1] + cyMax * imb[3] + imb[5];
- if (x1 < xMin) {
- xMin = x1;
- } else if (x1 > xMax) {
- xMax = x1;
- }
- if (y1 < yMin) {
- yMin = y1;
- } else if (y1 > yMax) {
- yMax = y1;
- }
- x1 = cxMax * imb[0] + cyMin * imb[2] + imb[4];
- y1 = cxMax * imb[1] + cyMin * imb[3] + imb[5];
- if (x1 < xMin) {
- xMin = x1;
- } else if (x1 > xMax) {
- xMax = x1;
- }
- if (y1 < yMin) {
- yMin = y1;
- } else if (y1 > yMax) {
- yMax = y1;
- }
- x1 = cxMax * imb[0] + cyMax * imb[2] + imb[4];
- y1 = cxMax * imb[1] + cyMax * imb[3] + imb[5];
- if (x1 < xMin) {
- xMin = x1;
- } else if (x1 > xMax) {
- xMax = x1;
- }
- if (y1 < yMin) {
- yMin = y1;
- } else if (y1 > yMax) {
- yMax = y1;
- }
-
- // draw the pattern
- //~ this should treat negative steps differently -- start at right/top
- //~ edge instead of left/bottom (?)
- xstep = fabs(tPat->getXStep());
- ystep = fabs(tPat->getYStep());
- xi0 = (int)floor((xMin - tPat->getBBox()[0]) / xstep);
- xi1 = (int)ceil((xMax - tPat->getBBox()[0]) / xstep);
- yi0 = (int)floor((yMin - tPat->getBBox()[1]) / ystep);
- yi1 = (int)ceil((yMax - tPat->getBBox()[1]) / ystep);
- for (i = 0; i < 4; ++i) {
- m1[i] = m[i];
- }
- for (yi = yi0; yi < yi1; ++yi) {
- for (xi = xi0; xi < xi1; ++xi) {
- x = xi * xstep;
- y = yi * ystep;
- m1[4] = x * m[0] + y * m[2] + m[4];
- m1[5] = x * m[1] + y * m[3] + m[5];
- doForm1(tPat->getContentStream(), tPat->getResDict(),
- m1, tPat->getBBox());
- }
- }
-
- // restore graphics state
- restoreState();
- state->setPath(savedPath);
-}
-
-void Gfx::doShadingPatternFill(GfxShadingPattern *sPat, GBool eoFill) {
- GfxShading *shading;
- GfxPath *savedPath;
- double *ctm, *btm, *ptm;
- double m[6], ictm[6], m1[6];
- double xMin, yMin, xMax, yMax;
- double det;
-
- shading = sPat->getShading();
-
- // save current graphics state
- savedPath = state->getPath()->copy();
- saveState();
-
- // clip to bbox
- if (shading->getHasBBox()) {
- shading->getBBox(&xMin, &yMin, &xMax, &yMax);
- state->moveTo(xMin, yMin);
- state->lineTo(xMax, yMin);
- state->lineTo(xMax, yMax);
- state->lineTo(xMin, yMax);
- state->closePath();
- state->clip();
- out->clip(state);
- state->clearPath();
- }
-
- // clip to current path
- state->clip();
- if (eoFill) {
- out->eoClip(state);
- } else {
- out->clip(state);
- }
- state->clearPath();
-
- // construct a (pattern space) -> (current space) transform matrix
- ctm = state->getCTM();
- btm = baseMatrix;
- ptm = sPat->getMatrix();
- // iCTM = invert CTM
- det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
- ictm[0] = ctm[3] * det;
- ictm[1] = -ctm[1] * det;
- ictm[2] = -ctm[2] * det;
- ictm[3] = ctm[0] * det;
- ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
- ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
- // m1 = PTM * BTM = PTM * base transform matrix
- m1[0] = ptm[0] * btm[0] + ptm[1] * btm[2];
- m1[1] = ptm[0] * btm[1] + ptm[1] * btm[3];
- m1[2] = ptm[2] * btm[0] + ptm[3] * btm[2];
- m1[3] = ptm[2] * btm[1] + ptm[3] * btm[3];
- m1[4] = ptm[4] * btm[0] + ptm[5] * btm[2] + btm[4];
- m1[5] = ptm[4] * btm[1] + ptm[5] * btm[3] + btm[5];
- // m = m1 * iCTM = (PTM * BTM) * (iCTM)
- m[0] = m1[0] * ictm[0] + m1[1] * ictm[2];
- m[1] = m1[0] * ictm[1] + m1[1] * ictm[3];
- m[2] = m1[2] * ictm[0] + m1[3] * ictm[2];
- m[3] = m1[2] * ictm[1] + m1[3] * ictm[3];
- m[4] = m1[4] * ictm[0] + m1[5] * ictm[2] + ictm[4];
- m[5] = m1[4] * ictm[1] + m1[5] * ictm[3] + ictm[5];
-
- // set the new matrix
- state->concatCTM(m[0], m[1], m[2], m[3], m[4], m[5]);
- out->updateCTM(state, m[0], m[1], m[2], m[3], m[4], m[5]);
-
- // set the color space
- state->setFillColorSpace(shading->getColorSpace()->copy());
-
- // do shading type-specific operations
- switch (shading->getType()) {
- case 1:
- doFunctionShFill((GfxFunctionShading *)shading);
- break;
- case 2:
- doAxialShFill((GfxAxialShading *)shading);
- break;
- case 3:
- doRadialShFill((GfxRadialShading *)shading);
- break;
- }
-
- // restore graphics state
- restoreState();
- state->setPath(savedPath);
-}
-
-void Gfx::opShFill(Object args[], int numArgs) {
- GfxShading *shading;
- GfxPath *savedPath;
- double xMin, yMin, xMax, yMax;
-
- if (!(shading = res->lookupShading(args[0].getName()))) {
- return;
- }
-
- // save current graphics state
- savedPath = state->getPath()->copy();
- saveState();
-
- // clip to bbox
- if (shading->getHasBBox()) {
- shading->getBBox(&xMin, &yMin, &xMax, &yMax);
- state->moveTo(xMin, yMin);
- state->lineTo(xMax, yMin);
- state->lineTo(xMax, yMax);
- state->lineTo(xMin, yMax);
- state->closePath();
- state->clip();
- out->clip(state);
- state->clearPath();
- }
-
- // set the color space
- state->setFillColorSpace(shading->getColorSpace()->copy());
-
- // do shading type-specific operations
- switch (shading->getType()) {
- case 1:
- doFunctionShFill((GfxFunctionShading *)shading);
- break;
- case 2:
- doAxialShFill((GfxAxialShading *)shading);
- break;
- case 3:
- doRadialShFill((GfxRadialShading *)shading);
- break;
- }
-
- // restore graphics state
- restoreState();
- state->setPath(savedPath);
-
- delete shading;
-}
-
-void Gfx::doFunctionShFill(GfxFunctionShading *shading) {
- double x0, y0, x1, y1;
- GfxColor colors[4];
-
- shading->getDomain(&x0, &y0, &x1, &y1);
- shading->getColor(x0, y0, &colors[0]);
- shading->getColor(x0, y1, &colors[1]);
- shading->getColor(x1, y0, &colors[2]);
- shading->getColor(x1, y1, &colors[3]);
- doFunctionShFill1(shading, x0, y0, x1, y1, colors, 0);
-}
-
-void Gfx::doFunctionShFill1(GfxFunctionShading *shading,
- double x0, double y0,
- double x1, double y1,
- GfxColor *colors, int depth) {
- GfxColor fillColor;
- GfxColor color0M, color1M, colorM0, colorM1, colorMM;
- GfxColor colors2[4];
- double *matrix;
- double xM, yM;
- int nComps, i, j;
-
- nComps = shading->getColorSpace()->getNComps();
- matrix = shading->getMatrix();
-
- // compare the four corner colors
- for (i = 0; i < 4; ++i) {
- for (j = 0; j < nComps; ++j) {
- if (fabs(colors[i].c[j] - colors[(i+1)&3].c[j]) > functionColorDelta) {
- break;
- }
- }
- if (j < nComps) {
- break;
- }
- }
-
- // center of the rectangle
- xM = 0.5 * (x0 + x1);
- yM = 0.5 * (y0 + y1);
-
- // the four corner colors are close (or we hit the recursive limit)
- // -- fill the rectangle; but require at least one subdivision
- // (depth==0) to avoid problems when the four outer corners of the
- // shaded region are the same color
- if ((i == 4 && depth > 0) || depth == functionMaxDepth) {
-
- // use the center color
- shading->getColor(xM, yM, &fillColor);
- state->setFillColor(&fillColor);
- out->updateFillColor(state);
-
- // fill the rectangle
- state->moveTo(x0 * matrix[0] + y0 * matrix[2] + matrix[4],
- x0 * matrix[1] + y0 * matrix[3] + matrix[5]);
- state->lineTo(x1 * matrix[0] + y0 * matrix[2] + matrix[4],
- x1 * matrix[1] + y0 * matrix[3] + matrix[5]);
- state->lineTo(x1 * matrix[0] + y1 * matrix[2] + matrix[4],
- x1 * matrix[1] + y1 * matrix[3] + matrix[5]);
- state->lineTo(x0 * matrix[0] + y1 * matrix[2] + matrix[4],
- x0 * matrix[1] + y1 * matrix[3] + matrix[5]);
- state->closePath();
- out->fill(state);
- state->clearPath();
-
- // the four corner colors are not close enough -- subdivide the
- // rectangle
- } else {
-
- // colors[0] colorM0 colors[2]
- // (x0,y0) (xM,y0) (x1,y0)
- // +----------+----------+
- // | | |
- // | UL | UR |
- // color0M | colorMM | color1M
- // (x0,yM) +----------+----------+ (x1,yM)
- // | (xM,yM) |
- // | LL | LR |
- // | | |
- // +----------+----------+
- // colors[1] colorM1 colors[3]
- // (x0,y1) (xM,y1) (x1,y1)
-
- shading->getColor(x0, yM, &color0M);
- shading->getColor(x1, yM, &color1M);
- shading->getColor(xM, y0, &colorM0);
- shading->getColor(xM, y1, &colorM1);
- shading->getColor(xM, yM, &colorMM);
-
- // upper-left sub-rectangle
- colors2[0] = colors[0];
- colors2[1] = color0M;
- colors2[2] = colorM0;
- colors2[3] = colorMM;
- doFunctionShFill1(shading, x0, y0, xM, yM, colors2, depth + 1);
-
- // lower-left sub-rectangle
- colors2[0] = color0M;
- colors2[1] = colors[1];
- colors2[2] = colorMM;
- colors2[3] = colorM1;
- doFunctionShFill1(shading, x0, yM, xM, y1, colors2, depth + 1);
-
- // upper-right sub-rectangle
- colors2[0] = colorM0;
- colors2[1] = colorMM;
- colors2[2] = colors[2];
- colors2[3] = color1M;
- doFunctionShFill1(shading, xM, y0, x1, yM, colors2, depth + 1);
-
- // lower-right sub-rectangle
- colors2[0] = colorMM;
- colors2[1] = colorM1;
- colors2[2] = color1M;
- colors2[3] = colors[3];
- doFunctionShFill1(shading, xM, yM, x1, y1, colors2, depth + 1);
- }
-}
-
-void Gfx::doAxialShFill(GfxAxialShading *shading) {
- double xMin, yMin, xMax, yMax;
- double x0, y0, x1, y1;
- double dx, dy, mul;
- double tMin, tMax, t, tx, ty;
- double s[4], sMin, sMax, tmp;
- double ux0, uy0, ux1, uy1, vx0, vy0, vx1, vy1;
- double t0, t1, tt;
- double ta[axialMaxSplits + 1];
- int next[axialMaxSplits + 1];
- GfxColor color0, color1;
- int nComps;
- int i, j, k, kk;
-
- // get the clip region bbox
- state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
-
- // compute min and max t values, based on the four corners of the
- // clip region bbox
- shading->getCoords(&x0, &y0, &x1, &y1);
- dx = x1 - x0;
- dy = y1 - y0;
- mul = 1 / (dx * dx + dy * dy);
- tMin = tMax = ((xMin - x0) * dx + (yMin - y0) * dy) * mul;
- t = ((xMin - x0) * dx + (yMax - y0) * dy) * mul;
- if (t < tMin) {
- tMin = t;
- } else if (t > tMax) {
- tMax = t;
- }
- t = ((xMax - x0) * dx + (yMin - y0) * dy) * mul;
- if (t < tMin) {
- tMin = t;
- } else if (t > tMax) {
- tMax = t;
- }
- t = ((xMax - x0) * dx + (yMax - y0) * dy) * mul;
- if (t < tMin) {
- tMin = t;
- } else if (t > tMax) {
- tMax = t;
- }
- if (tMin < 0 && !shading->getExtend0()) {
- tMin = 0;
- }
- if (tMax > 1 && !shading->getExtend1()) {
- tMax = 1;
- }
-
- // get the function domain
- t0 = shading->getDomain0();
- t1 = shading->getDomain1();
-
- // Traverse the t axis and do the shading.
- //
- // For each point (tx, ty) on the t axis, consider a line through
- // that point perpendicular to the t axis:
- //
- // x(s) = tx + s * -dy --> s = (x - tx) / -dy
- // y(s) = ty + s * dx --> s = (y - ty) / dx
- //
- // Then look at the intersection of this line with the bounding box
- // (xMin, yMin, xMax, yMax). In the general case, there are four
- // intersection points:
- //
- // s0 = (xMin - tx) / -dy
- // s1 = (xMax - tx) / -dy
- // s2 = (yMin - ty) / dx
- // s3 = (yMax - ty) / dx
- //
- // and we want the middle two s values.
- //
- // In the case where dx = 0, take s0 and s1; in the case where dy =
- // 0, take s2 and s3.
- //
- // Each filled polygon is bounded by two of these line segments
- // perpdendicular to the t axis.
- //
- // The t axis is bisected into smaller regions until the color
- // difference across a region is small enough, and then the region
- // is painted with a single color.
-
- // set up: require at least one split to avoid problems when the two
- // ends of the t axis have the same color
- nComps = shading->getColorSpace()->getNComps();
- ta[0] = tMin;
- next[0] = axialMaxSplits / 2;
- ta[axialMaxSplits / 2] = 0.5 * (tMin + tMax);
- next[axialMaxSplits / 2] = axialMaxSplits;
- ta[axialMaxSplits] = tMax;
-
- // compute the color at t = tMin
- if (tMin < 0) {
- tt = t0;
- } else if (tMin > 1) {
- tt = t1;
- } else {
- tt = t0 + (t1 - t0) * tMin;
- }
- shading->getColor(tt, &color0);
-
- // compute the coordinates of the point on the t axis at t = tMin;
- // then compute the intersection of the perpendicular line with the
- // bounding box
- tx = x0 + tMin * dx;
- ty = y0 + tMin * dy;
- if (dx == 0 && dy == 0) {
- sMin = sMax = 0;
- } if (dx == 0) {
- sMin = (xMin - tx) / -dy;
- sMax = (xMax - tx) / -dy;
- if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
- } else if (dy == 0) {
- sMin = (yMin - ty) / dx;
- sMax = (yMax - ty) / dx;
- if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
- } else {
- s[0] = (yMin - ty) / dx;
- s[1] = (yMax - ty) / dx;
- s[2] = (xMin - tx) / -dy;
- s[3] = (xMax - tx) / -dy;
- for (j = 0; j < 3; ++j) {
- kk = j;
- for (k = j + 1; k < 4; ++k) {
- if (s[k] < s[kk]) {
- kk = k;
- }
- }
- tmp = s[j]; s[j] = s[kk]; s[kk] = tmp;
- }
- sMin = s[1];
- sMax = s[2];
- }
- ux0 = tx - sMin * dy;
- uy0 = ty + sMin * dx;
- vx0 = tx - sMax * dy;
- vy0 = ty + sMax * dx;
-
- i = 0;
- while (i < axialMaxSplits) {
-
- // bisect until color difference is small enough or we hit the
- // bisection limit
- j = next[i];
- while (j > i + 1) {
- if (ta[j] < 0) {
- tt = t0;
- } else if (ta[j] > 1) {
- tt = t1;
- } else {
- tt = t0 + (t1 - t0) * ta[j];
- }
- shading->getColor(tt, &color1);
- for (k = 0; k < nComps; ++k) {
- if (fabs(color1.c[k] - color0.c[k]) > axialColorDelta) {
- break;
- }
- }
- if (k == nComps) {
- break;
- }
- k = (i + j) / 2;
- ta[k] = 0.5 * (ta[i] + ta[j]);
- next[i] = k;
- next[k] = j;
- j = k;
- }
-
- // use the average of the colors of the two sides of the region
- for (k = 0; k < nComps; ++k) {
- color0.c[k] = 0.5 * (color0.c[k] + color1.c[k]);
- }
-
- // compute the coordinates of the point on the t axis; then
- // compute the intersection of the perpendicular line with the
- // bounding box
- tx = x0 + ta[j] * dx;
- ty = y0 + ta[j] * dy;
- if (dx == 0 && dy == 0) {
- sMin = sMax = 0;
- } if (dx == 0) {
- sMin = (xMin - tx) / -dy;
- sMax = (xMax - tx) / -dy;
- if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
- } else if (dy == 0) {
- sMin = (yMin - ty) / dx;
- sMax = (yMax - ty) / dx;
- if (sMin > sMax) { tmp = sMin; sMin = sMax; sMax = tmp; }
- } else {
- s[0] = (yMin - ty) / dx;
- s[1] = (yMax - ty) / dx;
- s[2] = (xMin - tx) / -dy;
- s[3] = (xMax - tx) / -dy;
- for (j = 0; j < 3; ++j) {
- kk = j;
- for (k = j + 1; k < 4; ++k) {
- if (s[k] < s[kk]) {
- kk = k;
- }
- }
- tmp = s[j]; s[j] = s[kk]; s[kk] = tmp;
- }
- sMin = s[1];
- sMax = s[2];
- }
- ux1 = tx - sMin * dy;
- uy1 = ty + sMin * dx;
- vx1 = tx - sMax * dy;
- vy1 = ty + sMax * dx;
-
- // set the color
- state->setFillColor(&color0);
- out->updateFillColor(state);
-
- // fill the region
- state->moveTo(ux0, uy0);
- state->lineTo(vx0, vy0);
- state->lineTo(vx1, vy1);
- state->lineTo(ux1, uy1);
- state->closePath();
- out->fill(state);
- state->clearPath();
-
- // set up for next region
- ux0 = ux1;
- uy0 = uy1;
- vx0 = vx1;
- vy0 = vy1;
- color0 = color1;
- i = next[i];
- }
-}
-
-void Gfx::doRadialShFill(GfxRadialShading *shading) {
- double sMin, sMax, xMin, yMin, xMax, yMax;
- double x0, y0, r0, x1, y1, r1, t0, t1;
- int nComps;
- GfxColor colorA, colorB;
- double xa, ya, xb, yb, ra, rb;
- double ta, tb, sa, sb;
- int ia, ib, k, n;
- double *ctm;
- double angle, t;
-
- // get the shading info
- shading->getCoords(&x0, &y0, &r0, &x1, &y1, &r1);
- t0 = shading->getDomain0();
- t1 = shading->getDomain1();
- nComps = shading->getColorSpace()->getNComps();
-
- // compute the (possibly extended) s range
- sMin = 0;
- sMax = 1;
- if (shading->getExtend0()) {
- if (r0 < r1) {
- // extend the smaller end
- sMin = -r0 / (r1 - r0);
- } else {
- // extend the larger end
- //~ this computes the diagonal of the bounding box -- we should
- //~ really compute the intersection of the moving/expanding
- //~ circles with each of the four corners and look for the max
- //~ radius
- state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
- sMin = (sqrt((xMax - xMin) * (xMax - xMin) +
- (yMax - yMin) * (yMax - yMin)) - r0) / (r1 - r0);
- if (sMin > 0) {
- sMin = 0;
- } else if (sMin < -20) {
- // sanity check
- sMin = -20;
- }
- }
- }
- if (shading->getExtend1()) {
- if (r1 < r0) {
- // extend the smaller end
- sMax = -r0 / (r1 - r0);
- } else if (r1 > r0) {
- // extend the larger end
- state->getUserClipBBox(&xMin, &yMin, &xMax, &yMax);
- sMax = (sqrt((xMax - xMin) * (xMax - xMin) +
- (yMax - yMin) * (yMax - yMin)) - r0) / (r1 - r0);
- if (sMax < 1) {
- sMin = 1;
- } else if (sMax > 20) {
- // sanity check
- sMax = 20;
- }
- }
- }
-
- // compute the number of steps into which circles must be divided to
- // achieve a curve flatness of 0.1 pixel in device space for the
- // largest circle (note that "device space" is 72 dpi when generating
- // PostScript, hence the relatively small 0.1 pixel accuracy)
- ctm = state->getCTM();
- t = fabs(ctm[0]);
- if (fabs(ctm[1]) > t) {
- t = fabs(ctm[1]);
- }
- if (fabs(ctm[2]) > t) {
- t = fabs(ctm[2]);
- }
- if (fabs(ctm[3]) > t) {
- t = fabs(ctm[3]);
- }
- if (r0 > r1) {
- t *= r0;
- } else {
- t *= r1;
- }
- if (t < 1) {
- n = 3;
- } else {
- n = (int)(M_PI / acos(1 - 0.1 / t));
- if (n < 3) {
- n = 3;
- } else if (n > 200) {
- n = 200;
- }
- }
-
- // Traverse the t axis and do the shading.
- //
- // This generates and fills a series of rings. Each ring is defined
- // by two circles:
- // sa, ta, xa, ya, ra, colorA
- // sb, tb, xb, yb, rb, colorB
- //
- // The s/t axis is divided into radialMaxSplits parts; these parts
- // are combined as much as possible while respecting the
- // radialColorDelta parameter.
-
- // setup for the start circle
- ia = 0;
- sa = sMin;
- ta = t0 + sa * (t1 - t0);
- xa = x0 + sa * (x1 - x0);
- ya = y0 + sa * (y1 - y0);
- ra = r0 + sa * (r1 - r0);
- if (ta < t0) {
- shading->getColor(t0, &colorA);
- } else if (ta > t1) {
- shading->getColor(t1, &colorA);
- } else {
- shading->getColor(ta, &colorA);
- }
-
- while (ia < radialMaxSplits) {
-
- // go as far along the t axis (toward t1) as we can, such that the
- // color difference is within the tolerance (radialColorDelta) --
- // this uses bisection (between the current value, t, and t1),
- // limited to radialMaxSplits points along the t axis; require at
- // least one split to avoid problems when the innermost and
- // outermost colors are the same
- ib = radialMaxSplits;
- sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin);
- tb = t0 + sb * (t1 - t0);
- if (tb < t0) {
- shading->getColor(t0, &colorB);
- } else if (tb > t1) {
- shading->getColor(t1, &colorB);
- } else {
- shading->getColor(tb, &colorB);
- }
- while (ib - ia > 1) {
- for (k = 0; k < nComps; ++k) {
- if (fabs(colorB.c[k] - colorA.c[k]) > radialColorDelta) {
- break;
- }
- }
- if (k == nComps && ib < radialMaxSplits) {
- break;
- }
- ib = (ia + ib) / 2;
- sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin);
- tb = t0 + sb * (t1 - t0);
- if (tb < t0) {
- shading->getColor(t0, &colorB);
- } else if (tb > t1) {
- shading->getColor(t1, &colorB);
- } else {
- shading->getColor(tb, &colorB);
- }
- }
-
- // compute center and radius of the circle
- xb = x0 + sb * (x1 - x0);
- yb = y0 + sb * (y1 - y0);
- rb = r0 + sb * (r1 - r0);
-
- // use the average of the colors at the two circles
- for (k = 0; k < nComps; ++k) {
- colorA.c[k] = 0.5 * (colorA.c[k] + colorB.c[k]);
- }
- state->setFillColor(&colorA);
- out->updateFillColor(state);
-
- // construct path for first circle
- state->moveTo(xa + ra, ya);
- for (k = 1; k < n; ++k) {
- angle = ((double)k / (double)n) * 2 * M_PI;
- state->lineTo(xa + ra * cos(angle), ya + ra * sin(angle));
- }
- state->closePath();
-
- // construct and append path for second circle
- state->moveTo(xb + rb, yb);
- for (k = 1; k < n; ++k) {
- angle = ((double)k / (double)n) * 2 * M_PI;
- state->lineTo(xb + rb * cos(angle), yb + rb * sin(angle));
- }
- state->closePath();
-
- // fill the ring
- out->eoFill(state);
- state->clearPath();
-
- // step to the next value of t
- ia = ib;
- sa = sb;
- ta = tb;
- xa = xb;
- ya = yb;
- ra = rb;
- colorA = colorB;
- }
-}
-
-void Gfx::doEndPath() {
- if (state->isCurPt() && clip != clipNone) {
- state->clip();
- if (clip == clipNormal) {
- out->clip(state);
- } else {
- out->eoClip(state);
- }
- }
- clip = clipNone;
- state->clearPath();
-}
-
-//------------------------------------------------------------------------
-// path clipping operators
-//------------------------------------------------------------------------
-
-void Gfx::opClip(Object args[], int numArgs) {
- clip = clipNormal;
-}
-
-void Gfx::opEOClip(Object args[], int numArgs) {
- clip = clipEO;
-}
-
-//------------------------------------------------------------------------
-// text object operators
-//------------------------------------------------------------------------
-
-void Gfx::opBeginText(Object args[], int numArgs) {
- state->setTextMat(1, 0, 0, 1, 0, 0);
- state->textMoveTo(0, 0);
- out->updateTextMat(state);
- out->updateTextPos(state);
- fontChanged = gTrue;
-}
-
-void Gfx::opEndText(Object args[], int numArgs) {
- out->endTextObject(state);
-}
-
-//------------------------------------------------------------------------
-// text state operators
-//------------------------------------------------------------------------
-
-void Gfx::opSetCharSpacing(Object args[], int numArgs) {
- state->setCharSpace(args[0].getNum());
- out->updateCharSpace(state);
-}
-
-void Gfx::opSetFont(Object args[], int numArgs) {
- GfxFont *font;
-
- if (!(font = res->lookupFont(args[0].getName()))) {
- return;
- }
- if (printCommands) {
- printf(" font: tag=%s name='%s' %g\n",
- font->getTag()->getCString(),
- font->getName() ? font->getName()->getCString() : "???",
- args[1].getNum());
- fflush(stdout);
- }
- state->setFont(font, args[1].getNum());
- fontChanged = gTrue;
-}
-
-void Gfx::opSetTextLeading(Object args[], int numArgs) {
- state->setLeading(args[0].getNum());
-}
-
-void Gfx::opSetTextRender(Object args[], int numArgs) {
- state->setRender(args[0].getInt());
- out->updateRender(state);
-}
-
-void Gfx::opSetTextRise(Object args[], int numArgs) {
- state->setRise(args[0].getNum());
- out->updateRise(state);
-}
-
-void Gfx::opSetWordSpacing(Object args[], int numArgs) {
- state->setWordSpace(args[0].getNum());
- out->updateWordSpace(state);
-}
-
-void Gfx::opSetHorizScaling(Object args[], int numArgs) {
- state->setHorizScaling(args[0].getNum());
- out->updateHorizScaling(state);
- fontChanged = gTrue;
-}
-
-//------------------------------------------------------------------------
-// text positioning operators
-//------------------------------------------------------------------------
-
-void Gfx::opTextMove(Object args[], int numArgs) {
- double tx, ty;
-
- tx = state->getLineX() + args[0].getNum();
- ty = state->getLineY() + args[1].getNum();
- state->textMoveTo(tx, ty);
- out->updateTextPos(state);
-}
-
-void Gfx::opTextMoveSet(Object args[], int numArgs) {
- double tx, ty;
-
- tx = state->getLineX() + args[0].getNum();
- ty = args[1].getNum();
- state->setLeading(-ty);
- ty += state->getLineY();
- state->textMoveTo(tx, ty);
- out->updateTextPos(state);
-}
-
-void Gfx::opSetTextMatrix(Object args[], int numArgs) {
- state->setTextMat(args[0].getNum(), args[1].getNum(),
- args[2].getNum(), args[3].getNum(),
- args[4].getNum(), args[5].getNum());
- state->textMoveTo(0, 0);
- out->updateTextMat(state);
- out->updateTextPos(state);
- fontChanged = gTrue;
-}
-
-void Gfx::opTextNextLine(Object args[], int numArgs) {
- double tx, ty;
-
- tx = state->getLineX();
- ty = state->getLineY() - state->getLeading();
- state->textMoveTo(tx, ty);
- out->updateTextPos(state);
-}
-
-//------------------------------------------------------------------------
-// text string operators
-//------------------------------------------------------------------------
-
-void Gfx::opShowText(Object args[], int numArgs) {
- if (!state->getFont()) {
- error(getPos(), "No font in show");
- return;
- }
- doShowText(args[0].getString());
-}
-
-void Gfx::opMoveShowText(Object args[], int numArgs) {
- double tx, ty;
-
- if (!state->getFont()) {
- error(getPos(), "No font in move/show");
- return;
- }
- tx = state->getLineX();
- ty = state->getLineY() - state->getLeading();
- state->textMoveTo(tx, ty);
- out->updateTextPos(state);
- doShowText(args[0].getString());
-}
-
-void Gfx::opMoveSetShowText(Object args[], int numArgs) {
- double tx, ty;
-
- if (!state->getFont()) {
- error(getPos(), "No font in move/set/show");
- return;
- }
- state->setWordSpace(args[0].getNum());
- state->setCharSpace(args[1].getNum());
- tx = state->getLineX();
- ty = state->getLineY() - state->getLeading();
- state->textMoveTo(tx, ty);
- out->updateWordSpace(state);
- out->updateCharSpace(state);
- out->updateTextPos(state);
- doShowText(args[2].getString());
-}
-
-void Gfx::opShowSpaceText(Object args[], int numArgs) {
- Array *a;
- Object obj;
- int wMode;
- int i;
-
- if (!state->getFont()) {
- error(getPos(), "No font in show/space");
- return;
- }
- wMode = state->getFont()->getWMode();
- a = args[0].getArray();
- for (i = 0; i < a->getLength(); ++i) {
- a->get(i, &obj);
- if (obj.isNum()) {
- if (wMode) {
- state->textShift(0, -obj.getNum() * 0.001 * state->getFontSize());
- } else {
- state->textShift(-obj.getNum() * 0.001 * state->getFontSize(), 0);
- }
- out->updateTextShift(state, obj.getNum());
- } else if (obj.isString()) {
- doShowText(obj.getString());
- } else {
- error(getPos(), "Element of show/space array must be number or string");
- }
- obj.free();
- }
-}
-
-void Gfx::doShowText(GString *s) {
- GfxFont *font;
- int wMode;
- double riseX, riseY;
- CharCode code;
- Unicode u[8];
- double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY;
- double originX, originY, tOriginX, tOriginY;
- double oldCTM[6], newCTM[6];
- double *mat;
- Object charProc;
- Dict *resDict;
- Parser *oldParser;
- char *p;
- int len, n, uLen, nChars, nSpaces, i;
-
- if (fontChanged) {
- out->updateFont(state);
- fontChanged = gFalse;
- }
- font = state->getFont();
- wMode = font->getWMode();
-
- if (out->useDrawChar()) {
- out->beginString(state, s);
- }
-
- // handle a Type 3 char
- if (font->getType() == fontType3 && out->interpretType3Chars()) {
- mat = state->getCTM();
- for (i = 0; i < 6; ++i) {
- oldCTM[i] = mat[i];
- }
- mat = state->getTextMat();
- newCTM[0] = mat[0] * oldCTM[0] + mat[1] * oldCTM[2];
- newCTM[1] = mat[0] * oldCTM[1] + mat[1] * oldCTM[3];
- newCTM[2] = mat[2] * oldCTM[0] + mat[3] * oldCTM[2];
- newCTM[3] = mat[2] * oldCTM[1] + mat[3] * oldCTM[3];
- mat = font->getFontMatrix();
- newCTM[0] = mat[0] * newCTM[0] + mat[1] * newCTM[2];
- newCTM[1] = mat[0] * newCTM[1] + mat[1] * newCTM[3];
- newCTM[2] = mat[2] * newCTM[0] + mat[3] * newCTM[2];
- newCTM[3] = mat[2] * newCTM[1] + mat[3] * newCTM[3];
- newCTM[0] *= state->getFontSize();
- newCTM[1] *= state->getFontSize();
- newCTM[2] *= state->getFontSize();
- newCTM[3] *= state->getFontSize();
- newCTM[0] *= state->getHorizScaling();
- newCTM[2] *= state->getHorizScaling();
- state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
- curX = state->getCurX();
- curY = state->getCurY();
- lineX = state->getLineX();
- lineY = state->getLineY();
- oldParser = parser;
- p = s->getCString();
- len = s->getLength();
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
- &dx, &dy, &originX, &originY);
- dx = dx * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dx += state->getWordSpace();
- }
- dx *= state->getHorizScaling();
- dy *= state->getFontSize();
- state->textTransformDelta(dx, dy, &tdx, &tdy);
- state->transform(curX + riseX, curY + riseY, &x, &y);
- saveState();
- state->setCTM(newCTM[0], newCTM[1], newCTM[2], newCTM[3], x, y);
- //~ out->updateCTM(???)
- if (!out->beginType3Char(state, curX + riseX, curY + riseY, tdx, tdy,
- code, u, uLen)) {
- ((Gfx8BitFont *)font)->getCharProc(code, &charProc);
- if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
- pushResources(resDict);
- }
- if (charProc.isStream()) {
- display(&charProc, gFalse);
- } else {
- error(getPos(), "Missing or bad Type3 CharProc entry");
- }
- out->endType3Char(state);
- if (resDict) {
- popResources();
- }
- charProc.free();
- }
- restoreState();
- // GfxState::restore() does *not* restore the current position,
- // so we deal with it here using (curX, curY) and (lineX, lineY)
- curX += tdx;
- curY += tdy;
- state->moveTo(curX, curY);
- state->textSetPos(lineX, lineY);
- p += n;
- len -= n;
- }
- parser = oldParser;
-
- } else if (out->useDrawChar()) {
- state->textTransformDelta(0, state->getRise(), &riseX, &riseY);
- p = s->getCString();
- len = s->getLength();
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
- &dx, &dy, &originX, &originY);
- if (wMode) {
- dx *= state->getFontSize();
- dy = dy * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dy += state->getWordSpace();
- }
- } else {
- dx = dx * state->getFontSize() + state->getCharSpace();
- if (n == 1 && *p == ' ') {
- dx += state->getWordSpace();
- }
- dx *= state->getHorizScaling();
- dy *= state->getFontSize();
- }
- state->textTransformDelta(dx, dy, &tdx, &tdy);
- originX *= state->getFontSize();
- originY *= state->getFontSize();
- state->textTransformDelta(originX, originY, &tOriginX, &tOriginY);
- out->drawChar(state, state->getCurX() + riseX, state->getCurY() + riseY,
- tdx, tdy, tOriginX, tOriginY, code, u, uLen);
- state->shift(tdx, tdy);
- p += n;
- len -= n;
- }
-
- } else {
- dx = dy = 0;
- p = s->getCString();
- len = s->getLength();
- nChars = nSpaces = 0;
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
- &dx2, &dy2, &originX, &originY);
- dx += dx2;
- dy += dy2;
- if (n == 1 && *p == ' ') {
- ++nSpaces;
- }
- ++nChars;
- p += n;
- len -= n;
- }
- if (wMode) {
- dx *= state->getFontSize();
- dy = dy * state->getFontSize()
- + nChars * state->getCharSpace()
- + nSpaces * state->getWordSpace();
- } else {
- dx = dx * state->getFontSize()
- + nChars * state->getCharSpace()
- + nSpaces * state->getWordSpace();
- dx *= state->getHorizScaling();
- dy *= state->getFontSize();
- }
- state->textTransformDelta(dx, dy, &tdx, &tdy);
- out->drawString(state, s);
- state->shift(tdx, tdy);
- }
-
- if (out->useDrawChar()) {
- out->endString(state);
- }
-
- updateLevel += 10 * s->getLength();
-}
-
-//------------------------------------------------------------------------
-// XObject operators
-//------------------------------------------------------------------------
-
-void Gfx::opXObject(Object args[], int numArgs) {
- Object obj1, obj2, obj3, refObj;
-#if OPI_SUPPORT
- Object opiDict;
-#endif
-
- if (!res->lookupXObject(args[0].getName(), &obj1)) {
- return;
- }
- if (!obj1.isStream()) {
- error(getPos(), "XObject '%s' is wrong type", args[0].getName());
- obj1.free();
- return;
- }
-#if OPI_SUPPORT
- obj1.streamGetDict()->lookup("OPI", &opiDict);
- if (opiDict.isDict()) {
- out->opiBegin(state, opiDict.getDict());
- }
-#endif
- obj1.streamGetDict()->lookup("Subtype", &obj2);
- if (obj2.isName("Image")) {
- res->lookupXObjectNF(args[0].getName(), &refObj);
- doImage(&refObj, obj1.getStream(), gFalse);
- refObj.free();
- } else if (obj2.isName("Form")) {
- doForm(&obj1);
- } else if (obj2.isName("PS")) {
- obj1.streamGetDict()->lookup("Level1", &obj3);
- out->psXObject(obj1.getStream(),
- obj3.isStream() ? obj3.getStream() : (Stream *)NULL);
- } else if (obj2.isName()) {
- error(getPos(), "Unknown XObject subtype '%s'", obj2.getName());
- } else {
- error(getPos(), "XObject subtype is missing or wrong type");
- }
- obj2.free();
-#if OPI_SUPPORT
- if (opiDict.isDict()) {
- out->opiEnd(state, opiDict.getDict());
- }
- opiDict.free();
-#endif
- obj1.free();
-}
-
-void Gfx::doImage(Object *ref, Stream *str, GBool inlineImg) {
- Dict *dict;
- int width, height;
- int bits;
- GBool mask;
- GBool invert;
- GfxColorSpace *colorSpace;
- GfxImageColorMap *colorMap;
- Object maskObj;
- GBool haveMask;
- int maskColors[2*gfxColorMaxComps];
- Object obj1, obj2;
- int i;
-
- // get stream dict
- dict = str->getDict();
-
- // get size
- dict->lookup("Width", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("W", &obj1);
- }
- if (!obj1.isInt())
- goto err2;
- width = obj1.getInt();
- obj1.free();
- dict->lookup("Height", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("H", &obj1);
- }
- if (!obj1.isInt())
- goto err2;
- height = obj1.getInt();
- obj1.free();
-
- // image or mask?
- dict->lookup("ImageMask", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("IM", &obj1);
- }
- mask = gFalse;
- if (obj1.isBool())
- mask = obj1.getBool();
- else if (!obj1.isNull())
- goto err2;
- obj1.free();
-
- // bit depth
- dict->lookup("BitsPerComponent", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("BPC", &obj1);
- }
- if (obj1.isInt()) {
- bits = obj1.getInt();
- } else if (mask) {
- bits = 1;
- } else {
- goto err2;
- }
- obj1.free();
-
- // display a mask
- if (mask) {
-
- // check for inverted mask
- if (bits != 1)
- goto err1;
- invert = gFalse;
- dict->lookup("Decode", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
- }
- if (obj1.isArray()) {
- obj1.arrayGet(0, &obj2);
- if (obj2.isInt() && obj2.getInt() == 1)
- invert = gTrue;
- obj2.free();
- } else if (!obj1.isNull()) {
- goto err2;
- }
- obj1.free();
-
- // draw it
- out->drawImageMask(state, ref, str, width, height, invert, inlineImg);
-
- } else {
-
- // get color space and color map
- dict->lookup("ColorSpace", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("CS", &obj1);
- }
- if (obj1.isName()) {
- res->lookupColorSpace(obj1.getName(), &obj2);
- if (!obj2.isNull()) {
- obj1.free();
- obj1 = obj2;
- } else {
- obj2.free();
- }
- }
- colorSpace = GfxColorSpace::parse(&obj1);
- obj1.free();
- if (!colorSpace) {
- goto err1;
- }
- dict->lookup("Decode", &obj1);
- if (obj1.isNull()) {
- obj1.free();
- dict->lookup("D", &obj1);
- }
- colorMap = new GfxImageColorMap(bits, &obj1, colorSpace);
- obj1.free();
- if (!colorMap->isOk()) {
- delete colorMap;
- goto err1;
- }
-
- // get the mask
- haveMask = gFalse;
- dict->lookup("Mask", &maskObj);
- if (maskObj.isArray()) {
- for (i = 0;
- i < maskObj.arrayGetLength() && i < 2*gfxColorMaxComps;
- ++i) {
- maskObj.arrayGet(i, &obj1);
- maskColors[i] = obj1.getInt();
- obj1.free();
- }
- haveMask = gTrue;
- }
-
- // draw it
- out->drawImage(state, ref, str, width, height, colorMap,
- haveMask ? maskColors : (int *)NULL, inlineImg);
- delete colorMap;
-
- maskObj.free();
- }
-
- if ((i = width * height) > 1000) {
- i = 1000;
- }
- updateLevel += i;
-
- return;
-
- err2:
- obj1.free();
- err1:
- error(getPos(), "Bad image parameters");
-}
-
-void Gfx::doForm(Object *str) {
- Dict *dict;
- Object matrixObj, bboxObj;
- double m[6], bbox[6];
- Object resObj;
- Dict *resDict;
- Object obj1;
- int i;
-
- // check for excessive recursion
- if (formDepth > 20) {
- return;
- }
-
- // get stream dict
- dict = str->streamGetDict();
-
- // check form type
- dict->lookup("FormType", &obj1);
- if (!(obj1.isInt() && obj1.getInt() == 1)) {
- error(getPos(), "Unknown form type");
- }
- obj1.free();
-
- // get bounding box
- dict->lookup("BBox", &bboxObj);
- if (!bboxObj.isArray()) {
- matrixObj.free();
- bboxObj.free();
- error(getPos(), "Bad form bounding box");
- return;
- }
- for (i = 0; i < 4; ++i) {
- bboxObj.arrayGet(i, &obj1);
- bbox[i] = obj1.getNum();
- obj1.free();
- }
- bboxObj.free();
-
- // get matrix
- dict->lookup("Matrix", &matrixObj);
- if (matrixObj.isArray()) {
- for (i = 0; i < 6; ++i) {
- matrixObj.arrayGet(i, &obj1);
- m[i] = obj1.getNum();
- obj1.free();
- }
- } else {
- m[0] = 1; m[1] = 0;
- m[2] = 0; m[3] = 1;
- m[4] = 0; m[5] = 0;
- }
- matrixObj.free();
-
- // get resources
- dict->lookup("Resources", &resObj);
- resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
-
- // draw it
- ++formDepth;
- doForm1(str, resDict, m, bbox);
- --formDepth;
-
- resObj.free();
-}
-
-void Gfx::doAnnot(Object *str, double xMin, double yMin,
- double xMax, double yMax) {
- Dict *dict, *resDict;
- Object matrixObj, bboxObj, resObj;
- Object obj1;
- double m[6], bbox[6], ictm[6];
- double *ctm;
- double formX0, formY0, formX1, formY1;
- double annotX0, annotY0, annotX1, annotY1;
- double det, x, y, sx, sy;
- int i;
-
- // get stream dict
- dict = str->streamGetDict();
-
- // get the form bounding box
- dict->lookup("BBox", &bboxObj);
- if (!bboxObj.isArray()) {
- bboxObj.free();
- error(getPos(), "Bad form bounding box");
- return;
- }
- for (i = 0; i < 4; ++i) {
- bboxObj.arrayGet(i, &obj1);
- bbox[i] = obj1.getNum();
- obj1.free();
- }
- bboxObj.free();
-
- // get the form matrix
- dict->lookup("Matrix", &matrixObj);
- if (matrixObj.isArray()) {
- for (i = 0; i < 6; ++i) {
- matrixObj.arrayGet(i, &obj1);
- m[i] = obj1.getNum();
- obj1.free();
- }
- } else {
- m[0] = 1; m[1] = 0;
- m[2] = 0; m[3] = 1;
- m[4] = 0; m[5] = 0;
- }
- matrixObj.free();
-
- // transform the form bbox from form space to user space
- formX0 = bbox[0] * m[0] + bbox[1] * m[2] + m[4];
- formY0 = bbox[0] * m[1] + bbox[1] * m[3] + m[5];
- formX1 = bbox[2] * m[0] + bbox[3] * m[2] + m[4];
- formY1 = bbox[2] * m[1] + bbox[3] * m[3] + m[5];
-
- // transform the annotation bbox from default user space to user
- // space: (bbox * baseMatrix) * iCTM
- ctm = state->getCTM();
- det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
- ictm[0] = ctm[3] * det;
- ictm[1] = -ctm[1] * det;
- ictm[2] = -ctm[2] * det;
- ictm[3] = ctm[0] * det;
- ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
- ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
- x = baseMatrix[0] * xMin + baseMatrix[2] * yMin + baseMatrix[4];
- y = baseMatrix[1] * xMin + baseMatrix[3] * yMin + baseMatrix[5];
- annotX0 = ictm[0] * x + ictm[2] * y + ictm[4];
- annotY0 = ictm[1] * x + ictm[3] * y + ictm[5];
- x = baseMatrix[0] * xMax + baseMatrix[2] * yMax + baseMatrix[4];
- y = baseMatrix[1] * xMax + baseMatrix[3] * yMax + baseMatrix[5];
- annotX1 = ictm[0] * x + ictm[2] * y + ictm[4];
- annotY1 = ictm[1] * x + ictm[3] * y + ictm[5];
-
- // swap min/max coords
- if (formX0 > formX1) {
- x = formX0; formX0 = formX1; formX1 = x;
- }
- if (formY0 > formY1) {
- y = formY0; formY0 = formY1; formY1 = y;
- }
- if (annotX0 > annotX1) {
- x = annotX0; annotX0 = annotX1; annotX1 = x;
- }
- if (annotY0 > annotY1) {
- y = annotY0; annotY0 = annotY1; annotY1 = y;
- }
-
- // scale the form to fit the annotation bbox
- if (formX1 == formX0) {
- // this shouldn't happen
- sx = 1;
- } else {
- sx = (annotX1 - annotX0) / (formX1 - formX0);
- }
- if (formY1 == formY0) {
- // this shouldn't happen
- sy = 1;
- } else {
- sy = (annotY1 - annotY0) / (formY1 - formY0);
- }
- m[0] *= sx;
- m[2] *= sx;
- m[4] = (m[4] - formX0) * sx + annotX0;
- m[1] *= sy;
- m[3] *= sy;
- m[5] = (m[5] - formY0) * sy + annotY0;
-
- // get resources
- dict->lookup("Resources", &resObj);
- resDict = resObj.isDict() ? resObj.getDict() : (Dict *)NULL;
-
- // draw it
- doForm1(str, resDict, m, bbox);
-
- resObj.free();
- bboxObj.free();
-}
-
-void Gfx::doForm1(Object *str, Dict *resDict, double *matrix, double *bbox) {
- Parser *oldParser;
- double oldBaseMatrix[6];
- int i;
-
- // push new resources on stack
- pushResources(resDict);
-
- // save current graphics state
- saveState();
-
- // kill any pre-existing path
- state->clearPath();
-
- // save current parser
- oldParser = parser;
-
- // set form transformation matrix
- state->concatCTM(matrix[0], matrix[1], matrix[2],
- matrix[3], matrix[4], matrix[5]);
- out->updateCTM(state, matrix[0], matrix[1], matrix[2],
- matrix[3], matrix[4], matrix[5]);
-
- // set new base matrix
- for (i = 0; i < 6; ++i) {
- oldBaseMatrix[i] = baseMatrix[i];
- baseMatrix[i] = state->getCTM()[i];
- }
-
- // set form bounding box
- state->moveTo(bbox[0], bbox[1]);
- state->lineTo(bbox[2], bbox[1]);
- state->lineTo(bbox[2], bbox[3]);
- state->lineTo(bbox[0], bbox[3]);
- state->closePath();
- state->clip();
- out->clip(state);
- state->clearPath();
-
- // draw the form
- display(str, gFalse);
-
- // restore base matrix
- for (i = 0; i < 6; ++i) {
- baseMatrix[i] = oldBaseMatrix[i];
- }
-
- // restore parser
- parser = oldParser;
-
- // restore graphics state
- restoreState();
-
- // pop resource stack
- popResources();
-
- return;
-}
-
-//------------------------------------------------------------------------
-// in-line image operators
-//------------------------------------------------------------------------
-
-void Gfx::opBeginImage(Object args[], int numArgs) {
- Stream *str;
- int c1, c2;
-
- // build dict/stream
- str = buildImageStream();
-
- // display the image
- if (str) {
- doImage(NULL, str, gTrue);
-
- // skip 'EI' tag
- c1 = str->getBaseStream()->getChar();
- c2 = str->getBaseStream()->getChar();
- while (!(c1 == 'E' && c2 == 'I') && c2 != EOF) {
- c1 = c2;
- c2 = str->getBaseStream()->getChar();
- }
- delete str;
- }
-}
-
-Stream *Gfx::buildImageStream() {
- Object dict;
- Object obj;
- char *key;
- Stream *str;
-
- // build dictionary
- dict.initDict(xref);
- parser->getObj(&obj);
- while (!obj.isCmd("ID") && !obj.isEOF()) {
- if (!obj.isName()) {
- error(getPos(), "Inline image dictionary key must be a name object");
- obj.free();
- } else {
- key = copyString(obj.getName());
- obj.free();
- parser->getObj(&obj);
- if (obj.isEOF() || obj.isError()) {
- gfree(key);
- break;
- }
- dict.dictAdd(key, &obj);
- }
- parser->getObj(&obj);
- }
- if (obj.isEOF()) {
- error(getPos(), "End of file in inline image");
- obj.free();
- dict.free();
- return NULL;
- }
- obj.free();
-
- // make stream
- str = new EmbedStream(parser->getStream(), &dict, gFalse, 0);
- str = str->addFilters(&dict);
-
- return str;
-}
-
-void Gfx::opImageData(Object args[], int numArgs) {
- error(getPos(), "Internal: got 'ID' operator");
-}
-
-void Gfx::opEndImage(Object args[], int numArgs) {
- error(getPos(), "Internal: got 'EI' operator");
-}
-
-//------------------------------------------------------------------------
-// type 3 font operators
-//------------------------------------------------------------------------
-
-void Gfx::opSetCharWidth(Object args[], int numArgs) {
- out->type3D0(state, args[0].getNum(), args[1].getNum());
-}
-
-void Gfx::opSetCacheDevice(Object args[], int numArgs) {
- out->type3D1(state, args[0].getNum(), args[1].getNum(),
- args[2].getNum(), args[3].getNum(),
- args[4].getNum(), args[5].getNum());
-}
-
-//------------------------------------------------------------------------
-// compatibility operators
-//------------------------------------------------------------------------
-
-void Gfx::opBeginIgnoreUndef(Object args[], int numArgs) {
- ++ignoreUndef;
-}
-
-void Gfx::opEndIgnoreUndef(Object args[], int numArgs) {
- if (ignoreUndef > 0)
- --ignoreUndef;
-}
-
-//------------------------------------------------------------------------
-// marked content operators
-//------------------------------------------------------------------------
-
-void Gfx::opBeginMarkedContent(Object args[], int numArgs) {
- if (printCommands) {
- printf(" marked content: %s ", args[0].getName());
- if (numArgs == 2)
- args[2].print(stdout);
- printf("\n");
- fflush(stdout);
- }
-}
-
-void Gfx::opEndMarkedContent(Object args[], int numArgs) {
-}
-
-void Gfx::opMarkPoint(Object args[], int numArgs) {
- if (printCommands) {
- printf(" mark point: %s ", args[0].getName());
- if (numArgs == 2)
- args[2].print(stdout);
- printf("\n");
- fflush(stdout);
- }
-}
-
-//------------------------------------------------------------------------
-// misc
-//------------------------------------------------------------------------
-
-void Gfx::saveState() {
- out->saveState(state);
- state = state->save();
-}
-
-void Gfx::restoreState() {
- state = state->restore();
- out->restoreState(state);
-}
-
-void Gfx::pushResources(Dict *resDict) {
- res = new GfxResources(xref, resDict, res);
-}
-
-void Gfx::popResources() {
- GfxResources *resPtr;
-
- resPtr = res->getNext();
- delete res;
- res = resPtr;
-}
diff --git a/pdf/xpdf/Gfx.h b/pdf/xpdf/Gfx.h
deleted file mode 100644
index 2069e97..0000000
--- a/pdf/xpdf/Gfx.h
+++ /dev/null
@@ -1,281 +0,0 @@
-//========================================================================
-//
-// Gfx.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GFX_H
-#define GFX_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-
-class GString;
-class XRef;
-class Array;
-class Stream;
-class Parser;
-class Dict;
-class OutputDev;
-class GfxFontDict;
-class GfxFont;
-class GfxPattern;
-class GfxTilingPattern;
-class GfxShadingPattern;
-class GfxShading;
-class GfxFunctionShading;
-class GfxAxialShading;
-class GfxRadialShading;
-class GfxState;
-struct GfxColor;
-class Gfx;
-class PDFRectangle;
-
-//------------------------------------------------------------------------
-// Gfx
-//------------------------------------------------------------------------
-
-enum GfxClipType {
- clipNone,
- clipNormal,
- clipEO
-};
-
-enum TchkType {
- tchkBool, // boolean
- tchkInt, // integer
- tchkNum, // number (integer or real)
- tchkString, // string
- tchkName, // name
- tchkArray, // array
- tchkProps, // properties (dictionary or name)
- tchkSCN, // scn/SCN args (number of name)
- tchkNone // used to avoid empty initializer lists
-};
-
-#define maxArgs 8
-
-struct Operator {
- char name[4];
- int numArgs;
- TchkType tchk[maxArgs];
- void (Gfx::*func)(Object args[], int numArgs);
-};
-
-class GfxResources {
-public:
-
- GfxResources(XRef *xref, Dict *resDict, GfxResources *nextA);
- ~GfxResources();
-
- GfxFont *lookupFont(char *name);
- GBool lookupXObject(char *name, Object *obj);
- GBool lookupXObjectNF(char *name, Object *obj);
- void lookupColorSpace(char *name, Object *obj);
- GfxPattern *lookupPattern(char *name);
- GfxShading *lookupShading(char *name);
- GBool lookupGState(char *name, Object *obj);
-
- GfxResources *getNext() { return next; }
-
-private:
-
- GfxFontDict *fonts;
- Object xObjDict;
- Object colorSpaceDict;
- Object patternDict;
- Object shadingDict;
- Object gStateDict;
- GfxResources *next;
-};
-
-class Gfx {
-public:
-
- // Constructor for regular output.
- Gfx(XRef *xrefA, OutputDev *outA, int pageNum, Dict *resDict,
- double hDPI, double vDPI, PDFRectangle *box, GBool crop,
- PDFRectangle *cropBox, int rotate,
- GBool (*abortCheckCbkA)(void *data) = NULL,
- void *abortCheckCbkDataA = NULL);
-
- // Constructor for a sub-page object.
- Gfx(XRef *xrefA, OutputDev *outA, Dict *resDict,
- PDFRectangle *box, GBool crop, PDFRectangle *cropBox,
- GBool (*abortCheckCbkA)(void *data) = NULL,
- void *abortCheckCbkDataA = NULL);
-
- ~Gfx();
-
- // Interpret a stream or array of streams.
- void display(Object *obj, GBool topLevel = gTrue);
-
- // Display an annotation, given its appearance (a Form XObject) and
- // bounding box (in default user space).
- void doAnnot(Object *str, double xMin, double yMin,
- double xMax, double yMax);
-
- // Save graphics state.
- void saveState();
-
- // Restore graphics state.
- void restoreState();
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- OutputDev *out; // output device
- GBool subPage; // is this a sub-page object?
- GBool printCommands; // print the drawing commands (for debugging)
- GfxResources *res; // resource stack
- int updateLevel;
-
- GfxState *state; // current graphics state
- GBool fontChanged; // set if font or text matrix has changed
- GfxClipType clip; // do a clip?
- int ignoreUndef; // current BX/EX nesting level
- double baseMatrix[6]; // default matrix for most recent
- // page/form/pattern
- int formDepth;
-
- Parser *parser; // parser for page content stream(s)
-
- GBool // callback to check for an abort
- (*abortCheckCbk)(void *data);
- void *abortCheckCbkData;
-
- static Operator opTab[]; // table of operators
-
- void go(GBool topLevel);
- void execOp(Object *cmd, Object args[], int numArgs);
- Operator *findOp(char *name);
- GBool checkArg(Object *arg, TchkType type);
- int getPos();
-
- // graphics state operators
- void opSave(Object args[], int numArgs);
- void opRestore(Object args[], int numArgs);
- void opConcat(Object args[], int numArgs);
- void opSetDash(Object args[], int numArgs);
- void opSetFlat(Object args[], int numArgs);
- void opSetLineJoin(Object args[], int numArgs);
- void opSetLineCap(Object args[], int numArgs);
- void opSetMiterLimit(Object args[], int numArgs);
- void opSetLineWidth(Object args[], int numArgs);
- void opSetExtGState(Object args[], int numArgs);
- void opSetRenderingIntent(Object args[], int numArgs);
-
- // color operators
- void opSetFillGray(Object args[], int numArgs);
- void opSetStrokeGray(Object args[], int numArgs);
- void opSetFillCMYKColor(Object args[], int numArgs);
- void opSetStrokeCMYKColor(Object args[], int numArgs);
- void opSetFillRGBColor(Object args[], int numArgs);
- void opSetStrokeRGBColor(Object args[], int numArgs);
- void opSetFillColorSpace(Object args[], int numArgs);
- void opSetStrokeColorSpace(Object args[], int numArgs);
- void opSetFillColor(Object args[], int numArgs);
- void opSetStrokeColor(Object args[], int numArgs);
- void opSetFillColorN(Object args[], int numArgs);
- void opSetStrokeColorN(Object args[], int numArgs);
-
- // path segment operators
- void opMoveTo(Object args[], int numArgs);
- void opLineTo(Object args[], int numArgs);
- void opCurveTo(Object args[], int numArgs);
- void opCurveTo1(Object args[], int numArgs);
- void opCurveTo2(Object args[], int numArgs);
- void opRectangle(Object args[], int numArgs);
- void opClosePath(Object args[], int numArgs);
-
- // path painting operators
- void opEndPath(Object args[], int numArgs);
- void opStroke(Object args[], int numArgs);
- void opCloseStroke(Object args[], int numArgs);
- void opFill(Object args[], int numArgs);
- void opEOFill(Object args[], int numArgs);
- void opFillStroke(Object args[], int numArgs);
- void opCloseFillStroke(Object args[], int numArgs);
- void opEOFillStroke(Object args[], int numArgs);
- void opCloseEOFillStroke(Object args[], int numArgs);
- void doPatternFill(GBool eoFill);
- void doTilingPatternFill(GfxTilingPattern *tPat, GBool eoFill);
- void doShadingPatternFill(GfxShadingPattern *sPat, GBool eoFill);
- void opShFill(Object args[], int numArgs);
- void doFunctionShFill(GfxFunctionShading *shading);
- void doFunctionShFill1(GfxFunctionShading *shading,
- double x0, double y0,
- double x1, double y1,
- GfxColor *colors, int depth);
- void doAxialShFill(GfxAxialShading *shading);
- void doRadialShFill(GfxRadialShading *shading);
- void doEndPath();
-
- // path clipping operators
- void opClip(Object args[], int numArgs);
- void opEOClip(Object args[], int numArgs);
-
- // text object operators
- void opBeginText(Object args[], int numArgs);
- void opEndText(Object args[], int numArgs);
-
- // text state operators
- void opSetCharSpacing(Object args[], int numArgs);
- void opSetFont(Object args[], int numArgs);
- void opSetTextLeading(Object args[], int numArgs);
- void opSetTextRender(Object args[], int numArgs);
- void opSetTextRise(Object args[], int numArgs);
- void opSetWordSpacing(Object args[], int numArgs);
- void opSetHorizScaling(Object args[], int numArgs);
-
- // text positioning operators
- void opTextMove(Object args[], int numArgs);
- void opTextMoveSet(Object args[], int numArgs);
- void opSetTextMatrix(Object args[], int numArgs);
- void opTextNextLine(Object args[], int numArgs);
-
- // text string operators
- void opShowText(Object args[], int numArgs);
- void opMoveShowText(Object args[], int numArgs);
- void opMoveSetShowText(Object args[], int numArgs);
- void opShowSpaceText(Object args[], int numArgs);
- void doShowText(GString *s);
-
- // XObject operators
- void opXObject(Object args[], int numArgs);
- void doImage(Object *ref, Stream *str, GBool inlineImg);
- void doForm(Object *str);
- void doForm1(Object *str, Dict *resDict, double *matrix, double *bbox);
-
- // in-line image operators
- void opBeginImage(Object args[], int numArgs);
- Stream *buildImageStream();
- void opImageData(Object args[], int numArgs);
- void opEndImage(Object args[], int numArgs);
-
- // type 3 font operators
- void opSetCharWidth(Object args[], int numArgs);
- void opSetCacheDevice(Object args[], int numArgs);
-
- // compatibility operators
- void opBeginIgnoreUndef(Object args[], int numArgs);
- void opEndIgnoreUndef(Object args[], int numArgs);
-
- // marked content operators
- void opBeginMarkedContent(Object args[], int numArgs);
- void opEndMarkedContent(Object args[], int numArgs);
- void opMarkPoint(Object args[], int numArgs);
-
- void pushResources(Dict *resDict);
- void popResources();
-};
-
-#endif
diff --git a/pdf/xpdf/GfxFont.cc b/pdf/xpdf/GfxFont.cc
deleted file mode 100644
index ed9f076..0000000
--- a/pdf/xpdf/GfxFont.cc
+++ /dev/null
@@ -1,1508 +0,0 @@
-//========================================================================
-//
-// GfxFont.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include "gmem.h"
-#include "Error.h"
-#include "Object.h"
-#include "Dict.h"
-#include "GlobalParams.h"
-#include "CMap.h"
-#include "CharCodeToUnicode.h"
-#include "FontEncodingTables.h"
-#include "BuiltinFontTables.h"
-#include "FoFiType1.h"
-#include "FoFiType1C.h"
-#include "FoFiTrueType.h"
-#include "GfxFont.h"
-
-//------------------------------------------------------------------------
-
-struct StdFontMapEntry {
- char *altName;
- char *properName;
-};
-
-// Acrobat 4.0 and earlier substituted Base14-compatible fonts without
-// providing Widths and a FontDescriptor, so we munge the names into
-// the proper Base14 names. This table is from implementation note 44
-// in the PDF 1.4 spec, with some additions based on empirical
-// evidence.
-static StdFontMapEntry stdFontMap[] = {
- { "Arial", "Helvetica" },
- { "Arial,Bold", "Helvetica-Bold" },
- { "Arial,BoldItalic", "Helvetica-BoldOblique" },
- { "Arial,Italic", "Helvetica-Oblique" },
- { "Arial-Bold", "Helvetica-Bold" },
- { "Arial-BoldItalic", "Helvetica-BoldOblique" },
- { "Arial-BoldItalicMT", "Helvetica-BoldOblique" },
- { "Arial-BoldMT", "Helvetica-Bold" },
- { "Arial-Italic", "Helvetica-Oblique" },
- { "Arial-ItalicMT", "Helvetica-Oblique" },
- { "ArialMT", "Helvetica" },
- { "Courier,Bold", "Courier-Bold" },
- { "Courier,Italic", "Courier-Oblique" },
- { "Courier,BoldItalic", "Courier-BoldOblique" },
- { "CourierNew", "Courier" },
- { "CourierNew,Bold", "Courier-Bold" },
- { "CourierNew,BoldItalic", "Courier-BoldOblique" },
- { "CourierNew,Italic", "Courier-Oblique" },
- { "CourierNew-Bold", "Courier-Bold" },
- { "CourierNew-BoldItalic", "Courier-BoldOblique" },
- { "CourierNew-Italic", "Courier-Oblique" },
- { "CourierNewPS-BoldItalicMT", "Courier-BoldOblique" },
- { "CourierNewPS-BoldMT", "Courier-Bold" },
- { "CourierNewPS-ItalicMT", "Courier-Oblique" },
- { "CourierNewPSMT", "Courier" },
- { "Helvetica,Bold", "Helvetica-Bold" },
- { "Helvetica,BoldItalic", "Helvetica-BoldOblique" },
- { "Helvetica,Italic", "Helvetica-Oblique" },
- { "Helvetica-BoldItalic", "Helvetica-BoldOblique" },
- { "Helvetica-Italic", "Helvetica-Oblique" },
- { "Symbol,Bold", "Symbol" },
- { "Symbol,BoldItalic", "Symbol" },
- { "Symbol,Italic", "Symbol" },
- { "TimesNewRoman", "Times-Roman" },
- { "TimesNewRoman,Bold", "Times-Bold" },
- { "TimesNewRoman,BoldItalic", "Times-BoldItalic" },
- { "TimesNewRoman,Italic", "Times-Italic" },
- { "TimesNewRoman-Bold", "Times-Bold" },
- { "TimesNewRoman-BoldItalic", "Times-BoldItalic" },
- { "TimesNewRoman-Italic", "Times-Italic" },
- { "TimesNewRomanPS", "Times-Roman" },
- { "TimesNewRomanPS-Bold", "Times-Bold" },
- { "TimesNewRomanPS-BoldItalic", "Times-BoldItalic" },
- { "TimesNewRomanPS-BoldItalicMT", "Times-BoldItalic" },
- { "TimesNewRomanPS-BoldMT", "Times-Bold" },
- { "TimesNewRomanPS-Italic", "Times-Italic" },
- { "TimesNewRomanPS-ItalicMT", "Times-Italic" },
- { "TimesNewRomanPSMT", "Times-Roman" },
- { "TimesNewRomanPSMT,Bold", "Times-Bold" },
- { "TimesNewRomanPSMT,BoldItalic", "Times-BoldItalic" },
- { "TimesNewRomanPSMT,Italic", "Times-Italic" }
-};
-
-//------------------------------------------------------------------------
-// GfxFont
-//------------------------------------------------------------------------
-
-GfxFont *GfxFont::makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict) {
- GString *nameA;
- GfxFont *font;
- Object obj1;
-
- // get base font name
- nameA = NULL;
- fontDict->lookup("BaseFont", &obj1);
- if (obj1.isName()) {
- nameA = new GString(obj1.getName());
- }
- obj1.free();
-
- // get font type
- font = NULL;
- fontDict->lookup("Subtype", &obj1);
- if (obj1.isName("Type1") || obj1.isName("MMType1")) {
- font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1, fontDict);
- } else if (obj1.isName("Type1C")) {
- font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType1C, fontDict);
- } else if (obj1.isName("Type3")) {
- font = new Gfx8BitFont(xref, tagA, idA, nameA, fontType3, fontDict);
- } else if (obj1.isName("TrueType")) {
- font = new Gfx8BitFont(xref, tagA, idA, nameA, fontTrueType, fontDict);
- } else if (obj1.isName("Type0")) {
- font = new GfxCIDFont(xref, tagA, idA, nameA, fontDict);
- } else {
- error(-1, "Unknown font type: '%s'",
- obj1.isName() ? obj1.getName() : "???");
- font = new Gfx8BitFont(xref, tagA, idA, nameA, fontUnknownType, fontDict);
- }
- obj1.free();
-
- return font;
-}
-
-GfxFont::GfxFont(char *tagA, Ref idA, GString *nameA) {
- ok = gFalse;
- tag = new GString(tagA);
- id = idA;
- name = nameA;
- origName = nameA;
- embFontName = NULL;
- extFontFile = NULL;
-}
-
-GfxFont::~GfxFont() {
- delete tag;
- if (origName && origName != name) {
- delete origName;
- }
- if (name) {
- delete name;
- }
- if (embFontName) {
- delete embFontName;
- }
- if (extFontFile) {
- delete extFontFile;
- }
-}
-
-void GfxFont::readFontDescriptor(XRef *xref, Dict *fontDict) {
- Object obj1, obj2, obj3, obj4;
- double t;
- int i;
-
- // assume Times-Roman by default (for substitution purposes)
- flags = fontSerif;
-
- embFontID.num = -1;
- embFontID.gen = -1;
- missingWidth = 0;
-
- if (fontDict->lookup("FontDescriptor", &obj1)->isDict()) {
-
- // get flags
- if (obj1.dictLookup("Flags", &obj2)->isInt()) {
- flags = obj2.getInt();
- }
- obj2.free();
-
- // get name
- obj1.dictLookup("FontName", &obj2);
- if (obj2.isName()) {
- embFontName = new GString(obj2.getName());
- }
- obj2.free();
-
- // look for embedded font file
- if (obj1.dictLookupNF("FontFile", &obj2)->isRef()) {
- if (type == fontType1) {
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- }
- obj2.free();
- if (embFontID.num == -1 &&
- obj1.dictLookupNF("FontFile2", &obj2)->isRef()) {
- if (type == fontTrueType || type == fontCIDType2) {
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- }
- obj2.free();
- if (embFontID.num == -1 &&
- obj1.dictLookupNF("FontFile3", &obj2)->isRef()) {
- if (obj2.fetch(xref, &obj3)->isStream()) {
- obj3.streamGetDict()->lookup("Subtype", &obj4);
- if (obj4.isName("Type1")) {
- if (type == fontType1) {
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- } else if (obj4.isName("Type1C")) {
- if (type == fontType1) {
- type = fontType1C;
- embFontID = obj2.getRef();
- } else if (type == fontType1C) {
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- } else if (obj4.isName("TrueType")) {
- if (type == fontTrueType) {
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- } else if (obj4.isName("CIDFontType0C")) {
- if (type == fontCIDType0) {
- type = fontCIDType0C;
- embFontID = obj2.getRef();
- } else {
- error(-1, "Mismatch between font type and embedded font file");
- }
- } else {
- error(-1, "Unknown embedded font type '%s'",
- obj4.isName() ? obj4.getName() : "???");
- }
- obj4.free();
- }
- obj3.free();
- }
- obj2.free();
-
- // look for MissingWidth
- obj1.dictLookup("MissingWidth", &obj2);
- if (obj2.isNum()) {
- missingWidth = obj2.getNum();
- }
- obj2.free();
-
- // get Ascent and Descent
- obj1.dictLookup("Ascent", &obj2);
- if (obj2.isNum()) {
- t = 0.001 * obj2.getNum();
- // some broken font descriptors set ascent and descent to 0
- if (t != 0) {
- ascent = t;
- }
- }
- obj2.free();
- obj1.dictLookup("Descent", &obj2);
- if (obj2.isNum()) {
- t = 0.001 * obj2.getNum();
- // some broken font descriptors set ascent and descent to 0
- if (t != 0) {
- descent = t;
- }
- // some broken font descriptors specify a positive descent
- if (descent > 0) {
- descent = -descent;
- }
- }
- obj2.free();
-
- // font FontBBox
- if (obj1.dictLookup("FontBBox", &obj2)->isArray()) {
- for (i = 0; i < 4 && i < obj2.arrayGetLength(); ++i) {
- if (obj2.arrayGet(i, &obj3)->isNum()) {
- fontBBox[i] = 0.001 * obj3.getNum();
- }
- obj3.free();
- }
- }
- obj2.free();
-
- }
- obj1.free();
-}
-
-CharCodeToUnicode *GfxFont::readToUnicodeCMap(Dict *fontDict, int nBits,
- CharCodeToUnicode *ctu) {
- GString *buf;
- Object obj1;
- int c;
-
- if (!fontDict->lookup("ToUnicode", &obj1)->isStream()) {
- obj1.free();
- return NULL;
- }
- buf = new GString();
- obj1.streamReset();
- while ((c = obj1.streamGetChar()) != EOF) {
- buf->append(c);
- }
- obj1.streamClose();
- obj1.free();
- if (ctu) {
- ctu->mergeCMap(buf, nBits);
- } else {
- ctu = CharCodeToUnicode::parseCMap(buf, nBits);
- }
- delete buf;
- return ctu;
-}
-
-void GfxFont::findExtFontFile() {
- static char *type1Exts[] = { ".pfa", ".pfb", ".ps", "", NULL };
- static char *ttExts[] = { ".ttf", NULL };
-
- if (name) {
- if (type == fontType1) {
- extFontFile = globalParams->findFontFile(name, type1Exts);
- } else if (type == fontTrueType) {
- extFontFile = globalParams->findFontFile(name, ttExts);
- }
- }
-}
-
-char *GfxFont::readExtFontFile(int *len) {
- FILE *f;
- char *buf;
-
- if (!(f = fopen(extFontFile->getCString(), "rb"))) {
- error(-1, "External font file '%s' vanished", extFontFile->getCString());
- return NULL;
- }
- fseek(f, 0, SEEK_END);
- *len = (int)ftell(f);
- fseek(f, 0, SEEK_SET);
- buf = (char *)gmalloc(*len);
- if ((int)fread(buf, 1, *len, f) != *len) {
- error(-1, "Error reading external font file '%s'",
- extFontFile->getCString());
- }
- fclose(f);
- return buf;
-}
-
-char *GfxFont::readEmbFontFile(XRef *xref, int *len) {
- char *buf;
- Object obj1, obj2;
- Stream *str;
- int c;
- int size, i;
-
- obj1.initRef(embFontID.num, embFontID.gen);
- obj1.fetch(xref, &obj2);
- if (!obj2.isStream()) {
- error(-1, "Embedded font file is not a stream");
- obj2.free();
- obj1.free();
- embFontID.num = -1;
- return NULL;
- }
- str = obj2.getStream();
-
- buf = NULL;
- i = size = 0;
- str->reset();
- while ((c = str->getChar()) != EOF) {
- if (i == size) {
- size += 4096;
- buf = (char *)grealloc(buf, size);
- }
- buf[i++] = c;
- }
- *len = i;
- str->close();
-
- obj2.free();
- obj1.free();
-
- return buf;
-}
-
-//------------------------------------------------------------------------
-// Gfx8BitFont
-//------------------------------------------------------------------------
-
-Gfx8BitFont::Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
- GfxFontType typeA, Dict *fontDict):
- GfxFont(tagA, idA, nameA)
-{
- BuiltinFont *builtinFont;
- char **baseEnc;
- GBool baseEncFromFontFile;
- char *buf;
- int len;
- FoFiType1 *ffT1;
- FoFiType1C *ffT1C;
- int code, code2;
- char *charName;
- GBool missing, hex;
- Unicode toUnicode[256];
- CharCodeToUnicode *utu, *ctu2;
- Unicode uBuf[8];
- double mul;
- int firstChar, lastChar;
- Gushort w;
- Object obj1, obj2, obj3;
- int n, i, a, b, m;
-
- type = typeA;
- ctu = NULL;
-
- // do font name substitution for various aliases of the Base 14 font
- // names
- if (name) {
- a = 0;
- b = sizeof(stdFontMap) / sizeof(StdFontMapEntry);
- // invariant: stdFontMap[a].altName <= name < stdFontMap[b].altName
- while (b - a > 1) {
- m = (a + b) / 2;
- if (name->cmp(stdFontMap[m].altName) >= 0) {
- a = m;
- } else {
- b = m;
- }
- }
- if (!name->cmp(stdFontMap[a].altName)) {
- name = new GString(stdFontMap[a].properName);
- }
- }
-
- // is it a built-in font?
- builtinFont = NULL;
- if (name) {
- for (i = 0; i < nBuiltinFonts; ++i) {
- if (!name->cmp(builtinFonts[i].name)) {
- builtinFont = &builtinFonts[i];
- break;
- }
- }
- }
-
- // default ascent/descent values
- if (builtinFont) {
- ascent = 0.001 * builtinFont->ascent;
- descent = 0.001 * builtinFont->descent;
- fontBBox[0] = 0.001 * builtinFont->bbox[0];
- fontBBox[1] = 0.001 * builtinFont->bbox[1];
- fontBBox[2] = 0.001 * builtinFont->bbox[2];
- fontBBox[3] = 0.001 * builtinFont->bbox[3];
- } else {
- ascent = 0.95;
- descent = -0.35;
- fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0;
- }
-
- // get info from font descriptor
- readFontDescriptor(xref, fontDict);
-
- // look for an external font file
- findExtFontFile();
-
- // get font matrix
- fontMat[0] = fontMat[3] = 1;
- fontMat[1] = fontMat[2] = fontMat[4] = fontMat[5] = 0;
- if (fontDict->lookup("FontMatrix", &obj1)->isArray()) {
- for (i = 0; i < 6 && i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
- fontMat[i] = obj2.getNum();
- }
- obj2.free();
- }
- }
- obj1.free();
-
- // get Type 3 bounding box, font definition, and resources
- if (type == fontType3) {
- if (fontDict->lookup("FontBBox", &obj1)->isArray()) {
- for (i = 0; i < 4 && i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
- fontBBox[i] = obj2.getNum();
- }
- obj2.free();
- }
- }
- obj1.free();
- if (!fontDict->lookup("CharProcs", &charProcs)->isDict()) {
- error(-1, "Missing or invalid CharProcs dictionary in Type 3 font");
- charProcs.free();
- }
- if (!fontDict->lookup("Resources", &resources)->isDict()) {
- resources.free();
- }
- }
-
- //----- build the font encoding -----
-
- // Encodings start with a base encoding, which can come from
- // (in order of priority):
- // 1. FontDict.Encoding or FontDict.Encoding.BaseEncoding
- // - MacRoman / MacExpert / WinAnsi / Standard
- // 2. embedded or external font file
- // 3. default:
- // - builtin --> builtin encoding
- // - TrueType --> MacRomanEncoding
- // - others --> StandardEncoding
- // and then add a list of differences (if any) from
- // FontDict.Encoding.Differences.
-
- // check FontDict for base encoding
- hasEncoding = gFalse;
- usesMacRomanEnc = gFalse;
- baseEnc = NULL;
- baseEncFromFontFile = gFalse;
- fontDict->lookup("Encoding", &obj1);
- if (obj1.isDict()) {
- obj1.dictLookup("BaseEncoding", &obj2);
- if (obj2.isName("MacRomanEncoding")) {
- hasEncoding = gTrue;
- usesMacRomanEnc = gTrue;
- baseEnc = macRomanEncoding;
- } else if (obj2.isName("MacExpertEncoding")) {
- hasEncoding = gTrue;
- baseEnc = macExpertEncoding;
- } else if (obj2.isName("WinAnsiEncoding")) {
- hasEncoding = gTrue;
- baseEnc = winAnsiEncoding;
- } else if (obj2.isName("StandardEncoding")) {
- hasEncoding = gTrue;
- baseEnc = standardEncoding;
- }
- obj2.free();
- } else if (obj1.isName("MacRomanEncoding")) {
- hasEncoding = gTrue;
- usesMacRomanEnc = gTrue;
- baseEnc = macRomanEncoding;
- } else if (obj1.isName("MacExpertEncoding")) {
- hasEncoding = gTrue;
- baseEnc = macExpertEncoding;
- } else if (obj1.isName("WinAnsiEncoding")) {
- hasEncoding = gTrue;
- baseEnc = winAnsiEncoding;
- } else if (obj1.isName("StandardEncoding")) {
- hasEncoding = gTrue;
- baseEnc = standardEncoding;
- }
-
- // check embedded or external font file for base encoding
- // (only for Type 1 fonts - trying to get an encoding out of a
- // TrueType font is a losing proposition)
- ffT1 = NULL;
- ffT1C = NULL;
- buf = NULL;
- if (type == fontType1 && (extFontFile || embFontID.num >= 0)) {
- if (extFontFile) {
- ffT1 = FoFiType1::load(extFontFile->getCString());
- } else {
- buf = readEmbFontFile(xref, &len);
- ffT1 = FoFiType1::make(buf, len);
- }
- if (ffT1) {
- if (ffT1->getName()) {
- if (embFontName) {
- delete embFontName;
- }
- embFontName = new GString(ffT1->getName());
- }
- if (!baseEnc) {
- baseEnc = ffT1->getEncoding();
- baseEncFromFontFile = gTrue;
- }
- }
- } else if (type == fontType1C && (extFontFile || embFontID.num >= 0)) {
- if (extFontFile) {
- ffT1C = FoFiType1C::load(extFontFile->getCString());
- } else {
- buf = readEmbFontFile(xref, &len);
- ffT1C = FoFiType1C::make(buf, len);
- }
- if (ffT1C) {
- if (ffT1C->getName()) {
- if (embFontName) {
- delete embFontName;
- }
- embFontName = new GString(ffT1C->getName());
- }
- if (!baseEnc) {
- baseEnc = ffT1C->getEncoding();
- baseEncFromFontFile = gTrue;
- }
- }
- }
- if (buf) {
- gfree(buf);
- }
-
- // get default base encoding
- if (!baseEnc) {
- if (builtinFont) {
- baseEnc = builtinFont->defaultBaseEnc;
- hasEncoding = gTrue;
- } else if (type == fontTrueType) {
- baseEnc = winAnsiEncoding;
- } else {
- baseEnc = standardEncoding;
- }
- }
-
- // copy the base encoding
- for (i = 0; i < 256; ++i) {
- enc[i] = baseEnc[i];
- if ((encFree[i] = baseEncFromFontFile) && enc[i]) {
- enc[i] = copyString(baseEnc[i]);
- }
- }
-
- // some Type 1C font files have empty encodings, which can break the
- // T1C->T1 conversion (since the 'seac' operator depends on having
- // the accents in the encoding), so we fill in any gaps from
- // StandardEncoding
- if (type == fontType1C && (extFontFile || embFontID.num >= 0) &&
- baseEncFromFontFile) {
- for (i = 0; i < 256; ++i) {
- if (!enc[i] && standardEncoding[i]) {
- enc[i] = standardEncoding[i];
- encFree[i] = gFalse;
- }
- }
- }
-
- // merge differences into encoding
- if (obj1.isDict()) {
- obj1.dictLookup("Differences", &obj2);
- if (obj2.isArray()) {
- hasEncoding = gTrue;
- code = 0;
- for (i = 0; i < obj2.arrayGetLength(); ++i) {
- obj2.arrayGet(i, &obj3);
- if (obj3.isInt()) {
- code = obj3.getInt();
- } else if (obj3.isName()) {
- if (code >= 0 && code < 256) {
- if (encFree[code]) {
- gfree(enc[code]);
- }
- enc[code] = copyString(obj3.getName());
- encFree[code] = gTrue;
- }
- ++code;
- } else {
- error(-1, "Wrong type in font encoding resource differences (%s)",
- obj3.getTypeName());
- }
- obj3.free();
- }
- }
- obj2.free();
- }
- obj1.free();
- if (ffT1) {
- delete ffT1;
- }
- if (ffT1C) {
- delete ffT1C;
- }
-
- //----- build the mapping to Unicode -----
-
- // pass 1: use the name-to-Unicode mapping table
- missing = hex = gFalse;
- for (code = 0; code < 256; ++code) {
- if ((charName = enc[code])) {
- if (!(toUnicode[code] = globalParams->mapNameToUnicode(charName)) &&
- strcmp(charName, ".notdef")) {
- // if it wasn't in the name-to-Unicode table, check for a
- // name that looks like 'Axx' or 'xx', where 'A' is any letter
- // and 'xx' is two hex digits
- if ((strlen(charName) == 3 &&
- isalpha(charName[0]) &&
- isxdigit(charName[1]) && isxdigit(charName[2]) &&
- ((charName[1] >= 'a' && charName[1] <= 'f') ||
- (charName[1] >= 'A' && charName[1] <= 'F') ||
- (charName[2] >= 'a' && charName[2] <= 'f') ||
- (charName[2] >= 'A' && charName[2] <= 'F'))) ||
- (strlen(charName) == 2 &&
- isxdigit(charName[0]) && isxdigit(charName[1]) &&
- ((charName[0] >= 'a' && charName[0] <= 'f') ||
- (charName[0] >= 'A' && charName[0] <= 'F') ||
- (charName[1] >= 'a' && charName[1] <= 'f') ||
- (charName[1] >= 'A' && charName[1] <= 'F')))) {
- hex = gTrue;
- }
- missing = gTrue;
- }
- } else {
- toUnicode[code] = 0;
- }
- }
-
- // pass 2: try to fill in the missing chars, looking for names of
- // the form 'Axx', 'xx', 'Ann', 'ABnn', or 'nn', where 'A' and 'B'
- // are any letters, 'xx' is two hex digits, and 'nn' is 2-4
- // decimal digits
- if (missing && globalParams->getMapNumericCharNames()) {
- for (code = 0; code < 256; ++code) {
- if ((charName = enc[code]) && !toUnicode[code] &&
- strcmp(charName, ".notdef")) {
- n = strlen(charName);
- code2 = -1;
- if (hex && n == 3 && isalpha(charName[0]) &&
- isxdigit(charName[1]) && isxdigit(charName[2])) {
- sscanf(charName+1, "%x", &code2);
- } else if (hex && n == 2 &&
- isxdigit(charName[0]) && isxdigit(charName[1])) {
- sscanf(charName, "%x", &code2);
- } else if (!hex && n >= 2 && n <= 4 &&
- isdigit(charName[0]) && isdigit(charName[1])) {
- code2 = atoi(charName);
- } else if (n >= 3 && n <= 5 &&
- isdigit(charName[1]) && isdigit(charName[2])) {
- code2 = atoi(charName+1);
- } else if (n >= 4 && n <= 6 &&
- isdigit(charName[2]) && isdigit(charName[3])) {
- code2 = atoi(charName+2);
- }
- if (code2 >= 0 && code2 <= 0xff) {
- toUnicode[code] = (Unicode)code2;
- }
- }
- }
- }
-
- // construct the char code -> Unicode mapping object
- ctu = CharCodeToUnicode::make8BitToUnicode(toUnicode);
-
- // merge in a ToUnicode CMap, if there is one -- this overwrites
- // existing entries in ctu, i.e., the ToUnicode CMap takes
- // precedence, but the other encoding info is allowed to fill in any
- // holes
- readToUnicodeCMap(fontDict, 8, ctu);
-
- // look for a Unicode-to-Unicode mapping
- if (name && (utu = globalParams->getUnicodeToUnicode(name))) {
- for (i = 0; i < 256; ++i) {
- toUnicode[i] = 0;
- }
- ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode);
- for (i = 0; i < 256; ++i) {
- n = ctu->mapToUnicode((CharCode)i, uBuf, 8);
- if (n >= 1) {
- n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8);
- if (n >= 1) {
- ctu2->setMapping((CharCode)i, uBuf, n);
- }
- }
- }
- utu->decRefCnt();
- delete ctu;
- ctu = ctu2;
- }
-
- //----- get the character widths -----
-
- // initialize all widths
- for (code = 0; code < 256; ++code) {
- widths[code] = missingWidth * 0.001;
- }
-
- // use widths from font dict, if present
- fontDict->lookup("FirstChar", &obj1);
- firstChar = obj1.isInt() ? obj1.getInt() : 0;
- obj1.free();
- if (firstChar < 0 || firstChar > 255) {
- firstChar = 0;
- }
- fontDict->lookup("LastChar", &obj1);
- lastChar = obj1.isInt() ? obj1.getInt() : 255;
- obj1.free();
- if (lastChar < 0 || lastChar > 255) {
- lastChar = 255;
- }
- mul = (type == fontType3) ? fontMat[0] : 0.001;
- fontDict->lookup("Widths", &obj1);
- if (obj1.isArray()) {
- flags |= fontFixedWidth;
- if (obj1.arrayGetLength() < lastChar - firstChar + 1) {
- lastChar = firstChar + obj1.arrayGetLength() - 1;
- }
- for (code = firstChar; code <= lastChar; ++code) {
- obj1.arrayGet(code - firstChar, &obj2);
- if (obj2.isNum()) {
- widths[code] = obj2.getNum() * mul;
- if (widths[code] != widths[firstChar]) {
- flags &= ~fontFixedWidth;
- }
- }
- obj2.free();
- }
-
- // use widths from built-in font
- } else if (builtinFont) {
- // this is a kludge for broken PDF files that encode char 32
- // as .notdef
- if (builtinFont->widths->getWidth("space", &w)) {
- widths[32] = 0.001 * w;
- }
- for (code = 0; code < 256; ++code) {
- if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) {
- widths[code] = 0.001 * w;
- }
- }
-
- // couldn't find widths -- use defaults
- } else {
- // this is technically an error -- the Widths entry is required
- // for all but the Base-14 fonts -- but certain PDF generators
- // apparently don't include widths for Arial and TimesNewRoman
- if (isFixedWidth()) {
- i = 0;
- } else if (isSerif()) {
- i = 8;
- } else {
- i = 4;
- }
- if (isBold()) {
- i += 2;
- }
- if (isItalic()) {
- i += 1;
- }
- builtinFont = builtinFontSubst[i];
- // this is a kludge for broken PDF files that encode char 32
- // as .notdef
- if (builtinFont->widths->getWidth("space", &w)) {
- widths[32] = 0.001 * w;
- }
- for (code = 0; code < 256; ++code) {
- if (enc[code] && builtinFont->widths->getWidth(enc[code], &w)) {
- widths[code] = 0.001 * w;
- }
- }
- }
- obj1.free();
-
- ok = gTrue;
-}
-
-Gfx8BitFont::~Gfx8BitFont() {
- int i;
-
- for (i = 0; i < 256; ++i) {
- if (encFree[i] && enc[i]) {
- gfree(enc[i]);
- }
- }
- ctu->decRefCnt();
- if (charProcs.isDict()) {
- charProcs.free();
- }
- if (resources.isDict()) {
- resources.free();
- }
-}
-
-int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
- double *dx, double *dy, double *ox, double *oy) {
- CharCode c;
-
- *code = c = (CharCode)(*s & 0xff);
- *uLen = ctu->mapToUnicode(c, u, uSize);
- *dx = widths[c];
- *dy = *ox = *oy = 0;
- return 1;
-}
-
-CharCodeToUnicode *Gfx8BitFont::getToUnicode() {
- ctu->incRefCnt();
- return ctu;
-}
-
-Gushort *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) {
- Gushort *map;
- int cmapPlatform, cmapEncoding;
- int unicodeCmap, macRomanCmap, msSymbolCmap, cmap;
- GBool useMacRoman, useUnicode;
- char *charName;
- Unicode u;
- int code, i, n;
-
- map = (Gushort *)gmalloc(256 * sizeof(Gushort));
- for (i = 0; i < 256; ++i) {
- map[i] = 0;
- }
-
- // To match up with the Adobe-defined behaviour, we choose a cmap
- // like this:
- // 1. If the PDF font has an encoding:
- // 1a. If the PDF font specified MacRomanEncoding and the
- // TrueType font has a Macintosh Roman cmap, use it, and
- // reverse map the char names through MacRomanEncoding to
- // get char codes.
- // 1b. If the TrueType font has a Microsoft Unicode cmap or a
- // non-Microsoft Unicode cmap, use it, and use the Unicode
- // indexes, not the char codes.
- // 1c. If the PDF font is symbolic and the TrueType font has a
- // Microsoft Symbol cmap, use it, and use char codes
- // directly (possibly with an offset of 0xf000).
- // 1d. If the TrueType font has a Macintosh Roman cmap, use it,
- // as in case 1a.
- // 2. If the PDF font does not have an encoding:
- // 2a. If the TrueType font has a Macintosh Roman cmap, use it,
- // and use char codes directly (possibly with an offset of
- // 0xf000).
- // 2b. If the TrueType font has a Microsoft Symbol cmap, use it,
- // and use char codes directly (possible with an offset of
- // 0xf000).
- // 3. If none of these rules apply, use the first cmap and hope for
- // the best (this shouldn't happen).
- unicodeCmap = macRomanCmap = msSymbolCmap = -1;
- for (i = 0; i < ff->getNumCmaps(); ++i) {
- cmapPlatform = ff->getCmapPlatform(i);
- cmapEncoding = ff->getCmapEncoding(i);
- if ((cmapPlatform == 3 && cmapEncoding == 1) ||
- cmapPlatform == 0) {
- unicodeCmap = i;
- } else if (cmapPlatform == 1 && cmapEncoding == 0) {
- macRomanCmap = i;
- } else if (cmapPlatform == 3 && cmapEncoding == 0) {
- msSymbolCmap = i;
- }
- }
- cmap = 0;
- useMacRoman = gFalse;
- useUnicode = gFalse;
- if (hasEncoding) {
- if (usesMacRomanEnc && macRomanCmap >= 0) {
- cmap = macRomanCmap;
- useMacRoman = gTrue;
- } else if (unicodeCmap >= 0) {
- cmap = unicodeCmap;
- useUnicode = gTrue;
- } else if ((flags & fontSymbolic) && msSymbolCmap >= 0) {
- cmap = msSymbolCmap;
- } else if (macRomanCmap >= 0) {
- cmap = macRomanCmap;
- useMacRoman = gTrue;
- }
- } else {
- if (macRomanCmap >= 0) {
- cmap = macRomanCmap;
- } else if (msSymbolCmap >= 0) {
- cmap = msSymbolCmap;
- }
- }
-
- // reverse map the char names through MacRomanEncoding, then map the
- // char codes through the cmap
- if (useMacRoman) {
- for (i = 0; i < 256; ++i) {
- if ((charName = enc[i])) {
- if ((code = globalParams->getMacRomanCharCode(charName))) {
- map[i] = ff->mapCodeToGID(cmap, code);
- }
- }
- }
-
- // map Unicode through the cmap
- } else if (useUnicode) {
- for (i = 0; i < 256; ++i) {
- if ((n = ctu->mapToUnicode((CharCode)i, &u, 1))) {
- map[i] = ff->mapCodeToGID(cmap, u);
- }
- }
-
- // map the char codes through the cmap, possibly with an offset of
- // 0xf000
- } else {
- for (i = 0; i < 256; ++i) {
- if (!(map[i] = ff->mapCodeToGID(cmap, i))) {
- map[i] = ff->mapCodeToGID(cmap, 0xf000 + i);
- }
- }
- }
-
- // try the TrueType 'post' table to handle any unmapped characters
- for (i = 0; i < 256; ++i) {
- if (!map[i] && (charName = enc[i])) {
- map[i] = (Gushort)(int)ff->mapNameToGID(charName);
- }
- }
-
- return map;
-}
-
-Dict *Gfx8BitFont::getCharProcs() {
- return charProcs.isDict() ? charProcs.getDict() : (Dict *)NULL;
-}
-
-Object *Gfx8BitFont::getCharProc(int code, Object *proc) {
- if (enc[code] && charProcs.isDict()) {
- charProcs.dictLookup(enc[code], proc);
- } else {
- proc->initNull();
- }
- return proc;
-}
-
-Dict *Gfx8BitFont::getResources() {
- return resources.isDict() ? resources.getDict() : (Dict *)NULL;
-}
-
-//------------------------------------------------------------------------
-// GfxCIDFont
-//------------------------------------------------------------------------
-
-static int CDECL cmpWidthExcep(const void *w1, const void *w2) {
- return ((GfxFontCIDWidthExcep *)w1)->first -
- ((GfxFontCIDWidthExcep *)w2)->first;
-}
-
-static int CDECL cmpWidthExcepV(const void *w1, const void *w2) {
- return ((GfxFontCIDWidthExcepV *)w1)->first -
- ((GfxFontCIDWidthExcepV *)w2)->first;
-}
-
-GfxCIDFont::GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
- Dict *fontDict):
- GfxFont(tagA, idA, nameA)
-{
- Dict *desFontDict;
- GString *collection, *cMapName;
- Object desFontDictObj;
- Object obj1, obj2, obj3, obj4, obj5, obj6;
- int c1, c2;
- int excepsSize, i, j, k;
-
- ascent = 0.95;
- descent = -0.35;
- fontBBox[0] = fontBBox[1] = fontBBox[2] = fontBBox[3] = 0;
- cMap = NULL;
- ctu = NULL;
- widths.defWidth = 1.0;
- widths.defHeight = -1.0;
- widths.defVY = 0.880;
- widths.exceps = NULL;
- widths.nExceps = 0;
- widths.excepsV = NULL;
- widths.nExcepsV = 0;
- cidToGID = NULL;
- cidToGIDLen = 0;
-
- // get the descendant font
- if (!fontDict->lookup("DescendantFonts", &obj1)->isArray()) {
- error(-1, "Missing DescendantFonts entry in Type 0 font");
- obj1.free();
- goto err1;
- }
- if (!obj1.arrayGet(0, &desFontDictObj)->isDict()) {
- error(-1, "Bad descendant font in Type 0 font");
- goto err3;
- }
- obj1.free();
- desFontDict = desFontDictObj.getDict();
-
- // font type
- if (!desFontDict->lookup("Subtype", &obj1)) {
- error(-1, "Missing Subtype entry in Type 0 descendant font");
- goto err3;
- }
- if (obj1.isName("CIDFontType0")) {
- type = fontCIDType0;
- } else if (obj1.isName("CIDFontType2")) {
- type = fontCIDType2;
- } else {
- error(-1, "Unknown Type 0 descendant font type '%s'",
- obj1.isName() ? obj1.getName() : "???");
- goto err3;
- }
- obj1.free();
-
- // get info from font descriptor
- readFontDescriptor(xref, desFontDict);
-
- // look for an external font file
- findExtFontFile();
-
- //----- encoding info -----
-
- // char collection
- if (!desFontDict->lookup("CIDSystemInfo", &obj1)->isDict()) {
- error(-1, "Missing CIDSystemInfo dictionary in Type 0 descendant font");
- goto err3;
- }
- obj1.dictLookup("Registry", &obj2);
- obj1.dictLookup("Ordering", &obj3);
- if (!obj2.isString() || !obj3.isString()) {
- error(-1, "Invalid CIDSystemInfo dictionary in Type 0 descendant font");
- goto err4;
- }
- collection = obj2.getString()->copy()->append('-')->append(obj3.getString());
- obj3.free();
- obj2.free();
- obj1.free();
-
- // look for a ToUnicode CMap
- if (!(ctu = readToUnicodeCMap(fontDict, 16, NULL))) {
-
- // the "Adobe-Identity" and "Adobe-UCS" collections don't have
- // cidToUnicode files
- if (collection->cmp("Adobe-Identity") &&
- collection->cmp("Adobe-UCS")) {
-
- // look for a user-supplied .cidToUnicode file
- if (!(ctu = globalParams->getCIDToUnicode(collection))) {
- error(-1, "Unknown character collection '%s'",
- collection->getCString());
- delete collection;
- goto err2;
- }
- }
- }
-
- // encoding (i.e., CMap)
- //~ need to handle a CMap stream here
- //~ also need to deal with the UseCMap entry in the stream dict
- if (!fontDict->lookup("Encoding", &obj1)->isName()) {
- error(-1, "Missing or invalid Encoding entry in Type 0 font");
- delete collection;
- goto err3;
- }
- cMapName = new GString(obj1.getName());
- obj1.free();
- if (!(cMap = globalParams->getCMap(collection, cMapName))) {
- error(-1, "Unknown CMap '%s' for character collection '%s'",
- cMapName->getCString(), collection->getCString());
- delete collection;
- delete cMapName;
- goto err2;
- }
- delete collection;
- delete cMapName;
-
- // CIDToGIDMap (for embedded TrueType fonts)
- if (type == fontCIDType2) {
- desFontDict->lookup("CIDToGIDMap", &obj1);
- if (obj1.isStream()) {
- cidToGIDLen = 0;
- i = 64;
- cidToGID = (Gushort *)gmalloc(i * sizeof(Gushort));
- obj1.streamReset();
- while ((c1 = obj1.streamGetChar()) != EOF &&
- (c2 = obj1.streamGetChar()) != EOF) {
- if (cidToGIDLen == i) {
- i *= 2;
- cidToGID = (Gushort *)grealloc(cidToGID, i * sizeof(Gushort));
- }
- cidToGID[cidToGIDLen++] = (Gushort)((c1 << 8) + c2);
- }
- } else if (!obj1.isName("Identity") && !obj1.isNull()) {
- error(-1, "Invalid CIDToGIDMap entry in CID font");
- }
- obj1.free();
- }
-
- //----- character metrics -----
-
- // default char width
- if (desFontDict->lookup("DW", &obj1)->isInt()) {
- widths.defWidth = obj1.getInt() * 0.001;
- }
- obj1.free();
-
- // char width exceptions
- if (desFontDict->lookup("W", &obj1)->isArray()) {
- excepsSize = 0;
- i = 0;
- while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i + 1, &obj3);
- if (obj2.isInt() && obj3.isInt() && i + 2 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum()) {
- if (widths.nExceps == excepsSize) {
- excepsSize += 16;
- widths.exceps = (GfxFontCIDWidthExcep *)
- grealloc(widths.exceps,
- excepsSize * sizeof(GfxFontCIDWidthExcep));
- }
- widths.exceps[widths.nExceps].first = obj2.getInt();
- widths.exceps[widths.nExceps].last = obj3.getInt();
- widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001;
- ++widths.nExceps;
- } else {
- error(-1, "Bad widths array in Type 0 font");
- }
- obj4.free();
- i += 3;
- } else if (obj2.isInt() && obj3.isArray()) {
- if (widths.nExceps + obj3.arrayGetLength() > excepsSize) {
- excepsSize = (widths.nExceps + obj3.arrayGetLength() + 15) & ~15;
- widths.exceps = (GfxFontCIDWidthExcep *)
- grealloc(widths.exceps,
- excepsSize * sizeof(GfxFontCIDWidthExcep));
- }
- j = obj2.getInt();
- for (k = 0; k < obj3.arrayGetLength(); ++k) {
- if (obj3.arrayGet(k, &obj4)->isNum()) {
- widths.exceps[widths.nExceps].first = j;
- widths.exceps[widths.nExceps].last = j;
- widths.exceps[widths.nExceps].width = obj4.getNum() * 0.001;
- ++j;
- ++widths.nExceps;
- } else {
- error(-1, "Bad widths array in Type 0 font");
- }
- obj4.free();
- }
- i += 2;
- } else {
- error(-1, "Bad widths array in Type 0 font");
- ++i;
- }
- obj3.free();
- obj2.free();
- }
- qsort(widths.exceps, widths.nExceps, sizeof(GfxFontCIDWidthExcep),
- &cmpWidthExcep);
- }
- obj1.free();
-
- // default metrics for vertical font
- if (desFontDict->lookup("DW2", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- if (obj1.arrayGet(0, &obj2)->isNum()) {
- widths.defVY = obj2.getNum() * 0.001;
- }
- obj2.free();
- if (obj1.arrayGet(1, &obj2)->isNum()) {
- widths.defHeight = obj2.getNum() * 0.001;
- }
- obj2.free();
- }
- obj1.free();
-
- // char metric exceptions for vertical font
- if (desFontDict->lookup("W2", &obj1)->isArray()) {
- excepsSize = 0;
- i = 0;
- while (i + 1 < obj1.arrayGetLength()) {
- obj1.arrayGet(i, &obj2);
- obj1.arrayGet(i+ 1, &obj3);
- if (obj2.isInt() && obj3.isInt() && i + 4 < obj1.arrayGetLength()) {
- if (obj1.arrayGet(i + 2, &obj4)->isNum() &&
- obj1.arrayGet(i + 3, &obj5)->isNum() &&
- obj1.arrayGet(i + 4, &obj6)->isNum()) {
- if (widths.nExcepsV == excepsSize) {
- excepsSize += 16;
- widths.excepsV = (GfxFontCIDWidthExcepV *)
- grealloc(widths.excepsV,
- excepsSize * sizeof(GfxFontCIDWidthExcepV));
- }
- widths.excepsV[widths.nExcepsV].first = obj2.getInt();
- widths.excepsV[widths.nExcepsV].last = obj3.getInt();
- widths.excepsV[widths.nExcepsV].height = obj4.getNum() * 0.001;
- widths.excepsV[widths.nExcepsV].vx = obj5.getNum() * 0.001;
- widths.excepsV[widths.nExcepsV].vy = obj6.getNum() * 0.001;
- ++widths.nExcepsV;
- } else {
- error(-1, "Bad widths (W2) array in Type 0 font");
- }
- obj6.free();
- obj5.free();
- obj4.free();
- i += 5;
- } else if (obj2.isInt() && obj3.isArray()) {
- if (widths.nExcepsV + obj3.arrayGetLength() / 3 > excepsSize) {
- excepsSize =
- (widths.nExcepsV + obj3.arrayGetLength() / 3 + 15) & ~15;
- widths.excepsV = (GfxFontCIDWidthExcepV *)
- grealloc(widths.excepsV,
- excepsSize * sizeof(GfxFontCIDWidthExcepV));
- }
- j = obj2.getInt();
- for (k = 0; k < obj3.arrayGetLength(); k += 3) {
- if (obj3.arrayGet(k, &obj4)->isNum() &&
- obj3.arrayGet(k+1, &obj5)->isNum() &&
- obj3.arrayGet(k+2, &obj6)->isNum()) {
- widths.excepsV[widths.nExceps].first = j;
- widths.excepsV[widths.nExceps].last = j;
- widths.excepsV[widths.nExceps].height = obj4.getNum() * 0.001;
- widths.excepsV[widths.nExceps].vx = obj5.getNum() * 0.001;
- widths.excepsV[widths.nExceps].vy = obj6.getNum() * 0.001;
- ++j;
- ++widths.nExcepsV;
- } else {
- error(-1, "Bad widths (W2) array in Type 0 font");
- }
- obj6.free();
- obj5.free();
- obj4.free();
- }
- i += 2;
- } else {
- error(-1, "Bad widths (W2) array in Type 0 font");
- ++i;
- }
- obj3.free();
- obj2.free();
- }
- qsort(widths.excepsV, widths.nExcepsV, sizeof(GfxFontCIDWidthExcepV),
- &cmpWidthExcepV);
- }
- obj1.free();
-
- desFontDictObj.free();
- ok = gTrue;
- return;
-
- err4:
- obj3.free();
- obj2.free();
- err3:
- obj1.free();
- err2:
- desFontDictObj.free();
- err1:;
-}
-
-GfxCIDFont::~GfxCIDFont() {
- if (cMap) {
- cMap->decRefCnt();
- }
- if (ctu) {
- ctu->decRefCnt();
- }
- gfree(widths.exceps);
- gfree(widths.excepsV);
- if (cidToGID) {
- gfree(cidToGID);
- }
-}
-
-int GfxCIDFont::getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
- double *dx, double *dy, double *ox, double *oy) {
- CID cid;
- double w, h, vx, vy;
- int n, a, b, m;
-
- if (!cMap) {
- *code = 0;
- *uLen = 0;
- *dx = *dy = 0;
- return 1;
- }
-
- *code = (CharCode)(cid = cMap->getCID(s, len, &n));
- if (ctu) {
- *uLen = ctu->mapToUnicode(cid, u, uSize);
- } else {
- *uLen = 0;
- }
-
- // horizontal
- if (cMap->getWMode() == 0) {
- w = widths.defWidth;
- h = vx = vy = 0;
- if (widths.nExceps > 0 && cid >= widths.exceps[0].first) {
- a = 0;
- b = widths.nExceps;
- // invariant: widths.exceps[a].first <= cid < widths.exceps[b].first
- while (b - a > 1) {
- m = (a + b) / 2;
- if (widths.exceps[m].first <= cid) {
- a = m;
- } else {
- b = m;
- }
- }
- if (cid <= widths.exceps[a].last) {
- w = widths.exceps[a].width;
- }
- }
-
- // vertical
- } else {
- w = 0;
- h = widths.defHeight;
- vx = widths.defWidth / 2;
- vy = widths.defVY;
- if (widths.nExcepsV > 0 && cid >= widths.excepsV[0].first) {
- a = 0;
- b = widths.nExcepsV;
- // invariant: widths.excepsV[a].first <= cid < widths.excepsV[b].first
- while (b - a > 1) {
- m = (a + b) / 2;
- if (widths.excepsV[m].last <= cid) {
- a = m;
- } else {
- b = m;
- }
- }
- if (cid <= widths.excepsV[a].last) {
- h = widths.excepsV[a].height;
- vx = widths.excepsV[a].vx;
- vy = widths.excepsV[a].vy;
- }
- }
- }
-
- *dx = w;
- *dy = h;
- *ox = vx;
- *oy = vy;
-
- return n;
-}
-
-int GfxCIDFont::getWMode() {
- return cMap ? cMap->getWMode() : 0;
-}
-
-CharCodeToUnicode *GfxCIDFont::getToUnicode() {
- if (ctu) {
- ctu->incRefCnt();
- }
- return ctu;
-}
-
-GString *GfxCIDFont::getCollection() {
- return cMap ? cMap->getCollection() : (GString *)NULL;
-}
-
-//------------------------------------------------------------------------
-// GfxFontDict
-//------------------------------------------------------------------------
-
-GfxFontDict::GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict) {
- int i;
- Object obj1, obj2;
- Ref r;
-
- numFonts = fontDict->getLength();
- fonts = (GfxFont **)gmalloc(numFonts * sizeof(GfxFont *));
- for (i = 0; i < numFonts; ++i) {
- fontDict->getValNF(i, &obj1);
- obj1.fetch(xref, &obj2);
- if (obj2.isDict()) {
- if (obj1.isRef()) {
- r = obj1.getRef();
- } else {
- // no indirect reference for this font, so invent a unique one
- // (legal generation numbers are five digits, so any 6-digit
- // number would be safe)
- r.num = i;
- if (fontDictRef) {
- r.gen = 100000 + fontDictRef->num;
- } else {
- r.gen = 999999;
- }
- }
- fonts[i] = GfxFont::makeFont(xref, fontDict->getKey(i),
- r, obj2.getDict());
- if (fonts[i] && !fonts[i]->isOk()) {
- delete fonts[i];
- fonts[i] = NULL;
- }
- } else {
- error(-1, "font resource is not a dictionary");
- fonts[i] = NULL;
- }
- obj1.free();
- obj2.free();
- }
-}
-
-GfxFontDict::~GfxFontDict() {
- int i;
-
- for (i = 0; i < numFonts; ++i) {
- if (fonts[i]) {
- delete fonts[i];
- }
- }
- gfree(fonts);
-}
-
-GfxFont *GfxFontDict::lookup(char *tag) {
- int i;
-
- for (i = 0; i < numFonts; ++i) {
- if (fonts[i] && fonts[i]->matches(tag)) {
- return fonts[i];
- }
- }
- return NULL;
-}
diff --git a/pdf/xpdf/GfxFont.h b/pdf/xpdf/GfxFont.h
deleted file mode 100644
index 62dfd08..0000000
--- a/pdf/xpdf/GfxFont.h
+++ /dev/null
@@ -1,315 +0,0 @@
-//========================================================================
-//
-// GfxFont.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GFXFONT_H
-#define GFXFONT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "GString.h"
-#include "Object.h"
-#include "CharTypes.h"
-
-class Dict;
-class CMap;
-class CharCodeToUnicode;
-class FoFiTrueType;
-struct GfxFontCIDWidths;
-
-//------------------------------------------------------------------------
-// GfxFontType
-//------------------------------------------------------------------------
-
-enum GfxFontType {
- //----- Gfx8BitFont
- fontUnknownType,
- fontType1,
- fontType1C,
- fontType3,
- fontTrueType,
- //----- GfxCIDFont
- fontCIDType0,
- fontCIDType0C,
- fontCIDType2
-};
-
-//------------------------------------------------------------------------
-// GfxFontCIDWidths
-//------------------------------------------------------------------------
-
-struct GfxFontCIDWidthExcep {
- CID first; // this record applies to
- CID last; // CIDs <first>..<last>
- double width; // char width
-};
-
-struct GfxFontCIDWidthExcepV {
- CID first; // this record applies to
- CID last; // CIDs <first>..<last>
- double height; // char height
- double vx, vy; // origin position
-};
-
-struct GfxFontCIDWidths {
- double defWidth; // default char width
- double defHeight; // default char height
- double defVY; // default origin position
- GfxFontCIDWidthExcep *exceps; // exceptions
- int nExceps; // number of valid entries in exceps
- GfxFontCIDWidthExcepV * // exceptions for vertical font
- excepsV;
- int nExcepsV; // number of valid entries in excepsV
-};
-
-//------------------------------------------------------------------------
-// GfxFont
-//------------------------------------------------------------------------
-
-#define fontFixedWidth (1 << 0)
-#define fontSerif (1 << 1)
-#define fontSymbolic (1 << 2)
-#define fontItalic (1 << 6)
-#define fontBold (1 << 18)
-
-class GfxFont {
-public:
-
- // Build a GfxFont object.
- static GfxFont *makeFont(XRef *xref, char *tagA, Ref idA, Dict *fontDict);
-
- GfxFont(char *tagA, Ref idA, GString *nameA);
-
- virtual ~GfxFont();
-
- GBool isOk() { return ok; }
-
- // Get font tag.
- GString *getTag() { return tag; }
-
- // Get font dictionary ID.
- Ref *getID() { return &id; }
-
- // Does this font match the tag?
- GBool matches(char *tagA) { return !tag->cmp(tagA); }
-
- // Get base font name.
- GString *getName() { return name; }
-
- // Get the original font name (ignornig any munging that might have
- // been done to map to a canonical Base-14 font name).
- GString *getOrigName() { return origName; }
-
- // Get font type.
- GfxFontType getType() { return type; }
- virtual GBool isCIDFont() { return gFalse; }
-
- // Get embedded font ID, i.e., a ref for the font file stream.
- // Returns false if there is no embedded font.
- GBool getEmbeddedFontID(Ref *embID)
- { *embID = embFontID; return embFontID.num >= 0; }
-
- // Get the PostScript font name for the embedded font. Returns
- // NULL if there is no embedded font.
- GString *getEmbeddedFontName() { return embFontName; }
-
- // Get the name of the external font file. Returns NULL if there
- // is no external font file.
- GString *getExtFontFile() { return extFontFile; }
-
- // Get font descriptor flags.
- GBool isFixedWidth() { return flags & fontFixedWidth; }
- GBool isSerif() { return flags & fontSerif; }
- GBool isSymbolic() { return flags & fontSymbolic; }
- GBool isItalic() { return flags & fontItalic; }
- GBool isBold() { return flags & fontBold; }
-
- // Return the font matrix.
- double *getFontMatrix() { return fontMat; }
-
- // Return the font bounding box.
- double *getFontBBox() { return fontBBox; }
-
- // Return the ascent and descent values.
- double getAscent() { return ascent; }
- double getDescent() { return descent; }
-
- // Return the writing mode (0=horizontal, 1=vertical).
- virtual int getWMode() { return 0; }
-
- // Read an external or embedded font file into a buffer.
- char *readExtFontFile(int *len);
- char *readEmbFontFile(XRef *xref, int *len);
-
- // Get the next char from a string <s> of <len> bytes, returning the
- // char <code>, its Unicode mapping <u>, its displacement vector
- // (<dx>, <dy>), and its origin offset vector (<ox>, <oy>). <uSize>
- // is the number of entries available in <u>, and <uLen> is set to
- // the number actually used. Returns the number of bytes used by
- // the char code.
- virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
- double *dx, double *dy, double *ox, double *oy) = 0;
-
-protected:
-
- void readFontDescriptor(XRef *xref, Dict *fontDict);
- CharCodeToUnicode *readToUnicodeCMap(Dict *fontDict, int nBits,
- CharCodeToUnicode *ctu);
- void findExtFontFile();
-
- GString *tag; // PDF font tag
- Ref id; // reference (used as unique ID)
- GString *name; // font name
- GString *origName; // original font name
- GfxFontType type; // type of font
- int flags; // font descriptor flags
- GString *embFontName; // name of embedded font
- Ref embFontID; // ref to embedded font file stream
- GString *extFontFile; // external font file name
- double fontMat[6]; // font matrix (Type 3 only)
- double fontBBox[4]; // font bounding box (Type 3 only)
- double missingWidth; // "default" width
- double ascent; // max height above baseline
- double descent; // max depth below baseline
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// Gfx8BitFont
-//------------------------------------------------------------------------
-
-class Gfx8BitFont: public GfxFont {
-public:
-
- Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
- GfxFontType typeA, Dict *fontDict);
-
- virtual ~Gfx8BitFont();
-
- virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
- double *dx, double *dy, double *ox, double *oy);
-
- // Return the encoding.
- char **getEncoding() { return enc; }
-
- // Return the Unicode map.
- CharCodeToUnicode *getToUnicode();
-
- // Return the character name associated with <code>.
- char *getCharName(int code) { return enc[code]; }
-
- // Returns true if the PDF font specified an encoding.
- GBool getHasEncoding() { return hasEncoding; }
-
- // Returns true if the PDF font specified MacRomanEncoding.
- GBool getUsesMacRomanEnc() { return usesMacRomanEnc; }
-
- // Get width of a character.
- double getWidth(Guchar c) { return widths[c]; }
-
- // Return a char code-to-GID mapping for the provided font file.
- // (This is only useful for TrueType fonts.)
- Gushort *getCodeToGIDMap(FoFiTrueType *ff);
-
- // Return the Type 3 CharProc dictionary, or NULL if none.
- Dict *getCharProcs();
-
- // Return the Type 3 CharProc for the character associated with <code>.
- Object *getCharProc(int code, Object *proc);
-
- // Return the Type 3 Resources dictionary, or NULL if none.
- Dict *getResources();
-
-private:
-
- char *enc[256]; // char code --> char name
- char encFree[256]; // boolean for each char name: if set,
- // the string is malloc'ed
- CharCodeToUnicode *ctu; // char code --> Unicode
- GBool hasEncoding;
- GBool usesMacRomanEnc;
- double widths[256]; // character widths
- Object charProcs; // Type 3 CharProcs dictionary
- Object resources; // Type 3 Resources dictionary
-};
-
-//------------------------------------------------------------------------
-// GfxCIDFont
-//------------------------------------------------------------------------
-
-class GfxCIDFont: public GfxFont {
-public:
-
- GfxCIDFont(XRef *xref, char *tagA, Ref idA, GString *nameA,
- Dict *fontDict);
-
- virtual ~GfxCIDFont();
-
- virtual GBool isCIDFont() { return gTrue; }
-
- virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
- double *dx, double *dy, double *ox, double *oy);
-
- // Return the writing mode (0=horizontal, 1=vertical).
- virtual int getWMode();
-
- // Return the Unicode map.
- CharCodeToUnicode *getToUnicode();
-
- // Get the collection name (<registry>-<ordering>).
- GString *getCollection();
-
- // Return the CID-to-GID mapping table. These should only be called
- // if type is fontCIDType2.
- Gushort *getCIDToGID() { return cidToGID; }
- int getCIDToGIDLen() { return cidToGIDLen; }
-
-private:
-
- CMap *cMap; // char code --> CID
- CharCodeToUnicode *ctu; // CID --> Unicode
- GfxFontCIDWidths widths; // character widths
- Gushort *cidToGID; // CID --> GID mapping (for embedded
- // TrueType fonts)
- int cidToGIDLen;
-};
-
-//------------------------------------------------------------------------
-// GfxFontDict
-//------------------------------------------------------------------------
-
-class GfxFontDict {
-public:
-
- // Build the font dictionary, given the PDF font dictionary.
- GfxFontDict(XRef *xref, Ref *fontDictRef, Dict *fontDict);
-
- // Destructor.
- ~GfxFontDict();
-
- // Get the specified font.
- GfxFont *lookup(char *tag);
-
- // Iterative access.
- int getNumFonts() { return numFonts; }
- GfxFont *getFont(int i) { return fonts[i]; }
-
-private:
-
- GfxFont **fonts; // list of fonts
- int numFonts; // number of fonts
-};
-
-#endif
diff --git a/pdf/xpdf/GfxState.cc b/pdf/xpdf/GfxState.cc
deleted file mode 100644
index 92e5ebb..0000000
--- a/pdf/xpdf/GfxState.cc
+++ /dev/null
@@ -1,2782 +0,0 @@
-//========================================================================
-//
-// GfxState.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include <math.h>
-#include <string.h> // for memcpy()
-#include "gmem.h"
-#include "Error.h"
-#include "Object.h"
-#include "Array.h"
-#include "Page.h"
-#include "GfxState.h"
-
-//------------------------------------------------------------------------
-
-static inline double clip01(double x) {
- return (x < 0) ? 0 : ((x > 1) ? 1 : x);
-}
-
-//------------------------------------------------------------------------
-
-static char *gfxColorSpaceModeNames[] = {
- "DeviceGray",
- "CalGray",
- "DeviceRGB",
- "CalRGB",
- "DeviceCMYK",
- "Lab",
- "ICCBased",
- "Indexed",
- "Separation",
- "DeviceN",
- "Pattern"
-};
-
-#define nGfxColorSpaceModes ((sizeof(gfxColorSpaceModeNames) / sizeof(char *)))
-
-//------------------------------------------------------------------------
-// GfxColorSpace
-//------------------------------------------------------------------------
-
-GfxColorSpace::GfxColorSpace() {
-}
-
-GfxColorSpace::~GfxColorSpace() {
-}
-
-GfxColorSpace *GfxColorSpace::parse(Object *csObj) {
- GfxColorSpace *cs;
- Object obj1;
-
- cs = NULL;
- if (csObj->isName()) {
- if (csObj->isName("DeviceGray") || csObj->isName("G")) {
- cs = new GfxDeviceGrayColorSpace();
- } else if (csObj->isName("DeviceRGB") || csObj->isName("RGB")) {
- cs = new GfxDeviceRGBColorSpace();
- } else if (csObj->isName("DeviceCMYK") || csObj->isName("CMYK")) {
- cs = new GfxDeviceCMYKColorSpace();
- } else if (csObj->isName("Pattern")) {
- cs = new GfxPatternColorSpace(NULL);
- } else {
- error(-1, "Bad color space '%s'", csObj->getName());
- }
- } else if (csObj->isArray()) {
- csObj->arrayGet(0, &obj1);
- if (obj1.isName("DeviceGray") || obj1.isName("G")) {
- cs = new GfxDeviceGrayColorSpace();
- } else if (obj1.isName("DeviceRGB") || obj1.isName("RGB")) {
- cs = new GfxDeviceRGBColorSpace();
- } else if (obj1.isName("DeviceCMYK") || obj1.isName("CMYK")) {
- cs = new GfxDeviceCMYKColorSpace();
- } else if (obj1.isName("CalGray")) {
- cs = GfxCalGrayColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("CalRGB")) {
- cs = GfxCalRGBColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("Lab")) {
- cs = GfxLabColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("ICCBased")) {
- cs = GfxICCBasedColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("Indexed") || obj1.isName("I")) {
- cs = GfxIndexedColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("Separation")) {
- cs = GfxSeparationColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("DeviceN")) {
- cs = GfxDeviceNColorSpace::parse(csObj->getArray());
- } else if (obj1.isName("Pattern")) {
- cs = GfxPatternColorSpace::parse(csObj->getArray());
- } else {
- error(-1, "Bad color space");
- }
- obj1.free();
- } else {
- error(-1, "Bad color space - expected name or array");
- }
- return cs;
-}
-
-void GfxColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel) {
- int i;
-
- for (i = 0; i < getNComps(); ++i) {
- decodeLow[i] = 0;
- decodeRange[i] = 1;
- }
-}
-
-int GfxColorSpace::getNumColorSpaceModes() {
- return nGfxColorSpaceModes;
-}
-
-char *GfxColorSpace::getColorSpaceModeName(int idx) {
- return gfxColorSpaceModeNames[idx];
-}
-
-//------------------------------------------------------------------------
-// GfxDeviceGrayColorSpace
-//------------------------------------------------------------------------
-
-GfxDeviceGrayColorSpace::GfxDeviceGrayColorSpace() {
-}
-
-GfxDeviceGrayColorSpace::~GfxDeviceGrayColorSpace() {
-}
-
-GfxColorSpace *GfxDeviceGrayColorSpace::copy() {
- return new GfxDeviceGrayColorSpace();
-}
-
-void GfxDeviceGrayColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = clip01(color->c[0]);
-}
-
-void GfxDeviceGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- rgb->r = rgb->g = rgb->b = clip01(color->c[0]);
-}
-
-void GfxDeviceGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- cmyk->c = cmyk->m = cmyk->y = 0;
- cmyk->k = clip01(1 - color->c[0]);
-}
-
-//------------------------------------------------------------------------
-// GfxCalGrayColorSpace
-//------------------------------------------------------------------------
-
-GfxCalGrayColorSpace::GfxCalGrayColorSpace() {
- whiteX = whiteY = whiteZ = 1;
- blackX = blackY = blackZ = 0;
- gamma = 1;
-}
-
-GfxCalGrayColorSpace::~GfxCalGrayColorSpace() {
-}
-
-GfxColorSpace *GfxCalGrayColorSpace::copy() {
- GfxCalGrayColorSpace *cs;
-
- cs = new GfxCalGrayColorSpace();
- cs->whiteX = whiteX;
- cs->whiteY = whiteY;
- cs->whiteZ = whiteZ;
- cs->blackX = blackX;
- cs->blackY = blackY;
- cs->blackZ = blackZ;
- cs->gamma = gamma;
- return cs;
-}
-
-GfxColorSpace *GfxCalGrayColorSpace::parse(Array *arr) {
- GfxCalGrayColorSpace *cs;
- Object obj1, obj2, obj3;
-
- arr->get(1, &obj1);
- if (!obj1.isDict()) {
- error(-1, "Bad CalGray color space");
- obj1.free();
- return NULL;
- }
- cs = new GfxCalGrayColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->whiteZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->blackZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("Gamma", &obj2)->isNum()) {
- cs->gamma = obj2.getNum();
- }
- obj2.free();
- obj1.free();
- return cs;
-}
-
-void GfxCalGrayColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = clip01(color->c[0]);
-}
-
-void GfxCalGrayColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- rgb->r = rgb->g = rgb->b = clip01(color->c[0]);
-}
-
-void GfxCalGrayColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- cmyk->c = cmyk->m = cmyk->y = 0;
- cmyk->k = clip01(1 - color->c[0]);
-}
-
-//------------------------------------------------------------------------
-// GfxDeviceRGBColorSpace
-//------------------------------------------------------------------------
-
-GfxDeviceRGBColorSpace::GfxDeviceRGBColorSpace() {
-}
-
-GfxDeviceRGBColorSpace::~GfxDeviceRGBColorSpace() {
-}
-
-GfxColorSpace *GfxDeviceRGBColorSpace::copy() {
- return new GfxDeviceRGBColorSpace();
-}
-
-void GfxDeviceRGBColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = clip01(0.299 * color->c[0] +
- 0.587 * color->c[1] +
- 0.114 * color->c[2]);
-}
-
-void GfxDeviceRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- rgb->r = clip01(color->c[0]);
- rgb->g = clip01(color->c[1]);
- rgb->b = clip01(color->c[2]);
-}
-
-void GfxDeviceRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- double c, m, y, k;
-
- c = clip01(1 - color->c[0]);
- m = clip01(1 - color->c[1]);
- y = clip01(1 - color->c[2]);
- k = c;
- if (m < k) {
- k = m;
- }
- if (y < k) {
- k = y;
- }
- cmyk->c = c - k;
- cmyk->m = m - k;
- cmyk->y = y - k;
- cmyk->k = k;
-}
-
-//------------------------------------------------------------------------
-// GfxCalRGBColorSpace
-//------------------------------------------------------------------------
-
-GfxCalRGBColorSpace::GfxCalRGBColorSpace() {
- whiteX = whiteY = whiteZ = 1;
- blackX = blackY = blackZ = 0;
- gammaR = gammaG = gammaB = 1;
- mat[0] = 1; mat[1] = 0; mat[2] = 0;
- mat[3] = 0; mat[4] = 1; mat[5] = 0;
- mat[6] = 0; mat[7] = 0; mat[8] = 1;
-}
-
-GfxCalRGBColorSpace::~GfxCalRGBColorSpace() {
-}
-
-GfxColorSpace *GfxCalRGBColorSpace::copy() {
- GfxCalRGBColorSpace *cs;
- int i;
-
- cs = new GfxCalRGBColorSpace();
- cs->whiteX = whiteX;
- cs->whiteY = whiteY;
- cs->whiteZ = whiteZ;
- cs->blackX = blackX;
- cs->blackY = blackY;
- cs->blackZ = blackZ;
- cs->gammaR = gammaR;
- cs->gammaG = gammaG;
- cs->gammaB = gammaB;
- for (i = 0; i < 9; ++i) {
- cs->mat[i] = mat[i];
- }
- return cs;
-}
-
-GfxColorSpace *GfxCalRGBColorSpace::parse(Array *arr) {
- GfxCalRGBColorSpace *cs;
- Object obj1, obj2, obj3;
- int i;
-
- arr->get(1, &obj1);
- if (!obj1.isDict()) {
- error(-1, "Bad CalRGB color space");
- obj1.free();
- return NULL;
- }
- cs = new GfxCalRGBColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->whiteZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->blackZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("Gamma", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->gammaR = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->gammaG = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->gammaB = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("Matrix", &obj2)->isArray() &&
- obj2.arrayGetLength() == 9) {
- for (i = 0; i < 9; ++i) {
- obj2.arrayGet(i, &obj3);
- cs->mat[i] = obj3.getNum();
- obj3.free();
- }
- }
- obj2.free();
- obj1.free();
- return cs;
-}
-
-void GfxCalRGBColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = clip01(0.299 * color->c[0] +
- 0.587 * color->c[1] +
- 0.114 * color->c[2]);
-}
-
-void GfxCalRGBColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- rgb->r = clip01(color->c[0]);
- rgb->g = clip01(color->c[1]);
- rgb->b = clip01(color->c[2]);
-}
-
-void GfxCalRGBColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- double c, m, y, k;
-
- c = clip01(1 - color->c[0]);
- m = clip01(1 - color->c[1]);
- y = clip01(1 - color->c[2]);
- k = c;
- if (m < k) {
- k = m;
- }
- if (y < k) {
- k = y;
- }
- cmyk->c = c - k;
- cmyk->m = m - k;
- cmyk->y = y - k;
- cmyk->k = k;
-}
-
-//------------------------------------------------------------------------
-// GfxDeviceCMYKColorSpace
-//------------------------------------------------------------------------
-
-GfxDeviceCMYKColorSpace::GfxDeviceCMYKColorSpace() {
-}
-
-GfxDeviceCMYKColorSpace::~GfxDeviceCMYKColorSpace() {
-}
-
-GfxColorSpace *GfxDeviceCMYKColorSpace::copy() {
- return new GfxDeviceCMYKColorSpace();
-}
-
-void GfxDeviceCMYKColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = clip01(1 - color->c[3]
- - 0.299 * color->c[0]
- - 0.587 * color->c[1]
- - 0.114 * color->c[2]);
-}
-
-void GfxDeviceCMYKColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- double c, m, y, aw, ac, am, ay, ar, ag, ab;
-
- /* FIXME ask Derek */
- if (color->c[0] == 0.0 && color->c[1] == 0 && color->c[2] == 0) {
- rgb->r = rgb->g = rgb->b = 1 - color->c[3];
- return;
- }
-
- c = clip01(color->c[0] + color->c[3]);
- m = clip01(color->c[1] + color->c[3]);
- y = clip01(color->c[2] + color->c[3]);
- aw = (1-c) * (1-m) * (1-y);
- ac = c * (1-m) * (1-y);
- am = (1-c) * m * (1-y);
- ay = (1-c) * (1-m) * y;
- ar = (1-c) * m * y;
- ag = c * (1-m) * y;
- ab = c * m * (1-y);
- rgb->r = clip01(aw + 0.9137*am + 0.9961*ay + 0.9882*ar);
- rgb->g = clip01(aw + 0.6196*ac + ay + 0.5176*ag);
- rgb->b = clip01(aw + 0.7804*ac + 0.5412*am + 0.0667*ar + 0.2118*ag +
- 0.4863*ab);
-}
-
-void GfxDeviceCMYKColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- cmyk->c = clip01(color->c[0]);
- cmyk->m = clip01(color->c[1]);
- cmyk->y = clip01(color->c[2]);
- cmyk->k = clip01(color->c[3]);
-}
-
-//------------------------------------------------------------------------
-// GfxLabColorSpace
-//------------------------------------------------------------------------
-
-// This is the inverse of MatrixLMN in Example 4.10 from the PostScript
-// Language Reference, Third Edition.
-static double xyzrgb[3][3] = {
- { 3.240449, -1.537136, -0.498531 },
- { -0.969265, 1.876011, 0.041556 },
- { 0.055643, -0.204026, 1.057229 }
-};
-
-GfxLabColorSpace::GfxLabColorSpace() {
- whiteX = whiteY = whiteZ = 1;
- blackX = blackY = blackZ = 0;
- aMin = bMin = -100;
- aMax = bMax = 100;
-}
-
-GfxLabColorSpace::~GfxLabColorSpace() {
-}
-
-GfxColorSpace *GfxLabColorSpace::copy() {
- GfxLabColorSpace *cs;
-
- cs = new GfxLabColorSpace();
- cs->whiteX = whiteX;
- cs->whiteY = whiteY;
- cs->whiteZ = whiteZ;
- cs->blackX = blackX;
- cs->blackY = blackY;
- cs->blackZ = blackZ;
- cs->aMin = aMin;
- cs->aMax = aMax;
- cs->bMin = bMin;
- cs->bMax = bMax;
- cs->kr = kr;
- cs->kg = kg;
- cs->kb = kb;
- return cs;
-}
-
-GfxColorSpace *GfxLabColorSpace::parse(Array *arr) {
- GfxLabColorSpace *cs;
- Object obj1, obj2, obj3;
-
- arr->get(1, &obj1);
- if (!obj1.isDict()) {
- error(-1, "Bad Lab color space");
- obj1.free();
- return NULL;
- }
- cs = new GfxLabColorSpace();
- if (obj1.dictLookup("WhitePoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->whiteX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->whiteY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->whiteZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("BlackPoint", &obj2)->isArray() &&
- obj2.arrayGetLength() == 3) {
- obj2.arrayGet(0, &obj3);
- cs->blackX = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->blackY = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->blackZ = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- if (obj1.dictLookup("Range", &obj2)->isArray() &&
- obj2.arrayGetLength() == 4) {
- obj2.arrayGet(0, &obj3);
- cs->aMin = obj3.getNum();
- obj3.free();
- obj2.arrayGet(1, &obj3);
- cs->aMax = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2, &obj3);
- cs->bMin = obj3.getNum();
- obj3.free();
- obj2.arrayGet(3, &obj3);
- cs->bMax = obj3.getNum();
- obj3.free();
- }
- obj2.free();
- obj1.free();
-
- cs->kr = 1 / (xyzrgb[0][0] * cs->whiteX +
- xyzrgb[0][1] * cs->whiteY +
- xyzrgb[0][2] * cs->whiteZ);
- cs->kg = 1 / (xyzrgb[1][0] * cs->whiteX +
- xyzrgb[1][1] * cs->whiteY +
- xyzrgb[1][2] * cs->whiteZ);
- cs->kb = 1 / (xyzrgb[2][0] * cs->whiteX +
- xyzrgb[2][1] * cs->whiteY +
- xyzrgb[2][2] * cs->whiteZ);
-
- return cs;
-}
-
-void GfxLabColorSpace::getGray(GfxColor *color, double *gray) {
- GfxRGB rgb;
-
- getRGB(color, &rgb);
- *gray = clip01(0.299 * rgb.r +
- 0.587 * rgb.g +
- 0.114 * rgb.b);
-}
-
-void GfxLabColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- double X, Y, Z;
- double t1, t2;
- double r, g, b;
-
- // convert L*a*b* to CIE 1931 XYZ color space
- t1 = (color->c[0] + 16) / 116;
- t2 = t1 + color->c[1] / 500;
- if (t2 >= (6.0 / 29.0)) {
- X = t2 * t2 * t2;
- } else {
- X = (108.0 / 841.0) * (t2 - (4.0 / 29.0));
- }
- X *= whiteX;
- if (t1 >= (6.0 / 29.0)) {
- Y = t1 * t1 * t1;
- } else {
- Y = (108.0 / 841.0) * (t1 - (4.0 / 29.0));
- }
- Y *= whiteY;
- t2 = t1 - color->c[2] / 200;
- if (t2 >= (6.0 / 29.0)) {
- Z = t2 * t2 * t2;
- } else {
- Z = (108.0 / 841.0) * (t2 - (4.0 / 29.0));
- }
- Z *= whiteZ;
-
- // convert XYZ to RGB, including gamut mapping and gamma correction
- r = xyzrgb[0][0] * X + xyzrgb[0][1] * Y + xyzrgb[0][2] * Z;
- g = xyzrgb[1][0] * X + xyzrgb[1][1] * Y + xyzrgb[1][2] * Z;
- b = xyzrgb[2][0] * X + xyzrgb[2][1] * Y + xyzrgb[2][2] * Z;
- rgb->r = pow(clip01(r * kr), 0.5);
- rgb->g = pow(clip01(g * kg), 0.5);
- rgb->b = pow(clip01(b * kb), 0.5);
-}
-
-void GfxLabColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- GfxRGB rgb;
- double c, m, y, k;
-
- getRGB(color, &rgb);
- c = clip01(1 - rgb.r);
- m = clip01(1 - rgb.g);
- y = clip01(1 - rgb.b);
- k = c;
- if (m < k) {
- k = m;
- }
- if (y < k) {
- k = y;
- }
- cmyk->c = c - k;
- cmyk->m = m - k;
- cmyk->y = y - k;
- cmyk->k = k;
-}
-
-void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel) {
- decodeLow[0] = 0;
- decodeRange[0] = 100;
- decodeLow[1] = aMin;
- decodeRange[1] = aMax - aMin;
- decodeLow[2] = bMin;
- decodeRange[2] = bMax - bMin;
-}
-
-//------------------------------------------------------------------------
-// GfxICCBasedColorSpace
-//------------------------------------------------------------------------
-
-GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
- Ref *iccProfileStreamA) {
- nComps = nCompsA;
- alt = altA;
- iccProfileStream = *iccProfileStreamA;
- rangeMin[0] = rangeMin[1] = rangeMin[2] = rangeMin[3] = 0;
- rangeMax[0] = rangeMax[1] = rangeMax[2] = rangeMax[3] = 1;
-}
-
-GfxICCBasedColorSpace::~GfxICCBasedColorSpace() {
- delete alt;
-}
-
-GfxColorSpace *GfxICCBasedColorSpace::copy() {
- GfxICCBasedColorSpace *cs;
- int i;
-
- cs = new GfxICCBasedColorSpace(nComps, alt->copy(), &iccProfileStream);
- for (i = 0; i < 4; ++i) {
- cs->rangeMin[i] = rangeMin[i];
- cs->rangeMax[i] = rangeMax[i];
- }
- return cs;
-}
-
-GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) {
- GfxICCBasedColorSpace *cs;
- Ref iccProfileStreamA;
- int nCompsA;
- GfxColorSpace *altA;
- Dict *dict;
- Object obj1, obj2, obj3;
- int i;
-
- arr->getNF(1, &obj1);
- if (obj1.isRef()) {
- iccProfileStreamA = obj1.getRef();
- } else {
- iccProfileStreamA.num = 0;
- iccProfileStreamA.gen = 0;
- }
- obj1.free();
- arr->get(1, &obj1);
- if (!obj1.isStream()) {
- error(-1, "Bad ICCBased color space (stream)");
- obj1.free();
- return NULL;
- }
- dict = obj1.streamGetDict();
- if (!dict->lookup("N", &obj2)->isInt()) {
- error(-1, "Bad ICCBased color space (N)");
- obj2.free();
- obj1.free();
- return NULL;
- }
- nCompsA = obj2.getInt();
- obj2.free();
- if (nCompsA > gfxColorMaxComps) {
- error(-1, "ICCBased color space with too many (%d > %d) components",
- nCompsA, gfxColorMaxComps);
- nCompsA = gfxColorMaxComps;
- }
- if (dict->lookup("Alternate", &obj2)->isNull() ||
- !(altA = GfxColorSpace::parse(&obj2))) {
- switch (nCompsA) {
- case 1:
- altA = new GfxDeviceGrayColorSpace();
- break;
- case 3:
- altA = new GfxDeviceRGBColorSpace();
- break;
- case 4:
- altA = new GfxDeviceCMYKColorSpace();
- break;
- default:
- error(-1, "Bad ICCBased color space - invalid N");
- obj2.free();
- obj1.free();
- return NULL;
- }
- }
- obj2.free();
- cs = new GfxICCBasedColorSpace(nCompsA, altA, &iccProfileStreamA);
- if (dict->lookup("Range", &obj2)->isArray() &&
- obj2.arrayGetLength() == 2 * nCompsA) {
- for (i = 0; i < nCompsA; ++i) {
- obj2.arrayGet(2*i, &obj3);
- cs->rangeMin[i] = obj3.getNum();
- obj3.free();
- obj2.arrayGet(2*i+1, &obj3);
- cs->rangeMax[i] = obj3.getNum();
- obj3.free();
- }
- }
- obj2.free();
- obj1.free();
- return cs;
-}
-
-void GfxICCBasedColorSpace::getGray(GfxColor *color, double *gray) {
- alt->getGray(color, gray);
-}
-
-void GfxICCBasedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- alt->getRGB(color, rgb);
-}
-
-void GfxICCBasedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- alt->getCMYK(color, cmyk);
-}
-
-void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow,
- double *decodeRange,
- int maxImgPixel) {
- alt->getDefaultRanges(decodeLow, decodeRange, maxImgPixel);
-
-#if 0
- // this is nominally correct, but some PDF files don't set the
- // correct ranges in the ICCBased dict
- int i;
-
- for (i = 0; i < nComps; ++i) {
- decodeLow[i] = rangeMin[i];
- decodeRange[i] = rangeMax[i] - rangeMin[i];
- }
-#endif
-}
-
-//------------------------------------------------------------------------
-// GfxIndexedColorSpace
-//------------------------------------------------------------------------
-
-GfxIndexedColorSpace::GfxIndexedColorSpace(GfxColorSpace *baseA,
- int indexHighA) {
- base = baseA;
- indexHigh = indexHighA;
- lookup = (Guchar *)gmalloc((indexHigh + 1) * base->getNComps() *
- sizeof(Guchar));
-}
-
-GfxIndexedColorSpace::~GfxIndexedColorSpace() {
- delete base;
- gfree(lookup);
-}
-
-GfxColorSpace *GfxIndexedColorSpace::copy() {
- GfxIndexedColorSpace *cs;
-
- cs = new GfxIndexedColorSpace(base->copy(), indexHigh);
- memcpy(cs->lookup, lookup,
- (indexHigh + 1) * base->getNComps() * sizeof(Guchar));
- return cs;
-}
-
-GfxColorSpace *GfxIndexedColorSpace::parse(Array *arr) {
- GfxIndexedColorSpace *cs;
- GfxColorSpace *baseA;
- int indexHighA;
- Object obj1;
- int x;
- char *s;
- int n, i, j;
-
- if (arr->getLength() != 4) {
- error(-1, "Bad Indexed color space");
- goto err1;
- }
- arr->get(1, &obj1);
- if (!(baseA = GfxColorSpace::parse(&obj1))) {
- error(-1, "Bad Indexed color space (base color space)");
- goto err2;
- }
- obj1.free();
- if (!arr->get(2, &obj1)->isInt()) {
- error(-1, "Bad Indexed color space (hival)");
- delete baseA;
- goto err2;
- }
- indexHighA = obj1.getInt();
- if (indexHighA < 0 || indexHighA > 255) {
- // the PDF spec requires indexHigh to be in [0,255] -- allowing
- // values larger than 255 creates a security hole: if nComps *
- // indexHigh is greater than 2^31, the loop below may overwrite
- // past the end of the array
- error(-1, "Bad Indexed color space (invalid indexHigh value)");
- delete baseA;
- goto err2;
- }
- obj1.free();
- cs = new GfxIndexedColorSpace(baseA, indexHighA);
- arr->get(3, &obj1);
- n = baseA->getNComps();
- if (obj1.isStream()) {
- obj1.streamReset();
- for (i = 0; i <= indexHighA; ++i) {
- for (j = 0; j < n; ++j) {
- if ((x = obj1.streamGetChar()) == EOF) {
- error(-1, "Bad Indexed color space (lookup table stream too short)");
- goto err3;
- }
- cs->lookup[i*n + j] = (Guchar)x;
- }
- }
- obj1.streamClose();
- } else if (obj1.isString()) {
- if (obj1.getString()->getLength() < (indexHighA + 1) * n) {
- error(-1, "Bad Indexed color space (lookup table string too short)");
- goto err3;
- }
- s = obj1.getString()->getCString();
- for (i = 0; i <= indexHighA; ++i) {
- for (j = 0; j < n; ++j) {
- cs->lookup[i*n + j] = (Guchar)*s++;
- }
- }
- } else {
- error(-1, "Bad Indexed color space (lookup table)");
- goto err3;
- }
- obj1.free();
- return cs;
-
- err3:
- delete cs;
- err2:
- obj1.free();
- err1:
- return NULL;
-}
-
-GfxColor *GfxIndexedColorSpace::mapColorToBase(GfxColor *color,
- GfxColor *baseColor) {
- Guchar *p;
- double low[gfxColorMaxComps], range[gfxColorMaxComps];
- int n, i;
-
- n = base->getNComps();
- base->getDefaultRanges(low, range, indexHigh);
- p = &lookup[(int)(color->c[0] + 0.5) * n];
- for (i = 0; i < n; ++i) {
- baseColor->c[i] = low[i] + (p[i] / 255.0) * range[i];
- }
- return baseColor;
-}
-
-void GfxIndexedColorSpace::getGray(GfxColor *color, double *gray) {
- GfxColor color2;
-
- base->getGray(mapColorToBase(color, &color2), gray);
-}
-
-void GfxIndexedColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- GfxColor color2;
-
- base->getRGB(mapColorToBase(color, &color2), rgb);
-}
-
-void GfxIndexedColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- GfxColor color2;
-
- base->getCMYK(mapColorToBase(color, &color2), cmyk);
-}
-
-void GfxIndexedColorSpace::getDefaultRanges(double *decodeLow,
- double *decodeRange,
- int maxImgPixel) {
- decodeLow[0] = 0;
- decodeRange[0] = maxImgPixel;
-}
-
-//------------------------------------------------------------------------
-// GfxSeparationColorSpace
-//------------------------------------------------------------------------
-
-GfxSeparationColorSpace::GfxSeparationColorSpace(GString *nameA,
- GfxColorSpace *altA,
- Function *funcA) {
- name = nameA;
- alt = altA;
- func = funcA;
-}
-
-GfxSeparationColorSpace::~GfxSeparationColorSpace() {
- delete name;
- delete alt;
- delete func;
-}
-
-GfxColorSpace *GfxSeparationColorSpace::copy() {
- return new GfxSeparationColorSpace(name->copy(), alt->copy(), func->copy());
-}
-
-//~ handle the 'All' and 'None' colorants
-GfxColorSpace *GfxSeparationColorSpace::parse(Array *arr) {
- GfxSeparationColorSpace *cs;
- GString *nameA;
- GfxColorSpace *altA;
- Function *funcA;
- Object obj1;
-
- if (arr->getLength() != 4) {
- error(-1, "Bad Separation color space");
- goto err1;
- }
- if (!arr->get(1, &obj1)->isName()) {
- error(-1, "Bad Separation color space (name)");
- goto err2;
- }
- nameA = new GString(obj1.getName());
- obj1.free();
- arr->get(2, &obj1);
- if (!(altA = GfxColorSpace::parse(&obj1))) {
- error(-1, "Bad Separation color space (alternate color space)");
- goto err3;
- }
- obj1.free();
- arr->get(3, &obj1);
- if (!(funcA = Function::parse(&obj1))) {
- goto err4;
- }
- obj1.free();
- cs = new GfxSeparationColorSpace(nameA, altA, funcA);
- return cs;
-
- err4:
- delete altA;
- err3:
- delete nameA;
- err2:
- obj1.free();
- err1:
- return NULL;
-}
-
-void GfxSeparationColorSpace::getGray(GfxColor *color, double *gray) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getGray(&color2, gray);
-}
-
-void GfxSeparationColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getRGB(&color2, rgb);
-}
-
-void GfxSeparationColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getCMYK(&color2, cmyk);
-}
-
-//------------------------------------------------------------------------
-// GfxDeviceNColorSpace
-//------------------------------------------------------------------------
-
-GfxDeviceNColorSpace::GfxDeviceNColorSpace(int nCompsA,
- GfxColorSpace *altA,
- Function *funcA) {
- nComps = nCompsA;
- alt = altA;
- func = funcA;
-}
-
-GfxDeviceNColorSpace::~GfxDeviceNColorSpace() {
- int i;
-
- for (i = 0; i < nComps; ++i) {
- delete names[i];
- }
- delete alt;
- delete func;
-}
-
-GfxColorSpace *GfxDeviceNColorSpace::copy() {
- GfxDeviceNColorSpace *cs;
- int i;
-
- cs = new GfxDeviceNColorSpace(nComps, alt->copy(), func->copy());
- for (i = 0; i < nComps; ++i) {
- cs->names[i] = names[i]->copy();
- }
- return cs;
-}
-
-//~ handle the 'None' colorant
-GfxColorSpace *GfxDeviceNColorSpace::parse(Array *arr) {
- GfxDeviceNColorSpace *cs;
- int nCompsA;
- GString *namesA[gfxColorMaxComps];
- GfxColorSpace *altA;
- Function *funcA;
- Object obj1, obj2;
- int i;
-
- if (arr->getLength() != 4 && arr->getLength() != 5) {
- error(-1, "Bad DeviceN color space");
- goto err1;
- }
- if (!arr->get(1, &obj1)->isArray()) {
- error(-1, "Bad DeviceN color space (names)");
- goto err2;
- }
- nCompsA = obj1.arrayGetLength();
- if (nCompsA > gfxColorMaxComps) {
- error(-1, "DeviceN color space with too many (%d > %d) components",
- nCompsA, gfxColorMaxComps);
- nCompsA = gfxColorMaxComps;
- }
- for (i = 0; i < nCompsA; ++i) {
- if (!obj1.arrayGet(i, &obj2)->isName()) {
- error(-1, "Bad DeviceN color space (names)");
- obj2.free();
- goto err2;
- }
- namesA[i] = new GString(obj2.getName());
- obj2.free();
- }
- obj1.free();
- arr->get(2, &obj1);
- if (!(altA = GfxColorSpace::parse(&obj1))) {
- error(-1, "Bad DeviceN color space (alternate color space)");
- goto err3;
- }
- obj1.free();
- arr->get(3, &obj1);
- if (!(funcA = Function::parse(&obj1))) {
- goto err4;
- }
- obj1.free();
- cs = new GfxDeviceNColorSpace(nCompsA, altA, funcA);
- for (i = 0; i < nCompsA; ++i) {
- cs->names[i] = namesA[i];
- }
- return cs;
-
- err4:
- delete altA;
- err3:
- for (i = 0; i < nCompsA; ++i) {
- delete namesA[i];
- }
- err2:
- obj1.free();
- err1:
- return NULL;
-}
-
-void GfxDeviceNColorSpace::getGray(GfxColor *color, double *gray) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getGray(&color2, gray);
-}
-
-void GfxDeviceNColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getRGB(&color2, rgb);
-}
-
-void GfxDeviceNColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- GfxColor color2;
-
- func->transform(color->c, color2.c);
- alt->getCMYK(&color2, cmyk);
-}
-
-//------------------------------------------------------------------------
-// GfxPatternColorSpace
-//------------------------------------------------------------------------
-
-GfxPatternColorSpace::GfxPatternColorSpace(GfxColorSpace *underA) {
- under = underA;
-}
-
-GfxPatternColorSpace::~GfxPatternColorSpace() {
- if (under) {
- delete under;
- }
-}
-
-GfxColorSpace *GfxPatternColorSpace::copy() {
- return new GfxPatternColorSpace(under ? under->copy() :
- (GfxColorSpace *)NULL);
-}
-
-GfxColorSpace *GfxPatternColorSpace::parse(Array *arr) {
- GfxPatternColorSpace *cs;
- GfxColorSpace *underA;
- Object obj1;
-
- if (arr->getLength() != 1 && arr->getLength() != 2) {
- error(-1, "Bad Pattern color space");
- return NULL;
- }
- underA = NULL;
- if (arr->getLength() == 2) {
- arr->get(1, &obj1);
- if (!(underA = GfxColorSpace::parse(&obj1))) {
- error(-1, "Bad Pattern color space (underlying color space)");
- obj1.free();
- return NULL;
- }
- obj1.free();
- }
- cs = new GfxPatternColorSpace(underA);
- return cs;
-}
-
-void GfxPatternColorSpace::getGray(GfxColor *color, double *gray) {
- *gray = 0;
-}
-
-void GfxPatternColorSpace::getRGB(GfxColor *color, GfxRGB *rgb) {
- rgb->r = rgb->g = rgb->b = 0;
-}
-
-void GfxPatternColorSpace::getCMYK(GfxColor *color, GfxCMYK *cmyk) {
- cmyk->c = cmyk->m = cmyk->y = 0;
- cmyk->k = 1;
-}
-
-//------------------------------------------------------------------------
-// Pattern
-//------------------------------------------------------------------------
-
-GfxPattern::GfxPattern(int typeA) {
- type = typeA;
-}
-
-GfxPattern::~GfxPattern() {
-}
-
-GfxPattern *GfxPattern::parse(Object *obj) {
- GfxPattern *pattern;
- Object obj1;
-
- if (obj->isDict()) {
- obj->dictLookup("PatternType", &obj1);
- } else if (obj->isStream()) {
- obj->streamGetDict()->lookup("PatternType", &obj1);
- } else {
- return NULL;
- }
- pattern = NULL;
- if (obj1.isInt() && obj1.getInt() == 1) {
- pattern = GfxTilingPattern::parse(obj);
- } else if (obj1.isInt() && obj1.getInt() == 2) {
- pattern = GfxShadingPattern::parse(obj);
- }
- obj1.free();
- return pattern;
-}
-
-//------------------------------------------------------------------------
-// GfxTilingPattern
-//------------------------------------------------------------------------
-
-GfxTilingPattern *GfxTilingPattern::parse(Object *patObj) {
- GfxTilingPattern *pat;
- Dict *dict;
- int paintTypeA, tilingTypeA;
- double bboxA[4], matrixA[6];
- double xStepA, yStepA;
- Object resDictA;
- Object obj1, obj2;
- int i;
-
- if (!patObj->isStream()) {
- return NULL;
- }
- dict = patObj->streamGetDict();
-
- if (dict->lookup("PaintType", &obj1)->isInt()) {
- paintTypeA = obj1.getInt();
- } else {
- paintTypeA = 1;
- error(-1, "Invalid or missing PaintType in pattern");
- }
- obj1.free();
- if (dict->lookup("TilingType", &obj1)->isInt()) {
- tilingTypeA = obj1.getInt();
- } else {
- tilingTypeA = 1;
- error(-1, "Invalid or missing TilingType in pattern");
- }
- obj1.free();
- bboxA[0] = bboxA[1] = 0;
- bboxA[2] = bboxA[3] = 1;
- if (dict->lookup("BBox", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- for (i = 0; i < 4; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
- bboxA[i] = obj2.getNum();
- }
- obj2.free();
- }
- } else {
- error(-1, "Invalid or missing BBox in pattern");
- }
- obj1.free();
- if (dict->lookup("XStep", &obj1)->isNum()) {
- xStepA = obj1.getNum();
- } else {
- xStepA = 1;
- error(-1, "Invalid or missing XStep in pattern");
- }
- obj1.free();
- if (dict->lookup("YStep", &obj1)->isNum()) {
- yStepA = obj1.getNum();
- } else {
- yStepA = 1;
- error(-1, "Invalid or missing YStep in pattern");
- }
- obj1.free();
- if (!dict->lookup("Resources", &resDictA)->isDict()) {
- resDictA.free();
- resDictA.initNull();
- error(-1, "Invalid or missing Resources in pattern");
- }
- matrixA[0] = 1; matrixA[1] = 0;
- matrixA[2] = 0; matrixA[3] = 1;
- matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- for (i = 0; i < 6; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
- matrixA[i] = obj2.getNum();
- }
- obj2.free();
- }
- }
- obj1.free();
-
- pat = new GfxTilingPattern(paintTypeA, tilingTypeA, bboxA, xStepA, yStepA,
- &resDictA, matrixA, patObj);
- resDictA.free();
- return pat;
-}
-
-GfxTilingPattern::GfxTilingPattern(int paintTypeA, int tilingTypeA,
- double *bboxA, double xStepA, double yStepA,
- Object *resDictA, double *matrixA,
- Object *contentStreamA):
- GfxPattern(1)
-{
- int i;
-
- paintType = paintTypeA;
- tilingType = tilingTypeA;
- for (i = 0; i < 4; ++i) {
- bbox[i] = bboxA[i];
- }
- xStep = xStepA;
- yStep = yStepA;
- resDictA->copy(&resDict);
- for (i = 0; i < 6; ++i) {
- matrix[i] = matrixA[i];
- }
- contentStreamA->copy(&contentStream);
-}
-
-GfxTilingPattern::~GfxTilingPattern() {
- resDict.free();
- contentStream.free();
-}
-
-GfxPattern *GfxTilingPattern::copy() {
- return new GfxTilingPattern(paintType, tilingType, bbox, xStep, yStep,
- &resDict, matrix, &contentStream);
-}
-
-//------------------------------------------------------------------------
-// GfxShadingPattern
-//------------------------------------------------------------------------
-
-GfxShadingPattern *GfxShadingPattern::parse(Object *patObj) {
- Dict *dict;
- GfxShading *shadingA;
- double matrixA[6];
- Object obj1, obj2;
- int i;
-
- if (!patObj->isDict()) {
- return NULL;
- }
- dict = patObj->getDict();
-
- dict->lookup("Shading", &obj1);
- shadingA = GfxShading::parse(&obj1);
- obj1.free();
- if (!shadingA) {
- return NULL;
- }
-
- matrixA[0] = 1; matrixA[1] = 0;
- matrixA[2] = 0; matrixA[3] = 1;
- matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- for (i = 0; i < 6; ++i) {
- if (obj1.arrayGet(i, &obj2)->isNum()) {
- matrixA[i] = obj2.getNum();
- }
- obj2.free();
- }
- }
- obj1.free();
-
- return new GfxShadingPattern(shadingA, matrixA);
-}
-
-GfxShadingPattern::GfxShadingPattern(GfxShading *shadingA, double *matrixA):
- GfxPattern(2)
-{
- int i;
-
- shading = shadingA;
- for (i = 0; i < 6; ++i) {
- matrix[i] = matrixA[i];
- }
-}
-
-GfxShadingPattern::~GfxShadingPattern() {
- delete shading;
-}
-
-GfxPattern *GfxShadingPattern::copy() {
- return new GfxShadingPattern(shading->copy(), matrix);
-}
-
-//------------------------------------------------------------------------
-// GfxShading
-//------------------------------------------------------------------------
-
-GfxShading::GfxShading(int typeA) {
- type = typeA;
- colorSpace = NULL;
-}
-
-GfxShading::GfxShading(GfxShading *shading) {
- int i;
-
- type = shading->type;
- colorSpace = shading->colorSpace->copy();
- for (i = 0; i < gfxColorMaxComps; ++i) {
- background.c[i] = shading->background.c[i];
- }
- hasBackground = shading->hasBackground;
- xMin = shading->xMin;
- yMin = shading->yMin;
- xMax = shading->xMax;
- yMax = shading->yMax;
- hasBBox = shading->hasBBox;
-}
-
-GfxShading::~GfxShading() {
- if (colorSpace) {
- delete colorSpace;
- }
-}
-
-GfxShading *GfxShading::parse(Object *obj) {
- GfxShading *shading;
- Dict *dict;
- int typeA;
- Object obj1;
-
- if (obj->isDict()) {
- dict = obj->getDict();
- } else if (obj->isStream()) {
- dict = obj->streamGetDict();
- } else {
- return NULL;
- }
-
- if (!dict->lookup("ShadingType", &obj1)->isInt()) {
- error(-1, "Invalid ShadingType in shading dictionary");
- obj1.free();
- return NULL;
- }
- typeA = obj1.getInt();
- obj1.free();
-
- switch (typeA) {
- case 1:
- shading = GfxFunctionShading::parse(dict);
- break;
- case 2:
- shading = GfxAxialShading::parse(dict);
- break;
- case 3:
- shading = GfxRadialShading::parse(dict);
- break;
- default:
- error(-1, "Unimplemented shading type %d", typeA);
- goto err1;
- }
-
- return shading;
-
- err1:
- return NULL;
-}
-
-GBool GfxShading::init(Dict *dict) {
- Object obj1, obj2;
- int i;
-
- dict->lookup("ColorSpace", &obj1);
- if (!(colorSpace = GfxColorSpace::parse(&obj1))) {
- error(-1, "Bad color space in shading dictionary");
- obj1.free();
- return gFalse;
- }
- obj1.free();
-
- for (i = 0; i < gfxColorMaxComps; ++i) {
- background.c[i] = 0;
- }
- hasBackground = gFalse;
- if (dict->lookup("Background", &obj1)->isArray()) {
- if (obj1.arrayGetLength() == colorSpace->getNComps()) {
- hasBackground = gTrue;
- for (i = 0; i < colorSpace->getNComps(); ++i) {
- background.c[i] = obj1.arrayGet(i, &obj2)->getNum();
- obj2.free();
- }
- } else {
- error(-1, "Bad Background in shading dictionary");
- }
- }
- obj1.free();
-
- xMin = yMin = xMax = yMax = 0;
- hasBBox = gFalse;
- if (dict->lookup("BBox", &obj1)->isArray()) {
- if (obj1.arrayGetLength() == 4) {
- hasBBox = gTrue;
- xMin = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- yMin = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- xMax = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- yMax = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- } else {
- error(-1, "Bad BBox in shading dictionary");
- }
- }
- obj1.free();
-
- return gTrue;
-}
-
-//------------------------------------------------------------------------
-// GfxFunctionShading
-//------------------------------------------------------------------------
-
-GfxFunctionShading::GfxFunctionShading(double x0A, double y0A,
- double x1A, double y1A,
- double *matrixA,
- Function **funcsA, int nFuncsA):
- GfxShading(1)
-{
- int i;
-
- x0 = x0A;
- y0 = y0A;
- x1 = x1A;
- y1 = y1A;
- for (i = 0; i < 6; ++i) {
- matrix[i] = matrixA[i];
- }
- nFuncs = nFuncsA;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = funcsA[i];
- }
-}
-
-GfxFunctionShading::GfxFunctionShading(GfxFunctionShading *shading):
- GfxShading(shading)
-{
- int i;
-
- x0 = shading->x0;
- y0 = shading->y0;
- x1 = shading->x1;
- y1 = shading->y1;
- for (i = 0; i < 6; ++i) {
- matrix[i] = shading->matrix[i];
- }
- nFuncs = shading->nFuncs;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = shading->funcs[i]->copy();
- }
-}
-
-GfxFunctionShading::~GfxFunctionShading() {
- int i;
-
- for (i = 0; i < nFuncs; ++i) {
- delete funcs[i];
- }
-}
-
-GfxFunctionShading *GfxFunctionShading::parse(Dict *dict) {
- GfxFunctionShading *shading;
- double x0A, y0A, x1A, y1A;
- double matrixA[6];
- Function *funcsA[gfxColorMaxComps];
- int nFuncsA;
- Object obj1, obj2;
- int i;
-
- x0A = y0A = 0;
- x1A = y1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- x0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- y0A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- x1A = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- y1A = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- }
- obj1.free();
-
- matrixA[0] = 1; matrixA[1] = 0;
- matrixA[2] = 0; matrixA[3] = 1;
- matrixA[4] = 0; matrixA[5] = 0;
- if (dict->lookup("Matrix", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- matrixA[0] = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- matrixA[1] = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- matrixA[2] = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- matrixA[3] = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- matrixA[4] = obj1.arrayGet(4, &obj2)->getNum();
- obj2.free();
- matrixA[5] = obj1.arrayGet(5, &obj2)->getNum();
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("Function", &obj1);
- if (obj1.isArray()) {
- nFuncsA = obj1.arrayGetLength();
- if (nFuncsA > gfxColorMaxComps) {
- error(-1, "Invalid Function array in shading dictionary");
- goto err1;
- }
- for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!(funcsA[i] = Function::parse(&obj2))) {
- goto err2;
- }
- obj2.free();
- }
- } else {
- nFuncsA = 1;
- if (!(funcsA[0] = Function::parse(&obj1))) {
- goto err1;
- }
- }
- obj1.free();
-
- shading = new GfxFunctionShading(x0A, y0A, x1A, y1A, matrixA,
- funcsA, nFuncsA);
- if (!shading->init(dict)) {
- delete shading;
- return NULL;
- }
- return shading;
-
- err2:
- obj2.free();
- err1:
- obj1.free();
- return NULL;
-}
-
-GfxShading *GfxFunctionShading::copy() {
- return new GfxFunctionShading(this);
-}
-
-void GfxFunctionShading::getColor(double x, double y, GfxColor *color) {
- double in[2];
- int i;
-
- in[0] = x;
- in[1] = y;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i]->transform(in, &color->c[i]);
- }
-}
-
-//------------------------------------------------------------------------
-// GfxAxialShading
-//------------------------------------------------------------------------
-
-GfxAxialShading::GfxAxialShading(double x0A, double y0A,
- double x1A, double y1A,
- double t0A, double t1A,
- Function **funcsA, int nFuncsA,
- GBool extend0A, GBool extend1A):
- GfxShading(2)
-{
- int i;
-
- x0 = x0A;
- y0 = y0A;
- x1 = x1A;
- y1 = y1A;
- t0 = t0A;
- t1 = t1A;
- nFuncs = nFuncsA;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = funcsA[i];
- }
- extend0 = extend0A;
- extend1 = extend1A;
-}
-
-GfxAxialShading::GfxAxialShading(GfxAxialShading *shading):
- GfxShading(shading)
-{
- int i;
-
- x0 = shading->x0;
- y0 = shading->y0;
- x1 = shading->x1;
- y1 = shading->y1;
- t0 = shading->t0;
- y1 = shading->t1;
- nFuncs = shading->nFuncs;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = shading->funcs[i]->copy();
- }
- extend0 = shading->extend0;
- extend1 = shading->extend1;
-}
-
-GfxAxialShading::~GfxAxialShading() {
- int i;
-
- for (i = 0; i < nFuncs; ++i) {
- delete funcs[i];
- }
-}
-
-GfxAxialShading *GfxAxialShading::parse(Dict *dict) {
- GfxAxialShading *shading;
- double x0A, y0A, x1A, y1A;
- double t0A, t1A;
- Function *funcsA[gfxColorMaxComps];
- int nFuncsA;
- GBool extend0A, extend1A;
- Object obj1, obj2;
- int i;
-
- x0A = y0A = x1A = y1A = 0;
- if (dict->lookup("Coords", &obj1)->isArray() &&
- obj1.arrayGetLength() == 4) {
- x0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- y0A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- x1A = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- y1A = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- } else {
- error(-1, "Missing or invalid Coords in shading dictionary");
- goto err1;
- }
- obj1.free();
-
- t0A = 0;
- t1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- t0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- t1A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("Function", &obj1);
- if (obj1.isArray()) {
- nFuncsA = obj1.arrayGetLength();
- if (nFuncsA > gfxColorMaxComps) {
- error(-1, "Invalid Function array in shading dictionary");
- goto err1;
- }
- for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
- }
- obj2.free();
- }
- } else {
- nFuncsA = 1;
- if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
- }
- }
- obj1.free();
-
- extend0A = extend1A = gFalse;
- if (dict->lookup("Extend", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- extend0A = obj1.arrayGet(0, &obj2)->getBool();
- obj2.free();
- extend1A = obj1.arrayGet(1, &obj2)->getBool();
- obj2.free();
- }
- obj1.free();
-
- shading = new GfxAxialShading(x0A, y0A, x1A, y1A, t0A, t1A,
- funcsA, nFuncsA, extend0A, extend1A);
- if (!shading->init(dict)) {
- delete shading;
- return NULL;
- }
- return shading;
-
- err1:
- return NULL;
-}
-
-GfxShading *GfxAxialShading::copy() {
- return new GfxAxialShading(this);
-}
-
-void GfxAxialShading::getColor(double t, GfxColor *color) {
- int i;
-
- // NB: there can be one function with n outputs or n functions with
- // one output each (where n = number of color components)
- for (i = 0; i < nFuncs; ++i) {
- funcs[i]->transform(&t, &color->c[i]);
- }
-}
-
-//------------------------------------------------------------------------
-// GfxRadialShading
-//------------------------------------------------------------------------
-
-GfxRadialShading::GfxRadialShading(double x0A, double y0A, double r0A,
- double x1A, double y1A, double r1A,
- double t0A, double t1A,
- Function **funcsA, int nFuncsA,
- GBool extend0A, GBool extend1A):
- GfxShading(3)
-{
- int i;
-
- x0 = x0A;
- y0 = y0A;
- r0 = r0A;
- x1 = x1A;
- y1 = y1A;
- r1 = r1A;
- t0 = t0A;
- t1 = t1A;
- nFuncs = nFuncsA;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = funcsA[i];
- }
- extend0 = extend0A;
- extend1 = extend1A;
-}
-
-GfxRadialShading::GfxRadialShading(GfxRadialShading *shading):
- GfxShading(shading)
-{
- int i;
-
- x0 = shading->x0;
- y0 = shading->y0;
- r0 = shading->r0;
- x1 = shading->x1;
- y1 = shading->y1;
- r1 = shading->r1;
- t0 = shading->t0;
- y1 = shading->t1;
- nFuncs = shading->nFuncs;
- for (i = 0; i < nFuncs; ++i) {
- funcs[i] = shading->funcs[i]->copy();
- }
- extend0 = shading->extend0;
- extend1 = shading->extend1;
-}
-
-GfxRadialShading::~GfxRadialShading() {
- int i;
-
- for (i = 0; i < nFuncs; ++i) {
- delete funcs[i];
- }
-}
-
-GfxRadialShading *GfxRadialShading::parse(Dict *dict) {
- GfxRadialShading *shading;
- double x0A, y0A, r0A, x1A, y1A, r1A;
- double t0A, t1A;
- Function *funcsA[gfxColorMaxComps];
- int nFuncsA;
- GBool extend0A, extend1A;
- Object obj1, obj2;
- int i;
-
- x0A = y0A = r0A = x1A = y1A = r1A = 0;
- if (dict->lookup("Coords", &obj1)->isArray() &&
- obj1.arrayGetLength() == 6) {
- x0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- y0A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- r0A = obj1.arrayGet(2, &obj2)->getNum();
- obj2.free();
- x1A = obj1.arrayGet(3, &obj2)->getNum();
- obj2.free();
- y1A = obj1.arrayGet(4, &obj2)->getNum();
- obj2.free();
- r1A = obj1.arrayGet(5, &obj2)->getNum();
- obj2.free();
- } else {
- error(-1, "Missing or invalid Coords in shading dictionary");
- goto err1;
- }
- obj1.free();
-
- t0A = 0;
- t1A = 1;
- if (dict->lookup("Domain", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- t0A = obj1.arrayGet(0, &obj2)->getNum();
- obj2.free();
- t1A = obj1.arrayGet(1, &obj2)->getNum();
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("Function", &obj1);
- if (obj1.isArray()) {
- nFuncsA = obj1.arrayGetLength();
- if (nFuncsA > gfxColorMaxComps) {
- error(-1, "Invalid Function array in shading dictionary");
- goto err1;
- }
- for (i = 0; i < nFuncsA; ++i) {
- obj1.arrayGet(i, &obj2);
- if (!(funcsA[i] = Function::parse(&obj2))) {
- obj1.free();
- obj2.free();
- goto err1;
- }
- obj2.free();
- }
- } else {
- nFuncsA = 1;
- if (!(funcsA[0] = Function::parse(&obj1))) {
- obj1.free();
- goto err1;
- }
- }
- obj1.free();
-
- extend0A = extend1A = gFalse;
- if (dict->lookup("Extend", &obj1)->isArray() &&
- obj1.arrayGetLength() == 2) {
- extend0A = obj1.arrayGet(0, &obj2)->getBool();
- obj2.free();
- extend1A = obj1.arrayGet(1, &obj2)->getBool();
- obj2.free();
- }
- obj1.free();
-
- shading = new GfxRadialShading(x0A, y0A, r0A, x1A, y1A, r1A, t0A, t1A,
- funcsA, nFuncsA, extend0A, extend1A);
- if (!shading->init(dict)) {
- delete shading;
- return NULL;
- }
- return shading;
-
- err1:
- return NULL;
-}
-
-GfxShading *GfxRadialShading::copy() {
- return new GfxRadialShading(this);
-}
-
-void GfxRadialShading::getColor(double t, GfxColor *color) {
- int i;
-
- // NB: there can be one function with n outputs or n functions with
- // one output each (where n = number of color components)
- for (i = 0; i < nFuncs; ++i) {
- funcs[i]->transform(&t, &color->c[i]);
- }
-}
-
-//------------------------------------------------------------------------
-// GfxImageColorMap
-//------------------------------------------------------------------------
-
-GfxImageColorMap::GfxImageColorMap(int bitsA, Object *decode,
- GfxColorSpace *colorSpaceA) {
- GfxIndexedColorSpace *indexedCS;
- GfxSeparationColorSpace *sepCS;
- int maxPixel, indexHigh;
- Guchar *lookup2;
- Function *sepFunc;
- Object obj;
- double x[gfxColorMaxComps];
- double y[gfxColorMaxComps];
- int i, j, k;
-
- ok = gTrue;
-
- // bits per component and color space
- bits = bitsA;
- maxPixel = (1 << bits) - 1;
- colorSpace = colorSpaceA;
-
- // get decode map
- if (decode->isNull()) {
- nComps = colorSpace->getNComps();
- colorSpace->getDefaultRanges(decodeLow, decodeRange, maxPixel);
- } else if (decode->isArray()) {
- nComps = decode->arrayGetLength() / 2;
- if (nComps != colorSpace->getNComps()) {
- goto err1;
- }
- for (i = 0; i < nComps; ++i) {
- decode->arrayGet(2*i, &obj);
- if (!obj.isNum()) {
- goto err2;
- }
- decodeLow[i] = obj.getNum();
- obj.free();
- decode->arrayGet(2*i+1, &obj);
- if (!obj.isNum()) {
- goto err2;
- }
- decodeRange[i] = obj.getNum() - decodeLow[i];
- obj.free();
- }
- } else {
- goto err1;
- }
-
- // Construct a lookup table -- this stores pre-computed decoded
- // values for each component, i.e., the result of applying the
- // decode mapping to each possible image pixel component value.
- //
- // Optimization: for Indexed and Separation color spaces (which have
- // only one component), we store color values in the lookup table
- // rather than component values.
- colorSpace2 = NULL;
- nComps2 = 0;
- if (colorSpace->getMode() == csIndexed) {
- // Note that indexHigh may not be the same as maxPixel --
- // Distiller will remove unused palette entries, resulting in
- // indexHigh < maxPixel.
- indexedCS = (GfxIndexedColorSpace *)colorSpace;
- colorSpace2 = indexedCS->getBase();
- indexHigh = indexedCS->getIndexHigh();
- nComps2 = colorSpace2->getNComps();
- lookup = (double *)gmalloc((maxPixel + 1) * nComps2 * sizeof(double));
- lookup2 = indexedCS->getLookup();
- colorSpace2->getDefaultRanges(x, y, indexHigh);
- for (i = 0; i <= maxPixel; ++i) {
- j = (int)(decodeLow[0] + (i * decodeRange[0]) / maxPixel + 0.5);
- if (j < 0) {
- j = 0;
- } else if (j > indexHigh) {
- j = indexHigh;
- }
- for (k = 0; k < nComps2; ++k) {
- lookup[i*nComps2 + k] = x[k] + (lookup2[j*nComps2 + k] / 255.0) * y[k];
- }
- }
- } else if (colorSpace->getMode() == csSeparation) {
- sepCS = (GfxSeparationColorSpace *)colorSpace;
- colorSpace2 = sepCS->getAlt();
- nComps2 = colorSpace2->getNComps();
- lookup = (double *)gmalloc((maxPixel + 1) * nComps2 * sizeof(double));
- sepFunc = sepCS->getFunc();
- for (i = 0; i <= maxPixel; ++i) {
- x[0] = decodeLow[0] + (i * decodeRange[0]) / maxPixel;
- sepFunc->transform(x, y);
- for (k = 0; k < nComps2; ++k) {
- lookup[i*nComps2 + k] = y[k];
- }
- }
- } else {
- lookup = (double *)gmalloc((maxPixel + 1) * nComps * sizeof(double));
- for (i = 0; i <= maxPixel; ++i) {
- for (k = 0; k < nComps; ++k) {
- lookup[i*nComps + k] = decodeLow[k] +
- (i * decodeRange[k]) / maxPixel;
- }
- }
- }
-
- return;
-
- err2:
- obj.free();
- err1:
- ok = gFalse;
-}
-
-GfxImageColorMap::GfxImageColorMap(GfxImageColorMap *colorMap) {
- int n, i;
-
- colorSpace = colorMap->colorSpace->copy();
- bits = colorMap->bits;
- nComps = colorMap->nComps;
- nComps2 = colorMap->nComps2;
- colorSpace2 = NULL;
- lookup = NULL;
- n = 1 << bits;
- if (colorSpace->getMode() == csIndexed) {
- colorSpace2 = ((GfxIndexedColorSpace *)colorSpace)->getBase();
- n = n * nComps2 * sizeof(double);
- } else if (colorSpace->getMode() == csSeparation) {
- colorSpace2 = ((GfxSeparationColorSpace *)colorSpace)->getAlt();
- n = n * nComps2 * sizeof(double);
- } else {
- n = n * nComps * sizeof(double);
- }
- lookup = (double *)gmalloc(n);
- memcpy(lookup, colorMap->lookup, n);
- for (i = 0; i < nComps; ++i) {
- decodeLow[i] = colorMap->decodeLow[i];
- decodeRange[i] = colorMap->decodeRange[i];
- }
- ok = gTrue;
-}
-
-GfxImageColorMap::~GfxImageColorMap() {
- delete colorSpace;
- gfree(lookup);
-}
-
-void GfxImageColorMap::getGray(Guchar *x, double *gray) {
- GfxColor color;
- double *p;
- int i;
-
- if (colorSpace2) {
- p = &lookup[x[0] * nComps2];
- for (i = 0; i < nComps2; ++i) {
- color.c[i] = *p++;
- }
- colorSpace2->getGray(&color, gray);
- } else {
- for (i = 0; i < nComps; ++i) {
- color.c[i] = lookup[x[i] * nComps + i];
- }
- colorSpace->getGray(&color, gray);
- }
-}
-
-void GfxImageColorMap::getRGB(Guchar *x, GfxRGB *rgb) {
- GfxColor color;
- double *p;
- int i;
-
- if (colorSpace2) {
- p = &lookup[x[0] * nComps2];
- for (i = 0; i < nComps2; ++i) {
- color.c[i] = *p++;
- }
- colorSpace2->getRGB(&color, rgb);
- } else {
- for (i = 0; i < nComps; ++i) {
- color.c[i] = lookup[x[i] * nComps + i];
- }
- colorSpace->getRGB(&color, rgb);
- }
-}
-
-void GfxImageColorMap::getCMYK(Guchar *x, GfxCMYK *cmyk) {
- GfxColor color;
- double *p;
- int i;
-
- if (colorSpace2) {
- p = &lookup[x[0] * nComps2];
- for (i = 0; i < nComps2; ++i) {
- color.c[i] = *p++;
- }
- colorSpace2->getCMYK(&color, cmyk);
- } else {
- for (i = 0; i < nComps; ++i) {
- color.c[i] = lookup[x[i] * nComps + i];
- }
- colorSpace->getCMYK(&color, cmyk);
- }
-}
-
-void GfxImageColorMap::getColor(Guchar *x, GfxColor *color) {
- int maxPixel, i;
-
- maxPixel = (1 << bits) - 1;
- for (i = 0; i < nComps; ++i) {
- color->c[i] = decodeLow[i] + (x[i] * decodeRange[i]) / maxPixel;
- }
-}
-
-//------------------------------------------------------------------------
-// GfxSubpath and GfxPath
-//------------------------------------------------------------------------
-
-GfxSubpath::GfxSubpath(double x1, double y1) {
- size = 16;
- x = (double *)gmalloc(size * sizeof(double));
- y = (double *)gmalloc(size * sizeof(double));
- curve = (GBool *)gmalloc(size * sizeof(GBool));
- n = 1;
- x[0] = x1;
- y[0] = y1;
- curve[0] = gFalse;
- closed = gFalse;
-}
-
-GfxSubpath::~GfxSubpath() {
- gfree(x);
- gfree(y);
- gfree(curve);
-}
-
-// Used for copy().
-GfxSubpath::GfxSubpath(GfxSubpath *subpath) {
- size = subpath->size;
- n = subpath->n;
- x = (double *)gmalloc(size * sizeof(double));
- y = (double *)gmalloc(size * sizeof(double));
- curve = (GBool *)gmalloc(size * sizeof(GBool));
- memcpy(x, subpath->x, n * sizeof(double));
- memcpy(y, subpath->y, n * sizeof(double));
- memcpy(curve, subpath->curve, n * sizeof(GBool));
- closed = subpath->closed;
-}
-
-void GfxSubpath::lineTo(double x1, double y1) {
- if (n >= size) {
- size += 16;
- x = (double *)grealloc(x, size * sizeof(double));
- y = (double *)grealloc(y, size * sizeof(double));
- curve = (GBool *)grealloc(curve, size * sizeof(GBool));
- }
- x[n] = x1;
- y[n] = y1;
- curve[n] = gFalse;
- ++n;
-}
-
-void GfxSubpath::curveTo(double x1, double y1, double x2, double y2,
- double x3, double y3) {
- if (n+3 > size) {
- size += 16;
- x = (double *)grealloc(x, size * sizeof(double));
- y = (double *)grealloc(y, size * sizeof(double));
- curve = (GBool *)grealloc(curve, size * sizeof(GBool));
- }
- x[n] = x1;
- y[n] = y1;
- x[n+1] = x2;
- y[n+1] = y2;
- x[n+2] = x3;
- y[n+2] = y3;
- curve[n] = curve[n+1] = gTrue;
- curve[n+2] = gFalse;
- n += 3;
-}
-
-void GfxSubpath::close() {
- if (x[n-1] != x[0] || y[n-1] != y[0]) {
- lineTo(x[0], y[0]);
- }
- closed = gTrue;
-}
-
-void GfxSubpath::offset(double dx, double dy) {
- int i;
-
- for (i = 0; i < n; ++i) {
- x[i] += dx;
- y[i] += dy;
- }
-}
-
-GfxPath::GfxPath() {
- justMoved = gFalse;
- size = 16;
- n = 0;
- firstX = firstY = 0;
- subpaths = (GfxSubpath **)gmalloc(size * sizeof(GfxSubpath *));
-}
-
-GfxPath::~GfxPath() {
- int i;
-
- for (i = 0; i < n; ++i)
- delete subpaths[i];
- gfree(subpaths);
-}
-
-// Used for copy().
-GfxPath::GfxPath(GBool justMoved1, double firstX1, double firstY1,
- GfxSubpath **subpaths1, int n1, int size1) {
- int i;
-
- justMoved = justMoved1;
- firstX = firstX1;
- firstY = firstY1;
- size = size1;
- n = n1;
- subpaths = (GfxSubpath **)gmalloc(size * sizeof(GfxSubpath *));
- for (i = 0; i < n; ++i)
- subpaths[i] = subpaths1[i]->copy();
-}
-
-void GfxPath::moveTo(double x, double y) {
- justMoved = gTrue;
- firstX = x;
- firstY = y;
-}
-
-void GfxPath::lineTo(double x, double y) {
- if (justMoved) {
- if (n >= size) {
- size += 16;
- subpaths = (GfxSubpath **)
- grealloc(subpaths, size * sizeof(GfxSubpath *));
- }
- subpaths[n] = new GfxSubpath(firstX, firstY);
- ++n;
- justMoved = gFalse;
- }
- subpaths[n-1]->lineTo(x, y);
-}
-
-void GfxPath::curveTo(double x1, double y1, double x2, double y2,
- double x3, double y3) {
- if (justMoved) {
- if (n >= size) {
- size += 16;
- subpaths = (GfxSubpath **)
- grealloc(subpaths, size * sizeof(GfxSubpath *));
- }
- subpaths[n] = new GfxSubpath(firstX, firstY);
- ++n;
- justMoved = gFalse;
- }
- subpaths[n-1]->curveTo(x1, y1, x2, y2, x3, y3);
-}
-
-void GfxPath::close() {
- // this is necessary to handle the pathological case of
- // moveto/closepath/clip, which defines an empty clipping region
- if (justMoved) {
- if (n >= size) {
- size += 16;
- subpaths = (GfxSubpath **)
- grealloc(subpaths, size * sizeof(GfxSubpath *));
- }
- subpaths[n] = new GfxSubpath(firstX, firstY);
- ++n;
- justMoved = gFalse;
- }
- subpaths[n-1]->close();
-}
-
-void GfxPath::append(GfxPath *path) {
- int i;
-
- if (n + path->n > size) {
- size = n + path->n;
- subpaths = (GfxSubpath **)
- grealloc(subpaths, size * sizeof(GfxSubpath *));
- }
- for (i = 0; i < path->n; ++i) {
- subpaths[n++] = path->subpaths[i]->copy();
- }
- justMoved = gFalse;
-}
-
-void GfxPath::offset(double dx, double dy) {
- int i;
-
- for (i = 0; i < n; ++i) {
- subpaths[i]->offset(dx, dy);
- }
-}
-
-//------------------------------------------------------------------------
-// GfxState
-//------------------------------------------------------------------------
-
-GfxState::GfxState(double hDPI, double vDPI, PDFRectangle *pageBox,
- int rotate, GBool upsideDown) {
- double kx, ky;
-
- px1 = pageBox->x1;
- py1 = pageBox->y1;
- px2 = pageBox->x2;
- py2 = pageBox->y2;
- kx = hDPI / 72.0;
- ky = vDPI / 72.0;
- if (rotate == 90) {
- ctm[0] = 0;
- ctm[1] = upsideDown ? ky : -ky;
- ctm[2] = kx;
- ctm[3] = 0;
- ctm[4] = -kx * py1;
- ctm[5] = ky * (upsideDown ? -px1 : px2);
- pageWidth = kx * (py2 - py1);
- pageHeight = ky * (px2 - px1);
- } else if (rotate == 180) {
- ctm[0] = -kx;
- ctm[1] = 0;
- ctm[2] = 0;
- ctm[3] = upsideDown ? ky : -ky;
- ctm[4] = kx * px2;
- ctm[5] = ky * (upsideDown ? -py1 : py2);
- pageWidth = kx * (px2 - px1);
- pageHeight = ky * (py2 - py1);
- } else if (rotate == 270) {
- ctm[0] = 0;
- ctm[1] = upsideDown ? -ky : ky;
- ctm[2] = -kx;
- ctm[3] = 0;
- ctm[4] = kx * py2;
- ctm[5] = ky * (upsideDown ? px2 : -px1);
- pageWidth = kx * (py2 - py1);
- pageHeight = ky * (px2 - px1);
- } else {
- ctm[0] = kx;
- ctm[1] = 0;
- ctm[2] = 0;
- ctm[3] = upsideDown ? -ky : ky;
- ctm[4] = -kx * px1;
- ctm[5] = ky * (upsideDown ? py2 : -py1);
- pageWidth = kx * (px2 - px1);
- pageHeight = ky * (py2 - py1);
- }
-
- fillColorSpace = new GfxDeviceGrayColorSpace();
- strokeColorSpace = new GfxDeviceGrayColorSpace();
- fillColor.c[0] = 0;
- strokeColor.c[0] = 0;
- fillPattern = NULL;
- strokePattern = NULL;
- fillOpacity = 1;
- strokeOpacity = 1;
-
- lineWidth = 1;
- lineDash = NULL;
- lineDashLength = 0;
- lineDashStart = 0;
- flatness = 1;
- lineJoin = 0;
- lineCap = 0;
- miterLimit = 10;
-
- font = NULL;
- fontSize = 0;
- textMat[0] = 1; textMat[1] = 0;
- textMat[2] = 0; textMat[3] = 1;
- textMat[4] = 0; textMat[5] = 0;
- charSpace = 0;
- wordSpace = 0;
- horizScaling = 1;
- leading = 0;
- rise = 0;
- render = 0;
-
- path = new GfxPath();
- curX = curY = 0;
- lineX = lineY = 0;
-
- clipXMin = 0;
- clipYMin = 0;
- clipXMax = pageWidth;
- clipYMax = pageHeight;
-
- saved = NULL;
-}
-
-GfxState::~GfxState() {
- if (fillColorSpace) {
- delete fillColorSpace;
- }
- if (strokeColorSpace) {
- delete strokeColorSpace;
- }
- if (fillPattern) {
- delete fillPattern;
- }
- if (strokePattern) {
- delete strokePattern;
- }
- gfree(lineDash);
- if (path) {
- // this gets set to NULL by restore()
- delete path;
- }
- if (saved) {
- delete saved;
- }
-}
-
-// Used for copy();
-GfxState::GfxState(GfxState *state) {
- memcpy(this, state, sizeof(GfxState));
- if (fillColorSpace) {
- fillColorSpace = state->fillColorSpace->copy();
- }
- if (strokeColorSpace) {
- strokeColorSpace = state->strokeColorSpace->copy();
- }
- if (fillPattern) {
- fillPattern = state->fillPattern->copy();
- }
- if (strokePattern) {
- strokePattern = state->strokePattern->copy();
- }
- if (lineDashLength > 0) {
- lineDash = (double *)gmalloc(lineDashLength * sizeof(double));
- memcpy(lineDash, state->lineDash, lineDashLength * sizeof(double));
- }
- saved = NULL;
-}
-
-void GfxState::setPath(GfxPath *pathA) {
- delete path;
- path = pathA;
-}
-
-void GfxState::getUserClipBBox(double *xMin, double *yMin,
- double *xMax, double *yMax) {
- double ictm[6];
- double xMin1, yMin1, xMax1, yMax1, det, tx, ty;
-
- // invert the CTM
- det = 1 / (ctm[0] * ctm[3] - ctm[1] * ctm[2]);
- ictm[0] = ctm[3] * det;
- ictm[1] = -ctm[1] * det;
- ictm[2] = -ctm[2] * det;
- ictm[3] = ctm[0] * det;
- ictm[4] = (ctm[2] * ctm[5] - ctm[3] * ctm[4]) * det;
- ictm[5] = (ctm[1] * ctm[4] - ctm[0] * ctm[5]) * det;
-
- // transform all four corners of the clip bbox; find the min and max
- // x and y values
- xMin1 = xMax1 = clipXMin * ictm[0] + clipYMin * ictm[2] + ictm[4];
- yMin1 = yMax1 = clipXMin * ictm[1] + clipYMin * ictm[3] + ictm[5];
- tx = clipXMin * ictm[0] + clipYMax * ictm[2] + ictm[4];
- ty = clipXMin * ictm[1] + clipYMax * ictm[3] + ictm[5];
- if (tx < xMin1) {
- xMin1 = tx;
- } else if (tx > xMax1) {
- xMax1 = tx;
- }
- if (ty < yMin1) {
- yMin1 = ty;
- } else if (ty > yMax1) {
- yMax1 = ty;
- }
- tx = clipXMax * ictm[0] + clipYMin * ictm[2] + ictm[4];
- ty = clipXMax * ictm[1] + clipYMin * ictm[3] + ictm[5];
- if (tx < xMin1) {
- xMin1 = tx;
- } else if (tx > xMax1) {
- xMax1 = tx;
- }
- if (ty < yMin1) {
- yMin1 = ty;
- } else if (ty > yMax1) {
- yMax1 = ty;
- }
- tx = clipXMax * ictm[0] + clipYMax * ictm[2] + ictm[4];
- ty = clipXMax * ictm[1] + clipYMax * ictm[3] + ictm[5];
- if (tx < xMin1) {
- xMin1 = tx;
- } else if (tx > xMax1) {
- xMax1 = tx;
- }
- if (ty < yMin1) {
- yMin1 = ty;
- } else if (ty > yMax1) {
- yMax1 = ty;
- }
-
- *xMin = xMin1;
- *yMin = yMin1;
- *xMax = xMax1;
- *yMax = yMax1;
-}
-
-double GfxState::transformWidth(double w) {
- double x, y;
-
- x = ctm[0] + ctm[2];
- y = ctm[1] + ctm[3];
- return w * sqrt(0.5 * (x * x + y * y));
-}
-
-double GfxState::getTransformedFontSize() {
- double x1, y1, x2, y2;
-
- x1 = textMat[2] * fontSize;
- y1 = textMat[3] * fontSize;
- x2 = ctm[0] * x1 + ctm[2] * y1;
- y2 = ctm[1] * x1 + ctm[3] * y1;
- return sqrt(x2 * x2 + y2 * y2);
-}
-
-void GfxState::getFontTransMat(double *m11, double *m12,
- double *m21, double *m22) {
- *m11 = (textMat[0] * ctm[0] + textMat[1] * ctm[2]) * fontSize;
- *m12 = (textMat[0] * ctm[1] + textMat[1] * ctm[3]) * fontSize;
- *m21 = (textMat[2] * ctm[0] + textMat[3] * ctm[2]) * fontSize;
- *m22 = (textMat[2] * ctm[1] + textMat[3] * ctm[3]) * fontSize;
-}
-
-void GfxState::setCTM(double a, double b, double c,
- double d, double e, double f) {
- int i;
-
- ctm[0] = a;
- ctm[1] = b;
- ctm[2] = c;
- ctm[3] = d;
- ctm[4] = e;
- ctm[5] = f;
-
- // avoid FP exceptions on badly messed up PDF files
- for (i = 0; i < 6; ++i) {
- if (ctm[i] > 1e10) {
- ctm[i] = 1e10;
- } else if (ctm[i] < -1e10) {
- ctm[i] = -1e10;
- }
- }
-}
-
-void GfxState::concatCTM(double a, double b, double c,
- double d, double e, double f) {
- double a1 = ctm[0];
- double b1 = ctm[1];
- double c1 = ctm[2];
- double d1 = ctm[3];
- int i;
-
- ctm[0] = a * a1 + b * c1;
- ctm[1] = a * b1 + b * d1;
- ctm[2] = c * a1 + d * c1;
- ctm[3] = c * b1 + d * d1;
- ctm[4] = e * a1 + f * c1 + ctm[4];
- ctm[5] = e * b1 + f * d1 + ctm[5];
-
- // avoid FP exceptions on badly messed up PDF files
- for (i = 0; i < 6; ++i) {
- if (ctm[i] > 1e10) {
- ctm[i] = 1e10;
- } else if (ctm[i] < -1e10) {
- ctm[i] = -1e10;
- }
- }
-}
-
-void GfxState::setFillColorSpace(GfxColorSpace *colorSpace) {
- if (fillColorSpace) {
- delete fillColorSpace;
- }
- fillColorSpace = colorSpace;
-}
-
-void GfxState::setStrokeColorSpace(GfxColorSpace *colorSpace) {
- if (strokeColorSpace) {
- delete strokeColorSpace;
- }
- strokeColorSpace = colorSpace;
-}
-
-void GfxState::setFillPattern(GfxPattern *pattern) {
- if (fillPattern) {
- delete fillPattern;
- }
- fillPattern = pattern;
-}
-
-void GfxState::setStrokePattern(GfxPattern *pattern) {
- if (strokePattern) {
- delete strokePattern;
- }
- strokePattern = pattern;
-}
-
-void GfxState::setLineDash(double *dash, int length, double start) {
- if (lineDash)
- gfree(lineDash);
- lineDash = dash;
- lineDashLength = length;
- lineDashStart = start;
-}
-
-void GfxState::clearPath() {
- delete path;
- path = new GfxPath();
-}
-
-void GfxState::clip() {
- double xMin, yMin, xMax, yMax, x, y;
- GfxSubpath *subpath;
- int i, j;
-
- xMin = xMax = yMin = yMax = 0; // make gcc happy
- for (i = 0; i < path->getNumSubpaths(); ++i) {
- subpath = path->getSubpath(i);
- for (j = 0; j < subpath->getNumPoints(); ++j) {
- transform(subpath->getX(j), subpath->getY(j), &x, &y);
- if (i == 0 && j == 0) {
- xMin = xMax = x;
- yMin = yMax = y;
- } else {
- if (x < xMin) {
- xMin = x;
- } else if (x > xMax) {
- xMax = x;
- }
- if (y < yMin) {
- yMin = y;
- } else if (y > yMax) {
- yMax = y;
- }
- }
- }
- }
- if (xMin > clipXMin) {
- clipXMin = xMin;
- }
- if (yMin > clipYMin) {
- clipYMin = yMin;
- }
- if (xMax < clipXMax) {
- clipXMax = xMax;
- }
- if (yMax < clipYMax) {
- clipYMax = yMax;
- }
-}
-
-void GfxState::textShift(double tx, double ty) {
- double dx, dy;
-
- textTransformDelta(tx, ty, &dx, &dy);
- curX += dx;
- curY += dy;
-}
-
-void GfxState::shift(double dx, double dy) {
- curX += dx;
- curY += dy;
-}
-
-GfxState *GfxState::save() {
- GfxState *newState;
-
- newState = copy();
- newState->saved = this;
- return newState;
-}
-
-GfxState *GfxState::restore() {
- GfxState *oldState;
-
- if (saved) {
- oldState = saved;
-
- // these attributes aren't saved/restored by the q/Q operators
- oldState->path = path;
- oldState->curX = curX;
- oldState->curY = curY;
- oldState->lineX = lineX;
- oldState->lineY = lineY;
-
- path = NULL;
- saved = NULL;
- delete this;
-
- } else {
- oldState = this;
- }
-
- return oldState;
-}
diff --git a/pdf/xpdf/GfxState.h b/pdf/xpdf/GfxState.h
deleted file mode 100644
index f747a83..0000000
--- a/pdf/xpdf/GfxState.h
+++ /dev/null
@@ -1,1055 +0,0 @@
-//========================================================================
-//
-// GfxState.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GFXSTATE_H
-#define GFXSTATE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-#include "Function.h"
-
-class Array;
-class GfxFont;
-class PDFRectangle;
-class GfxShading;
-
-//------------------------------------------------------------------------
-// GfxColor
-//------------------------------------------------------------------------
-
-#define gfxColorMaxComps funcMaxOutputs
-
-struct GfxColor {
- double c[gfxColorMaxComps];
-};
-
-//------------------------------------------------------------------------
-// GfxRGB
-//------------------------------------------------------------------------
-
-struct GfxRGB {
- double r, g, b;
-};
-
-//------------------------------------------------------------------------
-// GfxCMYK
-//------------------------------------------------------------------------
-
-struct GfxCMYK {
- double c, m, y, k;
-};
-
-//------------------------------------------------------------------------
-// GfxColorSpace
-//------------------------------------------------------------------------
-
-// NB: The nGfxColorSpaceModes constant and the gfxColorSpaceModeNames
-// array defined in GfxState.cc must match this enum.
-enum GfxColorSpaceMode {
- csDeviceGray,
- csCalGray,
- csDeviceRGB,
- csCalRGB,
- csDeviceCMYK,
- csLab,
- csICCBased,
- csIndexed,
- csSeparation,
- csDeviceN,
- csPattern
-};
-
-class GfxColorSpace {
-public:
-
- GfxColorSpace();
- virtual ~GfxColorSpace();
- virtual GfxColorSpace *copy() = 0;
- virtual GfxColorSpaceMode getMode() = 0;
-
- // Construct a color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Object *csObj);
-
- // Convert to gray, RGB, or CMYK.
- virtual void getGray(GfxColor *color, double *gray) = 0;
- virtual void getRGB(GfxColor *color, GfxRGB *rgb) = 0;
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk) = 0;
-
- // Return the number of color components.
- virtual int getNComps() = 0;
-
- // Return the default ranges for each component, assuming an image
- // with a max pixel value of <maxImgPixel>.
- virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel);
-
- // Return the number of color space modes
- static int getNumColorSpaceModes();
-
- // Return the name of the <idx>th color space mode.
- static char *getColorSpaceModeName(int idx);
-
-private:
-};
-
-//------------------------------------------------------------------------
-// GfxDeviceGrayColorSpace
-//------------------------------------------------------------------------
-
-class GfxDeviceGrayColorSpace: public GfxColorSpace {
-public:
-
- GfxDeviceGrayColorSpace();
- virtual ~GfxDeviceGrayColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csDeviceGray; }
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 1; }
-
-private:
-};
-
-//------------------------------------------------------------------------
-// GfxCalGrayColorSpace
-//------------------------------------------------------------------------
-
-class GfxCalGrayColorSpace: public GfxColorSpace {
-public:
-
- GfxCalGrayColorSpace();
- virtual ~GfxCalGrayColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csCalGray; }
-
- // Construct a CalGray color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 1; }
-
- // CalGray-specific access.
- double getWhiteX() { return whiteX; }
- double getWhiteY() { return whiteY; }
- double getWhiteZ() { return whiteZ; }
- double getBlackX() { return blackX; }
- double getBlackY() { return blackY; }
- double getBlackZ() { return blackZ; }
- double getGamma() { return gamma; }
-
-private:
-
- double whiteX, whiteY, whiteZ; // white point
- double blackX, blackY, blackZ; // black point
- double gamma; // gamma value
-};
-
-//------------------------------------------------------------------------
-// GfxDeviceRGBColorSpace
-//------------------------------------------------------------------------
-
-class GfxDeviceRGBColorSpace: public GfxColorSpace {
-public:
-
- GfxDeviceRGBColorSpace();
- virtual ~GfxDeviceRGBColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csDeviceRGB; }
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 3; }
-
-private:
-};
-
-//------------------------------------------------------------------------
-// GfxCalRGBColorSpace
-//------------------------------------------------------------------------
-
-class GfxCalRGBColorSpace: public GfxColorSpace {
-public:
-
- GfxCalRGBColorSpace();
- virtual ~GfxCalRGBColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csCalRGB; }
-
- // Construct a CalRGB color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 3; }
-
- // CalRGB-specific access.
- double getWhiteX() { return whiteX; }
- double getWhiteY() { return whiteY; }
- double getWhiteZ() { return whiteZ; }
- double getBlackX() { return blackX; }
- double getBlackY() { return blackY; }
- double getBlackZ() { return blackZ; }
- double getGammaR() { return gammaR; }
- double getGammaG() { return gammaG; }
- double getGammaB() { return gammaB; }
- double *getMatrix() { return mat; }
-
-private:
-
- double whiteX, whiteY, whiteZ; // white point
- double blackX, blackY, blackZ; // black point
- double gammaR, gammaG, gammaB; // gamma values
- double mat[9]; // ABC -> XYZ transform matrix
-};
-
-//------------------------------------------------------------------------
-// GfxDeviceCMYKColorSpace
-//------------------------------------------------------------------------
-
-class GfxDeviceCMYKColorSpace: public GfxColorSpace {
-public:
-
- GfxDeviceCMYKColorSpace();
- virtual ~GfxDeviceCMYKColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csDeviceCMYK; }
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 4; }
-
-private:
-};
-
-//------------------------------------------------------------------------
-// GfxLabColorSpace
-//------------------------------------------------------------------------
-
-class GfxLabColorSpace: public GfxColorSpace {
-public:
-
- GfxLabColorSpace();
- virtual ~GfxLabColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csLab; }
-
- // Construct a Lab color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 3; }
-
- virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel);
-
- // Lab-specific access.
- double getWhiteX() { return whiteX; }
- double getWhiteY() { return whiteY; }
- double getWhiteZ() { return whiteZ; }
- double getBlackX() { return blackX; }
- double getBlackY() { return blackY; }
- double getBlackZ() { return blackZ; }
- double getAMin() { return aMin; }
- double getAMax() { return aMax; }
- double getBMin() { return bMin; }
- double getBMax() { return bMax; }
-
-private:
-
- double whiteX, whiteY, whiteZ; // white point
- double blackX, blackY, blackZ; // black point
- double aMin, aMax, bMin, bMax; // range for the a and b components
- double kr, kg, kb; // gamut mapping mulitpliers
-};
-
-//------------------------------------------------------------------------
-// GfxICCBasedColorSpace
-//------------------------------------------------------------------------
-
-class GfxICCBasedColorSpace: public GfxColorSpace {
-public:
-
- GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
- Ref *iccProfileStreamA);
- virtual ~GfxICCBasedColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csICCBased; }
-
- // Construct an ICCBased color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return nComps; }
-
- virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel);
-
- // ICCBased-specific access.
- GfxColorSpace *getAlt() { return alt; }
-
-private:
-
- int nComps; // number of color components (1, 3, or 4)
- GfxColorSpace *alt; // alternate color space
- double rangeMin[4]; // min values for each component
- double rangeMax[4]; // max values for each component
- Ref iccProfileStream; // the ICC profile
-};
-
-//------------------------------------------------------------------------
-// GfxIndexedColorSpace
-//------------------------------------------------------------------------
-
-class GfxIndexedColorSpace: public GfxColorSpace {
-public:
-
- GfxIndexedColorSpace(GfxColorSpace *baseA, int indexHighA);
- virtual ~GfxIndexedColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csIndexed; }
-
- // Construct a Lab color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 1; }
-
- virtual void getDefaultRanges(double *decodeLow, double *decodeRange,
- int maxImgPixel);
-
- // Indexed-specific access.
- GfxColorSpace *getBase() { return base; }
- int getIndexHigh() { return indexHigh; }
- Guchar *getLookup() { return lookup; }
- GfxColor *mapColorToBase(GfxColor *color, GfxColor *baseColor);
-
-private:
-
- GfxColorSpace *base; // base color space
- int indexHigh; // max pixel value
- Guchar *lookup; // lookup table
-};
-
-//------------------------------------------------------------------------
-// GfxSeparationColorSpace
-//------------------------------------------------------------------------
-
-class GfxSeparationColorSpace: public GfxColorSpace {
-public:
-
- GfxSeparationColorSpace(GString *nameA, GfxColorSpace *altA,
- Function *funcA);
- virtual ~GfxSeparationColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csSeparation; }
-
- // Construct a Separation color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 1; }
-
- // Separation-specific access.
- GString *getName() { return name; }
- GfxColorSpace *getAlt() { return alt; }
- Function *getFunc() { return func; }
-
-private:
-
- GString *name; // colorant name
- GfxColorSpace *alt; // alternate color space
- Function *func; // tint transform (into alternate color space)
-};
-
-//------------------------------------------------------------------------
-// GfxDeviceNColorSpace
-//------------------------------------------------------------------------
-
-class GfxDeviceNColorSpace: public GfxColorSpace {
-public:
-
- GfxDeviceNColorSpace(int nCompsA, GfxColorSpace *alt, Function *func);
- virtual ~GfxDeviceNColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csDeviceN; }
-
- // Construct a DeviceN color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return nComps; }
-
- // DeviceN-specific access.
- GString *getColorantName(int i) { return names[i]; }
- GfxColorSpace *getAlt() { return alt; }
- Function *getTintTransformFunc() { return func; }
-
-private:
-
- int nComps; // number of components
- GString // colorant names
- *names[gfxColorMaxComps];
- GfxColorSpace *alt; // alternate color space
- Function *func; // tint transform (into alternate color space)
-};
-
-//------------------------------------------------------------------------
-// GfxPatternColorSpace
-//------------------------------------------------------------------------
-
-class GfxPatternColorSpace: public GfxColorSpace {
-public:
-
- GfxPatternColorSpace(GfxColorSpace *underA);
- virtual ~GfxPatternColorSpace();
- virtual GfxColorSpace *copy();
- virtual GfxColorSpaceMode getMode() { return csPattern; }
-
- // Construct a Pattern color space. Returns NULL if unsuccessful.
- static GfxColorSpace *parse(Array *arr);
-
- virtual void getGray(GfxColor *color, double *gray);
- virtual void getRGB(GfxColor *color, GfxRGB *rgb);
- virtual void getCMYK(GfxColor *color, GfxCMYK *cmyk);
-
- virtual int getNComps() { return 0; }
-
- // Pattern-specific access.
- GfxColorSpace *getUnder() { return under; }
-
-private:
-
- GfxColorSpace *under; // underlying color space (for uncolored
- // patterns)
-};
-
-//------------------------------------------------------------------------
-// GfxPattern
-//------------------------------------------------------------------------
-
-class GfxPattern {
-public:
-
- GfxPattern(int typeA);
- virtual ~GfxPattern();
-
- static GfxPattern *parse(Object *obj);
-
- virtual GfxPattern *copy() = 0;
-
- int getType() { return type; }
-
-private:
-
- int type;
-};
-
-//------------------------------------------------------------------------
-// GfxTilingPattern
-//------------------------------------------------------------------------
-
-class GfxTilingPattern: public GfxPattern {
-public:
-
- static GfxTilingPattern *parse(Object *patObj);
- virtual ~GfxTilingPattern();
-
- virtual GfxPattern *copy();
-
- int getPaintType() { return paintType; }
- int getTilingType() { return tilingType; }
- double *getBBox() { return bbox; }
- double getXStep() { return xStep; }
- double getYStep() { return yStep; }
- Dict *getResDict()
- { return resDict.isDict() ? resDict.getDict() : (Dict *)NULL; }
- double *getMatrix() { return matrix; }
- Object *getContentStream() { return &contentStream; }
-
-private:
-
- GfxTilingPattern(int paintTypeA, int tilingTypeA,
- double *bboxA, double xStepA, double yStepA,
- Object *resDictA, double *matrixA,
- Object *contentStreamA);
-
- int paintType;
- int tilingType;
- double bbox[4];
- double xStep, yStep;
- Object resDict;
- double matrix[6];
- Object contentStream;
-};
-
-//------------------------------------------------------------------------
-// GfxShadingPattern
-//------------------------------------------------------------------------
-
-class GfxShadingPattern: public GfxPattern {
-public:
-
- static GfxShadingPattern *parse(Object *patObj);
- virtual ~GfxShadingPattern();
-
- virtual GfxPattern *copy();
-
- GfxShading *getShading() { return shading; }
- double *getMatrix() { return matrix; }
-
-private:
-
- GfxShadingPattern(GfxShading *shadingA, double *matrixA);
-
- GfxShading *shading;
- double matrix[6];
-};
-
-//------------------------------------------------------------------------
-// GfxShading
-//------------------------------------------------------------------------
-
-class GfxShading {
-public:
-
- GfxShading(int typeA);
- GfxShading(GfxShading *shading);
- virtual ~GfxShading();
-
- static GfxShading *parse(Object *obj);
-
- virtual GfxShading *copy() = 0;
-
- int getType() { return type; }
- GfxColorSpace *getColorSpace() { return colorSpace; }
- GfxColor *getBackground() { return &background; }
- GBool getHasBackground() { return hasBackground; }
- void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
- { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
- GBool getHasBBox() { return hasBBox; }
-
-protected:
-
- GBool init(Dict *dict);
-
- int type;
- GfxColorSpace *colorSpace;
- GfxColor background;
- GBool hasBackground;
- double xMin, yMin, xMax, yMax;
- GBool hasBBox;
-};
-
-//------------------------------------------------------------------------
-// GfxFunctionShading
-//------------------------------------------------------------------------
-
-class GfxFunctionShading: public GfxShading {
-public:
-
- GfxFunctionShading(double x0A, double y0A,
- double x1A, double y1A,
- double *matrixA,
- Function **funcsA, int nFuncsA);
- GfxFunctionShading(GfxFunctionShading *shading);
- virtual ~GfxFunctionShading();
-
- static GfxFunctionShading *parse(Dict *dict);
-
- virtual GfxShading *copy();
-
- void getDomain(double *x0A, double *y0A, double *x1A, double *y1A)
- { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; }
- double *getMatrix() { return matrix; }
- void getColor(double x, double y, GfxColor *color);
-
-private:
-
- double x0, y0, x1, y1;
- double matrix[6];
- Function *funcs[gfxColorMaxComps];
- int nFuncs;
-};
-
-//------------------------------------------------------------------------
-// GfxAxialShading
-//------------------------------------------------------------------------
-
-class GfxAxialShading: public GfxShading {
-public:
-
- GfxAxialShading(double x0A, double y0A,
- double x1A, double y1A,
- double t0A, double t1A,
- Function **funcsA, int nFuncsA,
- GBool extend0A, GBool extend1A);
- GfxAxialShading(GfxAxialShading *shading);
- virtual ~GfxAxialShading();
-
- static GfxAxialShading *parse(Dict *dict);
-
- virtual GfxShading *copy();
-
- void getCoords(double *x0A, double *y0A, double *x1A, double *y1A)
- { *x0A = x0; *y0A = y0; *x1A = x1; *y1A = y1; }
- double getDomain0() { return t0; }
- double getDomain1() { return t1; }
- void getColor(double t, GfxColor *color);
- GBool getExtend0() { return extend0; }
- GBool getExtend1() { return extend1; }
-
-private:
-
- double x0, y0, x1, y1;
- double t0, t1;
- Function *funcs[gfxColorMaxComps];
- int nFuncs;
- GBool extend0, extend1;
-};
-
-//------------------------------------------------------------------------
-// GfxRadialShading
-//------------------------------------------------------------------------
-
-class GfxRadialShading: public GfxShading {
-public:
-
- GfxRadialShading(double x0A, double y0A, double r0A,
- double x1A, double y1A, double r1A,
- double t0A, double t1A,
- Function **funcsA, int nFuncsA,
- GBool extend0A, GBool extend1A);
- GfxRadialShading(GfxRadialShading *shading);
- virtual ~GfxRadialShading();
-
- static GfxRadialShading *parse(Dict *dict);
-
- virtual GfxShading *copy();
-
- void getCoords(double *x0A, double *y0A, double *r0A,
- double *x1A, double *y1A, double *r1A)
- { *x0A = x0; *y0A = y0; *r0A = r0; *x1A = x1; *y1A = y1; *r1A = r1; }
- double getDomain0() { return t0; }
- double getDomain1() { return t1; }
- void getColor(double t, GfxColor *color);
- GBool getExtend0() { return extend0; }
- GBool getExtend1() { return extend1; }
-
-private:
-
- double x0, y0, r0, x1, y1, r1;
- double t0, t1;
- Function *funcs[gfxColorMaxComps];
- int nFuncs;
- GBool extend0, extend1;
-};
-
-//------------------------------------------------------------------------
-// GfxImageColorMap
-//------------------------------------------------------------------------
-
-class GfxImageColorMap {
-public:
-
- // Constructor.
- GfxImageColorMap(int bitsA, Object *decode, GfxColorSpace *colorSpaceA);
-
- // Destructor.
- ~GfxImageColorMap();
-
- // Return a copy of this color map.
- GfxImageColorMap *copy() { return new GfxImageColorMap(this); }
-
- // Is color map valid?
- GBool isOk() { return ok; }
-
- // Get the color space.
- GfxColorSpace *getColorSpace() { return colorSpace; }
-
- // Get stream decoding info.
- int getNumPixelComps() { return nComps; }
- int getBits() { return bits; }
-
- // Get decode table.
- double getDecodeLow(int i) { return decodeLow[i]; }
- double getDecodeHigh(int i) { return decodeLow[i] + decodeRange[i]; }
-
- // Convert an image pixel to a color.
- void getGray(Guchar *x, double *gray);
- void getRGB(Guchar *x, GfxRGB *rgb);
- void getCMYK(Guchar *x, GfxCMYK *cmyk);
- void getColor(Guchar *x, GfxColor *color);
-
-private:
-
- GfxImageColorMap(GfxImageColorMap *colorMap);
-
- GfxColorSpace *colorSpace; // the image color space
- int bits; // bits per component
- int nComps; // number of components in a pixel
- GfxColorSpace *colorSpace2; // secondary color space
- int nComps2; // number of components in colorSpace2
- double *lookup; // lookup table
- double // minimum values for each component
- decodeLow[gfxColorMaxComps];
- double // max - min value for each component
- decodeRange[gfxColorMaxComps];
- GBool ok;
-};
-
-//------------------------------------------------------------------------
-// GfxSubpath and GfxPath
-//------------------------------------------------------------------------
-
-class GfxSubpath {
-public:
-
- // Constructor.
- GfxSubpath(double x1, double y1);
-
- // Destructor.
- ~GfxSubpath();
-
- // Copy.
- GfxSubpath *copy() { return new GfxSubpath(this); }
-
- // Get points.
- int getNumPoints() { return n; }
- double getX(int i) { return x[i]; }
- double getY(int i) { return y[i]; }
- GBool getCurve(int i) { return curve[i]; }
-
- // Get last point.
- double getLastX() { return x[n-1]; }
- double getLastY() { return y[n-1]; }
-
- // Add a line segment.
- void lineTo(double x1, double y1);
-
- // Add a Bezier curve.
- void curveTo(double x1, double y1, double x2, double y2,
- double x3, double y3);
-
- // Close the subpath.
- void close();
- GBool isClosed() { return closed; }
-
- // Add (<dx>, <dy>) to each point in the subpath.
- void offset(double dx, double dy);
-
-private:
-
- double *x, *y; // points
- GBool *curve; // curve[i] => point i is a control point
- // for a Bezier curve
- int n; // number of points
- int size; // size of x/y arrays
- GBool closed; // set if path is closed
-
- GfxSubpath(GfxSubpath *subpath);
-};
-
-class GfxPath {
-public:
-
- // Constructor.
- GfxPath();
-
- // Destructor.
- ~GfxPath();
-
- // Copy.
- GfxPath *copy()
- { return new GfxPath(justMoved, firstX, firstY, subpaths, n, size); }
-
- // Is there a current point?
- GBool isCurPt() { return n > 0 || justMoved; }
-
- // Is the path non-empty, i.e., is there at least one segment?
- GBool isPath() { return n > 0; }
-
- // Get subpaths.
- int getNumSubpaths() { return n; }
- GfxSubpath *getSubpath(int i) { return subpaths[i]; }
-
- // Get last point on last subpath.
- double getLastX() { return subpaths[n-1]->getLastX(); }
- double getLastY() { return subpaths[n-1]->getLastY(); }
-
- // Move the current point.
- void moveTo(double x, double y);
-
- // Add a segment to the last subpath.
- void lineTo(double x, double y);
-
- // Add a Bezier curve to the last subpath
- void curveTo(double x1, double y1, double x2, double y2,
- double x3, double y3);
-
- // Close the last subpath.
- void close();
-
- // Append <path> to <this>.
- void append(GfxPath *path);
-
- // Add (<dx>, <dy>) to each point in the path.
- void offset(double dx, double dy);
-
-private:
-
- GBool justMoved; // set if a new subpath was just started
- double firstX, firstY; // first point in new subpath
- GfxSubpath **subpaths; // subpaths
- int n; // number of subpaths
- int size; // size of subpaths array
-
- GfxPath(GBool justMoved1, double firstX1, double firstY1,
- GfxSubpath **subpaths1, int n1, int size1);
-};
-
-//------------------------------------------------------------------------
-// GfxState
-//------------------------------------------------------------------------
-
-class GfxState {
-public:
-
- // Construct a default GfxState, for a device with resolution <hDPI>
- // x <vDPI>, page box <pageBox>, page rotation <rotate>, and
- // coordinate system specified by <upsideDown>.
- GfxState(double hDPI, double vDPI, PDFRectangle *pageBox,
- int rotate, GBool upsideDown);
-
- // Destructor.
- ~GfxState();
-
- // Copy.
- GfxState *copy() { return new GfxState(this); }
-
- // Accessors.
- double *getCTM() { return ctm; }
- double getX1() { return px1; }
- double getY1() { return py1; }
- double getX2() { return px2; }
- double getY2() { return py2; }
- double getPageWidth() { return pageWidth; }
- double getPageHeight() { return pageHeight; }
- GfxColor *getFillColor() { return &fillColor; }
- GfxColor *getStrokeColor() { return &strokeColor; }
- void getFillGray(double *gray)
- { fillColorSpace->getGray(&fillColor, gray); }
- void getStrokeGray(double *gray)
- { strokeColorSpace->getGray(&strokeColor, gray); }
- void getFillRGB(GfxRGB *rgb)
- { fillColorSpace->getRGB(&fillColor, rgb); }
- void getStrokeRGB(GfxRGB *rgb)
- { strokeColorSpace->getRGB(&strokeColor, rgb); }
- void getFillCMYK(GfxCMYK *cmyk)
- { fillColorSpace->getCMYK(&fillColor, cmyk); }
- void getStrokeCMYK(GfxCMYK *cmyk)
- { strokeColorSpace->getCMYK(&strokeColor, cmyk); }
- GfxColorSpace *getFillColorSpace() { return fillColorSpace; }
- GfxColorSpace *getStrokeColorSpace() { return strokeColorSpace; }
- GfxPattern *getFillPattern() { return fillPattern; }
- GfxPattern *getStrokePattern() { return strokePattern; }
- double getFillOpacity() { return fillOpacity; }
- double getStrokeOpacity() { return strokeOpacity; }
- double getLineWidth() { return lineWidth; }
- void getLineDash(double **dash, int *length, double *start)
- { *dash = lineDash; *length = lineDashLength; *start = lineDashStart; }
- int getFlatness() { return flatness; }
- int getLineJoin() { return lineJoin; }
- int getLineCap() { return lineCap; }
- double getMiterLimit() { return miterLimit; }
- GfxFont *getFont() { return font; }
- double getFontSize() { return fontSize; }
- double *getTextMat() { return textMat; }
- double getCharSpace() { return charSpace; }
- double getWordSpace() { return wordSpace; }
- double getHorizScaling() { return horizScaling; }
- double getLeading() { return leading; }
- double getRise() { return rise; }
- int getRender() { return render; }
- GfxPath *getPath() { return path; }
- void setPath(GfxPath *pathA);
- double getCurX() { return curX; }
- double getCurY() { return curY; }
- void getClipBBox(double *xMin, double *yMin, double *xMax, double *yMax)
- { *xMin = clipXMin; *yMin = clipYMin; *xMax = clipXMax; *yMax = clipYMax; }
- void getUserClipBBox(double *xMin, double *yMin, double *xMax, double *yMax);
- double getLineX() { return lineX; }
- double getLineY() { return lineY; }
-
- // Is there a current point/path?
- GBool isCurPt() { return path->isCurPt(); }
- GBool isPath() { return path->isPath(); }
-
- // Transforms.
- void transform(double x1, double y1, double *x2, double *y2)
- { *x2 = ctm[0] * x1 + ctm[2] * y1 + ctm[4];
- *y2 = ctm[1] * x1 + ctm[3] * y1 + ctm[5]; }
- void transformDelta(double x1, double y1, double *x2, double *y2)
- { *x2 = ctm[0] * x1 + ctm[2] * y1;
- *y2 = ctm[1] * x1 + ctm[3] * y1; }
- void textTransform(double x1, double y1, double *x2, double *y2)
- { *x2 = textMat[0] * x1 + textMat[2] * y1 + textMat[4];
- *y2 = textMat[1] * x1 + textMat[3] * y1 + textMat[5]; }
- void textTransformDelta(double x1, double y1, double *x2, double *y2)
- { *x2 = textMat[0] * x1 + textMat[2] * y1;
- *y2 = textMat[1] * x1 + textMat[3] * y1; }
- double transformWidth(double w);
- double getTransformedLineWidth()
- { return transformWidth(lineWidth); }
- double getTransformedFontSize();
- void getFontTransMat(double *m11, double *m12, double *m21, double *m22);
-
- // Change state parameters.
- void setCTM(double a, double b, double c,
- double d, double e, double f);
- void concatCTM(double a, double b, double c,
- double d, double e, double f);
- void setFillColorSpace(GfxColorSpace *colorSpace);
- void setStrokeColorSpace(GfxColorSpace *colorSpace);
- void setFillColor(GfxColor *color) { fillColor = *color; }
- void setStrokeColor(GfxColor *color) { strokeColor = *color; }
- void setFillPattern(GfxPattern *pattern);
- void setStrokePattern(GfxPattern *pattern);
- void setFillOpacity(double opac) { fillOpacity = opac; }
- void setStrokeOpacity(double opac) { strokeOpacity = opac; }
- void setLineWidth(double width) { lineWidth = width; }
- void setLineDash(double *dash, int length, double start);
- void setFlatness(int flatness1) { flatness = flatness1; }
- void setLineJoin(int lineJoin1) { lineJoin = lineJoin1; }
- void setLineCap(int lineCap1) { lineCap = lineCap1; }
- void setMiterLimit(double limit) { miterLimit = limit; }
- void setFont(GfxFont *fontA, double fontSizeA)
- { font = fontA; fontSize = fontSizeA; }
- void setTextMat(double a, double b, double c,
- double d, double e, double f)
- { textMat[0] = a; textMat[1] = b; textMat[2] = c;
- textMat[3] = d; textMat[4] = e; textMat[5] = f; }
- void setCharSpace(double space)
- { charSpace = space; }
- void setWordSpace(double space)
- { wordSpace = space; }
- void setHorizScaling(double scale)
- { horizScaling = 0.01 * scale; }
- void setLeading(double leadingA)
- { leading = leadingA; }
- void setRise(double riseA)
- { rise = riseA; }
- void setRender(int renderA)
- { render = renderA; }
-
- // Add to path.
- void moveTo(double x, double y)
- { path->moveTo(curX = x, curY = y); }
- void lineTo(double x, double y)
- { path->lineTo(curX = x, curY = y); }
- void curveTo(double x1, double y1, double x2, double y2,
- double x3, double y3)
- { path->curveTo(x1, y1, x2, y2, curX = x3, curY = y3); }
- void closePath()
- { path->close(); curX = path->getLastX(); curY = path->getLastY(); }
- void clearPath();
-
- // Update clip region.
- void clip();
-
- // Text position.
- void textSetPos(double tx, double ty) { lineX = tx; lineY = ty; }
- void textMoveTo(double tx, double ty)
- { lineX = tx; lineY = ty; textTransform(tx, ty, &curX, &curY); }
- void textShift(double tx, double ty);
- void shift(double dx, double dy);
-
- // Push/pop GfxState on/off stack.
- GfxState *save();
- GfxState *restore();
- GBool hasSaves() { return saved != NULL; }
-
-private:
-
- double ctm[6]; // coord transform matrix
- double px1, py1, px2, py2; // page corners (user coords)
- double pageWidth, pageHeight; // page size (pixels)
-
- GfxColorSpace *fillColorSpace; // fill color space
- GfxColorSpace *strokeColorSpace; // stroke color space
- GfxColor fillColor; // fill color
- GfxColor strokeColor; // stroke color
- GfxPattern *fillPattern; // fill pattern
- GfxPattern *strokePattern; // stroke pattern
- double fillOpacity; // fill opacity
- double strokeOpacity; // stroke opacity
-
- double lineWidth; // line width
- double *lineDash; // line dash
- int lineDashLength;
- double lineDashStart;
- int flatness; // curve flatness
- int lineJoin; // line join style
- int lineCap; // line cap style
- double miterLimit; // line miter limit
-
- GfxFont *font; // font
- double fontSize; // font size
- double textMat[6]; // text matrix
- double charSpace; // character spacing
- double wordSpace; // word spacing
- double horizScaling; // horizontal scaling
- double leading; // text leading
- double rise; // text rise
- int render; // text rendering mode
-
- GfxPath *path; // array of path elements
- double curX, curY; // current point (user coords)
- double lineX, lineY; // start of current text line (text coords)
-
- double clipXMin, clipYMin, // bounding box for clip region
- clipXMax, clipYMax;
-
- GfxState *saved; // next GfxState on stack
-
- GfxState(GfxState *state);
-};
-
-#endif
diff --git a/pdf/xpdf/GlobalParams.cc b/pdf/xpdf/GlobalParams.cc
deleted file mode 100644
index 2bc997f..0000000
--- a/pdf/xpdf/GlobalParams.cc
+++ /dev/null
@@ -1,1764 +0,0 @@
-//========================================================================
-//
-// GlobalParams.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#if HAVE_PAPER_H
-#include <paper.h>
-#endif
-#include <fontconfig/fontconfig.h>
-#include "gmem.h"
-#include "GString.h"
-#include "GList.h"
-#include "GHash.h"
-#include "gfile.h"
-#include "Error.h"
-#include "NameToCharCode.h"
-#include "CharCodeToUnicode.h"
-#include "UnicodeMap.h"
-#include "CMap.h"
-#include "BuiltinFontTables.h"
-#include "FontEncodingTables.h"
-#include "GlobalParams.h"
-
-#if MULTITHREADED
-# define lockGlobalParams gLockMutex(&mutex)
-# define lockUnicodeMapCache gLockMutex(&unicodeMapCacheMutex)
-# define lockCMapCache gLockMutex(&cMapCacheMutex)
-# define unlockGlobalParams gUnlockMutex(&mutex)
-# define unlockUnicodeMapCache gUnlockMutex(&unicodeMapCacheMutex)
-# define unlockCMapCache gUnlockMutex(&cMapCacheMutex)
-#else
-# define lockGlobalParams
-# define lockUnicodeMapCache
-# define lockCMapCache
-# define unlockGlobalParams
-# define unlockUnicodeMapCache
-# define unlockCMapCache
-#endif
-
-#include "NameToUnicodeTable.h"
-#include "UnicodeMapTables.h"
-#include "UTF8.h"
-
-//------------------------------------------------------------------------
-
-#define cidToUnicodeCacheSize 4
-#define unicodeToUnicodeCacheSize 4
-
-//------------------------------------------------------------------------
-
-static struct {
- char *name;
- char *fileName;
-} displayFontTab[] = {
- {"Courier", "n022003l.pfb"},
- {"Courier-Bold", "n022004l.pfb"},
- {"Courier-BoldOblique", "n022024l.pfb"},
- {"Courier-Oblique", "n022023l.pfb"},
- {"Helvetica", "n019003l.pfb"},
- {"Helvetica-Bold", "n019004l.pfb"},
- {"Helvetica-BoldOblique", "n019024l.pfb"},
- {"Helvetica-Oblique", "n019023l.pfb"},
- {"Symbol", "s050000l.pfb"},
- {"Times-Bold", "n021004l.pfb"},
- {"Times-BoldItalic", "n021024l.pfb"},
- {"Times-Italic", "n021023l.pfb"},
- {"Times-Roman", "n021003l.pfb"},
- {"ZapfDingbats", "d050000l.pfb"},
- {NULL}
-};
-
-static char *displayFontDirs[] = {
- "/usr/share/ghostscript/fonts",
- "/usr/local/share/ghostscript/fonts",
- "/usr/share/fonts/default/Type1",
- NULL
-};
-
-/* patterns originally from mupdf; added agfa fonts*/
-static struct {
- const char *name;
- const char *pattern;
-} displayFontTabFc[] = {
- /* FIXME Adobe fonts should be here, but that breaks down if
- fontconfig returns pcf fonts */
- {"Courier", "Nimbus Mono L,Courier New,Cumberland AMT,Cumberland:style=Regular,Roman"},
- {"Courier-Bold", "Nimbus Mono L,Courier New,Cumberland AMT,Cumberland:style=Bold"},
- {"Courier-BoldOblique", "Nimbus Mono L,Courier New,Cumberland AMT,Cumberland:style=Oblique,Italic"},
- {"Courier-Oblique", "Nimbus Mono L,Courier New,Cumberland AMT,Cumberland:style=BoldOblique,BoldItalic"},
- {"Helvetica", "Nimbus Sans L,Arial,Albany AMT,Albany:style=Regular,Roman"},
- {"Helvetica-Bold", "Nimbus Sans L,Arial,Albany AMT,Albany:style=Bold"},
- {"Helvetica-BoldOblique", "Nimbus Sans L,Arial,Albany AMT,Albany:style=Oblique,Italic"},
- {"Helvetica-Oblique", "Nimbus Sans L,Arial,Albany AMT,Albany:style=BoldOblique,BoldItalic"},
- /* FIXME Symbol should be first,
- but that matches windows ttf which gets wrong encoding */
- {"Symbol", "Standard Symbols L,Symbol"},
- {"Times-Bold", "Nimbus Roman No9 L,Times New Roman,Thorndale AMT,Thorndale:style=Bold,Medium"},
- {"Times-BoldItalic", "Nimbus Roman No9 L,Times New Roman,Thorndale AMT,Thorndale:style=BoldItalic,Medium Italic"},
- {"Times-Italic", "Nimbus Roman No9 L,Times New Roman,Thorndale AMT,Thorndale:style=Italic,Regular Italic"},
- {"Times-Roman", "Nimbus Roman No9 L,Times New Roman,Thorndale AMT,Thorndale:style=Regular,Roman"},
- {"ZapfDingbats", "Dingbats:outline=true"},
- {NULL}
-};
-
-//------------------------------------------------------------------------
-
-GlobalParams *globalParams = NULL;
-
-//------------------------------------------------------------------------
-// DisplayFontParam
-//------------------------------------------------------------------------
-
-DisplayFontParam::DisplayFontParam(GString *nameA,
- DisplayFontParamKind kindA) {
- name = nameA;
- kind = kindA;
- switch (kind) {
- case displayFontT1:
- t1.fileName = NULL;
- break;
- case displayFontTT:
- tt.fileName = NULL;
- break;
- }
-}
-
-DisplayFontParam::~DisplayFontParam() {
- delete name;
- switch (kind) {
- case displayFontT1:
- if (t1.fileName) {
- delete t1.fileName;
- }
- break;
- case displayFontTT:
- if (tt.fileName) {
- delete tt.fileName;
- }
- break;
- }
-}
-
-//------------------------------------------------------------------------
-// PSFontParam
-//------------------------------------------------------------------------
-
-PSFontParam::PSFontParam(GString *pdfFontNameA, int wModeA,
- GString *psFontNameA, GString *encodingA) {
- pdfFontName = pdfFontNameA;
- wMode = wModeA;
- psFontName = psFontNameA;
- encoding = encodingA;
-}
-
-PSFontParam::~PSFontParam() {
- delete pdfFontName;
- delete psFontName;
- if (encoding) {
- delete encoding;
- }
-}
-
-//------------------------------------------------------------------------
-// parsing
-//------------------------------------------------------------------------
-
-GlobalParams::GlobalParams(char *cfgFileName) {
- UnicodeMap *map;
- GString *fileName;
- FILE *f;
- int i;
-
-#if MULTITHREADED
- gInitMutex(&mutex);
- gInitMutex(&unicodeMapCacheMutex);
- gInitMutex(&cMapCacheMutex);
-#endif
-
- initBuiltinFontTables();
-
- // scan the encoding in reverse because we want the lowest-numbered
- // index for each char name ('space' is encoded twice)
- macRomanReverseMap = new NameToCharCode();
- for (i = 255; i >= 0; --i) {
- if (macRomanEncoding[i]) {
- macRomanReverseMap->add(macRomanEncoding[i], (CharCode)i);
- }
- }
-
- nameToUnicode = new NameToCharCode();
- cidToUnicodes = new GHash(gTrue);
- unicodeToUnicodes = new GHash(gTrue);
- residentUnicodeMaps = new GHash();
- unicodeMaps = new GHash(gTrue);
- cMapDirs = new GHash(gTrue);
- toUnicodeDirs = new GList();
- displayFonts = new GHash();
- displayCIDFonts = new GHash();
- displayNamedCIDFonts = new GHash();
-#if HAVE_PAPER_H
- char *paperName;
- const struct paper *paperType;
- paperinit();
- if ((paperName = systempapername())) {
- paperType = paperinfo(paperName);
- psPaperWidth = (int)paperpswidth(paperType);
- psPaperHeight = (int)paperpsheight(paperType);
- } else {
- error(-1, "No paper information available - using defaults");
- psPaperWidth = defPaperWidth;
- psPaperHeight = defPaperHeight;
- }
- paperdone();
-#else
- psPaperWidth = defPaperWidth;
- psPaperHeight = defPaperHeight;
-#endif
- psImageableLLX = psImageableLLY = 0;
- psImageableURX = psPaperWidth;
- psImageableURY = psPaperHeight;
- psCrop = gTrue;
- psExpandSmaller = gFalse;
- psShrinkLarger = gTrue;
- psCenter = gTrue;
- psDuplex = gFalse;
- psLevel = psLevel2;
- psFile = NULL;
- psFonts = new GHash();
- psNamedFonts16 = new GList();
- psFonts16 = new GList();
- psEmbedType1 = gTrue;
- psEmbedTrueType = gTrue;
- psEmbedCIDPostScript = gTrue;
- psEmbedCIDTrueType = gTrue;
- psOPI = gFalse;
- psASCIIHex = gFalse;
- textEncoding = new GString("Latin1");
-#if defined(WIN32)
- textEOL = eolDOS;
-#elif defined(MACOS)
- textEOL = eolMac;
-#else
- textEOL = eolUnix;
-#endif
- textPageBreaks = gTrue;
- textKeepTinyChars = gFalse;
- fontDirs = new GList();
- initialZoom = new GString("125");
- enableT1lib = gTrue;
- enableFreeType = gTrue;
- antialias = gTrue;
- urlCommand = NULL;
- movieCommand = NULL;
- mapNumericCharNames = gTrue;
- printCommands = gFalse;
- errQuiet = gFalse;
-
- cidToUnicodeCache = new CharCodeToUnicodeCache(cidToUnicodeCacheSize);
- unicodeToUnicodeCache =
- new CharCodeToUnicodeCache(unicodeToUnicodeCacheSize);
- unicodeMapCache = new UnicodeMapCache();
- cMapCache = new CMapCache();
-
- // set up the initial nameToUnicode table
- for (i = 0; nameToUnicodeTab[i].name; ++i) {
- nameToUnicode->add(nameToUnicodeTab[i].name, nameToUnicodeTab[i].u);
- }
-
- // set up the residentUnicodeMaps table
- map = new UnicodeMap("Latin1", gFalse,
- latin1UnicodeMapRanges, latin1UnicodeMapLen);
- residentUnicodeMaps->add(map->getEncodingName(), map);
- map = new UnicodeMap("ASCII7", gFalse,
- ascii7UnicodeMapRanges, ascii7UnicodeMapLen);
- residentUnicodeMaps->add(map->getEncodingName(), map);
- map = new UnicodeMap("Symbol", gFalse,
- symbolUnicodeMapRanges, symbolUnicodeMapLen);
- residentUnicodeMaps->add(map->getEncodingName(), map);
- map = new UnicodeMap("ZapfDingbats", gFalse, zapfDingbatsUnicodeMapRanges,
- zapfDingbatsUnicodeMapLen);
- residentUnicodeMaps->add(map->getEncodingName(), map);
- map = new UnicodeMap("UTF-8", gTrue, &mapUTF8);
- residentUnicodeMaps->add(map->getEncodingName(), map);
- map = new UnicodeMap("UCS-2", gTrue, &mapUCS2);
- residentUnicodeMaps->add(map->getEncodingName(), map);
-
- // look for a user config file, then a system-wide config file
- f = NULL;
- fileName = NULL;
- if (cfgFileName && cfgFileName[0]) {
- fileName = new GString(cfgFileName);
- if (!(f = fopen(fileName->getCString(), "r"))) {
- delete fileName;
- }
- }
- if (!f) {
- fileName = appendToPath(getHomeDir(), xpdfUserConfigFile);
- if (!(f = fopen(fileName->getCString(), "r"))) {
- delete fileName;
- }
- }
- if (!f) {
-#if defined(WIN32) && !defined(__CYGWIN32__)
- char buf[512];
- i = GetModuleFileName(NULL, buf, sizeof(buf));
- if (i <= 0 || i >= sizeof(buf)) {
- // error or path too long for buffer - just use the current dir
- buf[0] = '\0';
- }
- fileName = grabPath(buf);
- appendToPath(fileName, xpdfSysConfigFile);
-#else
- fileName = new GString(xpdfSysConfigFile);
-#endif
- if (!(f = fopen(fileName->getCString(), "r"))) {
- delete fileName;
- }
- }
- if (f) {
- parseFile(fileName, f);
- delete fileName;
- fclose(f);
- }
-}
-
-void GlobalParams::parseFile(GString *fileName, FILE *f) {
- int line;
- GList *tokens;
- GString *cmd, *incFile;
- char *p1, *p2;
- char buf[512];
- FILE *f2;
-
- line = 1;
- while (getLine(buf, sizeof(buf) - 1, f)) {
-
- // break the line into tokens
- tokens = new GList();
- p1 = buf;
- while (*p1) {
- for (; *p1 && isspace(*p1); ++p1) ;
- if (!*p1) {
- break;
- }
- if (*p1 == '"' || *p1 == '\'') {
- for (p2 = p1 + 1; *p2 && *p2 != *p1; ++p2) ;
- ++p1;
- } else {
- for (p2 = p1 + 1; *p2 && !isspace(*p2); ++p2) ;
- }
- tokens->append(new GString(p1, p2 - p1));
- p1 = *p2 ? p2 + 1 : p2;
- }
-
- if (tokens->getLength() > 0 &&
- ((GString *)tokens->get(0))->getChar(0) != '#') {
- cmd = (GString *)tokens->get(0);
- if (!cmd->cmp("include")) {
- if (tokens->getLength() == 2) {
- incFile = (GString *)tokens->get(1);
- if ((f2 = fopen(incFile->getCString(), "r"))) {
- parseFile(incFile, f2);
- fclose(f2);
- } else {
- error(-1, "Couldn't find included config file: '%s' (%s:%d)",
- incFile->getCString(), fileName->getCString(), line);
- }
- } else {
- error(-1, "Bad 'include' config file command (%s:%d)",
- fileName->getCString(), line);
- }
- } else if (!cmd->cmp("nameToUnicode")) {
- parseNameToUnicode(tokens, fileName, line);
- } else if (!cmd->cmp("cidToUnicode")) {
- parseCIDToUnicode(tokens, fileName, line);
- } else if (!cmd->cmp("unicodeToUnicode")) {
- parseUnicodeToUnicode(tokens, fileName, line);
- } else if (!cmd->cmp("unicodeMap")) {
- parseUnicodeMap(tokens, fileName, line);
- } else if (!cmd->cmp("cMapDir")) {
- parseCMapDir(tokens, fileName, line);
- } else if (!cmd->cmp("toUnicodeDir")) {
- parseToUnicodeDir(tokens, fileName, line);
- } else if (!cmd->cmp("displayFontT1")) {
- parseDisplayFont(tokens, displayFonts, displayFontT1, fileName, line);
- } else if (!cmd->cmp("displayFontTT")) {
- parseDisplayFont(tokens, displayFonts, displayFontTT, fileName, line);
- } else if (!cmd->cmp("displayNamedCIDFontT1")) {
- parseDisplayFont(tokens, displayNamedCIDFonts,
- displayFontT1, fileName, line);
- } else if (!cmd->cmp("displayCIDFontT1")) {
- parseDisplayFont(tokens, displayCIDFonts,
- displayFontT1, fileName, line);
- } else if (!cmd->cmp("displayNamedCIDFontTT")) {
- parseDisplayFont(tokens, displayNamedCIDFonts,
- displayFontTT, fileName, line);
- } else if (!cmd->cmp("displayCIDFontTT")) {
- parseDisplayFont(tokens, displayCIDFonts,
- displayFontTT, fileName, line);
- } else if (!cmd->cmp("psFile")) {
- parsePSFile(tokens, fileName, line);
- } else if (!cmd->cmp("psFont")) {
- parsePSFont(tokens, fileName, line);
- } else if (!cmd->cmp("psNamedFont16")) {
- parsePSFont16("psNamedFont16", psNamedFonts16,
- tokens, fileName, line);
- } else if (!cmd->cmp("psFont16")) {
- parsePSFont16("psFont16", psFonts16, tokens, fileName, line);
- } else if (!cmd->cmp("psPaperSize")) {
- parsePSPaperSize(tokens, fileName, line);
- } else if (!cmd->cmp("psImageableArea")) {
- parsePSImageableArea(tokens, fileName, line);
- } else if (!cmd->cmp("psCrop")) {
- parseYesNo("psCrop", &psCrop, tokens, fileName, line);
- } else if (!cmd->cmp("psExpandSmaller")) {
- parseYesNo("psExpandSmaller", &psExpandSmaller,
- tokens, fileName, line);
- } else if (!cmd->cmp("psShrinkLarger")) {
- parseYesNo("psShrinkLarger", &psShrinkLarger, tokens, fileName, line);
- } else if (!cmd->cmp("psCenter")) {
- parseYesNo("psCenter", &psCenter, tokens, fileName, line);
- } else if (!cmd->cmp("psDuplex")) {
- parseYesNo("psDuplex", &psDuplex, tokens, fileName, line);
- } else if (!cmd->cmp("psLevel")) {
- parsePSLevel(tokens, fileName, line);
- } else if (!cmd->cmp("psEmbedType1Fonts")) {
- parseYesNo("psEmbedType1", &psEmbedType1, tokens, fileName, line);
- } else if (!cmd->cmp("psEmbedTrueTypeFonts")) {
- parseYesNo("psEmbedTrueType", &psEmbedTrueType,
- tokens, fileName, line);
- } else if (!cmd->cmp("psEmbedCIDPostScriptFonts")) {
- parseYesNo("psEmbedCIDPostScript", &psEmbedCIDPostScript,
- tokens, fileName, line);
- } else if (!cmd->cmp("psEmbedCIDTrueTypeFonts")) {
- parseYesNo("psEmbedCIDTrueType", &psEmbedCIDTrueType,
- tokens, fileName, line);
- } else if (!cmd->cmp("psOPI")) {
- parseYesNo("psOPI", &psOPI, tokens, fileName, line);
- } else if (!cmd->cmp("psASCIIHex")) {
- parseYesNo("psASCIIHex", &psASCIIHex, tokens, fileName, line);
- } else if (!cmd->cmp("textEncoding")) {
- parseTextEncoding(tokens, fileName, line);
- } else if (!cmd->cmp("textEOL")) {
- parseTextEOL(tokens, fileName, line);
- } else if (!cmd->cmp("textPageBreaks")) {
- parseYesNo("textPageBreaks", &textPageBreaks,
- tokens, fileName, line);
- } else if (!cmd->cmp("textKeepTinyChars")) {
- parseYesNo("textKeepTinyChars", &textKeepTinyChars,
- tokens, fileName, line);
- } else if (!cmd->cmp("fontDir")) {
- parseFontDir(tokens, fileName, line);
- } else if (!cmd->cmp("initialZoom")) {
- parseInitialZoom(tokens, fileName, line);
- } else if (!cmd->cmp("enableT1lib")) {
- parseYesNo("enableT1lib", &enableT1lib, tokens, fileName, line);
- } else if (!cmd->cmp("enableFreeType")) {
- parseYesNo("enableFreeType", &enableFreeType, tokens, fileName, line);
- } else if (!cmd->cmp("antialias")) {
- parseYesNo("antialias", &antialias, tokens, fileName, line);
- } else if (!cmd->cmp("urlCommand")) {
- parseCommand("urlCommand", &urlCommand, tokens, fileName, line);
- } else if (!cmd->cmp("movieCommand")) {
- parseCommand("movieCommand", &movieCommand, tokens, fileName, line);
- } else if (!cmd->cmp("mapNumericCharNames")) {
- parseYesNo("mapNumericCharNames", &mapNumericCharNames,
- tokens, fileName, line);
- } else if (!cmd->cmp("printCommands")) {
- parseYesNo("printCommands", &printCommands, tokens, fileName, line);
- } else if (!cmd->cmp("errQuiet")) {
- parseYesNo("errQuiet", &errQuiet, tokens, fileName, line);
- } else {
- error(-1, "Unknown config file command '%s' (%s:%d)",
- cmd->getCString(), fileName->getCString(), line);
- if (!cmd->cmp("displayFontX") ||
- !cmd->cmp("displayNamedCIDFontX") ||
- !cmd->cmp("displayCIDFontX")) {
- error(-1, "-- Xpdf no longer supports X fonts");
- } else if (!cmd->cmp("t1libControl") || !cmd->cmp("freetypeControl")) {
- error(-1, "-- The t1libControl and freetypeControl options have been replaced");
- error(-1, " by the enableT1lib, enableFreeType, and antialias options");
- } else if (!cmd->cmp("fontpath") || !cmd->cmp("fontmap")) {
- error(-1, "-- the config file format has changed since Xpdf 0.9x");
- }
- }
- }
-
- deleteGList(tokens, GString);
- ++line;
- }
-}
-
-void GlobalParams::parseNameToUnicode(GList *tokens, GString *fileName,
- int line) {
- GString *name;
- char *tok1, *tok2;
- FILE *f;
- char buf[256];
- int line2;
- Unicode u;
-
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'nameToUnicode' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- name = (GString *)tokens->get(1);
- if (!(f = fopen(name->getCString(), "r"))) {
- error(-1, "Couldn't open 'nameToUnicode' file '%s'",
- name->getCString());
- return;
- }
- line2 = 1;
- while (getLine(buf, sizeof(buf), f)) {
- tok1 = strtok(buf, " \t\r\n");
- tok2 = strtok(NULL, " \t\r\n");
- if (tok1 && tok2) {
- sscanf(tok1, "%x", &u);
- nameToUnicode->add(tok2, u);
- } else {
- error(-1, "Bad line in 'nameToUnicode' file (%s:%d)", name, line2);
- }
- ++line2;
- }
- fclose(f);
-}
-
-void GlobalParams::parseCIDToUnicode(GList *tokens, GString *fileName,
- int line) {
- GString *collection, *name, *old;
-
- if (tokens->getLength() != 3) {
- error(-1, "Bad 'cidToUnicode' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- collection = (GString *)tokens->get(1);
- name = (GString *)tokens->get(2);
- if ((old = (GString *)cidToUnicodes->remove(collection))) {
- delete old;
- }
- cidToUnicodes->add(collection->copy(), name->copy());
-}
-
-void GlobalParams::parseUnicodeToUnicode(GList *tokens, GString *fileName,
- int line) {
- GString *font, *file, *old;
-
- if (tokens->getLength() != 3) {
- error(-1, "Bad 'unicodeToUnicode' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- font = (GString *)tokens->get(1);
- file = (GString *)tokens->get(2);
- if ((old = (GString *)unicodeToUnicodes->remove(font))) {
- delete old;
- }
- unicodeToUnicodes->add(font->copy(), file->copy());
-}
-
-void GlobalParams::parseUnicodeMap(GList *tokens, GString *fileName,
- int line) {
- GString *encodingName, *name, *old;
-
- if (tokens->getLength() != 3) {
- error(-1, "Bad 'unicodeMap' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- encodingName = (GString *)tokens->get(1);
- name = (GString *)tokens->get(2);
- if ((old = (GString *)unicodeMaps->remove(encodingName))) {
- delete old;
- }
- unicodeMaps->add(encodingName->copy(), name->copy());
-}
-
-void GlobalParams::parseCMapDir(GList *tokens, GString *fileName, int line) {
- GString *collection, *dir;
- GList *list;
-
- if (tokens->getLength() != 3) {
- error(-1, "Bad 'cMapDir' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- collection = (GString *)tokens->get(1);
- dir = (GString *)tokens->get(2);
- if (!(list = (GList *)cMapDirs->lookup(collection))) {
- list = new GList();
- cMapDirs->add(collection->copy(), list);
- }
- list->append(dir->copy());
-}
-
-void GlobalParams::parseToUnicodeDir(GList *tokens, GString *fileName,
- int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'toUnicodeDir' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- toUnicodeDirs->append(((GString *)tokens->get(1))->copy());
-}
-
-void GlobalParams::parseDisplayFont(GList *tokens, GHash *fontHash,
- DisplayFontParamKind kind,
- GString *fileName, int line) {
- DisplayFontParam *param, *old;
-
- if (tokens->getLength() < 2) {
- goto err1;
- }
- param = new DisplayFontParam(((GString *)tokens->get(1))->copy(), kind);
-
- switch (kind) {
- case displayFontT1:
- if (tokens->getLength() != 3) {
- goto err2;
- }
- param->t1.fileName = ((GString *)tokens->get(2))->copy();
- break;
- case displayFontTT:
- if (tokens->getLength() != 3) {
- goto err2;
- }
- param->tt.fileName = ((GString *)tokens->get(2))->copy();
- break;
- }
-
- if ((old = (DisplayFontParam *)fontHash->remove(param->name))) {
- delete old;
- }
- fontHash->add(param->name, param);
- return;
-
- err2:
- delete param;
- err1:
- error(-1, "Bad 'display*Font*' config file command (%s:%d)",
- fileName->getCString(), line);
-}
-
-void GlobalParams::parsePSPaperSize(GList *tokens, GString *fileName,
- int line) {
- GString *tok;
-
- if (tokens->getLength() == 2) {
- tok = (GString *)tokens->get(1);
- if (!setPSPaperSize(tok->getCString())) {
- error(-1, "Bad 'psPaperSize' config file command (%s:%d)",
- fileName->getCString(), line);
- }
- } else if (tokens->getLength() == 3) {
- tok = (GString *)tokens->get(1);
- psPaperWidth = atoi(tok->getCString());
- tok = (GString *)tokens->get(2);
- psPaperHeight = atoi(tok->getCString());
- psImageableLLX = psImageableLLY = 0;
- psImageableURX = psPaperWidth;
- psImageableURY = psPaperHeight;
- } else {
- error(-1, "Bad 'psPaperSize' config file command (%s:%d)",
- fileName->getCString(), line);
- }
-}
-
-void GlobalParams::parsePSImageableArea(GList *tokens, GString *fileName,
- int line) {
- if (tokens->getLength() != 5) {
- error(-1, "Bad 'psImageableArea' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- psImageableLLX = atoi(((GString *)tokens->get(1))->getCString());
- psImageableLLY = atoi(((GString *)tokens->get(2))->getCString());
- psImageableURX = atoi(((GString *)tokens->get(3))->getCString());
- psImageableURY = atoi(((GString *)tokens->get(4))->getCString());
-}
-
-void GlobalParams::parsePSLevel(GList *tokens, GString *fileName, int line) {
- GString *tok;
-
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'psLevel' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- tok = (GString *)tokens->get(1);
- if (!tok->cmp("level1")) {
- psLevel = psLevel1;
- } else if (!tok->cmp("level1sep")) {
- psLevel = psLevel1Sep;
- } else if (!tok->cmp("level2")) {
- psLevel = psLevel2;
- } else if (!tok->cmp("level2sep")) {
- psLevel = psLevel2Sep;
- } else if (!tok->cmp("level3")) {
- psLevel = psLevel3;
- } else if (!tok->cmp("level3Sep")) {
- psLevel = psLevel3Sep;
- } else {
- error(-1, "Bad 'psLevel' config file command (%s:%d)",
- fileName->getCString(), line);
- }
-}
-
-void GlobalParams::parsePSFile(GList *tokens, GString *fileName, int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'psFile' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- if (psFile) {
- delete psFile;
- }
- psFile = ((GString *)tokens->get(1))->copy();
-}
-
-void GlobalParams::parsePSFont(GList *tokens, GString *fileName, int line) {
- PSFontParam *param;
-
- if (tokens->getLength() != 3) {
- error(-1, "Bad 'psFont' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- param = new PSFontParam(((GString *)tokens->get(1))->copy(), 0,
- ((GString *)tokens->get(2))->copy(), NULL);
- psFonts->add(param->pdfFontName, param);
-}
-
-void GlobalParams::parsePSFont16(char *cmdName, GList *fontList,
- GList *tokens, GString *fileName, int line) {
- PSFontParam *param;
- int wMode;
- GString *tok;
-
- if (tokens->getLength() != 5) {
- error(-1, "Bad '%s' config file command (%s:%d)",
- cmdName, fileName->getCString(), line);
- return;
- }
- tok = (GString *)tokens->get(2);
- if (!tok->cmp("H")) {
- wMode = 0;
- } else if (!tok->cmp("V")) {
- wMode = 1;
- } else {
- error(-1, "Bad '%s' config file command (%s:%d)",
- cmdName, fileName->getCString(), line);
- return;
- }
- param = new PSFontParam(((GString *)tokens->get(1))->copy(),
- wMode,
- ((GString *)tokens->get(3))->copy(),
- ((GString *)tokens->get(4))->copy());
- fontList->append(param);
-}
-
-void GlobalParams::parseTextEncoding(GList *tokens, GString *fileName,
- int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'textEncoding' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- delete textEncoding;
- textEncoding = ((GString *)tokens->get(1))->copy();
-}
-
-void GlobalParams::parseTextEOL(GList *tokens, GString *fileName, int line) {
- GString *tok;
-
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'textEOL' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- tok = (GString *)tokens->get(1);
- if (!tok->cmp("unix")) {
- textEOL = eolUnix;
- } else if (!tok->cmp("dos")) {
- textEOL = eolDOS;
- } else if (!tok->cmp("mac")) {
- textEOL = eolMac;
- } else {
- error(-1, "Bad 'textEOL' config file command (%s:%d)",
- fileName->getCString(), line);
- }
-}
-
-void GlobalParams::parseFontDir(GList *tokens, GString *fileName, int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'fontDir' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- fontDirs->append(((GString *)tokens->get(1))->copy());
-}
-
-void GlobalParams::parseInitialZoom(GList *tokens,
- GString *fileName, int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad 'initialZoom' config file command (%s:%d)",
- fileName->getCString(), line);
- return;
- }
- delete initialZoom;
- initialZoom = ((GString *)tokens->get(1))->copy();
-}
-
-void GlobalParams::parseCommand(char *cmdName, GString **val,
- GList *tokens, GString *fileName, int line) {
- if (tokens->getLength() != 2) {
- error(-1, "Bad '%s' config file command (%s:%d)",
- cmdName, fileName->getCString(), line);
- return;
- }
- if (*val) {
- delete *val;
- }
- *val = ((GString *)tokens->get(1))->copy();
-}
-
-void GlobalParams::parseYesNo(char *cmdName, GBool *flag,
- GList *tokens, GString *fileName, int line) {
- GString *tok;
-
- if (tokens->getLength() != 2) {
- error(-1, "Bad '%s' config file command (%s:%d)",
- cmdName, fileName->getCString(), line);
- return;
- }
- tok = (GString *)tokens->get(1);
- if (!parseYesNo2(tok->getCString(), flag)) {
- error(-1, "Bad '%s' config file command (%s:%d)",
- cmdName, fileName->getCString(), line);
- }
-}
-
-GBool GlobalParams::parseYesNo2(char *token, GBool *flag) {
- if (!strcmp(token, "yes")) {
- *flag = gTrue;
- } else if (!strcmp(token, "no")) {
- *flag = gFalse;
- } else {
- return gFalse;
- }
- return gTrue;
-}
-
-GlobalParams::~GlobalParams() {
- GHashIter *iter;
- GString *key;
- GList *list;
-
- freeBuiltinFontTables();
-
- delete macRomanReverseMap;
-
- delete nameToUnicode;
- deleteGHash(cidToUnicodes, GString);
- deleteGHash(unicodeToUnicodes, GString);
- deleteGHash(residentUnicodeMaps, UnicodeMap);
- deleteGHash(unicodeMaps, GString);
- deleteGList(toUnicodeDirs, GString);
- deleteGHash(displayFonts, DisplayFontParam);
- deleteGHash(displayCIDFonts, DisplayFontParam);
- deleteGHash(displayNamedCIDFonts, DisplayFontParam);
- if (psFile) {
- delete psFile;
- }
- deleteGHash(psFonts, PSFontParam);
- deleteGList(psNamedFonts16, PSFontParam);
- deleteGList(psFonts16, PSFontParam);
- delete textEncoding;
- deleteGList(fontDirs, GString);
- delete initialZoom;
- if (urlCommand) {
- delete urlCommand;
- }
- if (movieCommand) {
- delete movieCommand;
- }
-
- cMapDirs->startIter(&iter);
- while (cMapDirs->getNext(&iter, &key, (void **)&list)) {
- deleteGList(list, GString);
- }
- delete cMapDirs;
-
- delete cidToUnicodeCache;
- delete unicodeToUnicodeCache;
- delete unicodeMapCache;
- delete cMapCache;
-
-#if MULTITHREADED
- gDestroyMutex(&mutex);
- gDestroyMutex(&unicodeMapCacheMutex);
- gDestroyMutex(&cMapCacheMutex);
-#endif
-}
-
-//------------------------------------------------------------------------
-
-void GlobalParams::setupBaseFonts(char *dir) {
- GString *fontName;
- GString *fileName;
- FILE *f;
- DisplayFontParam *dfp;
- int i, j;
-
- for (i = 0; displayFontTab[i].name; ++i) {
- fontName = new GString(displayFontTab[i].name);
- if (getDisplayFont(fontName)) {
- delete fontName;
- continue;
- }
- fileName = NULL;
- if (dir) {
- fileName = appendToPath(new GString(dir), displayFontTab[i].fileName);
- if ((f = fopen(fileName->getCString(), "rb"))) {
- fclose(f);
- } else {
- delete fileName;
- fileName = NULL;
- }
- }
-#ifndef WIN32
- for (j = 0; !fileName && displayFontDirs[j]; ++j) {
- fileName = appendToPath(new GString(displayFontDirs[j]),
- displayFontTab[i].fileName);
- if ((f = fopen(fileName->getCString(), "rb"))) {
- fclose(f);
- } else {
- delete fileName;
- fileName = NULL;
- }
- }
-#endif
- if (!fileName) {
- error(-1, "No display font for '%s'", displayFontTab[i].name);
- delete fontName;
- continue;
- }
- dfp = new DisplayFontParam(fontName, displayFontT1);
- dfp->t1.fileName = fileName;
- globalParams->addDisplayFont(dfp);
- }
-}
-
-//------------------------------------------------------------------------
-
-void GlobalParams::setupBaseFontsFc(FcConfig *fcConfig) {
- GString *fontName;
- GString *fileName;
- DisplayFontParam *dfp;
- FcPattern *namePat, *matchPat;
- FcResult result;
- FcChar8 *fcFileName;
- int i;
- DisplayFontParamKind kind;
-
- for (i = 0; displayFontTabFc[i].name; ++i) {
- fontName = new GString(displayFontTabFc[i].name);
- if (getDisplayFont(fontName)) {
- delete fontName;
- continue;
- }
- fileName = NULL;
- result = FcResultMatch;
- namePat = FcNameParse((const FcChar8 *)displayFontTabFc[i].pattern);
- FcConfigSubstitute(fcConfig, namePat, FcMatchPattern);
- FcDefaultSubstitute(namePat);
- matchPat = FcFontMatch(fcConfig, namePat, &result);
-
- if (result == FcResultMatch) {
- result = FcPatternGetString(matchPat, "file", 0, &fcFileName);
- if (result == FcResultMatch)
- fileName = new GString((const char *)fcFileName);
- }
-
- FcPatternDestroy(matchPat);
- FcPatternDestroy(namePat);
-
- if (fileName) {
- char *ext;
-
- /* FIXME */
- ext = strrchr(fileName->getCString(), '.');
- if (ext) {
- if (strcasecmp (ext, ".pfb") == 0)
- kind = displayFontT1;
- else if (strcasecmp (ext, ".pfa") == 0)
- kind = displayFontT1;
- else if (strcasecmp (ext, ".ttf") == 0)
- kind = displayFontTT;
- else if (strcasecmp (ext, ".ttc") == 0)
- kind = displayFontTT;
- else {
- delete fileName;
- fileName = NULL;
- }
- } else {
- delete fileName;
- fileName = NULL;
- }
- }
-
- if (!fileName) {
- error(-1, "No display font for '%s'", displayFontTabFc[i].name);
- delete fontName;
- continue;
- }
-
- dfp = new DisplayFontParam(fontName, kind);
- switch (kind) {
- case displayFontT1:
- dfp->t1.fileName = fileName;
- break;
- case displayFontTT:
- dfp->tt.fileName = fileName;
- }
-
- globalParams->addDisplayFont(dfp);
- }
-}
-
-//------------------------------------------------------------------------
-// accessors
-//------------------------------------------------------------------------
-
-CharCode GlobalParams::getMacRomanCharCode(char *charName) {
- // no need to lock - macRomanReverseMap is constant
- return macRomanReverseMap->lookup(charName);
-}
-
-Unicode GlobalParams::mapNameToUnicode(char *charName) {
- // no need to lock - nameToUnicode is constant
- return nameToUnicode->lookup(charName);
-}
-
-UnicodeMap *GlobalParams::getResidentUnicodeMap(GString *encodingName) {
- UnicodeMap *map;
-
- lockGlobalParams;
- map = (UnicodeMap *)residentUnicodeMaps->lookup(encodingName);
- unlockGlobalParams;
- if (map) {
- map->incRefCnt();
- }
- return map;
-}
-
-FILE *GlobalParams::getUnicodeMapFile(GString *encodingName) {
- GString *fileName;
- FILE *f;
-
- lockGlobalParams;
- if ((fileName = (GString *)unicodeMaps->lookup(encodingName))) {
- f = fopen(fileName->getCString(), "r");
- } else {
- f = NULL;
- }
- unlockGlobalParams;
- return f;
-}
-
-FILE *GlobalParams::findCMapFile(GString *collection, GString *cMapName) {
- GList *list;
- GString *dir;
- GString *fileName;
- FILE *f;
- int i;
-
- lockGlobalParams;
- if (!(list = (GList *)cMapDirs->lookup(collection))) {
- unlockGlobalParams;
- return NULL;
- }
- for (i = 0; i < list->getLength(); ++i) {
- dir = (GString *)list->get(i);
- fileName = appendToPath(dir->copy(), cMapName->getCString());
- f = fopen(fileName->getCString(), "r");
- delete fileName;
- if (f) {
- unlockGlobalParams;
- return f;
- }
- }
- unlockGlobalParams;
- return NULL;
-}
-
-FILE *GlobalParams::findToUnicodeFile(GString *name) {
- GString *dir, *fileName;
- FILE *f;
- int i;
-
- lockGlobalParams;
- for (i = 0; i < toUnicodeDirs->getLength(); ++i) {
- dir = (GString *)toUnicodeDirs->get(i);
- fileName = appendToPath(dir->copy(), name->getCString());
- f = fopen(fileName->getCString(), "r");
- delete fileName;
- if (f) {
- unlockGlobalParams;
- return f;
- }
- }
- unlockGlobalParams;
- return NULL;
-}
-
-DisplayFontParam *GlobalParams::getDisplayFont(GString *fontName) {
- DisplayFontParam *dfp;
-
- lockGlobalParams;
- dfp = (DisplayFontParam *)displayFonts->lookup(fontName);
- unlockGlobalParams;
- return dfp;
-}
-
-DisplayFontParam *GlobalParams::getDisplayCIDFont(GString *fontName,
- GString *collection) {
- DisplayFontParam *dfp;
-
- lockGlobalParams;
- if (!fontName ||
- !(dfp = (DisplayFontParam *)displayNamedCIDFonts->lookup(fontName))) {
- dfp = (DisplayFontParam *)displayCIDFonts->lookup(collection);
- }
- unlockGlobalParams;
- return dfp;
-}
-
-GString *GlobalParams::getPSFile() {
- GString *s;
-
- lockGlobalParams;
- s = psFile ? psFile->copy() : (GString *)NULL;
- unlockGlobalParams;
- return s;
-}
-
-int GlobalParams::getPSPaperWidth() {
- int w;
-
- lockGlobalParams;
- w = psPaperWidth;
- unlockGlobalParams;
- return w;
-}
-
-int GlobalParams::getPSPaperHeight() {
- int h;
-
- lockGlobalParams;
- h = psPaperHeight;
- unlockGlobalParams;
- return h;
-}
-
-void GlobalParams::getPSImageableArea(int *llx, int *lly, int *urx, int *ury) {
- lockGlobalParams;
- *llx = psImageableLLX;
- *lly = psImageableLLY;
- *urx = psImageableURX;
- *ury = psImageableURY;
- unlockGlobalParams;
-}
-
-GBool GlobalParams::getPSCrop() {
- GBool f;
-
- lockGlobalParams;
- f = psCrop;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getPSExpandSmaller() {
- GBool f;
-
- lockGlobalParams;
- f = psExpandSmaller;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getPSShrinkLarger() {
- GBool f;
-
- lockGlobalParams;
- f = psShrinkLarger;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getPSCenter() {
- GBool f;
-
- lockGlobalParams;
- f = psCenter;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getPSDuplex() {
- GBool d;
-
- lockGlobalParams;
- d = psDuplex;
- unlockGlobalParams;
- return d;
-}
-
-PSLevel GlobalParams::getPSLevel() {
- PSLevel level;
-
- lockGlobalParams;
- level = psLevel;
- unlockGlobalParams;
- return level;
-}
-
-PSFontParam *GlobalParams::getPSFont(GString *fontName) {
- PSFontParam *p;
-
- lockGlobalParams;
- p = (PSFontParam *)psFonts->lookup(fontName);
- unlockGlobalParams;
- return p;
-}
-
-PSFontParam *GlobalParams::getPSFont16(GString *fontName,
- GString *collection, int wMode) {
- PSFontParam *p;
- int i;
-
- lockGlobalParams;
- p = NULL;
- if (fontName) {
- for (i = 0; i < psNamedFonts16->getLength(); ++i) {
- p = (PSFontParam *)psNamedFonts16->get(i);
- if (!p->pdfFontName->cmp(fontName) &&
- p->wMode == wMode) {
- break;
- }
- p = NULL;
- }
- }
- if (!p && collection) {
- for (i = 0; i < psFonts16->getLength(); ++i) {
- p = (PSFontParam *)psFonts16->get(i);
- if (!p->pdfFontName->cmp(collection) &&
- p->wMode == wMode) {
- break;
- }
- p = NULL;
- }
- }
- unlockGlobalParams;
- return p;
-}
-
-GBool GlobalParams::getPSEmbedType1() {
- GBool e;
-
- lockGlobalParams;
- e = psEmbedType1;
- unlockGlobalParams;
- return e;
-}
-
-GBool GlobalParams::getPSEmbedTrueType() {
- GBool e;
-
- lockGlobalParams;
- e = psEmbedTrueType;
- unlockGlobalParams;
- return e;
-}
-
-GBool GlobalParams::getPSEmbedCIDPostScript() {
- GBool e;
-
- lockGlobalParams;
- e = psEmbedCIDPostScript;
- unlockGlobalParams;
- return e;
-}
-
-GBool GlobalParams::getPSEmbedCIDTrueType() {
- GBool e;
-
- lockGlobalParams;
- e = psEmbedCIDTrueType;
- unlockGlobalParams;
- return e;
-}
-
-GBool GlobalParams::getPSOPI() {
- GBool opi;
-
- lockGlobalParams;
- opi = psOPI;
- unlockGlobalParams;
- return opi;
-}
-
-GBool GlobalParams::getPSASCIIHex() {
- GBool ah;
-
- lockGlobalParams;
- ah = psASCIIHex;
- unlockGlobalParams;
- return ah;
-}
-
-GString *GlobalParams::getTextEncodingName() {
- GString *s;
-
- lockGlobalParams;
- s = textEncoding->copy();
- unlockGlobalParams;
- return s;
-}
-
-EndOfLineKind GlobalParams::getTextEOL() {
- EndOfLineKind eol;
-
- lockGlobalParams;
- eol = textEOL;
- unlockGlobalParams;
- return eol;
-}
-
-GBool GlobalParams::getTextPageBreaks() {
- GBool pageBreaks;
-
- lockGlobalParams;
- pageBreaks = textPageBreaks;
- unlockGlobalParams;
- return pageBreaks;
-}
-
-GBool GlobalParams::getTextKeepTinyChars() {
- GBool tiny;
-
- lockGlobalParams;
- tiny = textKeepTinyChars;
- unlockGlobalParams;
- return tiny;
-}
-
-GString *GlobalParams::findFontFile(GString *fontName, char **exts) {
- GString *dir, *fileName;
- char **ext;
- FILE *f;
- int i;
-
- lockGlobalParams;
- for (i = 0; i < fontDirs->getLength(); ++i) {
- dir = (GString *)fontDirs->get(i);
- for (ext = exts; *ext; ++ext) {
- fileName = appendToPath(dir->copy(), fontName->getCString());
- fileName->append(*ext);
- if ((f = fopen(fileName->getCString(), "rb"))) {
- fclose(f);
- unlockGlobalParams;
- return fileName;
- }
- delete fileName;
- }
- }
- unlockGlobalParams;
- return NULL;
-}
-
-GString *GlobalParams::getInitialZoom() {
- GString *s;
-
- lockGlobalParams;
- s = initialZoom->copy();
- unlockGlobalParams;
- return s;
-}
-
-GBool GlobalParams::getEnableT1lib() {
- GBool f;
-
- lockGlobalParams;
- f = enableT1lib;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getEnableFreeType() {
- GBool f;
-
- lockGlobalParams;
- f = enableFreeType;
- unlockGlobalParams;
- return f;
-}
-
-
-GBool GlobalParams::getAntialias() {
- GBool f;
-
- lockGlobalParams;
- f = antialias;
- unlockGlobalParams;
- return f;
-}
-
-GBool GlobalParams::getMapNumericCharNames() {
- GBool map;
-
- lockGlobalParams;
- map = mapNumericCharNames;
- unlockGlobalParams;
- return map;
-}
-
-GBool GlobalParams::getPrintCommands() {
- GBool p;
-
- lockGlobalParams;
- p = printCommands;
- unlockGlobalParams;
- return p;
-}
-
-GBool GlobalParams::getErrQuiet() {
- GBool q;
-
- lockGlobalParams;
- q = errQuiet;
- unlockGlobalParams;
- return q;
-}
-
-CharCodeToUnicode *GlobalParams::getCIDToUnicode(GString *collection) {
- GString *fileName;
- CharCodeToUnicode *ctu;
-
- lockGlobalParams;
- if (!(ctu = cidToUnicodeCache->getCharCodeToUnicode(collection))) {
- if ((fileName = (GString *)cidToUnicodes->lookup(collection)) &&
- (ctu = CharCodeToUnicode::parseCIDToUnicode(fileName, collection))) {
- cidToUnicodeCache->add(ctu);
- }
- }
- unlockGlobalParams;
- return ctu;
-}
-
-CharCodeToUnicode *GlobalParams::getUnicodeToUnicode(GString *fontName) {
- CharCodeToUnicode *ctu;
- GHashIter *iter;
- GString *fontPattern, *fileName;
-
- lockGlobalParams;
- fileName = NULL;
- unicodeToUnicodes->startIter(&iter);
- while (unicodeToUnicodes->getNext(&iter, &fontPattern, (void **)&fileName)) {
- if (strstr(fontName->getCString(), fontPattern->getCString())) {
- unicodeToUnicodes->killIter(&iter);
- break;
- }
- fileName = NULL;
- }
- if (fileName) {
- if (!(ctu = unicodeToUnicodeCache->getCharCodeToUnicode(fileName))) {
- if ((ctu = CharCodeToUnicode::parseUnicodeToUnicode(fileName))) {
- unicodeToUnicodeCache->add(ctu);
- }
- }
- } else {
- ctu = NULL;
- }
- unlockGlobalParams;
- return ctu;
-}
-
-UnicodeMap *GlobalParams::getUnicodeMap(GString *encodingName) {
- return getUnicodeMap2(encodingName);
-}
-
-UnicodeMap *GlobalParams::getUnicodeMap2(GString *encodingName) {
- UnicodeMap *map;
-
- if (!(map = getResidentUnicodeMap(encodingName))) {
- lockUnicodeMapCache;
- map = unicodeMapCache->getUnicodeMap(encodingName);
- unlockUnicodeMapCache;
- }
- return map;
-}
-
-CMap *GlobalParams::getCMap(GString *collection, GString *cMapName) {
- CMap *cMap;
-
- lockCMapCache;
- cMap = cMapCache->getCMap(collection, cMapName);
- unlockCMapCache;
- return cMap;
-}
-
-UnicodeMap *GlobalParams::getTextEncoding() {
- return getUnicodeMap2(textEncoding);
-}
-
-//------------------------------------------------------------------------
-// functions to set parameters
-//------------------------------------------------------------------------
-
-void GlobalParams::addDisplayFont(DisplayFontParam *param) {
- DisplayFontParam *old;
-
- lockGlobalParams;
- if ((old = (DisplayFontParam *)displayFonts->remove(param->name))) {
- delete old;
- }
- displayFonts->add(param->name, param);
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSFile(char *file) {
- lockGlobalParams;
- if (psFile) {
- delete psFile;
- }
- psFile = new GString(file);
- unlockGlobalParams;
-}
-
-GBool GlobalParams::setPSPaperSize(char *size) {
- lockGlobalParams;
- if (!strcmp(size, "match")) {
- psPaperWidth = psPaperHeight = -1;
- } else if (!strcmp(size, "letter")) {
- psPaperWidth = 612;
- psPaperHeight = 792;
- } else if (!strcmp(size, "legal")) {
- psPaperWidth = 612;
- psPaperHeight = 1008;
- } else if (!strcmp(size, "A4")) {
- psPaperWidth = 595;
- psPaperHeight = 842;
- } else if (!strcmp(size, "A3")) {
- psPaperWidth = 842;
- psPaperHeight = 1190;
- } else {
- unlockGlobalParams;
- return gFalse;
- }
- psImageableLLX = psImageableLLY = 0;
- psImageableURX = psPaperWidth;
- psImageableURY = psPaperHeight;
- unlockGlobalParams;
- return gTrue;
-}
-
-void GlobalParams::setPSPaperWidth(int width) {
- lockGlobalParams;
- psPaperWidth = width;
- psImageableLLX = 0;
- psImageableURX = psPaperWidth;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSPaperHeight(int height) {
- lockGlobalParams;
- psPaperHeight = height;
- psImageableLLY = 0;
- psImageableURY = psPaperHeight;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSImageableArea(int llx, int lly, int urx, int ury) {
- lockGlobalParams;
- psImageableLLX = llx;
- psImageableLLY = lly;
- psImageableURX = urx;
- psImageableURY = ury;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSCrop(GBool crop) {
- lockGlobalParams;
- psCrop = crop;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSExpandSmaller(GBool expand) {
- lockGlobalParams;
- psExpandSmaller = expand;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSShrinkLarger(GBool shrink) {
- lockGlobalParams;
- psShrinkLarger = shrink;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSCenter(GBool center) {
- lockGlobalParams;
- psCenter = center;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSDuplex(GBool duplex) {
- lockGlobalParams;
- psDuplex = duplex;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSLevel(PSLevel level) {
- lockGlobalParams;
- psLevel = level;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSEmbedType1(GBool embed) {
- lockGlobalParams;
- psEmbedType1 = embed;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSEmbedTrueType(GBool embed) {
- lockGlobalParams;
- psEmbedTrueType = embed;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSEmbedCIDPostScript(GBool embed) {
- lockGlobalParams;
- psEmbedCIDPostScript = embed;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSEmbedCIDTrueType(GBool embed) {
- lockGlobalParams;
- psEmbedCIDTrueType = embed;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSOPI(GBool opi) {
- lockGlobalParams;
- psOPI = opi;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPSASCIIHex(GBool hex) {
- lockGlobalParams;
- psASCIIHex = hex;
- unlockGlobalParams;
-}
-
-void GlobalParams::setTextEncoding(char *encodingName) {
- lockGlobalParams;
- delete textEncoding;
- textEncoding = new GString(encodingName);
- unlockGlobalParams;
-}
-
-GBool GlobalParams::setTextEOL(char *s) {
- lockGlobalParams;
- if (!strcmp(s, "unix")) {
- textEOL = eolUnix;
- } else if (!strcmp(s, "dos")) {
- textEOL = eolDOS;
- } else if (!strcmp(s, "mac")) {
- textEOL = eolMac;
- } else {
- unlockGlobalParams;
- return gFalse;
- }
- unlockGlobalParams;
- return gTrue;
-}
-
-void GlobalParams::setTextPageBreaks(GBool pageBreaks) {
- lockGlobalParams;
- textPageBreaks = pageBreaks;
- unlockGlobalParams;
-}
-
-void GlobalParams::setTextKeepTinyChars(GBool keep) {
- lockGlobalParams;
- textKeepTinyChars = keep;
- unlockGlobalParams;
-}
-
-void GlobalParams::setInitialZoom(char *s) {
- lockGlobalParams;
- delete initialZoom;
- initialZoom = new GString(s);
- unlockGlobalParams;
-}
-
-GBool GlobalParams::setEnableT1lib(char *s) {
- GBool ok;
-
- lockGlobalParams;
- ok = parseYesNo2(s, &enableT1lib);
- unlockGlobalParams;
- return ok;
-}
-
-GBool GlobalParams::setEnableFreeType(char *s) {
- GBool ok;
-
- lockGlobalParams;
- ok = parseYesNo2(s, &enableFreeType);
- unlockGlobalParams;
- return ok;
-}
-
-
-GBool GlobalParams::setAntialias(char *s) {
- GBool ok;
-
- lockGlobalParams;
- ok = parseYesNo2(s, &antialias);
- unlockGlobalParams;
- return ok;
-}
-
-void GlobalParams::setMapNumericCharNames(GBool map) {
- lockGlobalParams;
- mapNumericCharNames = map;
- unlockGlobalParams;
-}
-
-void GlobalParams::setPrintCommands(GBool printCommandsA) {
- lockGlobalParams;
- printCommands = printCommandsA;
- unlockGlobalParams;
-}
-
-void GlobalParams::setErrQuiet(GBool errQuietA) {
- lockGlobalParams;
- errQuiet = errQuietA;
- unlockGlobalParams;
-}
diff --git a/pdf/xpdf/GlobalParams.h b/pdf/xpdf/GlobalParams.h
deleted file mode 100644
index b099256..0000000
--- a/pdf/xpdf/GlobalParams.h
+++ /dev/null
@@ -1,313 +0,0 @@
-//========================================================================
-//
-// GlobalParams.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef GLOBALPARAMS_H
-#define GLOBALPARAMS_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include <fontconfig/fontconfig.h>
-#include "gtypes.h"
-#include "CharTypes.h"
-
-#if MULTITHREADED
-#include "GMutex.h"
-#endif
-
-class GString;
-class GList;
-class GHash;
-class NameToCharCode;
-class CharCodeToUnicode;
-class CharCodeToUnicodeCache;
-class UnicodeMap;
-class UnicodeMapCache;
-class CMap;
-class CMapCache;
-class GlobalParams;
-
-//------------------------------------------------------------------------
-
-// The global parameters object.
-extern GlobalParams *globalParams;
-
-//------------------------------------------------------------------------
-
-enum DisplayFontParamKind {
- displayFontT1,
- displayFontTT
-};
-
-class DisplayFontParam {
-public:
-
- GString *name; // font name for 8-bit fonts and named
- // CID fonts; collection name for
- // generic CID fonts
- DisplayFontParamKind kind;
- union {
- struct {
- GString *fileName;
- } t1;
- struct {
- GString *fileName;
- } tt;
- };
-
- DisplayFontParam(GString *nameA, DisplayFontParamKind kindA);
- ~DisplayFontParam();
-};
-
-//------------------------------------------------------------------------
-
-class PSFontParam {
-public:
-
- GString *pdfFontName; // PDF font name for 8-bit fonts and
- // named 16-bit fonts; char collection
- // name for generic 16-bit fonts
- int wMode; // writing mode (0=horiz, 1=vert) for
- // 16-bit fonts
- GString *psFontName; // PostScript font name
- GString *encoding; // encoding, for 16-bit fonts only
-
- PSFontParam(GString *pdfFontNameA, int wModeA,
- GString *psFontNameA, GString *encodingA);
- ~PSFontParam();
-};
-
-//------------------------------------------------------------------------
-
-enum PSLevel {
- psLevel1,
- psLevel1Sep,
- psLevel2,
- psLevel2Sep,
- psLevel3,
- psLevel3Sep
-};
-
-//------------------------------------------------------------------------
-
-enum EndOfLineKind {
- eolUnix, // LF
- eolDOS, // CR+LF
- eolMac // CR
-};
-
-//------------------------------------------------------------------------
-
-class GlobalParams {
-public:
-
- // Initialize the global parameters by attempting to read a config
- // file.
- GlobalParams(char *cfgFileName);
-
- ~GlobalParams();
-
- void setupBaseFonts(char *dir);
- void setupBaseFontsFc(FcConfig *fcConfig);
-
- //----- accessors
-
- CharCode getMacRomanCharCode(char *charName);
-
- Unicode mapNameToUnicode(char *charName);
- UnicodeMap *getResidentUnicodeMap(GString *encodingName);
- FILE *getUnicodeMapFile(GString *encodingName);
- FILE *findCMapFile(GString *collection, GString *cMapName);
- FILE *findToUnicodeFile(GString *name);
- DisplayFontParam *getDisplayFont(GString *fontName);
- DisplayFontParam *getDisplayCIDFont(GString *fontName, GString *collection);
- GString *getPSFile();
- int getPSPaperWidth();
- int getPSPaperHeight();
- void getPSImageableArea(int *llx, int *lly, int *urx, int *ury);
- GBool getPSDuplex();
- GBool getPSCrop();
- GBool getPSExpandSmaller();
- GBool getPSShrinkLarger();
- GBool getPSCenter();
- PSLevel getPSLevel();
- PSFontParam *getPSFont(GString *fontName);
- PSFontParam *getPSFont16(GString *fontName, GString *collection, int wMode);
- GBool getPSEmbedType1();
- GBool getPSEmbedTrueType();
- GBool getPSEmbedCIDPostScript();
- GBool getPSEmbedCIDTrueType();
- GBool getPSOPI();
- GBool getPSASCIIHex();
- GString *getTextEncodingName();
- EndOfLineKind getTextEOL();
- GBool getTextPageBreaks();
- GBool getTextKeepTinyChars();
- GString *findFontFile(GString *fontName, char **exts);
- GString *getInitialZoom();
- GBool getEnableT1lib();
- GBool getEnableFreeType();
- GBool getAntialias();
- GString *getURLCommand() { return urlCommand; }
- GString *getMovieCommand() { return movieCommand; }
- GBool getMapNumericCharNames();
- GBool getPrintCommands();
- GBool getErrQuiet();
-
- CharCodeToUnicode *getCIDToUnicode(GString *collection);
- CharCodeToUnicode *getUnicodeToUnicode(GString *fontName);
- UnicodeMap *getUnicodeMap(GString *encodingName);
- CMap *getCMap(GString *collection, GString *cMapName);
- UnicodeMap *getTextEncoding();
-
- //----- functions to set parameters
-
- void addDisplayFont(DisplayFontParam *param);
- void setPSFile(char *file);
- GBool setPSPaperSize(char *size);
- void setPSPaperWidth(int width);
- void setPSPaperHeight(int height);
- void setPSImageableArea(int llx, int lly, int urx, int ury);
- void setPSDuplex(GBool duplex);
- void setPSCrop(GBool crop);
- void setPSExpandSmaller(GBool expand);
- void setPSShrinkLarger(GBool shrink);
- void setPSCenter(GBool center);
- void setPSLevel(PSLevel level);
- void setPSEmbedType1(GBool embed);
- void setPSEmbedTrueType(GBool embed);
- void setPSEmbedCIDPostScript(GBool embed);
- void setPSEmbedCIDTrueType(GBool embed);
- void setPSOPI(GBool opi);
- void setPSASCIIHex(GBool hex);
- void setTextEncoding(char *encodingName);
- GBool setTextEOL(char *s);
- void setTextPageBreaks(GBool pageBreaks);
- void setTextKeepTinyChars(GBool keep);
- void setInitialZoom(char *s);
- GBool setEnableT1lib(char *s);
- GBool setEnableFreeType(char *s);
- GBool setAntialias(char *s);
- void setMapNumericCharNames(GBool map);
- void setPrintCommands(GBool printCommandsA);
- void setErrQuiet(GBool errQuietA);
-
-private:
-
- void parseFile(GString *fileName, FILE *f);
- void parseNameToUnicode(GList *tokens, GString *fileName, int line);
- void parseCIDToUnicode(GList *tokens, GString *fileName, int line);
- void parseUnicodeToUnicode(GList *tokens, GString *fileName, int line);
- void parseUnicodeMap(GList *tokens, GString *fileName, int line);
- void parseCMapDir(GList *tokens, GString *fileName, int line);
- void parseToUnicodeDir(GList *tokens, GString *fileName, int line);
- void parseDisplayFont(GList *tokens, GHash *fontHash,
- DisplayFontParamKind kind,
- GString *fileName, int line);
- void parsePSFile(GList *tokens, GString *fileName, int line);
- void parsePSPaperSize(GList *tokens, GString *fileName, int line);
- void parsePSImageableArea(GList *tokens, GString *fileName, int line);
- void parsePSLevel(GList *tokens, GString *fileName, int line);
- void parsePSFont(GList *tokens, GString *fileName, int line);
- void parsePSFont16(char *cmdName, GList *fontList,
- GList *tokens, GString *fileName, int line);
- void parseTextEncoding(GList *tokens, GString *fileName, int line);
- void parseTextEOL(GList *tokens, GString *fileName, int line);
- void parseFontDir(GList *tokens, GString *fileName, int line);
- void parseInitialZoom(GList *tokens, GString *fileName, int line);
- void parseCommand(char *cmdName, GString **val,
- GList *tokens, GString *fileName, int line);
- void parseYesNo(char *cmdName, GBool *flag,
- GList *tokens, GString *fileName, int line);
- GBool parseYesNo2(char *token, GBool *flag);
- UnicodeMap *getUnicodeMap2(GString *encodingName);
-
- //----- static tables
-
- NameToCharCode * // mapping from char name to
- macRomanReverseMap; // MacRomanEncoding index
-
- //----- user-modifiable settings
-
- NameToCharCode * // mapping from char name to Unicode
- nameToUnicode;
- GHash *cidToUnicodes; // files for mappings from char collections
- // to Unicode, indexed by collection name
- // [GString]
- GHash *unicodeToUnicodes; // files for Unicode-to-Unicode mappings,
- // indexed by font name pattern [GString]
- GHash *residentUnicodeMaps; // mappings from Unicode to char codes,
- // indexed by encoding name [UnicodeMap]
- GHash *unicodeMaps; // files for mappings from Unicode to char
- // codes, indexed by encoding name [GString]
- GHash *cMapDirs; // list of CMap dirs, indexed by collection
- // name [GList[GString]]
- GList *toUnicodeDirs; // list of ToUnicode CMap dirs [GString]
- GHash *displayFonts; // display font info, indexed by font name
- // [DisplayFontParam]
- GHash *displayCIDFonts; // display CID font info, indexed by
- // collection [DisplayFontParam]
- GHash *displayNamedCIDFonts; // display CID font info, indexed by
- // font name [DisplayFontParam]
- GString *psFile; // PostScript file or command (for xpdf)
- int psPaperWidth; // paper size, in PostScript points, for
- int psPaperHeight; // PostScript output
- int psImageableLLX, // imageable area, in PostScript points,
- psImageableLLY, // for PostScript output
- psImageableURX,
- psImageableURY;
- GBool psCrop; // crop PS output to CropBox
- GBool psExpandSmaller; // expand smaller pages to fill paper
- GBool psShrinkLarger; // shrink larger pages to fit paper
- GBool psCenter; // center pages on the paper
- GBool psDuplex; // enable duplexing in PostScript?
- PSLevel psLevel; // PostScript level to generate
- GHash *psFonts; // PostScript font info, indexed by PDF
- // font name [PSFontParam]
- GList *psNamedFonts16; // named 16-bit fonts [PSFontParam]
- GList *psFonts16; // generic 16-bit fonts [PSFontParam]
- GBool psEmbedType1; // embed Type 1 fonts?
- GBool psEmbedTrueType; // embed TrueType fonts?
- GBool psEmbedCIDPostScript; // embed CID PostScript fonts?
- GBool psEmbedCIDTrueType; // embed CID TrueType fonts?
- GBool psOPI; // generate PostScript OPI comments?
- GBool psASCIIHex; // use ASCIIHex instead of ASCII85?
- GString *textEncoding; // encoding (unicodeMap) to use for text
- // output
- EndOfLineKind textEOL; // type of EOL marker to use for text
- // output
- GBool textPageBreaks; // insert end-of-page markers?
- GBool textKeepTinyChars; // keep all characters in text output
- GList *fontDirs; // list of font dirs [GString]
- GString *initialZoom; // initial zoom level
- GBool enableT1lib; // t1lib enable flag
- GBool enableFreeType; // FreeType enable flag
- GBool antialias; // anti-aliasing enable flag
- GString *urlCommand; // command executed for URL links
- GString *movieCommand; // command executed for movie annotations
- GBool mapNumericCharNames; // map numeric char names (from font subsets)?
- GBool printCommands; // print the drawing commands
- GBool errQuiet; // suppress error messages?
-
- CharCodeToUnicodeCache *cidToUnicodeCache;
- CharCodeToUnicodeCache *unicodeToUnicodeCache;
- UnicodeMapCache *unicodeMapCache;
- CMapCache *cMapCache;
-
-#if MULTITHREADED
- GMutex mutex;
- GMutex unicodeMapCacheMutex;
- GMutex cMapCacheMutex;
-#endif
-};
-
-#endif
diff --git a/pdf/xpdf/GnomeVFSStream.cc b/pdf/xpdf/GnomeVFSStream.cc
deleted file mode 100644
index 06735ee..0000000
--- a/pdf/xpdf/GnomeVFSStream.cc
+++ /dev/null
@@ -1,129 +0,0 @@
-//========================================================================
-//
-// GnomeVFSStream.cc
-//
-// Copyright 1996-2002 Glyph & Cog, LLC
-// Copyright 2003 Martin Kretzschmar
-//
-//========================================================================
-
-#ifdef __GNUC__
-#pragma implementation
-#endif
-
-#include <aconf.h>
-#include "xpdfconfig.h"
-
-#include "GnomeVFSStream.h"
-#include "gpdf-g-switch.h"
-# include <libgnomevfs/gnome-vfs.h>
-#include "gpdf-g-switch.h"
-
-#ifndef NO_DECRYPTION
-#include "Decrypt.h"
-#endif
-
-GnomeVFSStream::GnomeVFSStream(GnomeVFSHandle *handleA, Guint startA,
- GBool limitedA, Guint lengthA, Object *dictA):
- BaseStream(dictA) {
- handle = handleA;
- start = startA;
- limited = limitedA;
- length = lengthA;
- bufPtr = bufEnd = buf;
- bufPos = start;
- savePos = 0;
- saved = gFalse;
-}
-
-GnomeVFSStream::~GnomeVFSStream() {
- close();
-}
-
-Stream *GnomeVFSStream::makeSubStream(Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA) {
- return new GnomeVFSStream(handle, startA, limitedA, lengthA, dictA);
-}
-
-void GnomeVFSStream::reset() {
- GnomeVFSFileSize offsetReturn;
- if (gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
- savePos = (Guint)offsetReturn;
- saved = gTrue;
- }
- gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, start);
- bufPtr = bufEnd = buf;
- bufPos = start;
-#ifndef NO_DECRYPTION
- if (decrypt)
- decrypt->reset();
-#endif
-}
-
-void GnomeVFSStream::close() {
- if (saved) {
- gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, savePos);
- saved = gFalse;
- }
-}
-
-GBool GnomeVFSStream::fillBuf() {
- int n;
- GnomeVFSFileSize bytesRead;
-#ifndef NO_DECRYPTION
- char *p;
-#endif
-
- bufPos += bufEnd - buf;
- bufPtr = bufEnd = buf;
- if (limited && bufPos >= start + length) {
- return gFalse;
- }
- if (limited && bufPos + gnomeVFSStreamBufSize > start + length) {
- n = start + length - bufPos;
- } else {
- n = gnomeVFSStreamBufSize;
- }
- if (gnome_vfs_read(handle, buf, n, &bytesRead) != GNOME_VFS_OK) {
- return gFalse;
- }
- bufEnd = buf + bytesRead;
- if (bufPtr >= bufEnd) {
- return gFalse;
- }
-#ifndef NO_DECRYPTION
- if (decrypt) {
- for (p = buf; p < bufEnd; ++p) {
- *p = (char)decrypt->decryptByte((Guchar)*p);
- }
- }
-#endif
- return gTrue;
-}
-
-void GnomeVFSStream::setPos(Guint pos, int dir) {
- if (dir >= 0) {
- if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_START, pos) == GNOME_VFS_OK) {
- bufPos = pos;
- }
- } else {
- GnomeVFSFileSize offsetReturn;
- if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, 0) == GNOME_VFS_OK &&
- gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
- bufPos = (Guint)offsetReturn;
- if (pos > bufPos)
- pos = (Guint)bufPos;
- if (gnome_vfs_seek(handle, GNOME_VFS_SEEK_END, -(int)pos) == GNOME_VFS_OK &&
- gnome_vfs_tell(handle, &offsetReturn) == GNOME_VFS_OK) {
- bufPos = (Guint)offsetReturn;
- }
- }
- }
- bufPtr = bufEnd = buf;
-}
-
-void GnomeVFSStream::moveStart(int delta) {
- start += delta;
- bufPtr = bufEnd = buf;
- bufPos = start;
-}
diff --git a/pdf/xpdf/GnomeVFSStream.h b/pdf/xpdf/GnomeVFSStream.h
deleted file mode 100644
index a02d288..0000000
--- a/pdf/xpdf/GnomeVFSStream.h
+++ /dev/null
@@ -1,58 +0,0 @@
-//========================================================================
-//
-// GnomeVFSStream.cc
-//
-// Copyright 1996-2002 Glyph & Cog, LLC
-// Copyright 2003 Martin Kretzschmar
-//
-//========================================================================
-
-#ifndef GNOME_VFS_STREAM_H
-#define GNOME_VFS_STREAM_H
-
-#include "gpdf-g-switch.h"
-# include <libgnomevfs/gnome-vfs-handle.h>
-#include "gpdf-g-switch.h"
-#include "Object.h"
-#include "Stream.h"
-
-#define gnomeVFSStreamBufSize fileStreamBufSize
-
-class GnomeVFSStream: public BaseStream {
-public:
-
- GnomeVFSStream(GnomeVFSHandle *handleA, Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA);
- virtual ~GnomeVFSStream();
- virtual Stream *makeSubStream(Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA);
- virtual StreamKind getKind() { return strFile; }
- virtual void reset();
- virtual void close();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual int getPos() { return bufPos + (bufPtr - buf); }
- virtual void setPos(Guint pos, int dir = 0);
- virtual GBool isBinary(GBool last = gTrue) { return last; }
- virtual Guint getStart() { return start; }
- virtual void moveStart(int delta);
-
-private:
-
- GBool fillBuf();
-
- GnomeVFSHandle *handle;
- Guint start;
- GBool limited;
- Guint length;
- char buf[gnomeVFSStreamBufSize];
- char *bufPtr;
- char *bufEnd;
- Guint bufPos;
- int savePos;
- GBool saved;
-};
-
-#endif /* GNOME_VFS_STREAM_H */
diff --git a/pdf/xpdf/ImageOutputDev.cc b/pdf/xpdf/ImageOutputDev.cc
deleted file mode 100644
index 5ca14ac..0000000
--- a/pdf/xpdf/ImageOutputDev.cc
+++ /dev/null
@@ -1,194 +0,0 @@
-//========================================================================
-//
-// ImageOutputDev.cc
-//
-// Copyright 1998-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <ctype.h>
-#include "gmem.h"
-#include "xpdfconfig.h"
-#include "Error.h"
-#include "GfxState.h"
-#include "Object.h"
-#include "Stream.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 --git a/pdf/xpdf/ImageOutputDev.h b/pdf/xpdf/ImageOutputDev.h
deleted file mode 100644
index 73f2f15..0000000
--- a/pdf/xpdf/ImageOutputDev.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//========================================================================
-//
-// ImageOutputDev.h
-//
-// Copyright 1998-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef IMAGEOUTPUTDEV_H
-#define IMAGEOUTPUTDEV_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include "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 --git a/pdf/xpdf/JArithmeticDecoder.cc b/pdf/xpdf/JArithmeticDecoder.cc
deleted file mode 100644
index fd29744..0000000
--- a/pdf/xpdf/JArithmeticDecoder.cc
+++ /dev/null
@@ -1,300 +0,0 @@
-//========================================================================
-//
-// JArithmeticDecoder.cc
-//
-// Copyright 2002-2004 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "Object.h"
-#include "Stream.h"
-#include "JArithmeticDecoder.h"
-
-//------------------------------------------------------------------------
-// JArithmeticDecoderStates
-//------------------------------------------------------------------------
-
-JArithmeticDecoderStats::JArithmeticDecoderStats(int contextSizeA) {
- contextSize = contextSizeA;
- cxTab = (Guchar *)gmalloc(contextSize * sizeof(Guchar));
- reset();
-}
-
-JArithmeticDecoderStats::~JArithmeticDecoderStats() {
- gfree(cxTab);
-}
-
-JArithmeticDecoderStats *JArithmeticDecoderStats::copy() {
- JArithmeticDecoderStats *stats;
-
- stats = new JArithmeticDecoderStats(contextSize);
- memcpy(stats->cxTab, cxTab, contextSize);
- return stats;
-}
-
-void JArithmeticDecoderStats::reset() {
- memset(cxTab, 0, contextSize);
-}
-
-void JArithmeticDecoderStats::copyFrom(JArithmeticDecoderStats *stats) {
- memcpy(cxTab, stats->cxTab, contextSize);
-}
-
-void JArithmeticDecoderStats::setEntry(Guint cx, int i, int mps) {
- cxTab[cx] = (i << 1) + mps;
-}
-
-//------------------------------------------------------------------------
-// JArithmeticDecoder
-//------------------------------------------------------------------------
-
-Guint JArithmeticDecoder::qeTab[47] = {
- 0x56010000, 0x34010000, 0x18010000, 0x0AC10000,
- 0x05210000, 0x02210000, 0x56010000, 0x54010000,
- 0x48010000, 0x38010000, 0x30010000, 0x24010000,
- 0x1C010000, 0x16010000, 0x56010000, 0x54010000,
- 0x51010000, 0x48010000, 0x38010000, 0x34010000,
- 0x30010000, 0x28010000, 0x24010000, 0x22010000,
- 0x1C010000, 0x18010000, 0x16010000, 0x14010000,
- 0x12010000, 0x11010000, 0x0AC10000, 0x09C10000,
- 0x08A10000, 0x05210000, 0x04410000, 0x02A10000,
- 0x02210000, 0x01410000, 0x01110000, 0x00850000,
- 0x00490000, 0x00250000, 0x00150000, 0x00090000,
- 0x00050000, 0x00010000, 0x56010000
-};
-
-int JArithmeticDecoder::nmpsTab[47] = {
- 1, 2, 3, 4, 5, 38, 7, 8, 9, 10, 11, 12, 13, 29, 15, 16,
- 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32,
- 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 46
-};
-
-int JArithmeticDecoder::nlpsTab[47] = {
- 1, 6, 9, 12, 29, 33, 6, 14, 14, 14, 17, 18, 20, 21, 14, 14,
- 15, 16, 17, 18, 19, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29,
- 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 46
-};
-
-int JArithmeticDecoder::switchTab[47] = {
- 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
-};
-
-JArithmeticDecoder::JArithmeticDecoder() {
- str = NULL;
-}
-
-JArithmeticDecoder::~JArithmeticDecoder() {
- while (dataLen > 0) {
- readByte();
- }
-}
-
-inline Guint JArithmeticDecoder::readByte() {
- if (dataLen == 0) {
- return 0xff;
- }
- if (dataLen > 0) {
- --dataLen;
- }
- return (Guint)str->getChar() & 0xff;
-}
-
-void JArithmeticDecoder::start() {
- buf0 = readByte();
- buf1 = readByte();
-
- // INITDEC
- c = (buf0 ^ 0xff) << 16;
- byteIn();
- c <<= 7;
- ct -= 7;
- a = 0x80000000;
-}
-
-int JArithmeticDecoder::decodeBit(Guint context,
- JArithmeticDecoderStats *stats) {
- int bit;
- Guint qe;
- int iCX, mpsCX;
-
- iCX = stats->cxTab[context] >> 1;
- mpsCX = stats->cxTab[context] & 1;
- qe = qeTab[iCX];
- a -= qe;
- if (c < a) {
- if (a & 0x80000000) {
- bit = mpsCX;
- } else {
- // MPS_EXCHANGE
- if (a < qe) {
- bit = 1 - mpsCX;
- if (switchTab[iCX]) {
- stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
- } else {
- stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
- }
- } else {
- bit = mpsCX;
- stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
- }
- // RENORMD
- do {
- if (ct == 0) {
- byteIn();
- }
- a <<= 1;
- c <<= 1;
- --ct;
- } while (!(a & 0x80000000));
- }
- } else {
- c -= a;
- // LPS_EXCHANGE
- if (a < qe) {
- bit = mpsCX;
- stats->cxTab[context] = (nmpsTab[iCX] << 1) | mpsCX;
- } else {
- bit = 1 - mpsCX;
- if (switchTab[iCX]) {
- stats->cxTab[context] = (nlpsTab[iCX] << 1) | (1 - mpsCX);
- } else {
- stats->cxTab[context] = (nlpsTab[iCX] << 1) | mpsCX;
- }
- }
- a = qe;
- // RENORMD
- do {
- if (ct == 0) {
- byteIn();
- }
- a <<= 1;
- c <<= 1;
- --ct;
- } while (!(a & 0x80000000));
- }
- return bit;
-}
-
-int JArithmeticDecoder::decodeByte(Guint context,
- JArithmeticDecoderStats *stats) {
- int byte;
- int i;
-
- byte = 0;
- for (i = 0; i < 8; ++i) {
- byte = (byte << 1) | decodeBit(context, stats);
- }
- return byte;
-}
-
-GBool JArithmeticDecoder::decodeInt(int *x, JArithmeticDecoderStats *stats) {
- int s;
- Guint v;
- int i;
-
- prev = 1;
- s = decodeIntBit(stats);
- if (decodeIntBit(stats)) {
- if (decodeIntBit(stats)) {
- if (decodeIntBit(stats)) {
- if (decodeIntBit(stats)) {
- if (decodeIntBit(stats)) {
- v = 0;
- for (i = 0; i < 32; ++i) {
- v = (v << 1) | decodeIntBit(stats);
- }
- v += 4436;
- } else {
- v = 0;
- for (i = 0; i < 12; ++i) {
- v = (v << 1) | decodeIntBit(stats);
- }
- v += 340;
- }
- } else {
- v = 0;
- for (i = 0; i < 8; ++i) {
- v = (v << 1) | decodeIntBit(stats);
- }
- v += 84;
- }
- } else {
- v = 0;
- for (i = 0; i < 6; ++i) {
- v = (v << 1) | decodeIntBit(stats);
- }
- v += 20;
- }
- } else {
- v = decodeIntBit(stats);
- v = (v << 1) | decodeIntBit(stats);
- v = (v << 1) | decodeIntBit(stats);
- v = (v << 1) | decodeIntBit(stats);
- v += 4;
- }
- } else {
- v = decodeIntBit(stats);
- v = (v << 1) | decodeIntBit(stats);
- }
-
- if (s) {
- if (v == 0) {
- return gFalse;
- }
- *x = -(int)v;
- } else {
- *x = (int)v;
- }
- return gTrue;
-}
-
-int JArithmeticDecoder::decodeIntBit(JArithmeticDecoderStats *stats) {
- int bit;
-
- bit = decodeBit(prev, stats);
- if (prev < 0x100) {
- prev = (prev << 1) | bit;
- } else {
- prev = (((prev << 1) | bit) & 0x1ff) | 0x100;
- }
- return bit;
-}
-
-Guint JArithmeticDecoder::decodeIAID(Guint codeLen,
- JArithmeticDecoderStats *stats) {
- Guint i;
- int bit;
-
- prev = 1;
- for (i = 0; i < codeLen; ++i) {
- bit = decodeBit(prev, stats);
- prev = (prev << 1) | bit;
- }
- return prev - (1 << codeLen);
-}
-
-void JArithmeticDecoder::byteIn() {
- if (buf0 == 0xff) {
- if (buf1 > 0x8f) {
- ct = 8;
- } else {
- buf0 = buf1;
- buf1 = readByte();
- c = c + 0xfe00 - (buf0 << 9);
- ct = 7;
- }
- } else {
- buf0 = buf1;
- buf1 = readByte();
- c = c + 0xff00 - (buf0 << 8);
- ct = 8;
- }
-}
diff --git a/pdf/xpdf/JArithmeticDecoder.h b/pdf/xpdf/JArithmeticDecoder.h
deleted file mode 100644
index a348017..0000000
--- a/pdf/xpdf/JArithmeticDecoder.h
+++ /dev/null
@@ -1,91 +0,0 @@
-//========================================================================
-//
-// JArithmeticDecoder.h
-//
-// Arithmetic decoder used by the JBIG2 and JPEG2000 decoders.
-//
-// Copyright 2002-2004 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef JARITHMETICDECODER_H
-#define JARITHMETICDECODER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-class Stream;
-
-//------------------------------------------------------------------------
-// JArithmeticDecoderStats
-//------------------------------------------------------------------------
-
-class JArithmeticDecoderStats {
-public:
-
- JArithmeticDecoderStats(int contextSizeA);
- ~JArithmeticDecoderStats();
- JArithmeticDecoderStats *copy();
- void reset();
- int getContextSize() { return contextSize; }
- void copyFrom(JArithmeticDecoderStats *stats);
- void setEntry(Guint cx, int i, int mps);
-
-private:
-
- Guchar *cxTab; // cxTab[cx] = (i[cx] << 1) + mps[cx]
- int contextSize;
-
- friend class JArithmeticDecoder;
-};
-
-//------------------------------------------------------------------------
-// JArithmeticDecoder
-//------------------------------------------------------------------------
-
-class JArithmeticDecoder {
-public:
-
- JArithmeticDecoder();
- ~JArithmeticDecoder();
- void setStream(Stream *strA)
- { str = strA; dataLen = -1; }
- void setStream(Stream *strA, int dataLenA)
- { str = strA; dataLen = dataLenA; }
- void start();
- int decodeBit(Guint context, JArithmeticDecoderStats *stats);
- int decodeByte(Guint context, JArithmeticDecoderStats *stats);
-
- // Returns false for OOB, otherwise sets *<x> and returns true.
- GBool decodeInt(int *x, JArithmeticDecoderStats *stats);
-
- Guint decodeIAID(Guint codeLen,
- JArithmeticDecoderStats *stats);
-
-private:
-
- Guint readByte();
- int decodeIntBit(JArithmeticDecoderStats *stats);
- void byteIn();
-
- static Guint qeTab[47];
- static int nmpsTab[47];
- static int nlpsTab[47];
- static int switchTab[47];
-
- Guint buf0, buf1;
- Guint c, a;
- int ct;
-
- Guint prev; // for the integer decoder
-
- Stream *str;
- int dataLen;
-};
-
-#endif
diff --git a/pdf/xpdf/JBIG2Stream.cc b/pdf/xpdf/JBIG2Stream.cc
deleted file mode 100644
index c1bf4f7..0000000
--- a/pdf/xpdf/JBIG2Stream.cc
+++ /dev/null
@@ -1,3337 +0,0 @@
-//========================================================================
-//
-// JBIG2Stream.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include "GList.h"
-#include "Error.h"
-#include "JArithmeticDecoder.h"
-#include "JBIG2Stream.h"
-
-//~ share these tables
-#include "Stream-CCITT.h"
-
-//------------------------------------------------------------------------
-
-static int contextSize[4] = { 16, 13, 10, 10 };
-static int refContextSize[2] = { 13, 10 };
-
-//------------------------------------------------------------------------
-// JBIG2HuffmanTable
-//------------------------------------------------------------------------
-
-#define jbig2HuffmanLOW 0xfffffffd
-#define jbig2HuffmanOOB 0xfffffffe
-#define jbig2HuffmanEOT 0xffffffff
-
-struct JBIG2HuffmanTable {
- int val;
- Guint prefixLen;
- Guint rangeLen; // can also be LOW, OOB, or EOT
- Guint prefix;
-};
-
-JBIG2HuffmanTable huffTableA[] = {
- { 0, 1, 4, 0x000 },
- { 16, 2, 8, 0x002 },
- { 272, 3, 16, 0x006 },
- { 65808, 3, 32, 0x007 },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableB[] = {
- { 0, 1, 0, 0x000 },
- { 1, 2, 0, 0x002 },
- { 2, 3, 0, 0x006 },
- { 3, 4, 3, 0x00e },
- { 11, 5, 6, 0x01e },
- { 75, 6, 32, 0x03e },
- { 0, 6, jbig2HuffmanOOB, 0x03f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableC[] = {
- { 0, 1, 0, 0x000 },
- { 1, 2, 0, 0x002 },
- { 2, 3, 0, 0x006 },
- { 3, 4, 3, 0x00e },
- { 11, 5, 6, 0x01e },
- { 0, 6, jbig2HuffmanOOB, 0x03e },
- { 75, 7, 32, 0x0fe },
- { -256, 8, 8, 0x0fe },
- { -257, 8, jbig2HuffmanLOW, 0x0ff },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableD[] = {
- { 1, 1, 0, 0x000 },
- { 2, 2, 0, 0x002 },
- { 3, 3, 0, 0x006 },
- { 4, 4, 3, 0x00e },
- { 12, 5, 6, 0x01e },
- { 76, 5, 32, 0x01f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableE[] = {
- { 1, 1, 0, 0x000 },
- { 2, 2, 0, 0x002 },
- { 3, 3, 0, 0x006 },
- { 4, 4, 3, 0x00e },
- { 12, 5, 6, 0x01e },
- { 76, 6, 32, 0x03e },
- { -255, 7, 8, 0x07e },
- { -256, 7, jbig2HuffmanLOW, 0x07f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableF[] = {
- { 0, 2, 7, 0x000 },
- { 128, 3, 7, 0x002 },
- { 256, 3, 8, 0x003 },
- { -1024, 4, 9, 0x008 },
- { -512, 4, 8, 0x009 },
- { -256, 4, 7, 0x00a },
- { -32, 4, 5, 0x00b },
- { 512, 4, 9, 0x00c },
- { 1024, 4, 10, 0x00d },
- { -2048, 5, 10, 0x01c },
- { -128, 5, 6, 0x01d },
- { -64, 5, 5, 0x01e },
- { -2049, 6, jbig2HuffmanLOW, 0x03e },
- { 2048, 6, 32, 0x03f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableG[] = {
- { -512, 3, 8, 0x000 },
- { 256, 3, 8, 0x001 },
- { 512, 3, 9, 0x002 },
- { 1024, 3, 10, 0x003 },
- { -1024, 4, 9, 0x008 },
- { -256, 4, 7, 0x009 },
- { -32, 4, 5, 0x00a },
- { 0, 4, 5, 0x00b },
- { 128, 4, 7, 0x00c },
- { -128, 5, 6, 0x01a },
- { -64, 5, 5, 0x01b },
- { 32, 5, 5, 0x01c },
- { 64, 5, 6, 0x01d },
- { -1025, 5, jbig2HuffmanLOW, 0x01e },
- { 2048, 5, 32, 0x01f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableH[] = {
- { 0, 2, 1, 0x000 },
- { 0, 2, jbig2HuffmanOOB, 0x001 },
- { 4, 3, 4, 0x004 },
- { -1, 4, 0, 0x00a },
- { 22, 4, 4, 0x00b },
- { 38, 4, 5, 0x00c },
- { 2, 5, 0, 0x01a },
- { 70, 5, 6, 0x01b },
- { 134, 5, 7, 0x01c },
- { 3, 6, 0, 0x03a },
- { 20, 6, 1, 0x03b },
- { 262, 6, 7, 0x03c },
- { 646, 6, 10, 0x03d },
- { -2, 7, 0, 0x07c },
- { 390, 7, 8, 0x07d },
- { -15, 8, 3, 0x0fc },
- { -5, 8, 1, 0x0fd },
- { -7, 9, 1, 0x1fc },
- { -3, 9, 0, 0x1fd },
- { -16, 9, jbig2HuffmanLOW, 0x1fe },
- { 1670, 9, 32, 0x1ff },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableI[] = {
- { 0, 2, jbig2HuffmanOOB, 0x000 },
- { -1, 3, 1, 0x002 },
- { 1, 3, 1, 0x003 },
- { 7, 3, 5, 0x004 },
- { -3, 4, 1, 0x00a },
- { 43, 4, 5, 0x00b },
- { 75, 4, 6, 0x00c },
- { 3, 5, 1, 0x01a },
- { 139, 5, 7, 0x01b },
- { 267, 5, 8, 0x01c },
- { 5, 6, 1, 0x03a },
- { 39, 6, 2, 0x03b },
- { 523, 6, 8, 0x03c },
- { 1291, 6, 11, 0x03d },
- { -5, 7, 1, 0x07c },
- { 779, 7, 9, 0x07d },
- { -31, 8, 4, 0x0fc },
- { -11, 8, 2, 0x0fd },
- { -15, 9, 2, 0x1fc },
- { -7, 9, 1, 0x1fd },
- { -32, 9, jbig2HuffmanLOW, 0x1fe },
- { 3339, 9, 32, 0x1ff },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableJ[] = {
- { -2, 2, 2, 0x000 },
- { 6, 2, 6, 0x001 },
- { 0, 2, jbig2HuffmanOOB, 0x002 },
- { -3, 5, 0, 0x018 },
- { 2, 5, 0, 0x019 },
- { 70, 5, 5, 0x01a },
- { 3, 6, 0, 0x036 },
- { 102, 6, 5, 0x037 },
- { 134, 6, 6, 0x038 },
- { 198, 6, 7, 0x039 },
- { 326, 6, 8, 0x03a },
- { 582, 6, 9, 0x03b },
- { 1094, 6, 10, 0x03c },
- { -21, 7, 4, 0x07a },
- { -4, 7, 0, 0x07b },
- { 4, 7, 0, 0x07c },
- { 2118, 7, 11, 0x07d },
- { -5, 8, 0, 0x0fc },
- { 5, 8, 0, 0x0fd },
- { -22, 8, jbig2HuffmanLOW, 0x0fe },
- { 4166, 8, 32, 0x0ff },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableK[] = {
- { 1, 1, 0, 0x000 },
- { 2, 2, 1, 0x002 },
- { 4, 4, 0, 0x00c },
- { 5, 4, 1, 0x00d },
- { 7, 5, 1, 0x01c },
- { 9, 5, 2, 0x01d },
- { 13, 6, 2, 0x03c },
- { 17, 7, 2, 0x07a },
- { 21, 7, 3, 0x07b },
- { 29, 7, 4, 0x07c },
- { 45, 7, 5, 0x07d },
- { 77, 7, 6, 0x07e },
- { 141, 7, 32, 0x07f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableL[] = {
- { 1, 1, 0, 0x000 },
- { 2, 2, 0, 0x002 },
- { 3, 3, 1, 0x006 },
- { 5, 5, 0, 0x01c },
- { 6, 5, 1, 0x01d },
- { 8, 6, 1, 0x03c },
- { 10, 7, 0, 0x07a },
- { 11, 7, 1, 0x07b },
- { 13, 7, 2, 0x07c },
- { 17, 7, 3, 0x07d },
- { 25, 7, 4, 0x07e },
- { 41, 8, 5, 0x0fe },
- { 73, 8, 32, 0x0ff },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableM[] = {
- { 1, 1, 0, 0x000 },
- { 2, 3, 0, 0x004 },
- { 7, 3, 3, 0x005 },
- { 3, 4, 0, 0x00c },
- { 5, 4, 1, 0x00d },
- { 4, 5, 0, 0x01c },
- { 15, 6, 1, 0x03a },
- { 17, 6, 2, 0x03b },
- { 21, 6, 3, 0x03c },
- { 29, 6, 4, 0x03d },
- { 45, 6, 5, 0x03e },
- { 77, 7, 6, 0x07e },
- { 141, 7, 32, 0x07f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableN[] = {
- { 0, 1, 0, 0x000 },
- { -2, 3, 0, 0x004 },
- { -1, 3, 0, 0x005 },
- { 1, 3, 0, 0x006 },
- { 2, 3, 0, 0x007 },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-JBIG2HuffmanTable huffTableO[] = {
- { 0, 1, 0, 0x000 },
- { -1, 3, 0, 0x004 },
- { 1, 3, 0, 0x005 },
- { -2, 4, 0, 0x00c },
- { 2, 4, 0, 0x00d },
- { -4, 5, 1, 0x01c },
- { 3, 5, 1, 0x01d },
- { -8, 6, 2, 0x03c },
- { 5, 6, 2, 0x03d },
- { -24, 7, 4, 0x07c },
- { 9, 7, 4, 0x07d },
- { -25, 7, jbig2HuffmanLOW, 0x07e },
- { 25, 7, 32, 0x07f },
- { 0, 0, jbig2HuffmanEOT, 0 }
-};
-
-//------------------------------------------------------------------------
-// JBIG2HuffmanDecoder
-//------------------------------------------------------------------------
-
-class JBIG2HuffmanDecoder {
-public:
-
- JBIG2HuffmanDecoder();
- ~JBIG2HuffmanDecoder();
- void setStream(Stream *strA) { str = strA; }
-
- void reset();
-
- // Returns false for OOB, otherwise sets *<x> and returns true.
- GBool decodeInt(int *x, JBIG2HuffmanTable *table);
-
- Guint readBits(Guint n);
- Guint readBit();
-
- // Sort the table by prefix length and assign prefix values.
- void buildTable(JBIG2HuffmanTable *table, Guint len);
-
-private:
-
- Stream *str;
- Guint buf;
- Guint bufLen;
-};
-
-JBIG2HuffmanDecoder::JBIG2HuffmanDecoder() {
- str = NULL;
- reset();
-}
-
-JBIG2HuffmanDecoder::~JBIG2HuffmanDecoder() {
-}
-
-void JBIG2HuffmanDecoder::reset() {
- buf = 0;
- bufLen = 0;
-}
-
-//~ optimize this
-GBool JBIG2HuffmanDecoder::decodeInt(int *x, JBIG2HuffmanTable *table) {
- Guint i, len, prefix;
-
- i = 0;
- len = 0;
- prefix = 0;
- while (table[i].rangeLen != jbig2HuffmanEOT) {
- while (len < table[i].prefixLen) {
- prefix = (prefix << 1) | readBit();
- ++len;
- }
- if (prefix == table[i].prefix) {
- if (table[i].rangeLen == jbig2HuffmanOOB) {
- return gFalse;
- }
- if (table[i].rangeLen == jbig2HuffmanLOW) {
- *x = table[i].val - readBits(32);
- } else if (table[i].rangeLen > 0) {
- *x = table[i].val + readBits(table[i].rangeLen);
- } else {
- *x = table[i].val;
- }
- return gTrue;
- }
- ++i;
- }
- return gFalse;
-}
-
-Guint JBIG2HuffmanDecoder::readBits(Guint n) {
- Guint x, mask, nLeft;
-
- mask = (n == 32) ? 0xffffffff : ((1 << n) - 1);
- if (bufLen >= n) {
- x = (buf >> (bufLen - n)) & mask;
- bufLen -= n;
- } else {
- x = buf & ((1 << bufLen) - 1);
- nLeft = n - bufLen;
- bufLen = 0;
- while (nLeft >= 8) {
- x = (x << 8) | (str->getChar() & 0xff);
- nLeft -= 8;
- }
- if (nLeft > 0) {
- buf = str->getChar();
- bufLen = 8 - nLeft;
- x = (x << nLeft) | ((buf >> bufLen) & ((1 << nLeft) - 1));
- }
- }
- return x;
-}
-
-Guint JBIG2HuffmanDecoder::readBit() {
- if (bufLen == 0) {
- buf = str->getChar();
- bufLen = 8;
- }
- --bufLen;
- return (buf >> bufLen) & 1;
-}
-
-void JBIG2HuffmanDecoder::buildTable(JBIG2HuffmanTable *table, Guint len) {
- Guint i, j, k, prefix;
- JBIG2HuffmanTable tab;
-
- // stable selection sort:
- // - entries with prefixLen > 0, in ascending prefixLen order
- // - entry with prefixLen = 0, rangeLen = EOT
- // - all other entries with prefixLen = 0
- // (on entry, table[len] has prefixLen = 0, rangeLen = EOT)
- for (i = 0; i < len; ++i) {
- for (j = i; j < len && table[j].prefixLen == 0; ++j) ;
- if (j == len) {
- break;
- }
- for (k = j + 1; k < len; ++k) {
- if (table[k].prefixLen > 0 &&
- table[k].prefixLen < table[j].prefixLen) {
- j = k;
- }
- }
- if (j != i) {
- tab = table[j];
- for (k = j; k > i; --k) {
- table[k] = table[k - 1];
- }
- table[i] = tab;
- }
- }
- table[i] = table[len];
-
- // assign prefixes
- i = 0;
- prefix = 0;
- table[i++].prefix = prefix++;
- for (; table[i].rangeLen != jbig2HuffmanEOT; ++i) {
- prefix <<= table[i].prefixLen - table[i-1].prefixLen;
- table[i].prefix = prefix++;
- }
-}
-
-//------------------------------------------------------------------------
-// JBIG2MMRDecoder
-//------------------------------------------------------------------------
-
-class JBIG2MMRDecoder {
-public:
-
- JBIG2MMRDecoder();
- ~JBIG2MMRDecoder();
- void setStream(Stream *strA) { str = strA; }
- void reset();
- int get2DCode();
- int getBlackCode();
- int getWhiteCode();
- Guint get24Bits();
- void skipTo(Guint length);
-
-private:
-
- Stream *str;
- Guint buf;
- Guint bufLen;
- Guint nBytesRead;
-};
-
-JBIG2MMRDecoder::JBIG2MMRDecoder() {
- str = NULL;
- reset();
-}
-
-JBIG2MMRDecoder::~JBIG2MMRDecoder() {
-}
-
-void JBIG2MMRDecoder::reset() {
- buf = 0;
- bufLen = 0;
- nBytesRead = 0;
-}
-
-int JBIG2MMRDecoder::get2DCode() {
- CCITTCode *p;
-
- if (bufLen == 0) {
- buf = str->getChar() & 0xff;
- bufLen = 8;
- ++nBytesRead;
- p = &twoDimTab1[(buf >> 1) & 0x7f];
- } else if (bufLen == 8) {
- p = &twoDimTab1[(buf >> 1) & 0x7f];
- } else {
- p = &twoDimTab1[(buf << (7 - bufLen)) & 0x7f];
- if (p->bits < 0 || p->bits > (int)bufLen) {
- buf = (buf << 8) | (str->getChar() & 0xff);
- bufLen += 8;
- ++nBytesRead;
- p = &twoDimTab1[(buf >> (bufLen - 7)) & 0x7f];
- }
- }
- if (p->bits < 0) {
- error(str->getPos(), "Bad two dim code in JBIG2 MMR stream");
- return 0;
- }
- bufLen -= p->bits;
- return p->n;
-}
-
-int JBIG2MMRDecoder::getWhiteCode() {
- CCITTCode *p;
- Guint code;
-
- if (bufLen == 0) {
- buf = str->getChar() & 0xff;
- bufLen = 8;
- ++nBytesRead;
- }
- while (1) {
- if (bufLen >= 7 && ((buf >> (bufLen - 7)) & 0x7f) == 0) {
- if (bufLen <= 12) {
- code = buf << (12 - bufLen);
- } else {
- code = buf >> (bufLen - 12);
- }
- p = &whiteTab1[code & 0x1f];
- } else {
- if (bufLen <= 9) {
- code = buf << (9 - bufLen);
- } else {
- code = buf >> (bufLen - 9);
- }
- p = &whiteTab2[code & 0x1ff];
- }
- if (p->bits > 0 && p->bits <= (int)bufLen) {
- bufLen -= p->bits;
- return p->n;
- }
- if (bufLen >= 12) {
- break;
- }
- buf = (buf << 8) | (str->getChar() & 0xff);
- bufLen += 8;
- ++nBytesRead;
- }
- error(str->getPos(), "Bad white code in JBIG2 MMR stream");
- // eat a bit and return a positive number so that the caller doesn't
- // go into an infinite loop
- --bufLen;
- return 1;
-}
-
-int JBIG2MMRDecoder::getBlackCode() {
- CCITTCode *p;
- Guint code;
-
- if (bufLen == 0) {
- buf = str->getChar() & 0xff;
- bufLen = 8;
- ++nBytesRead;
- }
- while (1) {
- if (bufLen >= 6 && ((buf >> (bufLen - 6)) & 0x3f) == 0) {
- if (bufLen <= 13) {
- code = buf << (13 - bufLen);
- } else {
- code = buf >> (bufLen - 13);
- }
- p = &blackTab1[code & 0x7f];
- } else if (bufLen >= 4 && ((buf >> (bufLen - 4)) & 0x0f) == 0) {
- if (bufLen <= 12) {
- code = buf << (12 - bufLen);
- } else {
- code = buf >> (bufLen - 12);
- }
- p = &blackTab2[(code & 0xff) - 64];
- } else {
- if (bufLen <= 6) {
- code = buf << (6 - bufLen);
- } else {
- code = buf >> (bufLen - 6);
- }
- p = &blackTab3[code & 0x3f];
- }
- if (p->bits > 0 && p->bits <= (int)bufLen) {
- bufLen -= p->bits;
- return p->n;
- }
- if (bufLen >= 13) {
- break;
- }
- buf = (buf << 8) | (str->getChar() & 0xff);
- bufLen += 8;
- ++nBytesRead;
- }
- error(str->getPos(), "Bad black code in JBIG2 MMR stream");
- // eat a bit and return a positive number so that the caller doesn't
- // go into an infinite loop
- --bufLen;
- return 1;
-}
-
-Guint JBIG2MMRDecoder::get24Bits() {
- while (bufLen < 24) {
- buf = (buf << 8) | (str->getChar() & 0xff);
- bufLen += 8;
- ++nBytesRead;
- }
- return (buf >> (bufLen - 24)) & 0xffffff;
-}
-
-void JBIG2MMRDecoder::skipTo(Guint length) {
- while (nBytesRead < length) {
- str->getChar();
- ++nBytesRead;
- }
-}
-
-//------------------------------------------------------------------------
-// JBIG2Segment
-//------------------------------------------------------------------------
-
-enum JBIG2SegmentType {
- jbig2SegBitmap,
- jbig2SegSymbolDict,
- jbig2SegPatternDict,
- jbig2SegCodeTable
-};
-
-class JBIG2Segment {
-public:
-
- JBIG2Segment(Guint segNumA) { segNum = segNumA; }
- virtual ~JBIG2Segment() {}
- void setSegNum(Guint segNumA) { segNum = segNumA; }
- Guint getSegNum() { return segNum; }
- virtual JBIG2SegmentType getType() = 0;
-
-private:
-
- Guint segNum;
-};
-
-//------------------------------------------------------------------------
-// JBIG2Bitmap
-//------------------------------------------------------------------------
-
-struct JBIG2BitmapPtr {
- Guchar *p;
- int shift;
- int x;
-};
-
-class JBIG2Bitmap: public JBIG2Segment {
-public:
-
- JBIG2Bitmap(Guint segNumA, int wA, int hA);
- virtual ~JBIG2Bitmap();
- virtual JBIG2SegmentType getType() { return jbig2SegBitmap; }
- JBIG2Bitmap *copy() { return new JBIG2Bitmap(0, this); }
- JBIG2Bitmap *getSlice(Guint x, Guint y, Guint wA, Guint hA);
- void expand(int newH, Guint pixel);
- void clearToZero();
- void clearToOne();
- int getWidth() { return w; }
- int getHeight() { return h; }
- int getPixel(int x, int y)
- { return (x < 0 || x >= w || y < 0 || y >= h) ? 0 :
- (data[y * line + (x >> 3)] >> (7 - (x & 7))) & 1; }
- void setPixel(int x, int y)
- { data[y * line + (x >> 3)] |= 1 << (7 - (x & 7)); }
- void clearPixel(int x, int y)
- { data[y * line + (x >> 3)] &= 0x7f7f >> (x & 7); }
- void getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr);
- int nextPixel(JBIG2BitmapPtr *ptr);
- void duplicateRow(int yDest, int ySrc);
- void combine(JBIG2Bitmap *bitmap, int x, int y, Guint combOp);
- Guchar *getDataPtr() { return data; }
- int getDataSize() { return h * line; }
-
-private:
-
- JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap);
-
- int w, h, line;
- Guchar *data;
-};
-
-JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, int wA, int hA):
- JBIG2Segment(segNumA)
-{
- w = wA;
- h = hA;
- line = (wA + 7) >> 3;
- data = (Guchar *)gmalloc(h * line);
-}
-
-JBIG2Bitmap::JBIG2Bitmap(Guint segNumA, JBIG2Bitmap *bitmap):
- JBIG2Segment(segNumA)
-{
- w = bitmap->w;
- h = bitmap->h;
- line = bitmap->line;
- data = (Guchar *)gmalloc(h * line);
- memcpy(data, bitmap->data, h * line);
-}
-
-JBIG2Bitmap::~JBIG2Bitmap() {
- gfree(data);
-}
-
-//~ optimize this
-JBIG2Bitmap *JBIG2Bitmap::getSlice(Guint x, Guint y, Guint wA, Guint hA) {
- JBIG2Bitmap *slice;
- Guint xx, yy;
-
- slice = new JBIG2Bitmap(0, wA, hA);
- slice->clearToZero();
- for (yy = 0; yy < hA; ++yy) {
- for (xx = 0; xx < wA; ++xx) {
- if (getPixel(x + xx, y + yy)) {
- slice->setPixel(xx, yy);
- }
- }
- }
- return slice;
-}
-
-void JBIG2Bitmap::expand(int newH, Guint pixel) {
- if (newH <= h) {
- return;
- }
- data = (Guchar *)grealloc(data, newH * line);
- if (pixel) {
- memset(data + h * line, 0xff, (newH - h) * line);
- } else {
- memset(data + h * line, 0x00, (newH - h) * line);
- }
- h = newH;
-}
-
-void JBIG2Bitmap::clearToZero() {
- memset(data, 0, h * line);
-}
-
-void JBIG2Bitmap::clearToOne() {
- memset(data, 0xff, h * line);
-}
-
-inline void JBIG2Bitmap::getPixelPtr(int x, int y, JBIG2BitmapPtr *ptr) {
- if (y < 0 || y >= h || x >= w) {
- ptr->p = NULL;
- } else if (x < 0) {
- ptr->p = &data[y * line];
- ptr->shift = 7;
- ptr->x = x;
- } else {
- ptr->p = &data[y * line + (x >> 3)];
- ptr->shift = 7 - (x & 7);
- ptr->x = x;
- }
-}
-
-inline int JBIG2Bitmap::nextPixel(JBIG2BitmapPtr *ptr) {
- int pix;
-
- if (!ptr->p) {
- pix = 0;
- } else if (ptr->x < 0) {
- ++ptr->x;
- pix = 0;
- } else {
- pix = (*ptr->p >> ptr->shift) & 1;
- if (++ptr->x == w) {
- ptr->p = NULL;
- } else if (ptr->shift == 0) {
- ++ptr->p;
- ptr->shift = 7;
- } else {
- --ptr->shift;
- }
- }
- return pix;
-}
-
-void JBIG2Bitmap::duplicateRow(int yDest, int ySrc) {
- memcpy(data + yDest * line, data + ySrc * line, line);
-}
-
-void JBIG2Bitmap::combine(JBIG2Bitmap *bitmap, int x, int y,
- Guint combOp) {
- int x0, x1, y0, y1, xx, yy;
- Guchar *srcPtr, *destPtr;
- Guint src0, src1, src, dest, s1, s2, m1, m2, m3;
- GBool oneByte;
-
- if (y < 0) {
- y0 = -y;
- } else {
- y0 = 0;
- }
- if (y + bitmap->h > h) {
- y1 = h - y;
- } else {
- y1 = bitmap->h;
- }
- if (y0 >= y1) {
- return;
- }
-
- if (x >= 0) {
- x0 = x & ~7;
- } else {
- x0 = 0;
- }
- x1 = x + bitmap->w;
- if (x1 > w) {
- x1 = w;
- }
- if (x0 >= x1) {
- return;
- }
-
- s1 = x & 7;
- s2 = 8 - s1;
- m1 = 0xff >> (x1 & 7);
- m2 = 0xff << (((x1 & 7) == 0) ? 0 : 8 - (x1 & 7));
- m3 = (0xff >> s1) & m2;
-
- oneByte = x0 == ((x1 - 1) & ~7);
-
- for (yy = y0; yy < y1; ++yy) {
-
- // one byte per line -- need to mask both left and right side
- if (oneByte) {
- if (x >= 0) {
- destPtr = data + (y + yy) * line + (x >> 3);
- srcPtr = bitmap->data + yy * bitmap->line;
- dest = *destPtr;
- src1 = *srcPtr;
- switch (combOp) {
- case 0: // or
- dest |= (src1 >> s1) & m2;
- break;
- case 1: // and
- dest &= ((0xff00 | src1) >> s1) | m1;
- break;
- case 2: // xor
- dest ^= (src1 >> s1) & m2;
- break;
- case 3: // xnor
- dest ^= ((src1 ^ 0xff) >> s1) & m2;
- break;
- case 4: // replace
- dest = (dest & ~m3) | ((src1 >> s1) & m3);
- break;
- }
- *destPtr = dest;
- } else {
- destPtr = data + (y + yy) * line;
- srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3);
- dest = *destPtr;
- src1 = *srcPtr;
- switch (combOp) {
- case 0: // or
- dest |= src1 & m2;
- break;
- case 1: // and
- dest &= src1 | m1;
- break;
- case 2: // xor
- dest ^= src1 & m2;
- break;
- case 3: // xnor
- dest ^= (src1 ^ 0xff) & m2;
- break;
- case 4: // replace
- dest = (src1 & m2) | (dest & m1);
- break;
- }
- *destPtr = dest;
- }
-
- // multiple bytes per line -- need to mask left side of left-most
- // byte and right side of right-most byte
- } else {
-
- // left-most byte
- if (x >= 0) {
- destPtr = data + (y + yy) * line + (x >> 3);
- srcPtr = bitmap->data + yy * bitmap->line;
- src1 = *srcPtr++;
- dest = *destPtr;
- switch (combOp) {
- case 0: // or
- dest |= src1 >> s1;
- break;
- case 1: // and
- dest &= (0xff00 | src1) >> s1;
- break;
- case 2: // xor
- dest ^= src1 >> s1;
- break;
- case 3: // xnor
- dest ^= (src1 ^ 0xff) >> s1;
- break;
- case 4: // replace
- dest = (dest & (0xff << s2)) | (src1 >> s1);
- break;
- }
- *destPtr++ = dest;
- xx = x0 + 8;
- } else {
- destPtr = data + (y + yy) * line;
- srcPtr = bitmap->data + yy * bitmap->line + (-x >> 3);
- src1 = *srcPtr++;
- xx = x0;
- }
-
- // middle bytes
- for (; xx < x1 - 8; xx += 8) {
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- switch (combOp) {
- case 0: // or
- dest |= src;
- break;
- case 1: // and
- dest &= src;
- break;
- case 2: // xor
- dest ^= src;
- break;
- case 3: // xnor
- dest ^= src ^ 0xff;
- break;
- case 4: // replace
- dest = src;
- break;
- }
- *destPtr++ = dest;
- }
-
- // right-most byte
- dest = *destPtr;
- src0 = src1;
- src1 = *srcPtr++;
- src = (((src0 << 8) | src1) >> s1) & 0xff;
- switch (combOp) {
- case 0: // or
- dest |= src & m2;
- break;
- case 1: // and
- dest &= src | m1;
- break;
- case 2: // xor
- dest ^= src & m2;
- break;
- case 3: // xnor
- dest ^= (src ^ 0xff) & m2;
- break;
- case 4: // replace
- dest = (src & m2) | (dest & m1);
- break;
- }
- *destPtr = dest;
- }
- }
-}
-
-//------------------------------------------------------------------------
-// JBIG2SymbolDict
-//------------------------------------------------------------------------
-
-class JBIG2SymbolDict: public JBIG2Segment {
-public:
-
- JBIG2SymbolDict(Guint segNumA, Guint sizeA);
- virtual ~JBIG2SymbolDict();
- virtual JBIG2SegmentType getType() { return jbig2SegSymbolDict; }
- Guint getSize() { return size; }
- void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; }
- JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; }
- void setGenericRegionStats(JArithmeticDecoderStats *stats)
- { genericRegionStats = stats; }
- void setRefinementRegionStats(JArithmeticDecoderStats *stats)
- { refinementRegionStats = stats; }
- JArithmeticDecoderStats *getGenericRegionStats()
- { return genericRegionStats; }
- JArithmeticDecoderStats *getRefinementRegionStats()
- { return refinementRegionStats; }
-
-private:
-
- Guint size;
- JBIG2Bitmap **bitmaps;
- JArithmeticDecoderStats *genericRegionStats;
- JArithmeticDecoderStats *refinementRegionStats;
-};
-
-JBIG2SymbolDict::JBIG2SymbolDict(Guint segNumA, Guint sizeA):
- JBIG2Segment(segNumA)
-{
- size = sizeA;
- bitmaps = (JBIG2Bitmap **)gmalloc(size * sizeof(JBIG2Bitmap *));
- genericRegionStats = NULL;
- refinementRegionStats = NULL;
-}
-
-JBIG2SymbolDict::~JBIG2SymbolDict() {
- Guint i;
-
- for (i = 0; i < size; ++i) {
- delete bitmaps[i];
- }
- gfree(bitmaps);
- if (genericRegionStats) {
- delete genericRegionStats;
- }
- if (refinementRegionStats) {
- delete refinementRegionStats;
- }
-}
-
-//------------------------------------------------------------------------
-// JBIG2PatternDict
-//------------------------------------------------------------------------
-
-class JBIG2PatternDict: public JBIG2Segment {
-public:
-
- JBIG2PatternDict(Guint segNumA, Guint sizeA);
- virtual ~JBIG2PatternDict();
- virtual JBIG2SegmentType getType() { return jbig2SegPatternDict; }
- Guint getSize() { return size; }
- void setBitmap(Guint idx, JBIG2Bitmap *bitmap) { bitmaps[idx] = bitmap; }
- JBIG2Bitmap *getBitmap(Guint idx) { return bitmaps[idx]; }
-
-private:
-
- Guint size;
- JBIG2Bitmap **bitmaps;
-};
-
-JBIG2PatternDict::JBIG2PatternDict(Guint segNumA, Guint sizeA):
- JBIG2Segment(segNumA)
-{
- size = sizeA;
- bitmaps = (JBIG2Bitmap **)gmalloc(size * sizeof(JBIG2Bitmap *));
-}
-
-JBIG2PatternDict::~JBIG2PatternDict() {
- Guint i;
-
- for (i = 0; i < size; ++i) {
- delete bitmaps[i];
- }
- gfree(bitmaps);
-}
-
-//------------------------------------------------------------------------
-// JBIG2CodeTable
-//------------------------------------------------------------------------
-
-class JBIG2CodeTable: public JBIG2Segment {
-public:
-
- JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA);
- virtual ~JBIG2CodeTable();
- virtual JBIG2SegmentType getType() { return jbig2SegCodeTable; }
- JBIG2HuffmanTable *getHuffTable() { return table; }
-
-private:
-
- JBIG2HuffmanTable *table;
-};
-
-JBIG2CodeTable::JBIG2CodeTable(Guint segNumA, JBIG2HuffmanTable *tableA):
- JBIG2Segment(segNumA)
-{
- table = tableA;
-}
-
-JBIG2CodeTable::~JBIG2CodeTable() {
- gfree(table);
-}
-
-//------------------------------------------------------------------------
-// JBIG2Stream
-//------------------------------------------------------------------------
-
-JBIG2Stream::JBIG2Stream(Stream *strA, Object *globalsStream):
- FilterStream(strA)
-{
- pageBitmap = NULL;
-
- arithDecoder = new JArithmeticDecoder();
- genericRegionStats = new JArithmeticDecoderStats(1 << 1);
- refinementRegionStats = new JArithmeticDecoderStats(1 << 1);
- iadhStats = new JArithmeticDecoderStats(1 << 9);
- iadwStats = new JArithmeticDecoderStats(1 << 9);
- iaexStats = new JArithmeticDecoderStats(1 << 9);
- iaaiStats = new JArithmeticDecoderStats(1 << 9);
- iadtStats = new JArithmeticDecoderStats(1 << 9);
- iaitStats = new JArithmeticDecoderStats(1 << 9);
- iafsStats = new JArithmeticDecoderStats(1 << 9);
- iadsStats = new JArithmeticDecoderStats(1 << 9);
- iardxStats = new JArithmeticDecoderStats(1 << 9);
- iardyStats = new JArithmeticDecoderStats(1 << 9);
- iardwStats = new JArithmeticDecoderStats(1 << 9);
- iardhStats = new JArithmeticDecoderStats(1 << 9);
- iariStats = new JArithmeticDecoderStats(1 << 9);
- iaidStats = new JArithmeticDecoderStats(1 << 1);
- huffDecoder = new JBIG2HuffmanDecoder();
- mmrDecoder = new JBIG2MMRDecoder();
-
- segments = globalSegments = new GList();
- if (globalsStream->isStream()) {
- curStr = globalsStream->getStream();
- curStr->reset();
- arithDecoder->setStream(curStr);
- huffDecoder->setStream(curStr);
- mmrDecoder->setStream(curStr);
- readSegments();
- }
-
- segments = NULL;
- curStr = NULL;
- dataPtr = dataEnd = NULL;
-}
-
-JBIG2Stream::~JBIG2Stream() {
- delete arithDecoder;
- delete genericRegionStats;
- delete refinementRegionStats;
- delete iadhStats;
- delete iadwStats;
- delete iaexStats;
- delete iaaiStats;
- delete iadtStats;
- delete iaitStats;
- delete iafsStats;
- delete iadsStats;
- delete iardxStats;
- delete iardyStats;
- delete iardwStats;
- delete iardhStats;
- delete iariStats;
- delete iaidStats;
- delete huffDecoder;
- delete mmrDecoder;
- if (pageBitmap) {
- delete pageBitmap;
- }
- if (segments) {
- deleteGList(segments, JBIG2Segment);
- }
- if (globalSegments) {
- deleteGList(globalSegments, JBIG2Segment);
- }
- delete str;
-}
-
-void JBIG2Stream::reset() {
- if (pageBitmap) {
- delete pageBitmap;
- pageBitmap = NULL;
- }
- if (segments) {
- deleteGList(segments, JBIG2Segment);
- }
- segments = new GList();
-
- curStr = str;
- curStr->reset();
- arithDecoder->setStream(curStr);
- huffDecoder->setStream(curStr);
- mmrDecoder->setStream(curStr);
- readSegments();
-
- if (pageBitmap) {
- dataPtr = pageBitmap->getDataPtr();
- dataEnd = dataPtr + pageBitmap->getDataSize();
- } else {
- dataPtr = NULL;
- }
-}
-
-int JBIG2Stream::getChar() {
- if (dataPtr && dataPtr < dataEnd) {
- return (*dataPtr++ ^ 0xff) & 0xff;
- }
- return EOF;
-}
-
-int JBIG2Stream::lookChar() {
- if (dataPtr && dataPtr < dataEnd) {
- return (*dataPtr ^ 0xff) & 0xff;
- }
- return EOF;
-}
-
-GString *JBIG2Stream::getPSFilter(int psLevel, char *indent) {
- return NULL;
-}
-
-GBool JBIG2Stream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-void JBIG2Stream::readSegments() {
- Guint segNum, segFlags, segType, page, segLength;
- Guint refFlags, nRefSegs;
- Guint *refSegs;
- int c1, c2, c3;
- Guint i;
-
- while (readULong(&segNum)) {
-
- // segment header flags
- if (!readUByte(&segFlags)) {
- goto eofError1;
- }
- segType = segFlags & 0x3f;
-
- // referred-to segment count and retention flags
- if (!readUByte(&refFlags)) {
- goto eofError1;
- }
- nRefSegs = refFlags >> 5;
- if (nRefSegs == 7) {
- if ((c1 = curStr->getChar()) == EOF ||
- (c2 = curStr->getChar()) == EOF ||
- (c3 = curStr->getChar()) == EOF) {
- goto eofError1;
- }
- refFlags = (refFlags << 24) | (c1 << 16) | (c2 << 8) | c3;
- nRefSegs = refFlags & 0x1fffffff;
- for (i = 0; i < (nRefSegs + 9) >> 3; ++i) {
- c1 = curStr->getChar();
- }
- }
-
- // referred-to segment numbers
- refSegs = (Guint *)gmalloc(nRefSegs * sizeof(Guint));
- if (segNum <= 256) {
- for (i = 0; i < nRefSegs; ++i) {
- if (!readUByte(&refSegs[i])) {
- goto eofError2;
- }
- }
- } else if (segNum <= 65536) {
- for (i = 0; i < nRefSegs; ++i) {
- if (!readUWord(&refSegs[i])) {
- goto eofError2;
- }
- }
- } else {
- for (i = 0; i < nRefSegs; ++i) {
- if (!readULong(&refSegs[i])) {
- goto eofError2;
- }
- }
- }
-
- // segment page association
- if (segFlags & 0x40) {
- if (!readULong(&page)) {
- goto eofError2;
- }
- } else {
- if (!readUByte(&page)) {
- goto eofError2;
- }
- }
-
- // segment data length
- if (!readULong(&segLength)) {
- goto eofError2;
- }
-
- // read the segment data
- switch (segType) {
- case 0:
- readSymbolDictSeg(segNum, segLength, refSegs, nRefSegs);
- break;
- case 4:
- readTextRegionSeg(segNum, gFalse, gFalse, segLength, refSegs, nRefSegs);
- break;
- case 6:
- readTextRegionSeg(segNum, gTrue, gFalse, segLength, refSegs, nRefSegs);
- break;
- case 7:
- readTextRegionSeg(segNum, gTrue, gTrue, segLength, refSegs, nRefSegs);
- break;
- case 16:
- readPatternDictSeg(segNum, segLength);
- break;
- case 20:
- readHalftoneRegionSeg(segNum, gFalse, gFalse, segLength,
- refSegs, nRefSegs);
- break;
- case 22:
- readHalftoneRegionSeg(segNum, gTrue, gFalse, segLength,
- refSegs, nRefSegs);
- break;
- case 23:
- readHalftoneRegionSeg(segNum, gTrue, gTrue, segLength,
- refSegs, nRefSegs);
- break;
- case 36:
- readGenericRegionSeg(segNum, gFalse, gFalse, segLength);
- break;
- case 38:
- readGenericRegionSeg(segNum, gTrue, gFalse, segLength);
- break;
- case 39:
- readGenericRegionSeg(segNum, gTrue, gTrue, segLength);
- break;
- case 40:
- readGenericRefinementRegionSeg(segNum, gFalse, gFalse, segLength,
- refSegs, nRefSegs);
- break;
- case 42:
- readGenericRefinementRegionSeg(segNum, gTrue, gFalse, segLength,
- refSegs, nRefSegs);
- break;
- case 43:
- readGenericRefinementRegionSeg(segNum, gTrue, gTrue, segLength,
- refSegs, nRefSegs);
- break;
- case 48:
- readPageInfoSeg(segLength);
- break;
- case 50:
- readEndOfStripeSeg(segLength);
- break;
- case 52:
- readProfilesSeg(segLength);
- break;
- case 53:
- readCodeTableSeg(segNum, segLength);
- break;
- case 62:
- readExtensionSeg(segLength);
- break;
- default:
- error(getPos(), "Unknown segment type in JBIG2 stream");
- for (i = 0; i < segLength; ++i) {
- if ((c1 = curStr->getChar()) == EOF) {
- goto eofError2;
- }
- }
- break;
- }
-
- gfree(refSegs);
- }
-
- return;
-
- eofError2:
- gfree(refSegs);
- eofError1:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readSymbolDictSeg(Guint segNum, Guint length,
- Guint *refSegs, Guint nRefSegs) {
- JBIG2SymbolDict *symbolDict;
- JBIG2HuffmanTable *huffDHTable, *huffDWTable;
- JBIG2HuffmanTable *huffBMSizeTable, *huffAggInstTable;
- JBIG2Segment *seg;
- GList *codeTables;
- JBIG2SymbolDict *inputSymbolDict;
- Guint flags, sdTemplate, sdrTemplate, huff, refAgg;
- Guint huffDH, huffDW, huffBMSize, huffAggInst;
- Guint contextUsed, contextRetained;
- int sdATX[4], sdATY[4], sdrATX[2], sdrATY[2];
- Guint numExSyms, numNewSyms, numInputSyms, symCodeLen;
- JBIG2Bitmap **bitmaps;
- JBIG2Bitmap *collBitmap, *refBitmap;
- Guint *symWidths;
- Guint symHeight, symWidth, totalWidth, x, symID;
- int dh, dw, refAggNum, refDX, refDY, bmSize;
- GBool ex;
- int run, cnt;
- Guint i, j, k;
- Guchar *p;
-
- // symbol dictionary flags
- if (!readUWord(&flags)) {
- goto eofError;
- }
- sdTemplate = (flags >> 10) & 3;
- sdrTemplate = (flags >> 12) & 1;
- huff = flags & 1;
- refAgg = (flags >> 1) & 1;
- huffDH = (flags >> 2) & 3;
- huffDW = (flags >> 4) & 3;
- huffBMSize = (flags >> 6) & 1;
- huffAggInst = (flags >> 7) & 1;
- contextUsed = (flags >> 8) & 1;
- contextRetained = (flags >> 9) & 1;
-
- // symbol dictionary AT flags
- if (!huff) {
- if (sdTemplate == 0) {
- if (!readByte(&sdATX[0]) ||
- !readByte(&sdATY[0]) ||
- !readByte(&sdATX[1]) ||
- !readByte(&sdATY[1]) ||
- !readByte(&sdATX[2]) ||
- !readByte(&sdATY[2]) ||
- !readByte(&sdATX[3]) ||
- !readByte(&sdATY[3])) {
- goto eofError;
- }
- } else {
- if (!readByte(&sdATX[0]) ||
- !readByte(&sdATY[0])) {
- goto eofError;
- }
- }
- }
-
- // symbol dictionary refinement AT flags
- if (refAgg && !sdrTemplate) {
- if (!readByte(&sdrATX[0]) ||
- !readByte(&sdrATY[0]) ||
- !readByte(&sdrATX[1]) ||
- !readByte(&sdrATY[1])) {
- goto eofError;
- }
- }
-
- // SDNUMEXSYMS and SDNUMNEWSYMS
- if (!readULong(&numExSyms) || !readULong(&numNewSyms)) {
- goto eofError;
- }
-
- // get referenced segments: input symbol dictionaries and code tables
- codeTables = new GList();
- numInputSyms = 0;
- for (i = 0; i < nRefSegs; ++i) {
- seg = findSegment(refSegs[i]);
- if (seg->getType() == jbig2SegSymbolDict) {
- numInputSyms += ((JBIG2SymbolDict *)seg)->getSize();
- } else if (seg->getType() == jbig2SegCodeTable) {
- codeTables->append(seg);
- }
- }
-
- // compute symbol code length
- symCodeLen = 0;
- i = 1;
- while (i < numInputSyms + numNewSyms) {
- ++symCodeLen;
- i <<= 1;
- }
-
- // get the input symbol bitmaps
- bitmaps = (JBIG2Bitmap **)gmalloc((numInputSyms + numNewSyms) *
- sizeof(JBIG2Bitmap *));
- k = 0;
- inputSymbolDict = NULL;
- for (i = 0; i < nRefSegs; ++i) {
- seg = findSegment(refSegs[i]);
- if (seg->getType() == jbig2SegSymbolDict) {
- inputSymbolDict = (JBIG2SymbolDict *)seg;
- for (j = 0; j < inputSymbolDict->getSize(); ++j) {
- bitmaps[k++] = inputSymbolDict->getBitmap(j);
- }
- }
- }
-
- // get the Huffman tables
- huffDHTable = huffDWTable = NULL; // make gcc happy
- huffBMSizeTable = huffAggInstTable = NULL; // make gcc happy
- i = 0;
- if (huff) {
- if (huffDH == 0) {
- huffDHTable = huffTableD;
- } else if (huffDH == 1) {
- huffDHTable = huffTableE;
- } else {
- huffDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffDW == 0) {
- huffDWTable = huffTableB;
- } else if (huffDW == 1) {
- huffDWTable = huffTableC;
- } else {
- huffDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffBMSize == 0) {
- huffBMSizeTable = huffTableA;
- } else {
- huffBMSizeTable =
- ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffAggInst == 0) {
- huffAggInstTable = huffTableA;
- } else {
- huffAggInstTable =
- ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- }
- delete codeTables;
-
- // set up the Huffman decoder
- if (huff) {
- huffDecoder->reset();
-
- // set up the arithmetic decoder
- } else {
- if (contextUsed && inputSymbolDict) {
- resetGenericStats(sdTemplate, inputSymbolDict->getGenericRegionStats());
- } else {
- resetGenericStats(sdTemplate, NULL);
- }
- resetIntStats(symCodeLen);
- arithDecoder->start();
- }
-
- // set up the arithmetic decoder for refinement/aggregation
- if (refAgg) {
- if (contextUsed && inputSymbolDict) {
- resetRefinementStats(sdrTemplate,
- inputSymbolDict->getRefinementRegionStats());
- } else {
- resetRefinementStats(sdrTemplate, NULL);
- }
- }
-
- // allocate symbol widths storage
- symWidths = NULL;
- if (huff && !refAgg) {
- symWidths = (Guint *)gmalloc(numNewSyms * sizeof(Guint));
- }
-
- symHeight = 0;
- i = 0;
- while (i < numNewSyms) {
-
- // read the height class delta height
- if (huff) {
- huffDecoder->decodeInt(&dh, huffDHTable);
- } else {
- arithDecoder->decodeInt(&dh, iadhStats);
- }
- symHeight += dh;
- symWidth = 0;
- totalWidth = 0;
- j = i;
-
- // read the symbols in this height class
- while (1) {
-
- // read the delta width
- if (huff) {
- if (!huffDecoder->decodeInt(&dw, huffDWTable)) {
- break;
- }
- } else {
- if (!arithDecoder->decodeInt(&dw, iadwStats)) {
- break;
- }
- }
- symWidth += dw;
-
- // using a collective bitmap, so don't read a bitmap here
- if (huff && !refAgg) {
- symWidths[i] = symWidth;
- totalWidth += symWidth;
-
- // refinement/aggregate coding
- } else if (refAgg) {
- if (huff) {
- if (!huffDecoder->decodeInt(&refAggNum, huffAggInstTable)) {
- break;
- }
- } else {
- if (!arithDecoder->decodeInt(&refAggNum, iaaiStats)) {
- break;
- }
- }
-#if 0 //~ This special case was added about a year before the final draft
- //~ of the JBIG2 spec was released. I have encountered some old
- //~ JBIG2 images that predate it.
- if (0) {
-#else
- if (refAggNum == 1) {
-#endif
- if (huff) {
- symID = huffDecoder->readBits(symCodeLen);
- huffDecoder->decodeInt(&refDX, huffTableO);
- huffDecoder->decodeInt(&refDY, huffTableO);
- huffDecoder->decodeInt(&bmSize, huffTableA);
- huffDecoder->reset();
- arithDecoder->start();
- } else {
- symID = arithDecoder->decodeIAID(symCodeLen, iaidStats);
- arithDecoder->decodeInt(&refDX, iardxStats);
- arithDecoder->decodeInt(&refDY, iardyStats);
- }
- refBitmap = bitmaps[symID];
- bitmaps[numInputSyms + i] =
- readGenericRefinementRegion(symWidth, symHeight,
- sdrTemplate, gFalse,
- refBitmap, refDX, refDY,
- sdrATX, sdrATY);
- //~ do we need to use the bmSize value here (in Huffman mode)?
- } else {
- bitmaps[numInputSyms + i] =
- readTextRegion(huff, gTrue, symWidth, symHeight,
- refAggNum, 0, numInputSyms + i, NULL,
- symCodeLen, bitmaps, 0, 0, 0, 1, 0,
- huffTableF, huffTableH, huffTableK, huffTableO,
- huffTableO, huffTableO, huffTableO, huffTableA,
- sdrTemplate, sdrATX, sdrATY);
- }
-
- // non-ref/agg coding
- } else {
- bitmaps[numInputSyms + i] =
- readGenericBitmap(gFalse, symWidth, symHeight,
- sdTemplate, gFalse, gFalse, NULL,
- sdATX, sdATY, 0);
- }
-
- ++i;
- }
-
- // read the collective bitmap
- if (huff && !refAgg) {
- huffDecoder->decodeInt(&bmSize, huffBMSizeTable);
- huffDecoder->reset();
- if (bmSize == 0) {
- collBitmap = new JBIG2Bitmap(0, totalWidth, symHeight);
- bmSize = symHeight * ((totalWidth + 7) >> 3);
- p = collBitmap->getDataPtr();
- for (k = 0; k < (Guint)bmSize; ++k) {
- *p++ = curStr->getChar();
- }
- } else {
- collBitmap = readGenericBitmap(gTrue, totalWidth, symHeight,
- 0, gFalse, gFalse, NULL, NULL, NULL,
- bmSize);
- }
- x = 0;
- for (; j < i; ++j) {
- bitmaps[numInputSyms + j] =
- collBitmap->getSlice(x, 0, symWidths[j], symHeight);
- x += symWidths[j];
- }
- delete collBitmap;
- }
- }
-
- // create the symbol dict object
- symbolDict = new JBIG2SymbolDict(segNum, numExSyms);
-
- // exported symbol list
- i = j = 0;
- ex = gFalse;
- while (i < numInputSyms + numNewSyms) {
- if (huff) {
- huffDecoder->decodeInt(&run, huffTableA);
- } else {
- arithDecoder->decodeInt(&run, iaexStats);
- }
- if (ex) {
- for (cnt = 0; cnt < run; ++cnt) {
- symbolDict->setBitmap(j++, bitmaps[i++]->copy());
- }
- } else {
- i += run;
- }
- ex = !ex;
- }
-
- for (i = 0; i < numNewSyms; ++i) {
- delete bitmaps[numInputSyms + i];
- }
- gfree(bitmaps);
- if (symWidths) {
- gfree(symWidths);
- }
-
- // save the arithmetic decoder stats
- if (!huff && contextRetained) {
- symbolDict->setGenericRegionStats(genericRegionStats->copy());
- if (refAgg) {
- symbolDict->setRefinementRegionStats(refinementRegionStats->copy());
- }
- }
-
- // store the new symbol dict
- segments->append(symbolDict);
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readTextRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs, Guint nRefSegs) {
- JBIG2Bitmap *bitmap;
- JBIG2HuffmanTable runLengthTab[36];
- JBIG2HuffmanTable *symCodeTab;
- JBIG2HuffmanTable *huffFSTable, *huffDSTable, *huffDTTable;
- JBIG2HuffmanTable *huffRDWTable, *huffRDHTable;
- JBIG2HuffmanTable *huffRDXTable, *huffRDYTable, *huffRSizeTable;
- JBIG2Segment *seg;
- GList *codeTables;
- JBIG2SymbolDict *symbolDict;
- JBIG2Bitmap **syms;
- Guint w, h, x, y, segInfoFlags, extCombOp;
- Guint flags, huff, refine, logStrips, refCorner, transposed;
- Guint combOp, defPixel, templ;
- int sOffset;
- Guint huffFlags, huffFS, huffDS, huffDT;
- Guint huffRDW, huffRDH, huffRDX, huffRDY, huffRSize;
- Guint numInstances, numSyms, symCodeLen;
- int atx[2], aty[2];
- Guint i, k, kk;
- int j;
-
- // region segment info field
- if (!readULong(&w) || !readULong(&h) ||
- !readULong(&x) || !readULong(&y) ||
- !readUByte(&segInfoFlags)) {
- goto eofError;
- }
- extCombOp = segInfoFlags & 7;
-
- // rest of the text region header
- if (!readUWord(&flags)) {
- goto eofError;
- }
- huff = flags & 1;
- refine = (flags >> 1) & 1;
- logStrips = (flags >> 2) & 3;
- refCorner = (flags >> 4) & 3;
- transposed = (flags >> 6) & 1;
- combOp = (flags >> 7) & 3;
- defPixel = (flags >> 9) & 1;
- sOffset = (flags >> 10) & 0x1f;
- if (sOffset & 0x10) {
- sOffset |= -1 - 0x0f;
- }
- templ = (flags >> 15) & 1;
- huffFS = huffDS = huffDT = 0; // make gcc happy
- huffRDW = huffRDH = huffRDX = huffRDY = huffRSize = 0; // make gcc happy
- if (huff) {
- if (!readUWord(&huffFlags)) {
- goto eofError;
- }
- huffFS = huffFlags & 3;
- huffDS = (huffFlags >> 2) & 3;
- huffDT = (huffFlags >> 4) & 3;
- huffRDW = (huffFlags >> 6) & 3;
- huffRDH = (huffFlags >> 8) & 3;
- huffRDX = (huffFlags >> 10) & 3;
- huffRDY = (huffFlags >> 12) & 3;
- huffRSize = (huffFlags >> 14) & 1;
- }
- if (refine && templ == 0) {
- if (!readByte(&atx[0]) || !readByte(&aty[0]) ||
- !readByte(&atx[1]) || !readByte(&aty[1])) {
- goto eofError;
- }
- }
- if (!readULong(&numInstances)) {
- goto eofError;
- }
-
- // get symbol dictionaries and tables
- codeTables = new GList();
- numSyms = 0;
- for (i = 0; i < nRefSegs; ++i) {
- seg = findSegment(refSegs[i]);
- if (seg->getType() == jbig2SegSymbolDict) {
- numSyms += ((JBIG2SymbolDict *)seg)->getSize();
- } else if (seg->getType() == jbig2SegCodeTable) {
- codeTables->append(seg);
- }
- }
- symCodeLen = 0;
- i = 1;
- while (i < numSyms) {
- ++symCodeLen;
- i <<= 1;
- }
-
- // get the symbol bitmaps
- syms = (JBIG2Bitmap **)gmalloc(numSyms * sizeof(JBIG2Bitmap *));
- kk = 0;
- for (i = 0; i < nRefSegs; ++i) {
- seg = findSegment(refSegs[i]);
- if (seg->getType() == jbig2SegSymbolDict) {
- symbolDict = (JBIG2SymbolDict *)seg;
- for (k = 0; k < symbolDict->getSize(); ++k) {
- syms[kk++] = symbolDict->getBitmap(k);
- }
- }
- }
-
- // get the Huffman tables
- huffFSTable = huffDSTable = huffDTTable = NULL; // make gcc happy
- huffRDWTable = huffRDHTable = NULL; // make gcc happy
- huffRDXTable = huffRDYTable = huffRSizeTable = NULL; // make gcc happy
- i = 0;
- if (huff) {
- if (huffFS == 0) {
- huffFSTable = huffTableF;
- } else if (huffFS == 1) {
- huffFSTable = huffTableG;
- } else {
- huffFSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffDS == 0) {
- huffDSTable = huffTableH;
- } else if (huffDS == 1) {
- huffDSTable = huffTableI;
- } else if (huffDS == 2) {
- huffDSTable = huffTableJ;
- } else {
- huffDSTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffDT == 0) {
- huffDTTable = huffTableK;
- } else if (huffDT == 1) {
- huffDTTable = huffTableL;
- } else if (huffDT == 2) {
- huffDTTable = huffTableM;
- } else {
- huffDTTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffRDW == 0) {
- huffRDWTable = huffTableN;
- } else if (huffRDW == 1) {
- huffRDWTable = huffTableO;
- } else {
- huffRDWTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffRDH == 0) {
- huffRDHTable = huffTableN;
- } else if (huffRDH == 1) {
- huffRDHTable = huffTableO;
- } else {
- huffRDHTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffRDX == 0) {
- huffRDXTable = huffTableN;
- } else if (huffRDX == 1) {
- huffRDXTable = huffTableO;
- } else {
- huffRDXTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffRDY == 0) {
- huffRDYTable = huffTableN;
- } else if (huffRDY == 1) {
- huffRDYTable = huffTableO;
- } else {
- huffRDYTable = ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- if (huffRSize == 0) {
- huffRSizeTable = huffTableA;
- } else {
- huffRSizeTable =
- ((JBIG2CodeTable *)codeTables->get(i++))->getHuffTable();
- }
- }
- delete codeTables;
-
- // symbol ID Huffman decoding table
- if (huff) {
- huffDecoder->reset();
- for (i = 0; i < 32; ++i) {
- runLengthTab[i].val = i;
- runLengthTab[i].prefixLen = huffDecoder->readBits(4);
- runLengthTab[i].rangeLen = 0;
- }
- runLengthTab[32].val = 0x103;
- runLengthTab[32].prefixLen = huffDecoder->readBits(4);
- runLengthTab[32].rangeLen = 2;
- runLengthTab[33].val = 0x203;
- runLengthTab[33].prefixLen = huffDecoder->readBits(4);
- runLengthTab[33].rangeLen = 3;
- runLengthTab[34].val = 0x20b;
- runLengthTab[34].prefixLen = huffDecoder->readBits(4);
- runLengthTab[34].rangeLen = 7;
- runLengthTab[35].prefixLen = 0;
- runLengthTab[35].rangeLen = jbig2HuffmanEOT;
- huffDecoder->buildTable(runLengthTab, 35);
- symCodeTab = (JBIG2HuffmanTable *)gmalloc((numSyms + 1) *
- sizeof(JBIG2HuffmanTable));
- for (i = 0; i < numSyms; ++i) {
- symCodeTab[i].val = i;
- symCodeTab[i].rangeLen = 0;
- }
- i = 0;
- while (i < numSyms) {
- huffDecoder->decodeInt(&j, runLengthTab);
- if (j > 0x200) {
- for (j -= 0x200; j && i < numSyms; --j) {
- symCodeTab[i++].prefixLen = 0;
- }
- } else if (j > 0x100) {
- for (j -= 0x100; j && i < numSyms; --j) {
- symCodeTab[i].prefixLen = symCodeTab[i-1].prefixLen;
- ++i;
- }
- } else {
- symCodeTab[i++].prefixLen = j;
- }
- }
- symCodeTab[numSyms].prefixLen = 0;
- symCodeTab[numSyms].rangeLen = jbig2HuffmanEOT;
- huffDecoder->buildTable(symCodeTab, numSyms);
- huffDecoder->reset();
-
- // set up the arithmetic decoder
- } else {
- symCodeTab = NULL;
- resetIntStats(symCodeLen);
- arithDecoder->start();
- }
- if (refine) {
- resetRefinementStats(templ, NULL);
- }
-
- bitmap = readTextRegion(huff, refine, w, h, numInstances,
- logStrips, numSyms, symCodeTab, symCodeLen, syms,
- defPixel, combOp, transposed, refCorner, sOffset,
- huffFSTable, huffDSTable, huffDTTable,
- huffRDWTable, huffRDHTable,
- huffRDXTable, huffRDYTable, huffRSizeTable,
- templ, atx, aty);
-
- gfree(syms);
-
- // combine the region bitmap into the page bitmap
- if (imm) {
- if (pageH == 0xffffffff && y + h > curPageH) {
- pageBitmap->expand(y + h, pageDefPixel);
- }
- pageBitmap->combine(bitmap, x, y, extCombOp);
- delete bitmap;
-
- // store the region bitmap
- } else {
- bitmap->setSegNum(segNum);
- segments->append(bitmap);
- }
-
- // clean up the Huffman decoder
- if (huff) {
- gfree(symCodeTab);
- }
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-JBIG2Bitmap *JBIG2Stream::readTextRegion(GBool huff, GBool refine,
- int w, int h,
- Guint numInstances,
- Guint logStrips,
- int numSyms,
- JBIG2HuffmanTable *symCodeTab,
- Guint symCodeLen,
- JBIG2Bitmap **syms,
- Guint defPixel, Guint combOp,
- Guint transposed, Guint refCorner,
- int sOffset,
- JBIG2HuffmanTable *huffFSTable,
- JBIG2HuffmanTable *huffDSTable,
- JBIG2HuffmanTable *huffDTTable,
- JBIG2HuffmanTable *huffRDWTable,
- JBIG2HuffmanTable *huffRDHTable,
- JBIG2HuffmanTable *huffRDXTable,
- JBIG2HuffmanTable *huffRDYTable,
- JBIG2HuffmanTable *huffRSizeTable,
- Guint templ,
- int *atx, int *aty) {
- JBIG2Bitmap *bitmap;
- JBIG2Bitmap *symbolBitmap;
- Guint strips;
- int t, dt, tt, s, ds, sFirst, j;
- int rdw, rdh, rdx, rdy, ri, refDX, refDY, bmSize;
- Guint symID, inst, bw, bh;
-
- strips = 1 << logStrips;
-
- // allocate the bitmap
- bitmap = new JBIG2Bitmap(0, w, h);
- if (defPixel) {
- bitmap->clearToOne();
- } else {
- bitmap->clearToZero();
- }
-
- // decode initial T value
- if (huff) {
- huffDecoder->decodeInt(&t, huffDTTable);
- } else {
- arithDecoder->decodeInt(&t, iadtStats);
- }
- t *= -(int)strips;
-
- inst = 0;
- sFirst = 0;
- while (inst < numInstances) {
-
- // decode delta-T
- if (huff) {
- huffDecoder->decodeInt(&dt, huffDTTable);
- } else {
- arithDecoder->decodeInt(&dt, iadtStats);
- }
- t += dt * strips;
-
- // first S value
- if (huff) {
- huffDecoder->decodeInt(&ds, huffFSTable);
- } else {
- arithDecoder->decodeInt(&ds, iafsStats);
- }
- sFirst += ds;
- s = sFirst;
-
- // read the instances
- while (1) {
-
- // T value
- if (strips == 1) {
- dt = 0;
- } else if (huff) {
- dt = huffDecoder->readBits(logStrips);
- } else {
- arithDecoder->decodeInt(&dt, iaitStats);
- }
- tt = t + dt;
-
- // symbol ID
- if (huff) {
- if (symCodeTab) {
- huffDecoder->decodeInt(&j, symCodeTab);
- symID = (Guint)j;
- } else {
- symID = huffDecoder->readBits(symCodeLen);
- }
- } else {
- symID = arithDecoder->decodeIAID(symCodeLen, iaidStats);
- }
-
- // get the symbol bitmap
- symbolBitmap = NULL;
- if (refine) {
- if (huff) {
- ri = (int)huffDecoder->readBit();
- } else {
- arithDecoder->decodeInt(&ri, iariStats);
- }
- } else {
- ri = 0;
- }
- if (ri) {
- if (huff) {
- huffDecoder->decodeInt(&rdw, huffRDWTable);
- huffDecoder->decodeInt(&rdh, huffRDHTable);
- huffDecoder->decodeInt(&rdx, huffRDXTable);
- huffDecoder->decodeInt(&rdy, huffRDYTable);
- huffDecoder->decodeInt(&bmSize, huffRSizeTable);
- huffDecoder->reset();
- arithDecoder->start();
- } else {
- arithDecoder->decodeInt(&rdw, iardwStats);
- arithDecoder->decodeInt(&rdh, iardhStats);
- arithDecoder->decodeInt(&rdx, iardxStats);
- arithDecoder->decodeInt(&rdy, iardyStats);
- }
- refDX = ((rdw >= 0) ? rdw : rdw - 1) / 2 + rdx;
- refDY = ((rdh >= 0) ? rdh : rdh - 1) / 2 + rdy;
-
- symbolBitmap =
- readGenericRefinementRegion(rdw + syms[symID]->getWidth(),
- rdh + syms[symID]->getHeight(),
- templ, gFalse, syms[symID],
- refDX, refDY, atx, aty);
- //~ do we need to use the bmSize value here (in Huffman mode)?
- } else {
- symbolBitmap = syms[symID];
- }
-
- // combine the symbol bitmap into the region bitmap
- //~ something is wrong here - refCorner shouldn't degenerate into
- //~ two cases
- bw = symbolBitmap->getWidth() - 1;
- bh = symbolBitmap->getHeight() - 1;
- if (transposed) {
- switch (refCorner) {
- case 0: // bottom left
- bitmap->combine(symbolBitmap, tt, s, combOp);
- break;
- case 1: // top left
- bitmap->combine(symbolBitmap, tt, s, combOp);
- break;
- case 2: // bottom right
- bitmap->combine(symbolBitmap, tt - bw, s, combOp);
- break;
- case 3: // top right
- bitmap->combine(symbolBitmap, tt - bw, s, combOp);
- break;
- }
- s += bh;
- } else {
- switch (refCorner) {
- case 0: // bottom left
- bitmap->combine(symbolBitmap, s, tt - bh, combOp);
- break;
- case 1: // top left
- bitmap->combine(symbolBitmap, s, tt, combOp);
- break;
- case 2: // bottom right
- bitmap->combine(symbolBitmap, s, tt - bh, combOp);
- break;
- case 3: // top right
- bitmap->combine(symbolBitmap, s, tt, combOp);
- break;
- }
- s += bw;
- }
- if (ri) {
- delete symbolBitmap;
- }
-
- // next instance
- ++inst;
-
- // next S value
- if (huff) {
- if (!huffDecoder->decodeInt(&ds, huffDSTable)) {
- break;
- }
- } else {
- if (!arithDecoder->decodeInt(&ds, iadsStats)) {
- break;
- }
- }
- s += sOffset + ds;
- }
- }
-
- return bitmap;
-}
-
-void JBIG2Stream::readPatternDictSeg(Guint segNum, Guint length) {
- JBIG2PatternDict *patternDict;
- JBIG2Bitmap *bitmap;
- Guint flags, patternW, patternH, grayMax, templ, mmr;
- int atx[4], aty[4];
- Guint i, x;
-
- // halftone dictionary flags, pattern width and height, max gray value
- if (!readUByte(&flags) ||
- !readUByte(&patternW) ||
- !readUByte(&patternH) ||
- !readULong(&grayMax)) {
- goto eofError;
- }
- templ = (flags >> 1) & 3;
- mmr = flags & 1;
-
- // set up the arithmetic decoder
- if (!mmr) {
- resetGenericStats(templ, NULL);
- arithDecoder->start();
- }
-
- // read the bitmap
- atx[0] = -(int)patternW; aty[0] = 0;
- atx[1] = -3; aty[1] = -1;
- atx[2] = 2; aty[2] = -2;
- atx[3] = -2; aty[3] = -2;
- bitmap = readGenericBitmap(mmr, (grayMax + 1) * patternW, patternH,
- templ, gFalse, gFalse, NULL,
- atx, aty, length - 7);
-
- // create the pattern dict object
- patternDict = new JBIG2PatternDict(segNum, grayMax + 1);
-
- // split up the bitmap
- x = 0;
- for (i = 0; i <= grayMax; ++i) {
- patternDict->setBitmap(i, bitmap->getSlice(x, 0, patternW, patternH));
- x += patternW;
- }
-
- // free memory
- delete bitmap;
-
- // store the new pattern dict
- segments->append(patternDict);
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readHalftoneRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs, Guint nRefSegs) {
- JBIG2Bitmap *bitmap;
- JBIG2Segment *seg;
- JBIG2PatternDict *patternDict;
- JBIG2Bitmap *skipBitmap;
- Guint *grayImg;
- JBIG2Bitmap *grayBitmap;
- JBIG2Bitmap *patternBitmap;
- Guint w, h, x, y, segInfoFlags, extCombOp;
- Guint flags, mmr, templ, enableSkip, combOp;
- Guint gridW, gridH, stepX, stepY, patW, patH;
- int atx[4], aty[4];
- int gridX, gridY, xx, yy, bit, j;
- Guint bpp, m, n, i;
-
- // region segment info field
- if (!readULong(&w) || !readULong(&h) ||
- !readULong(&x) || !readULong(&y) ||
- !readUByte(&segInfoFlags)) {
- goto eofError;
- }
- extCombOp = segInfoFlags & 7;
-
- // rest of the halftone region header
- if (!readUByte(&flags)) {
- goto eofError;
- }
- mmr = flags & 1;
- templ = (flags >> 1) & 3;
- enableSkip = (flags >> 3) & 1;
- combOp = (flags >> 4) & 7;
- if (!readULong(&gridW) || !readULong(&gridH) ||
- !readLong(&gridX) || !readLong(&gridY) ||
- !readUWord(&stepX) || !readUWord(&stepY)) {
- goto eofError;
- }
-
- // get pattern dictionary
- if (nRefSegs != 1) {
- error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");
- return;
- }
- seg = findSegment(refSegs[0]);
- if (seg->getType() != jbig2SegPatternDict) {
- error(getPos(), "Bad symbol dictionary reference in JBIG2 halftone segment");
- return;
- }
- patternDict = (JBIG2PatternDict *)seg;
- bpp = 0;
- i = 1;
- while (i < patternDict->getSize()) {
- ++bpp;
- i <<= 1;
- }
- patW = patternDict->getBitmap(0)->getWidth();
- patH = patternDict->getBitmap(0)->getHeight();
-
- // set up the arithmetic decoder
- if (!mmr) {
- resetGenericStats(templ, NULL);
- arithDecoder->start();
- }
-
- // allocate the bitmap
- bitmap = new JBIG2Bitmap(segNum, w, h);
- if (flags & 0x80) { // HDEFPIXEL
- bitmap->clearToOne();
- } else {
- bitmap->clearToZero();
- }
-
- // compute the skip bitmap
- skipBitmap = NULL;
- if (enableSkip) {
- skipBitmap = new JBIG2Bitmap(0, gridW, gridH);
- skipBitmap->clearToZero();
- for (m = 0; m < gridH; ++m) {
- xx = gridX + m * stepY;
- yy = gridY + m * stepX;
- for (n = 0; n < gridW; ++n) {
- if (((xx + (int)patW) >> 8) <= 0 || (xx >> 8) >= (int)w ||
- ((yy + (int)patH) >> 8) <= 0 || (yy >> 8) >= (int)h) {
- skipBitmap->setPixel(n, m);
- }
- }
- }
- }
-
- // read the gray-scale image
- grayImg = (Guint *)gmalloc(gridW * gridH * sizeof(Guint));
- memset(grayImg, 0, gridW * gridH * sizeof(Guint));
- atx[0] = templ <= 1 ? 3 : 2; aty[0] = -1;
- atx[1] = -3; aty[1] = -1;
- atx[2] = 2; aty[2] = -2;
- atx[3] = -2; aty[3] = -2;
- for (j = bpp - 1; j >= 0; --j) {
- grayBitmap = readGenericBitmap(mmr, gridW, gridH, templ, gFalse,
- enableSkip, skipBitmap, atx, aty, -1);
- i = 0;
- for (m = 0; m < gridH; ++m) {
- for (n = 0; n < gridW; ++n) {
- bit = grayBitmap->getPixel(n, m) ^ (grayImg[i] & 1);
- grayImg[i] = (grayImg[i] << 1) | bit;
- ++i;
- }
- }
- delete grayBitmap;
- }
-
- // decode the image
- i = 0;
- for (m = 0; m < gridH; ++m) {
- xx = gridX + m * stepY;
- yy = gridY + m * stepX;
- for (n = 0; n < gridW; ++n) {
- if (!(enableSkip && skipBitmap->getPixel(n, m))) {
- patternBitmap = patternDict->getBitmap(grayImg[i]);
- bitmap->combine(patternBitmap, xx >> 8, yy >> 8, combOp);
- }
- xx += stepX;
- yy -= stepY;
- ++i;
- }
- }
-
- gfree(grayImg);
-
- // combine the region bitmap into the page bitmap
- if (imm) {
- if (pageH == 0xffffffff && y + h > curPageH) {
- pageBitmap->expand(y + h, pageDefPixel);
- }
- pageBitmap->combine(bitmap, x, y, extCombOp);
- delete bitmap;
-
- // store the region bitmap
- } else {
- segments->append(bitmap);
- }
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readGenericRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length) {
- JBIG2Bitmap *bitmap;
- Guint w, h, x, y, segInfoFlags, extCombOp;
- Guint flags, mmr, templ, tpgdOn;
- int atx[4], aty[4];
-
- // region segment info field
- if (!readULong(&w) || !readULong(&h) ||
- !readULong(&x) || !readULong(&y) ||
- !readUByte(&segInfoFlags)) {
- goto eofError;
- }
- extCombOp = segInfoFlags & 7;
-
- // rest of the generic region segment header
- if (!readUByte(&flags)) {
- goto eofError;
- }
- mmr = flags & 1;
- templ = (flags >> 1) & 3;
- tpgdOn = (flags >> 3) & 1;
-
- // AT flags
- if (!mmr) {
- if (templ == 0) {
- if (!readByte(&atx[0]) ||
- !readByte(&aty[0]) ||
- !readByte(&atx[1]) ||
- !readByte(&aty[1]) ||
- !readByte(&atx[2]) ||
- !readByte(&aty[2]) ||
- !readByte(&atx[3]) ||
- !readByte(&aty[3])) {
- goto eofError;
- }
- } else {
- if (!readByte(&atx[0]) ||
- !readByte(&aty[0])) {
- goto eofError;
- }
- }
- }
-
- // set up the arithmetic decoder
- if (!mmr) {
- resetGenericStats(templ, NULL);
- arithDecoder->start();
- }
-
- // read the bitmap
- bitmap = readGenericBitmap(mmr, w, h, templ, tpgdOn, gFalse,
- NULL, atx, aty, mmr ? 0 : length - 18);
-
- // combine the region bitmap into the page bitmap
- if (imm) {
- if (pageH == 0xffffffff && y + h > curPageH) {
- pageBitmap->expand(y + h, pageDefPixel);
- }
- pageBitmap->combine(bitmap, x, y, extCombOp);
- delete bitmap;
-
- // store the region bitmap
- } else {
- bitmap->setSegNum(segNum);
- segments->append(bitmap);
- }
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-JBIG2Bitmap *JBIG2Stream::readGenericBitmap(GBool mmr, int w, int h,
- int templ, GBool tpgdOn,
- GBool useSkip, JBIG2Bitmap *skip,
- int *atx, int *aty,
- int mmrDataLength) {
- JBIG2Bitmap *bitmap;
- GBool ltp;
- Guint ltpCX, cx, cx0, cx1, cx2;
- JBIG2BitmapPtr cxPtr0, cxPtr1;
- JBIG2BitmapPtr atPtr0, atPtr1, atPtr2, atPtr3;
- int *refLine, *codingLine;
- int code1, code2, code3;
- int x, y, a0, pix, i, refI, codingI;
-
- bitmap = new JBIG2Bitmap(0, w, h);
- bitmap->clearToZero();
-
- //----- MMR decode
-
- if (mmr) {
-
- mmrDecoder->reset();
- refLine = (int *)gmalloc((w + 2) * sizeof(int));
- codingLine = (int *)gmalloc((w + 2) * sizeof(int));
- codingLine[0] = codingLine[1] = w;
-
- for (y = 0; y < h; ++y) {
-
- // copy coding line to ref line
- for (i = 0; codingLine[i] < w; ++i) {
- refLine[i] = codingLine[i];
- }
- refLine[i] = refLine[i + 1] = w;
-
- // decode a line
- refI = 0; // b1 = refLine[refI]
- codingI = 0; // a1 = codingLine[codingI]
- a0 = 0;
- do {
- code1 = mmrDecoder->get2DCode();
- switch (code1) {
- case twoDimPass:
- if (refLine[refI] < w) {
- a0 = refLine[refI + 1];
- refI += 2;
- }
- break;
- case twoDimHoriz:
- if (codingI & 1) {
- code1 = 0;
- do {
- code1 += code3 = mmrDecoder->getBlackCode();
- } while (code3 >= 64);
- code2 = 0;
- do {
- code2 += code3 = mmrDecoder->getWhiteCode();
- } while (code3 >= 64);
- } else {
- code1 = 0;
- do {
- code1 += code3 = mmrDecoder->getWhiteCode();
- } while (code3 >= 64);
- code2 = 0;
- do {
- code2 += code3 = mmrDecoder->getBlackCode();
- } while (code3 >= 64);
- }
- if (code1 > 0 || code2 > 0) {
- a0 = codingLine[codingI++] = a0 + code1;
- a0 = codingLine[codingI++] = a0 + code2;
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- }
- break;
- case twoDimVert0:
- a0 = codingLine[codingI++] = refLine[refI];
- if (refLine[refI] < w) {
- ++refI;
- }
- break;
- case twoDimVertR1:
- a0 = codingLine[codingI++] = refLine[refI] + 1;
- if (refLine[refI] < w) {
- ++refI;
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- }
- break;
- case twoDimVertR2:
- a0 = codingLine[codingI++] = refLine[refI] + 2;
- if (refLine[refI] < w) {
- ++refI;
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- }
- break;
- case twoDimVertR3:
- a0 = codingLine[codingI++] = refLine[refI] + 3;
- if (refLine[refI] < w) {
- ++refI;
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- }
- break;
- case twoDimVertL1:
- a0 = codingLine[codingI++] = refLine[refI] - 1;
- if (refI > 0) {
- --refI;
- } else {
- ++refI;
- }
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- break;
- case twoDimVertL2:
- a0 = codingLine[codingI++] = refLine[refI] - 2;
- if (refI > 0) {
- --refI;
- } else {
- ++refI;
- }
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- break;
- case twoDimVertL3:
- a0 = codingLine[codingI++] = refLine[refI] - 3;
- if (refI > 0) {
- --refI;
- } else {
- ++refI;
- }
- while (refLine[refI] <= a0 && refLine[refI] < w) {
- refI += 2;
- }
- break;
- default:
- error(getPos(), "Illegal code in JBIG2 MMR bitmap data");
- break;
- }
- } while (a0 < w);
- codingLine[codingI++] = w;
-
- // convert the run lengths to a bitmap line
- i = 0;
- while (codingLine[i] < w) {
- for (x = codingLine[i]; x < codingLine[i+1]; ++x) {
- bitmap->setPixel(x, y);
- }
- i += 2;
- }
- }
-
- if (mmrDataLength >= 0) {
- mmrDecoder->skipTo(mmrDataLength);
- } else {
- if (mmrDecoder->get24Bits() != 0x001001) {
- error(getPos(), "Missing EOFB in JBIG2 MMR bitmap data");
- }
- }
-
- gfree(refLine);
- gfree(codingLine);
-
- //----- arithmetic decode
-
- } else {
- // set up the typical row context
- ltpCX = 0; // make gcc happy
- if (tpgdOn) {
- switch (templ) {
- case 0:
- ltpCX = 0x3953; // 001 11001 0101 0011
- break;
- case 1:
- ltpCX = 0x079a; // 0011 11001 101 0
- break;
- case 2:
- ltpCX = 0x0e3; // 001 1100 01 1
- break;
- case 3:
- ltpCX = 0x18a; // 01100 0101 1
- break;
- }
- }
-
- ltp = 0;
- cx = cx0 = cx1 = cx2 = 0; // make gcc happy
- for (y = 0; y < h; ++y) {
-
- // check for a "typical" (duplicate) row
- if (tpgdOn) {
- if (arithDecoder->decodeBit(ltpCX, genericRegionStats)) {
- ltp = !ltp;
- }
- if (ltp) {
- bitmap->duplicateRow(y, y-1);
- continue;
- }
- }
-
- switch (templ) {
- case 0:
-
- // set up the context
- bitmap->getPixelPtr(0, y-2, &cxPtr0);
- cx0 = bitmap->nextPixel(&cxPtr0);
- cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0);
- bitmap->getPixelPtr(0, y-1, &cxPtr1);
- cx1 = bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx2 = 0;
- bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0);
- bitmap->getPixelPtr(atx[1], y + aty[1], &atPtr1);
- bitmap->getPixelPtr(atx[2], y + aty[2], &atPtr2);
- bitmap->getPixelPtr(atx[3], y + aty[3], &atPtr3);
-
- // decode the row
- for (x = 0; x < w; ++x) {
-
- // build the context
- cx = (cx0 << 13) | (cx1 << 8) | (cx2 << 4) |
- (bitmap->nextPixel(&atPtr0) << 3) |
- (bitmap->nextPixel(&atPtr1) << 2) |
- (bitmap->nextPixel(&atPtr2) << 1) |
- bitmap->nextPixel(&atPtr3);
-
- // check for a skipped pixel
- if (useSkip && skip->getPixel(x, y)) {
- pix = 0;
-
- // decode the pixel
- } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
- bitmap->setPixel(x, y);
- }
-
- // update the context
- cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07;
- cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f;
- cx2 = ((cx2 << 1) | pix) & 0x0f;
- }
- break;
-
- case 1:
-
- // set up the context
- bitmap->getPixelPtr(0, y-2, &cxPtr0);
- cx0 = bitmap->nextPixel(&cxPtr0);
- cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0);
- cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0);
- bitmap->getPixelPtr(0, y-1, &cxPtr1);
- cx1 = bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx2 = 0;
- bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0);
-
- // decode the row
- for (x = 0; x < w; ++x) {
-
- // build the context
- cx = (cx0 << 9) | (cx1 << 4) | (cx2 << 1) |
- bitmap->nextPixel(&atPtr0);
-
- // check for a skipped pixel
- if (useSkip && skip->getPixel(x, y)) {
- pix = 0;
-
- // decode the pixel
- } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
- bitmap->setPixel(x, y);
- }
-
- // update the context
- cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x0f;
- cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f;
- cx2 = ((cx2 << 1) | pix) & 0x07;
- }
- break;
-
- case 2:
-
- // set up the context
- bitmap->getPixelPtr(0, y-2, &cxPtr0);
- cx0 = bitmap->nextPixel(&cxPtr0);
- cx0 = (cx0 << 1) | bitmap->nextPixel(&cxPtr0);
- bitmap->getPixelPtr(0, y-1, &cxPtr1);
- cx1 = bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx2 = 0;
- bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0);
-
- // decode the row
- for (x = 0; x < w; ++x) {
-
- // build the context
- cx = (cx0 << 7) | (cx1 << 3) | (cx2 << 1) |
- bitmap->nextPixel(&atPtr0);
-
- // check for a skipped pixel
- if (useSkip && skip->getPixel(x, y)) {
- pix = 0;
-
- // decode the pixel
- } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
- bitmap->setPixel(x, y);
- }
-
- // update the context
- cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 0x07;
- cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x0f;
- cx2 = ((cx2 << 1) | pix) & 0x03;
- }
- break;
-
- case 3:
-
- // set up the context
- bitmap->getPixelPtr(0, y-1, &cxPtr1);
- cx1 = bitmap->nextPixel(&cxPtr1);
- cx1 = (cx1 << 1) | bitmap->nextPixel(&cxPtr1);
- cx2 = 0;
- bitmap->getPixelPtr(atx[0], y + aty[0], &atPtr0);
-
- // decode the row
- for (x = 0; x < w; ++x) {
-
- // build the context
- cx = (cx1 << 5) | (cx2 << 1) |
- bitmap->nextPixel(&atPtr0);
-
- // check for a skipped pixel
- if (useSkip && skip->getPixel(x, y)) {
- pix = 0;
-
- // decode the pixel
- } else if ((pix = arithDecoder->decodeBit(cx, genericRegionStats))) {
- bitmap->setPixel(x, y);
- }
-
- // update the context
- cx1 = ((cx1 << 1) | bitmap->nextPixel(&cxPtr1)) & 0x1f;
- cx2 = ((cx2 << 1) | pix) & 0x0f;
- }
- break;
- }
- }
- }
-
- return bitmap;
-}
-
-void JBIG2Stream::readGenericRefinementRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs,
- Guint nRefSegs) {
- JBIG2Bitmap *bitmap, *refBitmap;
- Guint w, h, x, y, segInfoFlags, extCombOp;
- Guint flags, templ, tpgrOn;
- int atx[2], aty[2];
- JBIG2Segment *seg;
-
- // region segment info field
- if (!readULong(&w) || !readULong(&h) ||
- !readULong(&x) || !readULong(&y) ||
- !readUByte(&segInfoFlags)) {
- goto eofError;
- }
- extCombOp = segInfoFlags & 7;
-
- // rest of the generic refinement region segment header
- if (!readUByte(&flags)) {
- goto eofError;
- }
- templ = flags & 1;
- tpgrOn = (flags >> 1) & 1;
-
- // AT flags
- if (!templ) {
- if (!readByte(&atx[0]) || !readByte(&aty[0]) ||
- !readByte(&atx[1]) || !readByte(&aty[1])) {
- goto eofError;
- }
- }
-
- // resize the page bitmap if needed
- if (nRefSegs == 0 || imm) {
- if (pageH == 0xffffffff && y + h > curPageH) {
- pageBitmap->expand(y + h, pageDefPixel);
- }
- }
-
- // get referenced bitmap
- if (nRefSegs > 1) {
- error(getPos(), "Bad reference in JBIG2 generic refinement segment");
- return;
- }
- if (nRefSegs == 1) {
- seg = findSegment(refSegs[0]);
- if (seg->getType() != jbig2SegBitmap) {
- error(getPos(), "Bad bitmap reference in JBIG2 generic refinement segment");
- return;
- }
- refBitmap = (JBIG2Bitmap *)seg;
- } else {
- refBitmap = pageBitmap->getSlice(x, y, w, h);
- }
-
- // set up the arithmetic decoder
- resetRefinementStats(templ, NULL);
- arithDecoder->start();
-
- // read
- bitmap = readGenericRefinementRegion(w, h, templ, tpgrOn,
- refBitmap, 0, 0, atx, aty);
-
- // combine the region bitmap into the page bitmap
- if (imm) {
- pageBitmap->combine(bitmap, x, y, extCombOp);
- delete bitmap;
-
- // store the region bitmap
- } else {
- bitmap->setSegNum(segNum);
- segments->append(bitmap);
- }
-
- // delete the referenced bitmap
- if (nRefSegs == 1) {
- discardSegment(refSegs[0]);
- } else {
- delete refBitmap;
- }
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-JBIG2Bitmap *JBIG2Stream::readGenericRefinementRegion(int w, int h,
- int templ, GBool tpgrOn,
- JBIG2Bitmap *refBitmap,
- int refDX, int refDY,
- int *atx, int *aty) {
- JBIG2Bitmap *bitmap;
- GBool ltp;
- Guint ltpCX, cx, cx0, cx2, cx3, cx4, tpgrCX0, tpgrCX1, tpgrCX2;
- JBIG2BitmapPtr cxPtr0, cxPtr1, cxPtr2, cxPtr3, cxPtr4, cxPtr5, cxPtr6;
- JBIG2BitmapPtr tpgrCXPtr0, tpgrCXPtr1, tpgrCXPtr2;
- int x, y, pix;
-
- bitmap = new JBIG2Bitmap(0, w, h);
- bitmap->clearToZero();
-
- // set up the typical row context
- if (templ) {
- ltpCX = 0x008;
- } else {
- ltpCX = 0x0010;
- }
-
- ltp = 0;
- for (y = 0; y < h; ++y) {
-
- if (templ) {
-
- // set up the context
- bitmap->getPixelPtr(0, y-1, &cxPtr0);
- cx0 = bitmap->nextPixel(&cxPtr0);
- bitmap->getPixelPtr(-1, y, &cxPtr1);
- refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2);
- refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3);
- cx3 = refBitmap->nextPixel(&cxPtr3);
- cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3);
- refBitmap->getPixelPtr(-refDX, y+1-refDY, &cxPtr4);
- cx4 = refBitmap->nextPixel(&cxPtr4);
-
- // set up the typical prediction context
- tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy
- if (tpgrOn) {
- refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0);
- tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0);
- tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
- tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
- refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1);
- tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1);
- tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
- tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
- refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2);
- tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2);
- tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
- tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
- }
-
- for (x = 0; x < w; ++x) {
-
- // update the context
- cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 7;
- cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7;
- cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 3;
-
- if (tpgrOn) {
- // update the typical predictor context
- tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7;
- tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7;
- tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7;
-
- // check for a "typical" pixel
- if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) {
- ltp = !ltp;
- }
- if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) {
- bitmap->clearPixel(x, y);
- continue;
- } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) {
- bitmap->setPixel(x, y);
- continue;
- }
- }
-
- // build the context
- cx = (cx0 << 7) | (bitmap->nextPixel(&cxPtr1) << 6) |
- (refBitmap->nextPixel(&cxPtr2) << 5) |
- (cx3 << 2) | cx4;
-
- // decode the pixel
- if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) {
- bitmap->setPixel(x, y);
- }
- }
-
- } else {
-
- // set up the context
- bitmap->getPixelPtr(0, y-1, &cxPtr0);
- cx0 = bitmap->nextPixel(&cxPtr0);
- bitmap->getPixelPtr(-1, y, &cxPtr1);
- refBitmap->getPixelPtr(-refDX, y-1-refDY, &cxPtr2);
- cx2 = refBitmap->nextPixel(&cxPtr2);
- refBitmap->getPixelPtr(-1-refDX, y-refDY, &cxPtr3);
- cx3 = refBitmap->nextPixel(&cxPtr3);
- cx3 = (cx3 << 1) | refBitmap->nextPixel(&cxPtr3);
- refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &cxPtr4);
- cx4 = refBitmap->nextPixel(&cxPtr4);
- cx4 = (cx4 << 1) | refBitmap->nextPixel(&cxPtr4);
- bitmap->getPixelPtr(atx[0], y+aty[0], &cxPtr5);
- refBitmap->getPixelPtr(atx[1]-refDX, y+aty[1]-refDY, &cxPtr6);
-
- // set up the typical prediction context
- tpgrCX0 = tpgrCX1 = tpgrCX2 = 0; // make gcc happy
- if (tpgrOn) {
- refBitmap->getPixelPtr(-1-refDX, y-1-refDY, &tpgrCXPtr0);
- tpgrCX0 = refBitmap->nextPixel(&tpgrCXPtr0);
- tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
- tpgrCX0 = (tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0);
- refBitmap->getPixelPtr(-1-refDX, y-refDY, &tpgrCXPtr1);
- tpgrCX1 = refBitmap->nextPixel(&tpgrCXPtr1);
- tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
- tpgrCX1 = (tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1);
- refBitmap->getPixelPtr(-1-refDX, y+1-refDY, &tpgrCXPtr2);
- tpgrCX2 = refBitmap->nextPixel(&tpgrCXPtr2);
- tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
- tpgrCX2 = (tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2);
- }
-
- for (x = 0; x < w; ++x) {
-
- // update the context
- cx0 = ((cx0 << 1) | bitmap->nextPixel(&cxPtr0)) & 3;
- cx2 = ((cx2 << 1) | refBitmap->nextPixel(&cxPtr2)) & 3;
- cx3 = ((cx3 << 1) | refBitmap->nextPixel(&cxPtr3)) & 7;
- cx4 = ((cx4 << 1) | refBitmap->nextPixel(&cxPtr4)) & 7;
-
- if (tpgrOn) {
- // update the typical predictor context
- tpgrCX0 = ((tpgrCX0 << 1) | refBitmap->nextPixel(&tpgrCXPtr0)) & 7;
- tpgrCX1 = ((tpgrCX1 << 1) | refBitmap->nextPixel(&tpgrCXPtr1)) & 7;
- tpgrCX2 = ((tpgrCX2 << 1) | refBitmap->nextPixel(&tpgrCXPtr2)) & 7;
-
- // check for a "typical" pixel
- if (arithDecoder->decodeBit(ltpCX, refinementRegionStats)) {
- ltp = !ltp;
- }
- if (tpgrCX0 == 0 && tpgrCX1 == 0 && tpgrCX2 == 0) {
- bitmap->clearPixel(x, y);
- continue;
- } else if (tpgrCX0 == 7 && tpgrCX1 == 7 && tpgrCX2 == 7) {
- bitmap->setPixel(x, y);
- continue;
- }
- }
-
- // build the context
- cx = (cx0 << 11) | (bitmap->nextPixel(&cxPtr1) << 10) |
- (cx2 << 8) | (cx3 << 5) | (cx4 << 2) |
- (bitmap->nextPixel(&cxPtr5) << 1) |
- refBitmap->nextPixel(&cxPtr6);
-
- // decode the pixel
- if ((pix = arithDecoder->decodeBit(cx, refinementRegionStats))) {
- bitmap->setPixel(x, y);
- }
- }
- }
- }
-
- return bitmap;
-}
-
-void JBIG2Stream::readPageInfoSeg(Guint length) {
- Guint xRes, yRes, flags, striping;
-
- if (!readULong(&pageW) || !readULong(&pageH) ||
- !readULong(&xRes) || !readULong(&yRes) ||
- !readUByte(&flags) || !readUWord(&striping)) {
- goto eofError;
- }
- pageDefPixel = (flags >> 2) & 1;
- defCombOp = (flags >> 3) & 3;
-
- // allocate the page bitmap
- if (pageH == 0xffffffff) {
- curPageH = striping & 0x7fff;
- } else {
- curPageH = pageH;
- }
- pageBitmap = new JBIG2Bitmap(0, pageW, curPageH);
-
- // default pixel value
- if (pageDefPixel) {
- pageBitmap->clearToOne();
- } else {
- pageBitmap->clearToZero();
- }
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readEndOfStripeSeg(Guint length) {
- Guint i;
-
- // skip the segment
- for (i = 0; i < length; ++i) {
- curStr->getChar();
- }
-}
-
-void JBIG2Stream::readProfilesSeg(Guint length) {
- Guint i;
-
- // skip the segment
- for (i = 0; i < length; ++i) {
- curStr->getChar();
- }
-}
-
-void JBIG2Stream::readCodeTableSeg(Guint segNum, Guint length) {
- JBIG2HuffmanTable *huffTab;
- Guint flags, oob, prefixBits, rangeBits;
- int lowVal, highVal, val;
- Guint huffTabSize, i;
-
- if (!readUByte(&flags) || !readLong(&lowVal) || !readLong(&highVal)) {
- goto eofError;
- }
- oob = flags & 1;
- prefixBits = ((flags >> 1) & 7) + 1;
- rangeBits = ((flags >> 4) & 7) + 1;
-
- huffDecoder->reset();
- huffTabSize = 8;
- huffTab = (JBIG2HuffmanTable *)
- gmalloc(huffTabSize * sizeof(JBIG2HuffmanTable));
- i = 0;
- val = lowVal;
- while (val < highVal) {
- if (i == huffTabSize) {
- huffTabSize *= 2;
- huffTab = (JBIG2HuffmanTable *)
- grealloc(huffTab, huffTabSize * sizeof(JBIG2HuffmanTable));
- }
- huffTab[i].val = val;
- huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
- huffTab[i].rangeLen = huffDecoder->readBits(rangeBits);
- val += 1 << huffTab[i].rangeLen;
- ++i;
- }
- if (i + oob + 3 > huffTabSize) {
- huffTabSize = i + oob + 3;
- huffTab = (JBIG2HuffmanTable *)
- grealloc(huffTab, huffTabSize * sizeof(JBIG2HuffmanTable));
- }
- huffTab[i].val = lowVal - 1;
- huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
- huffTab[i].rangeLen = jbig2HuffmanLOW;
- ++i;
- huffTab[i].val = highVal;
- huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
- huffTab[i].rangeLen = 32;
- ++i;
- if (oob) {
- huffTab[i].val = 0;
- huffTab[i].prefixLen = huffDecoder->readBits(prefixBits);
- huffTab[i].rangeLen = jbig2HuffmanOOB;
- ++i;
- }
- huffTab[i].val = 0;
- huffTab[i].prefixLen = 0;
- huffTab[i].rangeLen = jbig2HuffmanEOT;
- huffDecoder->buildTable(huffTab, i);
-
- // create and store the new table segment
- segments->append(new JBIG2CodeTable(segNum, huffTab));
-
- return;
-
- eofError:
- error(getPos(), "Unexpected EOF in JBIG2 stream");
-}
-
-void JBIG2Stream::readExtensionSeg(Guint length) {
- Guint i;
-
- // skip the segment
- for (i = 0; i < length; ++i) {
- curStr->getChar();
- }
-}
-
-JBIG2Segment *JBIG2Stream::findSegment(Guint segNum) {
- JBIG2Segment *seg;
- int i;
-
- for (i = 0; i < globalSegments->getLength(); ++i) {
- seg = (JBIG2Segment *)globalSegments->get(i);
- if (seg->getSegNum() == segNum) {
- return seg;
- }
- }
- for (i = 0; i < segments->getLength(); ++i) {
- seg = (JBIG2Segment *)segments->get(i);
- if (seg->getSegNum() == segNum) {
- return seg;
- }
- }
- return NULL;
-}
-
-void JBIG2Stream::discardSegment(Guint segNum) {
- JBIG2Segment *seg;
- int i;
-
- for (i = 0; i < globalSegments->getLength(); ++i) {
- seg = (JBIG2Segment *)globalSegments->get(i);
- if (seg->getSegNum() == segNum) {
- globalSegments->del(i);
- return;
- }
- }
- for (i = 0; i < segments->getLength(); ++i) {
- seg = (JBIG2Segment *)segments->get(i);
- if (seg->getSegNum() == segNum) {
- segments->del(i);
- return;
- }
- }
-}
-
-void JBIG2Stream::resetGenericStats(Guint templ,
- JArithmeticDecoderStats *prevStats) {
- int size;
-
- size = contextSize[templ];
- if (prevStats && prevStats->getContextSize() == size) {
- if (genericRegionStats->getContextSize() == size) {
- genericRegionStats->copyFrom(prevStats);
- } else {
- delete genericRegionStats;
- genericRegionStats = prevStats->copy();
- }
- } else {
- if (genericRegionStats->getContextSize() == size) {
- genericRegionStats->reset();
- } else {
- delete genericRegionStats;
- genericRegionStats = new JArithmeticDecoderStats(1 << size);
- }
- }
-}
-
-void JBIG2Stream::resetRefinementStats(Guint templ,
- JArithmeticDecoderStats *prevStats) {
- int size;
-
- size = refContextSize[templ];
- if (prevStats && prevStats->getContextSize() == size) {
- if (refinementRegionStats->getContextSize() == size) {
- refinementRegionStats->copyFrom(prevStats);
- } else {
- delete refinementRegionStats;
- refinementRegionStats = prevStats->copy();
- }
- } else {
- if (refinementRegionStats->getContextSize() == size) {
- refinementRegionStats->reset();
- } else {
- delete refinementRegionStats;
- refinementRegionStats = new JArithmeticDecoderStats(1 << size);
- }
- }
-}
-
-void JBIG2Stream::resetIntStats(int symCodeLen) {
- iadhStats->reset();
- iadwStats->reset();
- iaexStats->reset();
- iaaiStats->reset();
- iadtStats->reset();
- iaitStats->reset();
- iafsStats->reset();
- iadsStats->reset();
- iardxStats->reset();
- iardyStats->reset();
- iardwStats->reset();
- iardhStats->reset();
- iariStats->reset();
- if (iaidStats->getContextSize() == symCodeLen + 1) {
- iaidStats->reset();
- } else {
- delete iaidStats;
- iaidStats = new JArithmeticDecoderStats(1 << (symCodeLen + 1));
- }
-}
-
-GBool JBIG2Stream::readUByte(Guint *x) {
- int c0;
-
- if ((c0 = curStr->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)c0;
- return gTrue;
-}
-
-GBool JBIG2Stream::readByte(int *x) {
- int c0;
-
- if ((c0 = curStr->getChar()) == EOF) {
- return gFalse;
- }
- *x = c0;
- if (c0 & 0x80) {
- *x |= -1 - 0xff;
- }
- return gTrue;
-}
-
-GBool JBIG2Stream::readUWord(Guint *x) {
- int c0, c1;
-
- if ((c0 = curStr->getChar()) == EOF ||
- (c1 = curStr->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)((c0 << 8) | c1);
- return gTrue;
-}
-
-GBool JBIG2Stream::readULong(Guint *x) {
- int c0, c1, c2, c3;
-
- if ((c0 = curStr->getChar()) == EOF ||
- (c1 = curStr->getChar()) == EOF ||
- (c2 = curStr->getChar()) == EOF ||
- (c3 = curStr->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
- return gTrue;
-}
-
-GBool JBIG2Stream::readLong(int *x) {
- int c0, c1, c2, c3;
-
- if ((c0 = curStr->getChar()) == EOF ||
- (c1 = curStr->getChar()) == EOF ||
- (c2 = curStr->getChar()) == EOF ||
- (c3 = curStr->getChar()) == EOF) {
- return gFalse;
- }
- *x = ((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
- if (c0 & 0x80) {
- *x |= -1 - (int)0xffffffff;
- }
- return gTrue;
-}
diff --git a/pdf/xpdf/JBIG2Stream.h b/pdf/xpdf/JBIG2Stream.h
deleted file mode 100644
index ed26d4e..0000000
--- a/pdf/xpdf/JBIG2Stream.h
+++ /dev/null
@@ -1,143 +0,0 @@
-//========================================================================
-//
-// JBIG2Stream.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef JBIG2STREAM_H
-#define JBIG2STREAM_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-#include "Stream.h"
-
-class GList;
-class JBIG2Segment;
-class JBIG2Bitmap;
-class JArithmeticDecoder;
-class JArithmeticDecoderStats;
-class JBIG2HuffmanDecoder;
-struct JBIG2HuffmanTable;
-class JBIG2MMRDecoder;
-
-//------------------------------------------------------------------------
-
-class JBIG2Stream: public FilterStream {
-public:
-
- JBIG2Stream(Stream *strA, Object *globalsStream);
- virtual ~JBIG2Stream();
- virtual StreamKind getKind() { return strJBIG2; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- void readSegments();
- void readSymbolDictSeg(Guint segNum, Guint length,
- Guint *refSegs, Guint nRefSegs);
- void readTextRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs, Guint nRefSegs);
- JBIG2Bitmap *readTextRegion(GBool huff, GBool refine,
- int w, int h,
- Guint numInstances,
- Guint logStrips,
- int numSyms,
- JBIG2HuffmanTable *symCodeTab,
- Guint symCodeLen,
- JBIG2Bitmap **syms,
- Guint defPixel, Guint combOp,
- Guint transposed, Guint refCorner,
- int sOffset,
- JBIG2HuffmanTable *huffFSTable,
- JBIG2HuffmanTable *huffDSTable,
- JBIG2HuffmanTable *huffDTTable,
- JBIG2HuffmanTable *huffRDWTable,
- JBIG2HuffmanTable *huffRDHTable,
- JBIG2HuffmanTable *huffRDXTable,
- JBIG2HuffmanTable *huffRDYTable,
- JBIG2HuffmanTable *huffRSizeTable,
- Guint templ,
- int *atx, int *aty);
- void readPatternDictSeg(Guint segNum, Guint length);
- void readHalftoneRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs, Guint nRefSegs);
- void readGenericRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length);
- JBIG2Bitmap *readGenericBitmap(GBool mmr, int w, int h,
- int templ, GBool tpgdOn,
- GBool useSkip, JBIG2Bitmap *skip,
- int *atx, int *aty,
- int mmrDataLength);
- void readGenericRefinementRegionSeg(Guint segNum, GBool imm,
- GBool lossless, Guint length,
- Guint *refSegs,
- Guint nRefSegs);
- JBIG2Bitmap *readGenericRefinementRegion(int w, int h,
- int templ, GBool tpgrOn,
- JBIG2Bitmap *refBitmap,
- int refDX, int refDY,
- int *atx, int *aty);
- void readPageInfoSeg(Guint length);
- void readEndOfStripeSeg(Guint length);
- void readProfilesSeg(Guint length);
- void readCodeTableSeg(Guint segNum, Guint length);
- void readExtensionSeg(Guint length);
- JBIG2Segment *findSegment(Guint segNum);
- void discardSegment(Guint segNum);
- void resetGenericStats(Guint templ,
- JArithmeticDecoderStats *prevStats);
- void resetRefinementStats(Guint templ,
- JArithmeticDecoderStats *prevStats);
- void resetIntStats(int symCodeLen);
- GBool readUByte(Guint *x);
- GBool readByte(int *x);
- GBool readUWord(Guint *x);
- GBool readULong(Guint *x);
- GBool readLong(int *x);
-
- Guint pageW, pageH, curPageH;
- Guint pageDefPixel;
- JBIG2Bitmap *pageBitmap;
- Guint defCombOp;
- GList *segments; // [JBIG2Segment]
- GList *globalSegments; // [JBIG2Segment]
- Stream *curStr;
- Guchar *dataPtr;
- Guchar *dataEnd;
-
- JArithmeticDecoder *arithDecoder;
- JArithmeticDecoderStats *genericRegionStats;
- JArithmeticDecoderStats *refinementRegionStats;
- JArithmeticDecoderStats *iadhStats;
- JArithmeticDecoderStats *iadwStats;
- JArithmeticDecoderStats *iaexStats;
- JArithmeticDecoderStats *iaaiStats;
- JArithmeticDecoderStats *iadtStats;
- JArithmeticDecoderStats *iaitStats;
- JArithmeticDecoderStats *iafsStats;
- JArithmeticDecoderStats *iadsStats;
- JArithmeticDecoderStats *iardxStats;
- JArithmeticDecoderStats *iardyStats;
- JArithmeticDecoderStats *iardwStats;
- JArithmeticDecoderStats *iardhStats;
- JArithmeticDecoderStats *iariStats;
- JArithmeticDecoderStats *iaidStats;
- JBIG2HuffmanDecoder *huffDecoder;
- JBIG2MMRDecoder *mmrDecoder;
-};
-
-#endif
diff --git a/pdf/xpdf/JPXStream.cc b/pdf/xpdf/JPXStream.cc
deleted file mode 100644
index defa7d2..0000000
--- a/pdf/xpdf/JPXStream.cc
+++ /dev/null
@@ -1,2822 +0,0 @@
-//========================================================================
-//
-// JPXStream.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "Error.h"
-#include "JArithmeticDecoder.h"
-#include "JPXStream.h"
-
-//~ to do:
-// - precincts
-// - ROI
-// - progression order changes
-// - packed packet headers
-// - support for palettes, channel maps, etc.
-// - make sure all needed JP2/JPX subboxes are parsed (readBoxes)
-// - can we assume that QCC segments must come after the QCD segment?
-// - skip EPH markers (readTilePartData)
-// - handle tilePartToEOC in readTilePartData
-// - deal with multiple codeword segments (readTilePartData,
-// readCodeBlockData)
-// - progression orders 2, 3, and 4
-// - in coefficient decoding (readCodeBlockData):
-// - termination pattern: terminate after every coding pass
-// - error resilience segmentation symbol
-// - selective arithmetic coding bypass
-// - vertically causal context formation
-// - coeffs longer than 31 bits (should just ignore the extra bits?)
-// - handle boxes larger than 2^32 bytes
-// - the fixed-point arithmetic won't handle 16-bit pixels
-
-//------------------------------------------------------------------------
-
-// number of contexts for the arithmetic decoder
-#define jpxNContexts 19
-
-#define jpxContextSigProp 0 // 0 - 8: significance prop and cleanup
-#define jpxContextSign 9 // 9 - 13: sign
-#define jpxContextMagRef 14 // 14 -16: magnitude refinement
-#define jpxContextRunLength 17 // cleanup: run length
-#define jpxContextUniform 18 // cleanup: first signif coeff
-
-//------------------------------------------------------------------------
-
-#define jpxPassSigProp 0
-#define jpxPassMagRef 1
-#define jpxPassCleanup 2
-
-//------------------------------------------------------------------------
-
-// arithmetic decoder context for the significance propagation and
-// cleanup passes:
-// [horiz][vert][diag][subband]
-// where subband = 0 for HL
-// = 1 for LH and LL
-// = 2 for HH
-static Guint sigPropContext[3][3][5][3] = {
- {{{ 0, 0, 0 }, // horiz=0, vert=0, diag=0
- { 1, 1, 3 }, // horiz=0, vert=0, diag=1
- { 2, 2, 6 }, // horiz=0, vert=0, diag=2
- { 2, 2, 8 }, // horiz=0, vert=0, diag=3
- { 2, 2, 8 }}, // horiz=0, vert=0, diag=4
- {{ 5, 3, 1 }, // horiz=0, vert=1, diag=0
- { 6, 3, 4 }, // horiz=0, vert=1, diag=1
- { 6, 3, 7 }, // horiz=0, vert=1, diag=2
- { 6, 3, 8 }, // horiz=0, vert=1, diag=3
- { 6, 3, 8 }}, // horiz=0, vert=1, diag=4
- {{ 8, 4, 2 }, // horiz=0, vert=2, diag=0
- { 8, 4, 5 }, // horiz=0, vert=2, diag=1
- { 8, 4, 7 }, // horiz=0, vert=2, diag=2
- { 8, 4, 8 }, // horiz=0, vert=2, diag=3
- { 8, 4, 8 }}}, // horiz=0, vert=2, diag=4
- {{{ 3, 5, 1 }, // horiz=1, vert=0, diag=0
- { 3, 6, 4 }, // horiz=1, vert=0, diag=1
- { 3, 6, 7 }, // horiz=1, vert=0, diag=2
- { 3, 6, 8 }, // horiz=1, vert=0, diag=3
- { 3, 6, 8 }}, // horiz=1, vert=0, diag=4
- {{ 7, 7, 2 }, // horiz=1, vert=1, diag=0
- { 7, 7, 5 }, // horiz=1, vert=1, diag=1
- { 7, 7, 7 }, // horiz=1, vert=1, diag=2
- { 7, 7, 8 }, // horiz=1, vert=1, diag=3
- { 7, 7, 8 }}, // horiz=1, vert=1, diag=4
- {{ 8, 7, 2 }, // horiz=1, vert=2, diag=0
- { 8, 7, 5 }, // horiz=1, vert=2, diag=1
- { 8, 7, 7 }, // horiz=1, vert=2, diag=2
- { 8, 7, 8 }, // horiz=1, vert=2, diag=3
- { 8, 7, 8 }}}, // horiz=1, vert=2, diag=4
- {{{ 4, 8, 2 }, // horiz=2, vert=0, diag=0
- { 4, 8, 5 }, // horiz=2, vert=0, diag=1
- { 4, 8, 7 }, // horiz=2, vert=0, diag=2
- { 4, 8, 8 }, // horiz=2, vert=0, diag=3
- { 4, 8, 8 }}, // horiz=2, vert=0, diag=4
- {{ 7, 8, 2 }, // horiz=2, vert=1, diag=0
- { 7, 8, 5 }, // horiz=2, vert=1, diag=1
- { 7, 8, 7 }, // horiz=2, vert=1, diag=2
- { 7, 8, 8 }, // horiz=2, vert=1, diag=3
- { 7, 8, 8 }}, // horiz=2, vert=1, diag=4
- {{ 8, 8, 2 }, // horiz=2, vert=2, diag=0
- { 8, 8, 5 }, // horiz=2, vert=2, diag=1
- { 8, 8, 7 }, // horiz=2, vert=2, diag=2
- { 8, 8, 8 }, // horiz=2, vert=2, diag=3
- { 8, 8, 8 }}} // horiz=2, vert=2, diag=4
-};
-
-// arithmetic decoder context and xor bit for the sign bit in the
-// significance propagation pass:
-// [horiz][vert][k]
-// where horiz/vert are offset by 2 (i.e., range is -2 .. 2)
-// and k = 0 for the context
-// = 1 for the xor bit
-static Guint signContext[5][5][2] = {
- {{ 13, 1 }, // horiz=-2, vert=-2
- { 13, 1 }, // horiz=-2, vert=-1
- { 12, 1 }, // horiz=-2, vert= 0
- { 11, 1 }, // horiz=-2, vert=+1
- { 11, 1 }}, // horiz=-2, vert=+2
- {{ 13, 1 }, // horiz=-1, vert=-2
- { 13, 1 }, // horiz=-1, vert=-1
- { 12, 1 }, // horiz=-1, vert= 0
- { 11, 1 }, // horiz=-1, vert=+1
- { 11, 1 }}, // horiz=-1, vert=+2
- {{ 10, 1 }, // horiz= 0, vert=-2
- { 10, 1 }, // horiz= 0, vert=-1
- { 9, 0 }, // horiz= 0, vert= 0
- { 10, 0 }, // horiz= 0, vert=+1
- { 10, 0 }}, // horiz= 0, vert=+2
- {{ 11, 0 }, // horiz=+1, vert=-2
- { 11, 0 }, // horiz=+1, vert=-1
- { 12, 0 }, // horiz=+1, vert= 0
- { 13, 0 }, // horiz=+1, vert=+1
- { 13, 0 }}, // horiz=+1, vert=+2
- {{ 11, 0 }, // horiz=+2, vert=-2
- { 11, 0 }, // horiz=+2, vert=-1
- { 12, 0 }, // horiz=+2, vert= 0
- { 13, 0 }, // horiz=+2, vert=+1
- { 13, 0 }}, // horiz=+2, vert=+2
-};
-
-//------------------------------------------------------------------------
-
-// constants used in the IDWT
-#define idwtAlpha -1.586134342059924
-#define idwtBeta -0.052980118572961
-#define idwtGamma 0.882911075530934
-#define idwtDelta 0.443506852043971
-#define idwtKappa 1.230174104914001
-#define idwtIKappa (1.0 / idwtKappa)
-
-// number of bits to the right of the decimal point for the fixed
-// point arithmetic used in the IDWT
-#define fracBits 16
-
-//------------------------------------------------------------------------
-
-// floor(x / y)
-#define jpxFloorDiv(x, y) ((x) / (y))
-
-// floor(x / 2^y)
-#define jpxFloorDivPow2(x, y) ((x) >> (y))
-
-// ceil(x / y)
-#define jpxCeilDiv(x, y) (((x) + (y) - 1) / (y))
-
-// ceil(x / 2^y)
-#define jpxCeilDivPow2(x, y) (((x) + (1 << (y)) - 1) >> (y))
-
-//------------------------------------------------------------------------
-
-JPXStream::JPXStream(Stream *strA):
- FilterStream(strA)
-{
- nComps = 0;
- bpc = NULL;
- width = height = 0;
- haveCS = gFalse;
- havePalette = gFalse;
- haveCompMap = gFalse;
- haveChannelDefn = gFalse;
-
- img.tiles = NULL;
- bitBuf = 0;
- bitBufLen = 0;
- bitBufSkip = gFalse;
- byteCount = 0;
-}
-
-JPXStream::~JPXStream() {
- JPXTile *tile;
- JPXTileComp *tileComp;
- JPXResLevel *resLevel;
- JPXPrecinct *precinct;
- JPXSubband *subband;
- JPXCodeBlock *cb;
- Guint comp, i, k, r, pre, sb;
-
- gfree(bpc);
- if (havePalette) {
- gfree(palette.bpc);
- gfree(palette.c);
- }
- if (haveCompMap) {
- gfree(compMap.comp);
- gfree(compMap.type);
- gfree(compMap.pComp);
- }
- if (haveChannelDefn) {
- gfree(channelDefn.idx);
- gfree(channelDefn.type);
- gfree(channelDefn.assoc);
- }
-
- if (img.tiles) {
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- tile = &img.tiles[i];
- if (tile->tileComps) {
- for (comp = 0; comp < img.nComps; ++comp) {
- tileComp = &tile->tileComps[comp];
- gfree(tileComp->quantSteps);
- gfree(tileComp->data);
- gfree(tileComp->buf);
- if (tileComp->resLevels) {
- for (r = 0; r <= tileComp->nDecompLevels; ++r) {
- resLevel = &tileComp->resLevels[r];
- if (resLevel->precincts) {
- for (pre = 0; pre < 1; ++pre) {
- precinct = &resLevel->precincts[pre];
- if (precinct->subbands) {
- for (sb = 0; sb < (r == 0 ? 1 : 3); ++sb) {
- subband = &precinct->subbands[sb];
- gfree(subband->inclusion);
- gfree(subband->zeroBitPlane);
- if (subband->cbs) {
- for (k = 0; k < subband->nXCBs * subband->nYCBs; ++k) {
- cb = &subband->cbs[k];
- gfree(cb->coeffs);
- if (cb->stats) {
- delete cb->stats;
- }
- }
- gfree(subband->cbs);
- }
- }
- gfree(precinct->subbands);
- }
- }
- gfree(img.tiles[i].tileComps[comp].resLevels[r].precincts);
- }
- }
- gfree(img.tiles[i].tileComps[comp].resLevels);
- }
- }
- gfree(img.tiles[i].tileComps);
- }
- }
- gfree(img.tiles);
- }
- delete str;
-}
-
-void JPXStream::reset() {
- str->reset();
- if (readBoxes()) {
- curY = img.yOffset;
- } else {
- // readBoxes reported an error, so we go immediately to EOF
- curY = img.ySize;
- }
- curX = img.xOffset;
- curComp = 0;
- readBufLen = 0;
-}
-
-int JPXStream::getChar() {
- int c;
-
- if (readBufLen < 8) {
- fillReadBuf();
- }
- if (readBufLen == 8) {
- c = readBuf & 0xff;
- readBufLen = 0;
- } else if (readBufLen > 8) {
- c = (readBuf >> (readBufLen - 8)) & 0xff;
- readBufLen -= 8;
- } else if (readBufLen == 0) {
- c = EOF;
- } else {
- c = (readBuf << (8 - readBufLen)) & 0xff;
- readBufLen = 0;
- }
- return c;
-}
-
-int JPXStream::lookChar() {
- int c;
-
- if (readBufLen < 8) {
- fillReadBuf();
- }
- if (readBufLen == 8) {
- c = readBuf & 0xff;
- } else if (readBufLen > 8) {
- c = (readBuf >> (readBufLen - 8)) & 0xff;
- } else if (readBufLen == 0) {
- c = EOF;
- } else {
- c = (readBuf << (8 - readBufLen)) & 0xff;
- }
- return c;
-}
-
-void JPXStream::fillReadBuf() {
- JPXTileComp *tileComp;
- Guint tileIdx, tx, ty;
- int pix, pixBits;
-
- do {
- if (curY >= img.ySize) {
- return;
- }
- tileIdx = ((curY - img.yTileOffset) / img.yTileSize) * img.nXTiles
- + (curX - img.xTileOffset) / img.xTileSize;
-#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid
- tileComp = &img.tiles[tileIdx].tileComps[curComp];
-#else
- tileComp = &img.tiles[tileIdx].tileComps[havePalette ? 0 : curComp];
-#endif
- tx = jpxCeilDiv((curX - img.xTileOffset) % img.xTileSize, tileComp->hSep);
- ty = jpxCeilDiv((curY - img.yTileOffset) % img.yTileSize, tileComp->vSep);
- pix = (int)tileComp->data[ty * (tileComp->x1 - tileComp->x0) + tx];
- pixBits = tileComp->prec;
-#if 1 //~ ignore the palette, assume the PDF ColorSpace object is valid
- if (++curComp == img.nComps) {
-#else
- if (havePalette) {
- if (pix >= 0 && pix < palette.nEntries) {
- pix = palette.c[pix * palette.nComps + curComp];
- } else {
- pix =
- pixBits = palette.bpc[curComp];
- }
- if (++curComp == (Guint)(havePalette ? palette.nComps : img.nComps)) {
-#endif
- curComp = 0;
- if (++curX == img.xSize) {
- curX = img.xOffset;
- ++curY;
- }
- }
- if (pixBits == 8) {
- readBuf = (readBuf << 8) | (pix & 0xff);
- } else {
- readBuf = (readBuf << pixBits) | (pix & ((1 << pixBits) - 1));
- }
- readBufLen += pixBits;
- } while (readBufLen < 8);
-}
-
-GString *JPXStream::getPSFilter(int psLevel, char *indent) {
- return NULL;
-}
-
-GBool JPXStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-GBool JPXStream::readBoxes() {
- Guint boxType, boxLen, dataLen;
- Guint bpc1, compression, unknownColorspace, ipr;
- Guint i, j;
-
- haveImgHdr = gFalse;
-
- // check for a naked JPEG 2000 codestream (without the JP2/JPX
- // wrapper) -- this appears to be a violation of the PDF spec, but
- // Acrobat allows it
- if (str->lookChar() == 0xff) {
- error(getPos(), "Naked JPEG 2000 codestream, missing JP2/JPX wrapper");
- readCodestream(0);
- nComps = img.nComps;
- bpc = (Guint *)gmalloc(nComps * sizeof(Guint));
- for (i = 0; i < nComps; ++i) {
- bpc[i] = img.tiles[0].tileComps[i].prec;
- }
- width = img.xSize - img.xOffset;
- height = img.ySize - img.yOffset;
- return gTrue;
- }
-
- while (readBoxHdr(&boxType, &boxLen, &dataLen)) {
- switch (boxType) {
- case 0x6a703268: // JP2 header
- // this is a grouping box ('superbox') which has no real
- // contents and doesn't appear to be used consistently, i.e.,
- // some things which should be subboxes of the JP2 header box
- // show up outside of it - so we simply ignore the JP2 header
- // box
- break;
- case 0x69686472: // image header
- if (!readULong(&height) ||
- !readULong(&width) ||
- !readUWord(&nComps) ||
- !readUByte(&bpc1) ||
- !readUByte(&compression) ||
- !readUByte(&unknownColorspace) ||
- !readUByte(&ipr)) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- if (compression != 7) {
- error(getPos(), "Unknown compression type in JPX stream");
- return gFalse;
- }
- bpc = (Guint *)gmalloc(nComps * sizeof(Guint));
- for (i = 0; i < nComps; ++i) {
- bpc[i] = bpc1;
- }
- haveImgHdr = gTrue;
- break;
- case 0x62706363: // bits per component
- if (!haveImgHdr) {
- error(getPos(), "Found bits per component box before image header box in JPX stream");
- return gFalse;
- }
- if (dataLen != nComps) {
- error(getPos(), "Invalid bits per component box in JPX stream");
- return gFalse;
- }
- for (i = 0; i < nComps; ++i) {
- if (!readUByte(&bpc[i])) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- }
- break;
- case 0x636F6C72: // color specification
- if (!readColorSpecBox(dataLen)) {
- return gFalse;
- }
- break;
- case 0x70636c72: // palette
- if (!readUWord(&palette.nEntries) ||
- !readUByte(&palette.nComps)) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- palette.bpc = (Guint *)gmalloc(palette.nComps * sizeof(Guint));
- palette.c =
- (int *)gmalloc(palette.nEntries * palette.nComps * sizeof(int));
- for (i = 0; i < palette.nComps; ++i) {
- if (!readUByte(&palette.bpc[i])) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- ++palette.bpc[i];
- }
- for (i = 0; i < palette.nEntries; ++i) {
- for (j = 0; j < palette.nComps; ++j) {
- if (!readNBytes(((palette.bpc[j] & 0x7f) + 7) >> 3,
- (palette.bpc[j] & 0x80) ? gTrue : gFalse,
- &palette.c[i * palette.nComps + j])) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- }
- }
- havePalette = gTrue;
- break;
- case 0x636d6170: // component mapping
- compMap.nChannels = dataLen / 4;
- compMap.comp = (Guint *)gmalloc(compMap.nChannels * sizeof(Guint));
- compMap.type = (Guint *)gmalloc(compMap.nChannels * sizeof(Guint));
- compMap.pComp = (Guint *)gmalloc(compMap.nChannels * sizeof(Guint));
- for (i = 0; i < compMap.nChannels; ++i) {
- if (!readUWord(&compMap.comp[i]) ||
- !readUByte(&compMap.type[i]) ||
- !readUByte(&compMap.pComp[i])) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- }
- haveCompMap = gTrue;
- break;
- case 0x63646566: // channel definition
- if (!readUWord(&channelDefn.nChannels)) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- channelDefn.idx =
- (Guint *)gmalloc(channelDefn.nChannels * sizeof(Guint));
- channelDefn.type =
- (Guint *)gmalloc(channelDefn.nChannels * sizeof(Guint));
- channelDefn.assoc =
- (Guint *)gmalloc(channelDefn.nChannels * sizeof(Guint));
- for (i = 0; i < channelDefn.nChannels; ++i) {
- if (!readUWord(&channelDefn.idx[i]) ||
- !readUWord(&channelDefn.type[i]) ||
- !readUWord(&channelDefn.assoc[i])) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- }
- haveChannelDefn = gTrue;
- break;
- case 0x6A703263: // contiguous codestream
- if (!bpc) {
- error(getPos(), "JPX stream is missing the image header box");
- return gFalse;
- }
- if (!haveCS) {
- error(getPos(), "JPX stream has no supported color spec");
- return gFalse;
- }
- if (!readCodestream(dataLen)) {
- return gFalse;
- }
- break;
- default:
- for (i = 0; i < dataLen; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Unexpected EOF in JPX stream");
- return gFalse;
- }
- }
- break;
- }
- }
- return gTrue;
-}
-
-GBool JPXStream::readColorSpecBox(Guint dataLen) {
- JPXColorSpec newCS;
- Guint csApprox, csEnum;
- Guint i;
- GBool ok;
-
- ok = gFalse;
- if (!readUByte(&newCS.meth) ||
- !readByte(&newCS.prec) ||
- !readUByte(&csApprox)) {
- goto err;
- }
- switch (newCS.meth) {
- case 1: // enumerated colorspace
- if (!readULong(&csEnum)) {
- goto err;
- }
- newCS.enumerated.type = (JPXColorSpaceType)csEnum;
- switch (newCS.enumerated.type) {
- case jpxCSBiLevel:
- ok = gTrue;
- break;
- case jpxCSYCbCr1:
- ok = gTrue;
- break;
- case jpxCSYCbCr2:
- ok = gTrue;
- break;
- case jpxCSYCBCr3:
- ok = gTrue;
- break;
- case jpxCSPhotoYCC:
- ok = gTrue;
- break;
- case jpxCSCMY:
- ok = gTrue;
- break;
- case jpxCSCMYK:
- ok = gTrue;
- break;
- case jpxCSYCCK:
- ok = gTrue;
- break;
- case jpxCSCIELab:
- if (dataLen == 3 + 7*4) {
- if (!readULong(&newCS.enumerated.cieLab.rl) ||
- !readULong(&newCS.enumerated.cieLab.ol) ||
- !readULong(&newCS.enumerated.cieLab.ra) ||
- !readULong(&newCS.enumerated.cieLab.oa) ||
- !readULong(&newCS.enumerated.cieLab.rb) ||
- !readULong(&newCS.enumerated.cieLab.ob) ||
- !readULong(&newCS.enumerated.cieLab.il)) {
- goto err;
- }
- } else if (dataLen == 3) {
- //~ this assumes the 8-bit case
- newCS.enumerated.cieLab.rl = 100;
- newCS.enumerated.cieLab.ol = 0;
- newCS.enumerated.cieLab.ra = 255;
- newCS.enumerated.cieLab.oa = 128;
- newCS.enumerated.cieLab.rb = 255;
- newCS.enumerated.cieLab.ob = 96;
- newCS.enumerated.cieLab.il = 0x00443530;
- } else {
- goto err;
- }
- ok = gTrue;
- break;
- case jpxCSsRGB:
- ok = gTrue;
- break;
- case jpxCSGrayscale:
- ok = gTrue;
- break;
- case jpxCSBiLevel2:
- ok = gTrue;
- break;
- case jpxCSCIEJab:
- // not allowed in PDF
- goto err;
- case jpxCSCISesRGB:
- ok = gTrue;
- break;
- case jpxCSROMMRGB:
- ok = gTrue;
- break;
- case jpxCSsRGBYCbCr:
- ok = gTrue;
- break;
- case jpxCSYPbPr1125:
- ok = gTrue;
- break;
- case jpxCSYPbPr1250:
- ok = gTrue;
- break;
- default:
- goto err;
- }
- break;
- case 2: // restricted ICC profile
- case 3: // any ICC profile (JPX)
- case 4: // vendor color (JPX)
- for (i = 0; i < dataLen - 3; ++i) {
- if (str->getChar() == EOF) {
- goto err;
- }
- }
- break;
- }
-
- if (ok && (!haveCS || newCS.prec > cs.prec)) {
- cs = newCS;
- haveCS = gTrue;
- }
-
- return gTrue;
-
- err:
- error(getPos(), "Error in JPX color spec");
- return gFalse;
-}
-
-GBool JPXStream::readCodestream(Guint len) {
- JPXTile *tile;
- JPXTileComp *tileComp;
- int segType;
- GBool haveSIZ, haveCOD, haveQCD, haveSOT;
- Guint precinctSize, style;
- Guint segLen, capabilities, comp, i, j, r;
-
- //----- main header
- haveSIZ = haveCOD = haveQCD = haveSOT = gFalse;
- do {
- if (!readMarkerHdr(&segType, &segLen)) {
- error(getPos(), "Error in JPX codestream");
- return gFalse;
- }
- switch (segType) {
- case 0x4f: // SOC - start of codestream
- // marker only
- break;
- case 0x51: // SIZ - image and tile size
- if (!readUWord(&capabilities) ||
- !readULong(&img.xSize) ||
- !readULong(&img.ySize) ||
- !readULong(&img.xOffset) ||
- !readULong(&img.yOffset) ||
- !readULong(&img.xTileSize) ||
- !readULong(&img.yTileSize) ||
- !readULong(&img.xTileOffset) ||
- !readULong(&img.yTileOffset) ||
- !readUWord(&img.nComps)) {
- error(getPos(), "Error in JPX SIZ marker segment");
- return gFalse;
- }
- if (haveImgHdr && img.nComps != nComps) {
- error(getPos(), "Different number of components in JPX SIZ marker segment");
- return gFalse;
- }
- img.nXTiles = (img.xSize - img.xTileOffset + img.xTileSize - 1)
- / img.xTileSize;
- img.nYTiles = (img.ySize - img.yTileOffset + img.yTileSize - 1)
- / img.yTileSize;
- img.tiles = (JPXTile *)gmalloc(img.nXTiles * img.nYTiles *
- sizeof(JPXTile));
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- img.tiles[i].tileComps = (JPXTileComp *)gmalloc(img.nComps *
- sizeof(JPXTileComp));
- for (comp = 0; comp < img.nComps; ++comp) {
- img.tiles[i].tileComps[comp].quantSteps = NULL;
- img.tiles[i].tileComps[comp].data = NULL;
- img.tiles[i].tileComps[comp].buf = NULL;
- img.tiles[i].tileComps[comp].resLevels = NULL;
- }
- }
- for (comp = 0; comp < img.nComps; ++comp) {
- if (!readUByte(&img.tiles[0].tileComps[comp].prec) ||
- !readUByte(&img.tiles[0].tileComps[comp].hSep) ||
- !readUByte(&img.tiles[0].tileComps[comp].vSep)) {
- error(getPos(), "Error in JPX SIZ marker segment");
- return gFalse;
- }
- img.tiles[0].tileComps[comp].sgned =
- (img.tiles[0].tileComps[comp].prec & 0x80) ? gTrue : gFalse;
- img.tiles[0].tileComps[comp].prec =
- (img.tiles[0].tileComps[comp].prec & 0x7f) + 1;
- for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
- img.tiles[i].tileComps[comp] = img.tiles[0].tileComps[comp];
- }
- }
- haveSIZ = gTrue;
- break;
- case 0x52: // COD - coding style default
- if (!readUByte(&img.tiles[0].tileComps[0].style) ||
- !readUByte(&img.tiles[0].progOrder) ||
- !readUWord(&img.tiles[0].nLayers) ||
- !readUByte(&img.tiles[0].multiComp) ||
- !readUByte(&img.tiles[0].tileComps[0].nDecompLevels) ||
- !readUByte(&img.tiles[0].tileComps[0].codeBlockW) ||
- !readUByte(&img.tiles[0].tileComps[0].codeBlockH) ||
- !readUByte(&img.tiles[0].tileComps[0].codeBlockStyle) ||
- !readUByte(&img.tiles[0].tileComps[0].transform)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[0].tileComps[0].codeBlockW += 2;
- img.tiles[0].tileComps[0].codeBlockH += 2;
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- if (i != 0) {
- img.tiles[i].progOrder = img.tiles[0].progOrder;
- img.tiles[i].nLayers = img.tiles[0].nLayers;
- img.tiles[i].multiComp = img.tiles[0].multiComp;
- }
- for (comp = 0; comp < img.nComps; ++comp) {
- if (!(i == 0 && comp == 0)) {
- img.tiles[i].tileComps[comp].style =
- img.tiles[0].tileComps[0].style;
- img.tiles[i].tileComps[comp].nDecompLevels =
- img.tiles[0].tileComps[0].nDecompLevels;
- img.tiles[i].tileComps[comp].codeBlockW =
- img.tiles[0].tileComps[0].codeBlockW;
- img.tiles[i].tileComps[comp].codeBlockH =
- img.tiles[0].tileComps[0].codeBlockH;
- img.tiles[i].tileComps[comp].codeBlockStyle =
- img.tiles[0].tileComps[0].codeBlockStyle;
- img.tiles[i].tileComps[comp].transform =
- img.tiles[0].tileComps[0].transform;
- }
- img.tiles[i].tileComps[comp].resLevels =
- (JPXResLevel *)gmalloc(
- (img.tiles[i].tileComps[comp].nDecompLevels + 1) *
- sizeof(JPXResLevel));
- for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
- img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
- }
- }
- }
- for (r = 0; r <= img.tiles[0].tileComps[0].nDecompLevels; ++r) {
- if (img.tiles[0].tileComps[0].style & 0x01) {
- if (!readUByte(&precinctSize)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[0].tileComps[0].resLevels[r].precinctWidth =
- precinctSize & 0x0f;
- img.tiles[0].tileComps[0].resLevels[r].precinctHeight =
- (precinctSize >> 4) & 0x0f;
- } else {
- img.tiles[0].tileComps[0].resLevels[r].precinctWidth = 15;
- img.tiles[0].tileComps[0].resLevels[r].precinctHeight = 15;
- }
- }
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- for (comp = 0; comp < img.nComps; ++comp) {
- if (!(i == 0 && comp == 0)) {
- for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
- img.tiles[i].tileComps[comp].resLevels[r].precinctWidth =
- img.tiles[0].tileComps[0].resLevels[r].precinctWidth;
- img.tiles[i].tileComps[comp].resLevels[r].precinctHeight =
- img.tiles[0].tileComps[0].resLevels[r].precinctHeight;
- }
- }
- }
- }
- haveCOD = gTrue;
- break;
- case 0x53: // COC - coding style component
- if (!haveCOD) {
- error(getPos(), "JPX COC marker segment before COD segment");
- return gFalse;
- }
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&style) ||
- !readUByte(&img.tiles[0].tileComps[comp].nDecompLevels) ||
- !readUByte(&img.tiles[0].tileComps[comp].codeBlockW) ||
- !readUByte(&img.tiles[0].tileComps[comp].codeBlockH) ||
- !readUByte(&img.tiles[0].tileComps[comp].codeBlockStyle) ||
- !readUByte(&img.tiles[0].tileComps[comp].transform)) {
- error(getPos(), "Error in JPX COC marker segment");
- return gFalse;
- }
- img.tiles[0].tileComps[comp].style =
- (img.tiles[0].tileComps[comp].style & ~1) | (style & 1);
- img.tiles[0].tileComps[comp].codeBlockW += 2;
- img.tiles[0].tileComps[comp].codeBlockH += 2;
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- if (i != 0) {
- img.tiles[i].tileComps[comp].style =
- img.tiles[0].tileComps[comp].style;
- img.tiles[i].tileComps[comp].nDecompLevels =
- img.tiles[0].tileComps[comp].nDecompLevels;
- img.tiles[i].tileComps[comp].codeBlockW =
- img.tiles[0].tileComps[comp].codeBlockW;
- img.tiles[i].tileComps[comp].codeBlockH =
- img.tiles[0].tileComps[comp].codeBlockH;
- img.tiles[i].tileComps[comp].codeBlockStyle =
- img.tiles[0].tileComps[comp].codeBlockStyle;
- img.tiles[i].tileComps[comp].transform =
- img.tiles[0].tileComps[comp].transform;
- }
- img.tiles[i].tileComps[comp].resLevels =
- (JPXResLevel *)grealloc(
- img.tiles[i].tileComps[comp].resLevels,
- (img.tiles[i].tileComps[comp].nDecompLevels + 1) *
- sizeof(JPXResLevel));
- for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
- img.tiles[i].tileComps[comp].resLevels[r].precincts = NULL;
- }
- }
- for (r = 0; r <= img.tiles[0].tileComps[comp].nDecompLevels; ++r) {
- if (img.tiles[0].tileComps[comp].style & 0x01) {
- if (!readUByte(&precinctSize)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[0].tileComps[comp].resLevels[r].precinctWidth =
- precinctSize & 0x0f;
- img.tiles[0].tileComps[comp].resLevels[r].precinctHeight =
- (precinctSize >> 4) & 0x0f;
- } else {
- img.tiles[0].tileComps[comp].resLevels[r].precinctWidth = 15;
- img.tiles[0].tileComps[comp].resLevels[r].precinctHeight = 15;
- }
- }
- for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
- for (r = 0; r <= img.tiles[i].tileComps[comp].nDecompLevels; ++r) {
- img.tiles[i].tileComps[comp].resLevels[r].precinctWidth =
- img.tiles[0].tileComps[comp].resLevels[r].precinctWidth;
- img.tiles[i].tileComps[comp].resLevels[r].precinctHeight =
- img.tiles[0].tileComps[comp].resLevels[r].precinctHeight;
- }
- }
- break;
- case 0x5c: // QCD - quantization default
- if (!readUByte(&img.tiles[0].tileComps[0].quantStyle)) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x00) {
- img.tiles[0].tileComps[0].nQuantSteps = segLen - 3;
- img.tiles[0].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[0].quantSteps,
- img.tiles[0].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) {
- if (!readUByte(&img.tiles[0].tileComps[0].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x01) {
- img.tiles[0].tileComps[0].nQuantSteps = 1;
- img.tiles[0].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[0].quantSteps,
- img.tiles[0].tileComps[0].nQuantSteps *
- sizeof(Guint));
- if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[0])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- } else if ((img.tiles[0].tileComps[0].quantStyle & 0x1f) == 0x02) {
- img.tiles[0].tileComps[0].nQuantSteps = (segLen - 3) / 2;
- img.tiles[0].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[0].quantSteps,
- img.tiles[0].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[0].tileComps[0].nQuantSteps; ++i) {
- if (!readUWord(&img.tiles[0].tileComps[0].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- for (comp = 0; comp < img.nComps; ++comp) {
- if (!(i == 0 && comp == 0)) {
- img.tiles[i].tileComps[comp].quantStyle =
- img.tiles[0].tileComps[0].quantStyle;
- img.tiles[i].tileComps[comp].nQuantSteps =
- img.tiles[0].tileComps[0].nQuantSteps;
- img.tiles[i].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[i].tileComps[comp].quantSteps,
- img.tiles[0].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (j = 0; j < img.tiles[0].tileComps[0].nQuantSteps; ++j) {
- img.tiles[i].tileComps[comp].quantSteps[j] =
- img.tiles[0].tileComps[0].quantSteps[j];
- }
- }
- }
- }
- haveQCD = gTrue;
- break;
- case 0x5d: // QCC - quantization component
- if (!haveQCD) {
- error(getPos(), "JPX QCC marker segment before QCD segment");
- return gFalse;
- }
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&img.tiles[0].tileComps[comp].quantStyle)) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x00) {
- img.tiles[0].tileComps[comp].nQuantSteps =
- segLen - (img.nComps > 256 ? 5 : 4);
- img.tiles[0].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[comp].quantSteps,
- img.tiles[0].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) {
- if (!readUByte(&img.tiles[0].tileComps[comp].quantSteps[i])) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- }
- } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x01) {
- img.tiles[0].tileComps[comp].nQuantSteps = 1;
- img.tiles[0].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[comp].quantSteps,
- img.tiles[0].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[0])) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- } else if ((img.tiles[0].tileComps[comp].quantStyle & 0x1f) == 0x02) {
- img.tiles[0].tileComps[comp].nQuantSteps =
- (segLen - (img.nComps > 256 ? 5 : 4)) / 2;
- img.tiles[0].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[0].tileComps[comp].quantSteps,
- img.tiles[0].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[0].tileComps[comp].nQuantSteps; ++i) {
- if (!readUWord(&img.tiles[0].tileComps[comp].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- for (i = 1; i < img.nXTiles * img.nYTiles; ++i) {
- img.tiles[i].tileComps[comp].quantStyle =
- img.tiles[0].tileComps[comp].quantStyle;
- img.tiles[i].tileComps[comp].nQuantSteps =
- img.tiles[0].tileComps[comp].nQuantSteps;
- img.tiles[i].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[i].tileComps[comp].quantSteps,
- img.tiles[0].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- for (j = 0; j < img.tiles[0].tileComps[comp].nQuantSteps; ++j) {
- img.tiles[i].tileComps[comp].quantSteps[j] =
- img.tiles[0].tileComps[comp].quantSteps[j];
- }
- }
- break;
- case 0x5e: // RGN - region of interest
-#if 1 //~ ROI is unimplemented
- fprintf(stderr, "RGN\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPM marker segment");
- return gFalse;
- }
- }
-#else
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&compInfo[comp].defROI.style) ||
- !readUByte(&compInfo[comp].defROI.shift)) {
- error(getPos(), "Error in JPX RGN marker segment");
- return gFalse;
- }
-#endif
- break;
- case 0x5f: // POC - progression order change
-#if 1 //~ progression order changes are unimplemented
- fprintf(stderr, "POC\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPM marker segment");
- return gFalse;
- }
- }
-#else
- nProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7);
- progs = (JPXProgOrder *)gmalloc(nProgs * sizeof(JPXProgOrder));
- for (i = 0; i < nProgs; ++i) {
- if (!readUByte(&progs[i].startRes) ||
- !(img.nComps > 256 && readUWord(&progs[i].startComp)) ||
- !(img.nComps <= 256 && readUByte(&progs[i].startComp)) ||
- !readUWord(&progs[i].endLayer) ||
- !readUByte(&progs[i].endRes) ||
- !(img.nComps > 256 && readUWord(&progs[i].endComp)) ||
- !(img.nComps <= 256 && readUByte(&progs[i].endComp)) ||
- !readUByte(&progs[i].progOrder)) {
- error(getPos(), "Error in JPX POC marker segment");
- return gFalse;
- }
- }
-#endif
- break;
- case 0x60: // PPM - packed packet headers, main header
-#if 1 //~ packed packet headers are unimplemented
- fprintf(stderr, "PPM\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPM marker segment");
- return gFalse;
- }
- }
-#endif
- break;
- case 0x55: // TLM - tile-part lengths
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX TLM marker segment");
- return gFalse;
- }
- }
- break;
- case 0x57: // PLM - packet length, main header
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PLM marker segment");
- return gFalse;
- }
- }
- break;
- case 0x63: // CRG - component registration
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX CRG marker segment");
- return gFalse;
- }
- }
- break;
- case 0x64: // COM - comment
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX COM marker segment");
- return gFalse;
- }
- }
- break;
- case 0x90: // SOT - start of tile
- haveSOT = gTrue;
- break;
- default:
- error(getPos(), "Unknown marker segment %02x in JPX stream", segType);
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- break;
- }
- }
- break;
- }
- } while (!haveSOT);
-
- if (!haveSIZ) {
- error(getPos(), "Missing SIZ marker segment in JPX stream");
- return gFalse;
- }
- if (!haveCOD) {
- error(getPos(), "Missing COD marker segment in JPX stream");
- return gFalse;
- }
- if (!haveQCD) {
- error(getPos(), "Missing QCD marker segment in JPX stream");
- return gFalse;
- }
-
- //----- read the tile-parts
- while (1) {
- if (!readTilePart()) {
- return gFalse;
- }
- if (!readMarkerHdr(&segType, &segLen)) {
- error(getPos(), "Error in JPX codestream");
- return gFalse;
- }
- if (segType != 0x90) { // SOT - start of tile
- break;
- }
- }
-
- if (segType != 0xd9) { // EOC - end of codestream
- error(getPos(), "Missing EOC marker in JPX codestream");
- return gFalse;
- }
-
- //----- finish decoding the image
- for (i = 0; i < img.nXTiles * img.nYTiles; ++i) {
- tile = &img.tiles[i];
- for (comp = 0; comp < img.nComps; ++comp) {
- tileComp = &tile->tileComps[comp];
- inverseTransform(tileComp);
- }
- if (!inverseMultiCompAndDC(tile)) {
- return gFalse;
- }
- }
-
- //~ can free memory below tileComps here, and also tileComp.buf
-
- return gTrue;
-}
-
-GBool JPXStream::readTilePart() {
- JPXTile *tile;
- JPXTileComp *tileComp;
- JPXResLevel *resLevel;
- JPXPrecinct *precinct;
- JPXSubband *subband;
- JPXCodeBlock *cb;
- GBool haveSOD;
- Guint tileIdx, tilePartLen, tilePartIdx, nTileParts;
- GBool tilePartToEOC;
- Guint precinctSize, style;
- Guint n, nSBs, nx, ny, sbx0, sby0, comp, segLen;
- Guint i, j, k, cbX, cbY, r, pre, sb, cbi;
- int segType, level;
-
- // process the SOT marker segment
- if (!readUWord(&tileIdx) ||
- !readULong(&tilePartLen) ||
- !readUByte(&tilePartIdx) ||
- !readUByte(&nTileParts)) {
- error(getPos(), "Error in JPX SOT marker segment");
- return gFalse;
- }
-
- if (tileIdx >= img.nXTiles * img.nYTiles) {
- error(getPos(), "Weird tile index in JPX stream");
- return gFalse;
- }
-
- tilePartToEOC = tilePartLen == 0;
- tilePartLen -= 12; // subtract size of SOT segment
-
- haveSOD = gFalse;
- do {
- if (!readMarkerHdr(&segType, &segLen)) {
- error(getPos(), "Error in JPX tile-part codestream");
- return gFalse;
- }
- tilePartLen -= 2 + segLen;
- switch (segType) {
- case 0x52: // COD - coding style default
- if (!readUByte(&img.tiles[tileIdx].tileComps[0].style) ||
- !readUByte(&img.tiles[tileIdx].progOrder) ||
- !readUWord(&img.tiles[tileIdx].nLayers) ||
- !readUByte(&img.tiles[tileIdx].multiComp) ||
- !readUByte(&img.tiles[tileIdx].tileComps[0].nDecompLevels) ||
- !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockW) ||
- !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockH) ||
- !readUByte(&img.tiles[tileIdx].tileComps[0].codeBlockStyle) ||
- !readUByte(&img.tiles[tileIdx].tileComps[0].transform)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[tileIdx].tileComps[0].codeBlockW += 2;
- img.tiles[tileIdx].tileComps[0].codeBlockH += 2;
- for (comp = 0; comp < img.nComps; ++comp) {
- if (comp != 0) {
- img.tiles[tileIdx].tileComps[comp].style =
- img.tiles[tileIdx].tileComps[0].style;
- img.tiles[tileIdx].tileComps[comp].nDecompLevels =
- img.tiles[tileIdx].tileComps[0].nDecompLevels;
- img.tiles[tileIdx].tileComps[comp].codeBlockW =
- img.tiles[tileIdx].tileComps[0].codeBlockW;
- img.tiles[tileIdx].tileComps[comp].codeBlockH =
- img.tiles[tileIdx].tileComps[0].codeBlockH;
- img.tiles[tileIdx].tileComps[comp].codeBlockStyle =
- img.tiles[tileIdx].tileComps[0].codeBlockStyle;
- img.tiles[tileIdx].tileComps[comp].transform =
- img.tiles[tileIdx].tileComps[0].transform;
- }
- img.tiles[tileIdx].tileComps[comp].resLevels =
- (JPXResLevel *)grealloc(
- img.tiles[tileIdx].tileComps[comp].resLevels,
- (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1) *
- sizeof(JPXResLevel));
- for (r = 0;
- r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels;
- ++r) {
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL;
- }
- }
- for (r = 0; r <= img.tiles[tileIdx].tileComps[0].nDecompLevels; ++r) {
- if (img.tiles[tileIdx].tileComps[0].style & 0x01) {
- if (!readUByte(&precinctSize)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth =
- precinctSize & 0x0f;
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight =
- (precinctSize >> 4) & 0x0f;
- } else {
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth = 15;
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight = 15;
- }
- }
- for (comp = 1; comp < img.nComps; ++comp) {
- for (r = 0;
- r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels;
- ++r) {
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth =
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctWidth;
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight =
- img.tiles[tileIdx].tileComps[0].resLevels[r].precinctHeight;
- }
- }
- break;
- case 0x53: // COC - coding style component
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&style) ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].nDecompLevels) ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockW) ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockH) ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].codeBlockStyle) ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].transform)) {
- error(getPos(), "Error in JPX COC marker segment");
- return gFalse;
- }
- img.tiles[tileIdx].tileComps[comp].style =
- (img.tiles[tileIdx].tileComps[comp].style & ~1) | (style & 1);
- img.tiles[tileIdx].tileComps[comp].codeBlockW += 2;
- img.tiles[tileIdx].tileComps[comp].codeBlockH += 2;
- img.tiles[tileIdx].tileComps[comp].resLevels =
- (JPXResLevel *)grealloc(
- img.tiles[tileIdx].tileComps[comp].resLevels,
- (img.tiles[tileIdx].tileComps[comp].nDecompLevels + 1) *
- sizeof(JPXResLevel));
- for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) {
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precincts = NULL;
- }
- for (r = 0; r <= img.tiles[tileIdx].tileComps[comp].nDecompLevels; ++r) {
- if (img.tiles[tileIdx].tileComps[comp].style & 0x01) {
- if (!readUByte(&precinctSize)) {
- error(getPos(), "Error in JPX COD marker segment");
- return gFalse;
- }
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth =
- precinctSize & 0x0f;
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight =
- (precinctSize >> 4) & 0x0f;
- } else {
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctWidth = 15;
- img.tiles[tileIdx].tileComps[comp].resLevels[r].precinctHeight = 15;
- }
- }
- break;
- case 0x5c: // QCD - quantization default
- if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantStyle)) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x00) {
- img.tiles[tileIdx].tileComps[0].nQuantSteps =
- segLen - 3;
- img.tiles[tileIdx].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[0].quantSteps,
- img.tiles[tileIdx].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) {
- if (!readUByte(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x01) {
- img.tiles[tileIdx].tileComps[0].nQuantSteps = 1;
- img.tiles[tileIdx].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[0].quantSteps,
- img.tiles[tileIdx].tileComps[0].nQuantSteps *
- sizeof(Guint));
- if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[0])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- } else if ((img.tiles[tileIdx].tileComps[0].quantStyle & 0x1f) == 0x02) {
- img.tiles[tileIdx].tileComps[0].nQuantSteps = (segLen - 3) / 2;
- img.tiles[tileIdx].tileComps[0].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[0].quantSteps,
- img.tiles[tileIdx].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++i) {
- if (!readUWord(&img.tiles[tileIdx].tileComps[0].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- for (comp = 1; comp < img.nComps; ++comp) {
- img.tiles[tileIdx].tileComps[comp].quantStyle =
- img.tiles[tileIdx].tileComps[0].quantStyle;
- img.tiles[tileIdx].tileComps[comp].nQuantSteps =
- img.tiles[tileIdx].tileComps[0].nQuantSteps;
- img.tiles[tileIdx].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[comp].quantSteps,
- img.tiles[tileIdx].tileComps[0].nQuantSteps *
- sizeof(Guint));
- for (j = 0; j < img.tiles[tileIdx].tileComps[0].nQuantSteps; ++j) {
- img.tiles[tileIdx].tileComps[comp].quantSteps[j] =
- img.tiles[tileIdx].tileComps[0].quantSteps[j];
- }
- }
- break;
- case 0x5d: // QCC - quantization component
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&img.tiles[tileIdx].tileComps[comp].quantStyle)) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f) == 0x00) {
- img.tiles[tileIdx].tileComps[comp].nQuantSteps =
- segLen - (img.nComps > 256 ? 5 : 4);
- img.tiles[tileIdx].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[comp].quantSteps,
- img.tiles[tileIdx].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) {
- if (!readUByte(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- }
- } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f)
- == 0x01) {
- img.tiles[tileIdx].tileComps[comp].nQuantSteps = 1;
- img.tiles[tileIdx].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[comp].quantSteps,
- img.tiles[tileIdx].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[0])) {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- } else if ((img.tiles[tileIdx].tileComps[comp].quantStyle & 0x1f)
- == 0x02) {
- img.tiles[tileIdx].tileComps[comp].nQuantSteps =
- (segLen - (img.nComps > 256 ? 5 : 4)) / 2;
- img.tiles[tileIdx].tileComps[comp].quantSteps =
- (Guint *)grealloc(img.tiles[tileIdx].tileComps[comp].quantSteps,
- img.tiles[tileIdx].tileComps[comp].nQuantSteps *
- sizeof(Guint));
- for (i = 0; i < img.tiles[tileIdx].tileComps[comp].nQuantSteps; ++i) {
- if (!readUWord(&img.tiles[tileIdx].tileComps[comp].quantSteps[i])) {
- error(getPos(), "Error in JPX QCD marker segment");
- return gFalse;
- }
- }
- } else {
- error(getPos(), "Error in JPX QCC marker segment");
- return gFalse;
- }
- break;
- case 0x5e: // RGN - region of interest
-#if 1 //~ ROI is unimplemented
- fprintf(stderr, "RGN\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPM marker segment");
- return gFalse;
- }
- }
-#else
- if ((img.nComps > 256 && !readUWord(&comp)) ||
- (img.nComps <= 256 && !readUByte(&comp)) ||
- comp >= img.nComps ||
- !readUByte(&compInfo[comp].roi.style) ||
- !readUByte(&compInfo[comp].roi.shift)) {
- error(getPos(), "Error in JPX RGN marker segment");
- return gFalse;
- }
-#endif
- break;
- case 0x5f: // POC - progression order change
-#if 1 //~ progression order changes are unimplemented
- fprintf(stderr, "POC\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPM marker segment");
- return gFalse;
- }
- }
-#else
- nTileProgs = (segLen - 2) / (img.nComps > 256 ? 9 : 7);
- tileProgs = (JPXProgOrder *)gmalloc(nTileProgs * sizeof(JPXProgOrder));
- for (i = 0; i < nTileProgs; ++i) {
- if (!readUByte(&tileProgs[i].startRes) ||
- !(img.nComps > 256 && readUWord(&tileProgs[i].startComp)) ||
- !(img.nComps <= 256 && readUByte(&tileProgs[i].startComp)) ||
- !readUWord(&tileProgs[i].endLayer) ||
- !readUByte(&tileProgs[i].endRes) ||
- !(img.nComps > 256 && readUWord(&tileProgs[i].endComp)) ||
- !(img.nComps <= 256 && readUByte(&tileProgs[i].endComp)) ||
- !readUByte(&tileProgs[i].progOrder)) {
- error(getPos(), "Error in JPX POC marker segment");
- return gFalse;
- }
- }
-#endif
- break;
- case 0x61: // PPT - packed packet headers, tile-part hdr
-#if 1 //~ packed packet headers are unimplemented
- fprintf(stderr, "PPT\n");
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PPT marker segment");
- return gFalse;
- }
- }
-#endif
- case 0x58: // PLT - packet length, tile-part header
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX PLT marker segment");
- return gFalse;
- }
- }
- break;
- case 0x64: // COM - comment
- // skipped
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- error(getPos(), "Error in JPX COM marker segment");
- return gFalse;
- }
- }
- break;
- case 0x93: // SOD - start of data
- haveSOD = gTrue;
- break;
- default:
- error(getPos(), "Unknown marker segment %02x in JPX tile-part stream",
- segType);
- for (i = 0; i < segLen - 2; ++i) {
- if (str->getChar() == EOF) {
- break;
- }
- }
- break;
- }
- } while (!haveSOD);
-
- //----- initialize the tile, precincts, and code-blocks
- if (tilePartIdx == 0) {
- tile = &img.tiles[tileIdx];
- i = tileIdx / img.nXTiles;
- j = tileIdx % img.nXTiles;
- if ((tile->x0 = img.xTileOffset + j * img.xTileSize) < img.xOffset) {
- tile->x0 = img.xOffset;
- }
- if ((tile->y0 = img.yTileOffset + i * img.yTileSize) < img.yOffset) {
- tile->y0 = img.yOffset;
- }
- if ((tile->x1 = img.xTileOffset + (j + 1) * img.xTileSize) > img.xSize) {
- tile->x1 = img.xSize;
- }
- if ((tile->y1 = img.yTileOffset + (i + 1) * img.yTileSize) > img.ySize) {
- tile->y1 = img.ySize;
- }
- tile->comp = 0;
- tile->res = 0;
- tile->precinct = 0;
- tile->layer = 0;
- tile->maxNDecompLevels = 0;
- for (comp = 0; comp < img.nComps; ++comp) {
- tileComp = &tile->tileComps[comp];
- if (tileComp->nDecompLevels > tile->maxNDecompLevels) {
- tile->maxNDecompLevels = tileComp->nDecompLevels;
- }
- tileComp->x0 = jpxCeilDiv(tile->x0, tileComp->hSep);
- tileComp->y0 = jpxCeilDiv(tile->y0, tileComp->hSep);
- tileComp->x1 = jpxCeilDiv(tile->x1, tileComp->hSep);
- tileComp->y1 = jpxCeilDiv(tile->y1, tileComp->hSep);
- tileComp->cbW = 1 << tileComp->codeBlockW;
- tileComp->cbH = 1 << tileComp->codeBlockH;
- tileComp->data = (int *)gmalloc((tileComp->x1 - tileComp->x0) *
- (tileComp->y1 - tileComp->y0) *
- sizeof(int));
- if (tileComp->x1 - tileComp->x0 > tileComp->y1 - tileComp->y0) {
- n = tileComp->x1 - tileComp->x0;
- } else {
- n = tileComp->y1 - tileComp->y0;
- }
- tileComp->buf = (int *)gmalloc((n + 8) * sizeof(int));
- for (r = 0; r <= tileComp->nDecompLevels; ++r) {
- resLevel = &tileComp->resLevels[r];
- k = r == 0 ? tileComp->nDecompLevels
- : tileComp->nDecompLevels - r + 1;
- resLevel->x0 = jpxCeilDivPow2(tileComp->x0, k);
- resLevel->y0 = jpxCeilDivPow2(tileComp->y0, k);
- resLevel->x1 = jpxCeilDivPow2(tileComp->x1, k);
- resLevel->y1 = jpxCeilDivPow2(tileComp->y1, k);
- if (r == 0) {
- resLevel->bx0[0] = resLevel->x0;
- resLevel->by0[0] = resLevel->y0;
- resLevel->bx1[0] = resLevel->x1;
- resLevel->by1[0] = resLevel->y1;
- } else {
- resLevel->bx0[0] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k);
- resLevel->by0[0] = resLevel->y0;
- resLevel->bx1[0] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k);
- resLevel->by1[0] = resLevel->y1;
- resLevel->bx0[1] = resLevel->x0;
- resLevel->by0[1] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k);
- resLevel->bx1[1] = resLevel->x1;
- resLevel->by1[1] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k);
- resLevel->bx0[2] = jpxCeilDivPow2(tileComp->x0 - (1 << (k-1)), k);
- resLevel->by0[2] = jpxCeilDivPow2(tileComp->y0 - (1 << (k-1)), k);
- resLevel->bx1[2] = jpxCeilDivPow2(tileComp->x1 - (1 << (k-1)), k);
- resLevel->by1[2] = jpxCeilDivPow2(tileComp->y1 - (1 << (k-1)), k);
- }
- resLevel->precincts = (JPXPrecinct *)gmalloc(1 * sizeof(JPXPrecinct));
- for (pre = 0; pre < 1; ++pre) {
- precinct = &resLevel->precincts[pre];
- precinct->x0 = resLevel->x0;
- precinct->y0 = resLevel->y0;
- precinct->x1 = resLevel->x1;
- precinct->y1 = resLevel->y1;
- nSBs = r == 0 ? 1 : 3;
- precinct->subbands =
- (JPXSubband *)gmalloc(nSBs * sizeof(JPXSubband));
- for (sb = 0; sb < nSBs; ++sb) {
- subband = &precinct->subbands[sb];
- subband->x0 = resLevel->bx0[sb];
- subband->y0 = resLevel->by0[sb];
- subband->x1 = resLevel->bx1[sb];
- subband->y1 = resLevel->by1[sb];
- subband->nXCBs = jpxCeilDivPow2(subband->x1,
- tileComp->codeBlockW)
- - jpxFloorDivPow2(subband->x0,
- tileComp->codeBlockW);
- subband->nYCBs = jpxCeilDivPow2(subband->y1,
- tileComp->codeBlockH)
- - jpxFloorDivPow2(subband->y0,
- tileComp->codeBlockH);
- n = subband->nXCBs > subband->nYCBs ? subband->nXCBs
- : subband->nYCBs;
- for (subband->maxTTLevel = 0, --n;
- n;
- ++subband->maxTTLevel, n >>= 1) ;
- n = 0;
- for (level = subband->maxTTLevel; level >= 0; --level) {
- nx = jpxCeilDivPow2(subband->nXCBs, level);
- ny = jpxCeilDivPow2(subband->nYCBs, level);
- n += nx * ny;
- }
- subband->inclusion =
- (JPXTagTreeNode *)gmalloc(n * sizeof(JPXTagTreeNode));
- subband->zeroBitPlane =
- (JPXTagTreeNode *)gmalloc(n * sizeof(JPXTagTreeNode));
- for (k = 0; k < n; ++k) {
- subband->inclusion[k].finished = gFalse;
- subband->inclusion[k].val = 0;
- subband->zeroBitPlane[k].finished = gFalse;
- subband->zeroBitPlane[k].val = 0;
- }
- subband->cbs = (JPXCodeBlock *)gmalloc(subband->nXCBs *
- subband->nYCBs *
- sizeof(JPXCodeBlock));
- sbx0 = jpxFloorDivPow2(subband->x0, tileComp->codeBlockW);
- sby0 = jpxFloorDivPow2(subband->y0, tileComp->codeBlockH);
- cb = subband->cbs;
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- cb->x0 = (sbx0 + cbX) << tileComp->codeBlockW;
- cb->x1 = cb->x0 + tileComp->cbW;
- if (subband->x0 > cb->x0) {
- cb->x0 = subband->x0;
- }
- if (subband->x1 < cb->x1) {
- cb->x1 = subband->x1;
- }
- cb->y0 = (sby0 + cbY) << tileComp->codeBlockH;
- cb->y1 = cb->y0 + tileComp->cbH;
- if (subband->y0 > cb->y0) {
- cb->y0 = subband->y0;
- }
- if (subband->y1 < cb->y1) {
- cb->y1 = subband->y1;
- }
- cb->seen = gFalse;
- cb->lBlock = 3;
- cb->nextPass = jpxPassCleanup;
- cb->nZeroBitPlanes = 0;
- cb->coeffs =
- (JPXCoeff *)gmalloc((1 << (tileComp->codeBlockW
- + tileComp->codeBlockH))
- * sizeof(JPXCoeff));
- for (cbi = 0;
- cbi < (Guint)(1 << (tileComp->codeBlockW
- + tileComp->codeBlockH));
- ++cbi) {
- cb->coeffs[cbi].flags = 0;
- cb->coeffs[cbi].len = 0;
- cb->coeffs[cbi].mag = 0;
- }
- cb->stats = new JArithmeticDecoderStats(jpxNContexts);
- cb->stats->setEntry(jpxContextSigProp, 4, 0);
- cb->stats->setEntry(jpxContextRunLength, 3, 0);
- cb->stats->setEntry(jpxContextUniform, 46, 0);
- ++cb;
- }
- }
- }
- }
- }
- }
- }
-
- return readTilePartData(tileIdx, tilePartLen, tilePartToEOC);
-}
-
-GBool JPXStream::readTilePartData(Guint tileIdx,
- Guint tilePartLen, GBool tilePartToEOC) {
- JPXTile *tile;
- JPXTileComp *tileComp;
- JPXResLevel *resLevel;
- JPXPrecinct *precinct;
- JPXSubband *subband;
- JPXCodeBlock *cb;
- Guint ttVal;
- Guint bits, cbX, cbY, nx, ny, i, j, n, sb;
- int level;
-
- tile = &img.tiles[tileIdx];
-
- // read all packets from this tile-part
- while (1) {
- if (tilePartToEOC) {
- //~ peek for an EOC marker
- } else if (tilePartLen == 0) {
- break;
- }
-
- tileComp = &tile->tileComps[tile->comp];
- resLevel = &tileComp->resLevels[tile->res];
- precinct = &resLevel->precincts[tile->precinct];
-
- //----- packet header
-
- // zero-length flag
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (!bits) {
- // packet is empty -- clear all code-block inclusion flags
- for (sb = 0; sb < (tile->res == 0 ? 1 : 3); ++sb) {
- subband = &precinct->subbands[sb];
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- cb = &subband->cbs[cbY * subband->nXCBs + cbX];
- cb->included = gFalse;
- }
- }
- }
- } else {
-
- for (sb = 0; sb < (tile->res == 0 ? 1 : 3); ++sb) {
- subband = &precinct->subbands[sb];
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- cb = &subband->cbs[cbY * subband->nXCBs + cbX];
-
- // skip code-blocks with no coefficients
- if (cb->x0 >= cb->x1 || cb->y0 >= cb->y1) {
- cb->included = gFalse;
- continue;
- }
-
- // code-block inclusion
- if (cb->seen) {
- if (!readBits(1, &cb->included)) {
- goto err;
- }
- } else {
- ttVal = 0;
- i = 0;
- for (level = subband->maxTTLevel; level >= 0; --level) {
- nx = jpxCeilDivPow2(subband->nXCBs, level);
- ny = jpxCeilDivPow2(subband->nYCBs, level);
- j = i + (cbY >> level) * nx + (cbX >> level);
- if (!subband->inclusion[j].finished &&
- !subband->inclusion[j].val) {
- subband->inclusion[j].val = ttVal;
- } else {
- ttVal = subband->inclusion[j].val;
- }
- while (!subband->inclusion[j].finished &&
- ttVal <= tile->layer) {
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (bits == 1) {
- subband->inclusion[j].finished = gTrue;
- } else {
- ++ttVal;
- }
- }
- subband->inclusion[j].val = ttVal;
- if (ttVal > tile->layer) {
- break;
- }
- i += nx * ny;
- }
- cb->included = level < 0;
- }
-
- if (cb->included) {
-
- // zero bit-plane count
- if (!cb->seen) {
- ttVal = 0;
- i = 0;
- for (level = subband->maxTTLevel; level >= 0; --level) {
- nx = jpxCeilDivPow2(subband->nXCBs, level);
- ny = jpxCeilDivPow2(subband->nYCBs, level);
- j = i + (cbY >> level) * nx + (cbX >> level);
- if (!subband->zeroBitPlane[j].finished &&
- !subband->zeroBitPlane[j].val) {
- subband->zeroBitPlane[j].val = ttVal;
- } else {
- ttVal = subband->zeroBitPlane[j].val;
- }
- while (!subband->zeroBitPlane[j].finished) {
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (bits == 1) {
- subband->zeroBitPlane[j].finished = gTrue;
- } else {
- ++ttVal;
- }
- }
- subband->zeroBitPlane[j].val = ttVal;
- i += nx * ny;
- }
- cb->nZeroBitPlanes = ttVal;
- }
-
- // number of coding passes
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (bits == 0) {
- cb->nCodingPasses = 1;
- } else {
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (bits == 0) {
- cb->nCodingPasses = 2;
- } else {
- if (!readBits(2, &bits)) {
- goto err;
- }
- if (bits < 3) {
- cb->nCodingPasses = 3 + bits;
- } else {
- if (!readBits(5, &bits)) {
- goto err;
- }
- if (bits < 31) {
- cb->nCodingPasses = 6 + bits;
- } else {
- if (!readBits(7, &bits)) {
- goto err;
- }
- cb->nCodingPasses = 37 + bits;
- }
- }
- }
- }
-
- // update Lblock
- while (1) {
- if (!readBits(1, &bits)) {
- goto err;
- }
- if (!bits) {
- break;
- }
- ++cb->lBlock;
- }
-
- // length of compressed data
- //~ deal with multiple codeword segments
- for (n = cb->lBlock, i = cb->nCodingPasses >> 1;
- i;
- ++n, i >>= 1) ;
- if (!readBits(n, &cb->dataLen)) {
- goto err;
- }
- }
- }
- }
- }
- }
- tilePartLen -= byteCount;
- clearBitBuf();
-
- //----- packet data
-
- for (sb = 0; sb < (tile->res == 0 ? 1 : 3); ++sb) {
- subband = &precinct->subbands[sb];
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- cb = &subband->cbs[cbY * subband->nXCBs + cbX];
- if (cb->included) {
- if (!readCodeBlockData(tileComp, resLevel, precinct, subband,
- tile->res, sb, cb)) {
- return gFalse;
- }
- tilePartLen -= cb->dataLen;
- cb->seen = gTrue;
- }
- }
- }
- }
-
- //----- next packet
-
- switch (tile->progOrder) {
- case 0: // layer, resolution level, component, precinct
- if (++tile->comp == img.nComps) {
- tile->comp = 0;
- if (++tile->res == tile->maxNDecompLevels + 1) {
- tile->res = 0;
- if (++tile->layer == tile->nLayers) {
- tile->layer = 0;
- }
- }
- }
- break;
- case 1: // resolution level, layer, component, precinct
- if (++tile->comp == img.nComps) {
- tile->comp = 0;
- if (++tile->layer == tile->nLayers) {
- tile->layer = 0;
- if (++tile->res == tile->maxNDecompLevels + 1) {
- tile->res = 0;
- }
- }
- }
- break;
- case 2: // resolution level, precinct, component, layer
- //~ this isn't correct -- see B.12.1.3
- if (++tile->layer == tile->nLayers) {
- tile->layer = 0;
- if (++tile->comp == img.nComps) {
- tile->comp = 0;
- if (++tile->res == tile->maxNDecompLevels + 1) {
- tile->res = 0;
- }
- }
- }
- break;
- case 3: // precinct, component, resolution level, layer
- //~ this isn't correct -- see B.12.1.4
- if (++tile->layer == tile->nLayers) {
- tile->layer = 0;
- if (++tile->res == tile->maxNDecompLevels + 1) {
- tile->res = 0;
- if (++tile->comp == img.nComps) {
- tile->comp = 0;
- }
- }
- }
- break;
- case 4: // component, precinct, resolution level, layer
- //~ this isn't correct -- see B.12.1.5
- if (++tile->layer == tile->nLayers) {
- tile->layer = 0;
- if (++tile->res == tile->maxNDecompLevels + 1) {
- tile->res = 0;
- if (++tile->comp == img.nComps) {
- tile->comp = 0;
- }
- }
- }
- break;
- }
- }
-
- return gTrue;
-
- err:
- error(getPos(), "Error in JPX stream");
- return gFalse;
-}
-
-GBool JPXStream::readCodeBlockData(JPXTileComp *tileComp,
- JPXResLevel *resLevel,
- JPXPrecinct *precinct,
- JPXSubband *subband,
- Guint res, Guint sb,
- JPXCodeBlock *cb) {
- JPXCoeff *coeff0, *coeff1, *coeff;
- JArithmeticDecoder *arithDecoder;
- Guint horiz, vert, diag, all, cx, xorBit;
- int horizSign, vertSign;
- Guint i, x, y0, y1, y2;
-
- arithDecoder = new JArithmeticDecoder();
- arithDecoder->setStream(str, cb->dataLen);
- arithDecoder->start();
-
- for (i = 0; i < cb->nCodingPasses; ++i) {
- switch (cb->nextPass) {
-
- //----- significance propagation pass
- case jpxPassSigProp:
- for (y0 = cb->y0, coeff0 = cb->coeffs;
- y0 < cb->y1;
- y0 += 4, coeff0 += 4 << tileComp->codeBlockW) {
- for (x = cb->x0, coeff1 = coeff0;
- x < cb->x1;
- ++x, ++coeff1) {
- for (y1 = 0, coeff = coeff1;
- y1 < 4 && y0+y1 < cb->y1;
- ++y1, coeff += tileComp->cbW) {
- if (!(coeff->flags & jpxCoeffSignificant)) {
- horiz = vert = diag = 0;
- horizSign = vertSign = 2;
- if (x > cb->x0) {
- if (coeff[-1].flags & jpxCoeffSignificant) {
- ++horiz;
- horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1;
- }
- if (y0+y1 > cb->y0) {
- diag += (coeff[-tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- diag += (coeff[tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (x < cb->x1 - 1) {
- if (coeff[1].flags & jpxCoeffSignificant) {
- ++horiz;
- horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1;
- }
- if (y0+y1 > cb->y0) {
- diag += (coeff[-tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- diag += (coeff[tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (y0+y1 > cb->y0) {
- if (coeff[-tileComp->cbW].flags & jpxCoeffSignificant) {
- ++vert;
- vertSign += (coeff[-tileComp->cbW].flags & jpxCoeffSign)
- ? -1 : 1;
- }
- }
- if (y0+y1 < cb->y1 - 1) {
- if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) {
- ++vert;
- vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign)
- ? -1 : 1;
- }
- }
- cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb];
- if (cx != 0) {
- if (arithDecoder->decodeBit(cx, cb->stats)) {
- coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef;
- coeff->mag = (coeff->mag << 1) | 1;
- cx = signContext[horizSign][vertSign][0];
- xorBit = signContext[horizSign][vertSign][1];
- if (arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
- coeff->flags |= jpxCoeffSign;
- }
- }
- ++coeff->len;
- coeff->flags |= jpxCoeffTouched;
- }
- }
- }
- }
- }
- ++cb->nextPass;
- break;
-
- //----- magnitude refinement pass
- case jpxPassMagRef:
- for (y0 = cb->y0, coeff0 = cb->coeffs;
- y0 < cb->y1;
- y0 += 4, coeff0 += 4 << tileComp->codeBlockW) {
- for (x = cb->x0, coeff1 = coeff0;
- x < cb->x1;
- ++x, ++coeff1) {
- for (y1 = 0, coeff = coeff1;
- y1 < 4 && y0+y1 < cb->y1;
- ++y1, coeff += tileComp->cbW) {
- if ((coeff->flags & jpxCoeffSignificant) &&
- !(coeff->flags & jpxCoeffTouched)) {
- if (coeff->flags & jpxCoeffFirstMagRef) {
- all = 0;
- if (x > cb->x0) {
- all += (coeff[-1].flags >> jpxCoeffSignificantB) & 1;
- if (y0+y1 > cb->y0) {
- all += (coeff[-tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- all += (coeff[tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (x < cb->x1 - 1) {
- all += (coeff[1].flags >> jpxCoeffSignificantB) & 1;
- if (y0+y1 > cb->y0) {
- all += (coeff[-tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- all += (coeff[tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (y0+y1 > cb->y0) {
- all += (coeff[-tileComp->cbW].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- all += (coeff[tileComp->cbW].flags
- >> jpxCoeffSignificantB) & 1;
- }
- cx = all ? 15 : 14;
- } else {
- cx = 16;
- }
- coeff->mag = (coeff->mag << 1) |
- arithDecoder->decodeBit(cx, cb->stats);
- ++coeff->len;
- coeff->flags |= jpxCoeffTouched;
- coeff->flags &= ~jpxCoeffFirstMagRef;
- }
- }
- }
- }
- ++cb->nextPass;
- break;
-
- //----- cleanup pass
- case jpxPassCleanup:
- for (y0 = cb->y0, coeff0 = cb->coeffs;
- y0 < cb->y1;
- y0 += 4, coeff0 += 4 << tileComp->codeBlockW) {
- for (x = cb->x0, coeff1 = coeff0;
- x < cb->x1;
- ++x, ++coeff1) {
- y1 = 0;
- if (y0 + 3 < cb->y1 &&
- !(coeff1->flags & jpxCoeffTouched) &&
- !(coeff1[tileComp->cbW].flags & jpxCoeffTouched) &&
- !(coeff1[2 * tileComp->cbW].flags & jpxCoeffTouched) &&
- !(coeff1[3 * tileComp->cbW].flags & jpxCoeffTouched) &&
- (x == cb->x0 || y0 == cb->y0 ||
- !(coeff1[-tileComp->cbW - 1].flags
- & jpxCoeffSignificant)) &&
- (y0 == cb->y0 ||
- !(coeff1[-tileComp->cbW].flags & jpxCoeffSignificant)) &&
- (x == cb->x1 - 1 || y0 == cb->y0 ||
- !(coeff1[-tileComp->cbW + 1].flags & jpxCoeffSignificant)) &&
- (x == cb->x0 ||
- (!(coeff1[-1].flags & jpxCoeffSignificant) &&
- !(coeff1[tileComp->cbW - 1].flags
- & jpxCoeffSignificant) &&
- !(coeff1[2 * tileComp->cbW - 1].flags
- & jpxCoeffSignificant) &&
- !(coeff1[3 * tileComp->cbW - 1].flags
- & jpxCoeffSignificant))) &&
- (x == cb->x1 - 1 ||
- (!(coeff1[1].flags & jpxCoeffSignificant) &&
- !(coeff1[tileComp->cbW + 1].flags
- & jpxCoeffSignificant) &&
- !(coeff1[2 * tileComp->cbW + 1].flags
- & jpxCoeffSignificant) &&
- !(coeff1[3 * tileComp->cbW + 1].flags
- & jpxCoeffSignificant))) &&
- (x == cb->x0 || y0+4 == cb->y1 ||
- !(coeff1[4 * tileComp->cbW - 1].flags & jpxCoeffSignificant)) &&
- (y0+4 == cb->y1 ||
- !(coeff1[4 * tileComp->cbW].flags & jpxCoeffSignificant)) &&
- (x == cb->x1 - 1 || y0+4 == cb->y1 ||
- !(coeff1[4 * tileComp->cbW + 1].flags
- & jpxCoeffSignificant))) {
- if (arithDecoder->decodeBit(jpxContextRunLength, cb->stats)) {
- y1 = arithDecoder->decodeBit(jpxContextUniform, cb->stats);
- y1 = (y1 << 1) |
- arithDecoder->decodeBit(jpxContextUniform, cb->stats);
- for (y2 = 0, coeff = coeff1;
- y2 < y1;
- ++y2, coeff += tileComp->cbW) {
- ++coeff->len;
- }
- coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef;
- coeff->mag = (coeff->mag << 1) | 1;
- ++coeff->len;
- cx = signContext[2][2][0];
- xorBit = signContext[2][2][1];
- if (arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
- coeff->flags |= jpxCoeffSign;
- }
- ++y1;
- } else {
- for (y1 = 0, coeff = coeff1;
- y1 < 4;
- ++y1, coeff += tileComp->cbW) {
- ++coeff->len;
- }
- y1 = 4;
- }
- }
- for (coeff = &coeff1[y1 << tileComp->codeBlockW];
- y1 < 4 && y0 + y1 < cb->y1;
- ++y1, coeff += tileComp->cbW) {
- if (!(coeff->flags & jpxCoeffTouched)) {
- horiz = vert = diag = 0;
- horizSign = vertSign = 2;
- if (x > cb->x0) {
- if (coeff[-1].flags & jpxCoeffSignificant) {
- ++horiz;
- horizSign += (coeff[-1].flags & jpxCoeffSign) ? -1 : 1;
- }
- if (y0+y1 > cb->y0) {
- diag += (coeff[-tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- diag += (coeff[tileComp->cbW - 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (x < cb->x1 - 1) {
- if (coeff[1].flags & jpxCoeffSignificant) {
- ++horiz;
- horizSign += (coeff[1].flags & jpxCoeffSign) ? -1 : 1;
- }
- if (y0+y1 > cb->y0) {
- diag += (coeff[-tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- if (y0+y1 < cb->y1 - 1) {
- diag += (coeff[tileComp->cbW + 1].flags
- >> jpxCoeffSignificantB) & 1;
- }
- }
- if (y0+y1 > cb->y0) {
- if (coeff[-tileComp->cbW].flags & jpxCoeffSignificant) {
- ++vert;
- vertSign += (coeff[-tileComp->cbW].flags & jpxCoeffSign)
- ? -1 : 1;
- }
- }
- if (y0+y1 < cb->y1 - 1) {
- if (coeff[tileComp->cbW].flags & jpxCoeffSignificant) {
- ++vert;
- vertSign += (coeff[tileComp->cbW].flags & jpxCoeffSign)
- ? -1 : 1;
- }
- }
- cx = sigPropContext[horiz][vert][diag][res == 0 ? 1 : sb];
- if (arithDecoder->decodeBit(cx, cb->stats)) {
- coeff->flags |= jpxCoeffSignificant | jpxCoeffFirstMagRef;
- coeff->mag = (coeff->mag << 1) | 1;
- cx = signContext[horizSign][vertSign][0];
- xorBit = signContext[horizSign][vertSign][1];
- if (arithDecoder->decodeBit(cx, cb->stats) ^ xorBit) {
- coeff->flags |= jpxCoeffSign;
- }
- }
- ++coeff->len;
- } else {
- coeff->flags &= ~jpxCoeffTouched;
- }
- }
- }
- }
- cb->nextPass = jpxPassSigProp;
- break;
- }
- }
-
- delete arithDecoder;
- return gTrue;
-}
-
-// Inverse quantization, and wavelet transform (IDWT). This also does
-// the initial shift to convert to fixed point format.
-void JPXStream::inverseTransform(JPXTileComp *tileComp) {
- JPXResLevel *resLevel;
- JPXPrecinct *precinct;
- JPXSubband *subband;
- JPXCodeBlock *cb;
- JPXCoeff *coeff0, *coeff;
- Guint qStyle, guard, eps, shift, shift2;
- double mu;
- int val;
- int *dataPtr;
- Guint nx0, ny0, nx1, ny1;
- Guint r, cbX, cbY, x, y;
-
- //----- (NL)LL subband (resolution level 0)
-
- resLevel = &tileComp->resLevels[0];
- precinct = &resLevel->precincts[0];
- subband = &precinct->subbands[0];
-
- // i-quant parameters
- qStyle = tileComp->quantStyle & 0x1f;
- guard = (tileComp->quantStyle >> 5) & 7;
- if (qStyle == 0) {
- eps = (tileComp->quantSteps[0] >> 3) & 0x1f;
- shift = guard + eps - 1;
- mu = 0; // make gcc happy
- } else {
- shift = guard - 1 + tileComp->prec;
- mu = (double)(0x800 + (tileComp->quantSteps[0] & 0x7ff)) / 2048.0;
- }
- if (tileComp->transform == 0) {
- shift += fracBits;
- }
-
- // copy (NL)LL into the upper-left corner of the data array, doing
- // the fixed point adjustment and dequantization along the way
- cb = subband->cbs;
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- for (y = cb->y0, coeff0 = cb->coeffs;
- y < cb->y1;
- ++y, coeff0 += tileComp->cbW) {
- dataPtr = &tileComp->data[(y - subband->y0)
- * (tileComp->x1 - tileComp->x0)
- + (cb->x0 - subband->x0)];
- for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) {
- val = (int)coeff->mag;
- if (val != 0) {
- shift2 = shift - (cb->nZeroBitPlanes + coeff->len);
- if (shift2 > 0) {
- val = (val << shift2) + (1 << (shift2 - 1));
- } else {
- val >>= -shift2;
- }
- if (qStyle == 0) {
- if (tileComp->transform == 0) {
- val &= -1 << fracBits;
- }
- } else {
- val = (int)((double)val * mu);
- }
- if (coeff->flags & jpxCoeffSign) {
- val = -val;
- }
- }
- *dataPtr++ = val;
- }
- }
- ++cb;
- }
- }
-
- //----- IDWT for each level
-
- for (r = 1; r <= tileComp->nDecompLevels; ++r) {
- resLevel = &tileComp->resLevels[r];
-
- // (n)LL is already in the upper-left corner of the
- // tile-component data array -- interleave with (n)HL/LH/HH
- // and inverse transform to get (n-1)LL, which will be stored
- // in the upper-left corner of the tile-component data array
- if (r == tileComp->nDecompLevels) {
- nx0 = tileComp->x0;
- ny0 = tileComp->y0;
- nx1 = tileComp->x1;
- ny1 = tileComp->y1;
- } else {
- nx0 = tileComp->resLevels[r+1].x0;
- ny0 = tileComp->resLevels[r+1].y0;
- nx1 = tileComp->resLevels[r+1].x1;
- ny1 = tileComp->resLevels[r+1].y1;
- }
- inverseTransformLevel(tileComp, r, resLevel, nx0, ny0, nx1, ny1);
- }
-}
-
-// Do one level of the inverse transform:
-// - take (n)LL from the tile-component data array
-// - take (n)HL/LH/HH from <resLevel>
-// - leave the resulting (n-1)LL in the tile-component data array
-void JPXStream::inverseTransformLevel(JPXTileComp *tileComp,
- Guint r, JPXResLevel *resLevel,
- Guint nx0, Guint ny0,
- Guint nx1, Guint ny1) {
- JPXPrecinct *precinct;
- JPXSubband *subband;
- JPXCodeBlock *cb;
- JPXCoeff *coeff0, *coeff;
- Guint qStyle, guard, eps, shift, shift2, t;
- double mu;
- int val;
- int *dataPtr;
- Guint xo, yo;
- Guint x, y, sb, cbX, cbY;
- int xx, yy;
-
- //----- interleave
-
- // spread out LL
- for (yy = resLevel->y1 - 1; yy >= (int)resLevel->y0; --yy) {
- for (xx = resLevel->x1 - 1; xx >= (int)resLevel->x0; --xx) {
- tileComp->data[(2 * yy - ny0) * (tileComp->x1 - tileComp->x0)
- + (2 * xx - nx0)] =
- tileComp->data[(yy - resLevel->y0) * (tileComp->x1 - tileComp->x0)
- + (xx - resLevel->x0)];
- }
- }
-
- // i-quant parameters
- qStyle = tileComp->quantStyle & 0x1f;
- guard = (tileComp->quantStyle >> 5) & 7;
-
- // interleave HL/LH/HH
- precinct = &resLevel->precincts[0];
- for (sb = 0; sb < 3; ++sb) {
-
- // i-quant parameters
- if (qStyle == 0) {
- eps = (tileComp->quantSteps[3*r - 2 + sb] >> 3) & 0x1f;
- shift = guard + eps - 1;
- mu = 0; // make gcc happy
- } else {
- shift = guard + tileComp->prec;
- if (sb == 2) {
- ++shift;
- }
- t = tileComp->quantSteps[qStyle == 1 ? 0 : (3*r - 2 + sb)];
- mu = (double)(0x800 + (t & 0x7ff)) / 2048.0;
- }
- if (tileComp->transform == 0) {
- shift += fracBits;
- }
-
- // copy the subband coefficients into the data array, doing the
- // fixed point adjustment and dequantization along the way
- xo = (sb & 1) ? 0 : 1;
- yo = (sb > 0) ? 1 : 0;
- subband = &precinct->subbands[sb];
- cb = subband->cbs;
- for (cbY = 0; cbY < subband->nYCBs; ++cbY) {
- for (cbX = 0; cbX < subband->nXCBs; ++cbX) {
- for (y = cb->y0, coeff0 = cb->coeffs;
- y < cb->y1;
- ++y, coeff0 += tileComp->cbW) {
- dataPtr = &tileComp->data[(2 * y + yo - ny0)
- * (tileComp->x1 - tileComp->x0)
- + (2 * cb->x0 + xo - nx0)];
- for (x = cb->x0, coeff = coeff0; x < cb->x1; ++x, ++coeff) {
- val = (int)coeff->mag;
- if (val != 0) {
- shift2 = shift - (cb->nZeroBitPlanes + coeff->len);
- if (shift2 > 0) {
- val = (val << shift2) + (1 << (shift2 - 1));
- } else {
- val >>= -shift2;
- }
- if (qStyle == 0) {
- if (tileComp->transform == 0) {
- val &= -1 << fracBits;
- }
- } else {
- val = (int)((double)val * mu);
- }
- if (coeff->flags & jpxCoeffSign) {
- val = -val;
- }
- }
- *dataPtr = val;
- dataPtr += 2;
- }
- }
- ++cb;
- }
- }
- }
-
- //----- horizontal (row) transforms
- dataPtr = tileComp->data;
- for (y = 0; y < ny1 - ny0; ++y) {
- inverseTransform1D(tileComp, dataPtr, 1, nx0, nx1);
- dataPtr += tileComp->x1 - tileComp->x0;
- }
-
- //----- vertical (column) transforms
- dataPtr = tileComp->data;
- for (x = 0; x < nx1 - nx0; ++x) {
- inverseTransform1D(tileComp, dataPtr,
- tileComp->x1 - tileComp->x0, ny0, ny1);
- ++dataPtr;
- }
-}
-
-void JPXStream::inverseTransform1D(JPXTileComp *tileComp,
- int *data, Guint stride,
- Guint i0, Guint i1) {
- int *buf;
- Guint offset, end, i;
-
- //----- special case for length = 1
- if (i1 - i0 == 1) {
- if (i0 & 1) {
- *data >>= 1;
- }
-
- } else {
-
- // choose an offset: this makes even buf[] indexes correspond to
- // odd values of i, and vice versa
- offset = 3 + (i0 & 1);
- end = offset + i1 - i0;
-
- //----- gather
- buf = tileComp->buf;
- for (i = 0; i < i1 - i0; ++i) {
- buf[offset + i] = data[i * stride];
- }
-
- //----- extend right
- buf[end] = buf[end - 2];
- if (i1 - i0 == 2) {
- buf[end+1] = buf[offset + 1];
- buf[end+2] = buf[offset];
- buf[end+3] = buf[offset + 1];
- } else {
- buf[end+1] = buf[end - 3];
- if (i1 - i0 == 3) {
- buf[end+2] = buf[offset + 1];
- buf[end+3] = buf[offset + 2];
- } else {
- buf[end+2] = buf[end - 4];
- if (i1 - i0 == 4) {
- buf[end+3] = buf[offset + 1];
- } else {
- buf[end+3] = buf[end - 5];
- }
- }
- }
-
- //----- extend left
- buf[offset - 1] = buf[offset + 1];
- buf[offset - 2] = buf[offset + 2];
- buf[offset - 3] = buf[offset + 3];
- if (offset == 4) {
- buf[0] = buf[offset + 4];
- }
-
- //----- 9-7 irreversible filter
-
- if (tileComp->transform == 0) {
- // step 1 (even)
- for (i = 1; i <= end + 2; i += 2) {
- buf[i] = (int)(idwtKappa * buf[i]);
- }
- // step 2 (odd)
- for (i = 0; i <= end + 3; i += 2) {
- buf[i] = (int)(idwtIKappa * buf[i]);
- }
- // step 3 (even)
- for (i = 1; i <= end + 2; i += 2) {
- buf[i] = (int)(buf[i] - idwtDelta * (buf[i-1] + buf[i+1]));
- }
- // step 4 (odd)
- for (i = 2; i <= end + 1; i += 2) {
- buf[i] = (int)(buf[i] - idwtGamma * (buf[i-1] + buf[i+1]));
- }
- // step 5 (even)
- for (i = 3; i <= end; i += 2) {
- buf[i] = (int)(buf[i] - idwtBeta * (buf[i-1] + buf[i+1]));
- }
- // step 6 (odd)
- for (i = 4; i <= end - 1; i += 2) {
- buf[i] = (int)(buf[i] - idwtAlpha * (buf[i-1] + buf[i+1]));
- }
-
- //----- 5-3 reversible filter
-
- } else {
- // step 1 (even)
- for (i = 3; i <= end; i += 2) {
- buf[i] -= (buf[i-1] + buf[i+1] + 2) >> 2;
- }
- // step 2 (odd)
- for (i = 4; i < end; i += 2) {
- buf[i] += (buf[i-1] + buf[i+1]) >> 1;
- }
- }
-
- //----- scatter
- for (i = 0; i < i1 - i0; ++i) {
- data[i * stride] = buf[offset + i];
- }
- }
-}
-
-// Inverse multi-component transform and DC level shift. This also
-// converts fixed point samples back to integers.
-GBool JPXStream::inverseMultiCompAndDC(JPXTile *tile) {
- JPXTileComp *tileComp;
- int coeff, d0, d1, d2, minVal, maxVal, zeroVal;
- int *dataPtr;
- Guint j, comp, x, y;
-
- //----- inverse multi-component transform
-
- if (tile->multiComp == 1) {
- if (img.nComps < 3 ||
- tile->tileComps[0].hSep != tile->tileComps[1].hSep ||
- tile->tileComps[0].vSep != tile->tileComps[1].vSep ||
- tile->tileComps[1].hSep != tile->tileComps[2].hSep ||
- tile->tileComps[1].vSep != tile->tileComps[2].vSep) {
- return gFalse;
- }
-
- // inverse irreversible multiple component transform
- if (tile->tileComps[0].transform == 0) {
- j = 0;
- for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) {
- for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) {
- d0 = tile->tileComps[0].data[j];
- d1 = tile->tileComps[1].data[j];
- d2 = tile->tileComps[2].data[j];
- tile->tileComps[0].data[j] = (int)(d0 + 1.402 * d2 + 0.5);
- tile->tileComps[1].data[j] =
- (int)(d0 - 0.34413 * d1 - 0.71414 * d2 + 0.5);
- tile->tileComps[2].data[j] = (int)(d0 + 1.772 * d1 + 0.5);
- ++j;
- }
- }
-
- // inverse reversible multiple component transform
- } else {
- j = 0;
- for (y = 0; y < tile->tileComps[0].y1 - tile->tileComps[0].y0; ++y) {
- for (x = 0; x < tile->tileComps[0].x1 - tile->tileComps[0].x0; ++x) {
- d0 = tile->tileComps[0].data[j];
- d1 = tile->tileComps[1].data[j];
- d2 = tile->tileComps[2].data[j];
- tile->tileComps[0].data[j] = d0 - ((d2 + d1) >> 2);
- tile->tileComps[1].data[j] = d2 - d1;
- tile->tileComps[2].data[j] = d0 - d1;
- ++j;
- }
- }
- }
- }
-
- //----- DC level shift
- for (comp = 0; comp < img.nComps; ++comp) {
- tileComp = &tile->tileComps[comp];
-
- // signed: clip
- if (tileComp->sgned) {
- minVal = -(1 << (tileComp->prec - 1));
- maxVal = (1 << (tileComp->prec - 1)) - 1;
- dataPtr = tileComp->data;
- for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) {
- for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) {
- coeff = *dataPtr;
- if (tileComp->transform == 0) {
- coeff >>= fracBits;
- }
- if (coeff < minVal) {
- coeff = minVal;
- } else if (coeff > maxVal) {
- coeff = maxVal;
- }
- *dataPtr++ = coeff;
- }
- }
-
- // unsigned: inverse DC level shift and clip
- } else {
- maxVal = (1 << tileComp->prec) - 1;
- zeroVal = 1 << (tileComp->prec - 1);
- dataPtr = tileComp->data;
- for (y = 0; y < tileComp->y1 - tileComp->y0; ++y) {
- for (x = 0; x < tileComp->x1 - tileComp->x0; ++x) {
- coeff = *dataPtr;
- if (tileComp->transform == 0) {
- coeff >>= fracBits;
- }
- coeff += zeroVal;
- if (coeff < 0) {
- coeff = 0;
- } else if (coeff > maxVal) {
- coeff = maxVal;
- }
- *dataPtr++ = coeff;
- }
- }
- }
- }
-
- return gTrue;
-}
-
-GBool JPXStream::readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen) {
- Guint len, lenH;
-
- if (!readULong(&len) ||
- !readULong(boxType)) {
- return gFalse;
- }
- if (len == 1) {
- if (!readULong(&lenH) || !readULong(&len)) {
- return gFalse;
- }
- if (lenH) {
- error(getPos(), "JPX stream contains a box larger than 2^32 bytes");
- return gFalse;
- }
- *boxLen = len;
- *dataLen = len - 16;
- } else if (len == 0) {
- *boxLen = 0;
- *dataLen = 0;
- } else {
- *boxLen = len;
- *dataLen = len - 8;
- }
- return gTrue;
-}
-
-int JPXStream::readMarkerHdr(int *segType, Guint *segLen) {
- int c;
-
- do {
- do {
- if ((c = str->getChar()) == EOF) {
- return gFalse;
- }
- } while (c != 0xff);
- do {
- if ((c = str->getChar()) == EOF) {
- return gFalse;
- }
- } while (c == 0xff);
- } while (c == 0x00);
- *segType = c;
- if ((c >= 0x30 && c <= 0x3f) ||
- c == 0x4f || c == 0x92 || c == 0x93 || c == 0xd9) {
- *segLen = 0;
- return gTrue;
- }
- return readUWord(segLen);
-}
-
-GBool JPXStream::readUByte(Guint *x) {
- int c0;
-
- if ((c0 = str->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)c0;
- return gTrue;
-}
-
-GBool JPXStream::readByte(int *x) {
- int c0;
-
- if ((c0 = str->getChar()) == EOF) {
- return gFalse;
- }
- *x = c0;
- if (c0 & 0x80) {
- *x |= -1 - 0xff;
- }
- return gTrue;
-}
-
-GBool JPXStream::readUWord(Guint *x) {
- int c0, c1;
-
- if ((c0 = str->getChar()) == EOF ||
- (c1 = str->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)((c0 << 8) | c1);
- return gTrue;
-}
-
-GBool JPXStream::readULong(Guint *x) {
- int c0, c1, c2, c3;
-
- if ((c0 = str->getChar()) == EOF ||
- (c1 = str->getChar()) == EOF ||
- (c2 = str->getChar()) == EOF ||
- (c3 = str->getChar()) == EOF) {
- return gFalse;
- }
- *x = (Guint)((c0 << 24) | (c1 << 16) | (c2 << 8) | c3);
- return gTrue;
-}
-
-GBool JPXStream::readNBytes(int nBytes, GBool signd, int *x) {
- int y, c, i;
-
- y = 0;
- for (i = 0; i < nBytes; ++i) {
- if ((c = str->getChar()) == EOF) {
- return gFalse;
- }
- y = (y << 8) + c;
- }
- if (signd) {
- if (y & (1 << (8 * nBytes - 1))) {
- y |= -1 << (8 * nBytes);
- }
- }
- *x = y;
- return gTrue;
-}
-
-GBool JPXStream::readBits(int nBits, Guint *x) {
- int c;
-
- while (bitBufLen < nBits) {
- if ((c = str->getChar()) == EOF) {
- return gFalse;
- }
- ++byteCount;
- if (bitBufSkip) {
- bitBuf = (bitBuf << 7) | (c & 0x7f);
- bitBufLen += 7;
- } else {
- bitBuf = (bitBuf << 8) | (c & 0xff);
- bitBufLen += 8;
- }
- bitBufSkip = c == 0xff;
- }
- *x = (bitBuf >> (bitBufLen - nBits)) & ((1 << nBits) - 1);
- bitBufLen -= nBits;
- return gTrue;
-}
-
-void JPXStream::clearBitBuf() {
- bitBufLen = 0;
- bitBufSkip = gFalse;
- byteCount = 0;
-}
diff --git a/pdf/xpdf/JPXStream.h b/pdf/xpdf/JPXStream.h
deleted file mode 100644
index eb84fe6..0000000
--- a/pdf/xpdf/JPXStream.h
+++ /dev/null
@@ -1,340 +0,0 @@
-//========================================================================
-//
-// JPXStream.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef JPXSTREAM_H
-#define JPXSTREAM_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-#include "Stream.h"
-
-class JArithmeticDecoderStats;
-
-//------------------------------------------------------------------------
-
-enum JPXColorSpaceType {
- jpxCSBiLevel = 0,
- jpxCSYCbCr1 = 1,
- jpxCSYCbCr2 = 3,
- jpxCSYCBCr3 = 4,
- jpxCSPhotoYCC = 9,
- jpxCSCMY = 11,
- jpxCSCMYK = 12,
- jpxCSYCCK = 13,
- jpxCSCIELab = 14,
- jpxCSsRGB = 16,
- jpxCSGrayscale = 17,
- jpxCSBiLevel2 = 18,
- jpxCSCIEJab = 19,
- jpxCSCISesRGB = 20,
- jpxCSROMMRGB = 21,
- jpxCSsRGBYCbCr = 22,
- jpxCSYPbPr1125 = 23,
- jpxCSYPbPr1250 = 24
-};
-
-struct JPXColorSpec {
- Guint meth; // method
- int prec; // precedence
- union {
- struct {
- JPXColorSpaceType type; // color space type
- union {
- struct {
- Guint rl, ol, ra, oa, rb, ob, il;
- } cieLab;
- };
- } enumerated;
- };
-};
-
-//------------------------------------------------------------------------
-
-struct JPXPalette {
- Guint nEntries; // number of entries in the palette
- Guint nComps; // number of components in each entry
- Guint *bpc; // bits per component, for each component
- int *c; // color data:
- // c[i*nComps+j] = entry i, component j
-};
-
-//------------------------------------------------------------------------
-
-struct JPXCompMap {
- Guint nChannels; // number of channels
- Guint *comp; // codestream components mapped to each channel
- Guint *type; // 0 for direct use, 1 for palette mapping
- Guint *pComp; // palette components to use
-};
-
-//------------------------------------------------------------------------
-
-struct JPXChannelDefn {
- Guint nChannels; // number of channels
- Guint *idx; // channel indexes
- Guint *type; // channel types
- Guint *assoc; // channel associations
-};
-
-//------------------------------------------------------------------------
-
-struct JPXTagTreeNode {
- GBool finished; // true if this node is finished
- Guint val; // current value
-};
-
-//------------------------------------------------------------------------
-
-struct JPXCoeff {
- Gushort flags; // flag bits
- Gushort len; // number of significant bits in mag
- Guint mag; // magnitude value
-};
-
-// coefficient flags
-#define jpxCoeffSignificantB 0
-#define jpxCoeffTouchedB 1
-#define jpxCoeffFirstMagRefB 2
-#define jpxCoeffSignB 7
-#define jpxCoeffSignificant (1 << jpxCoeffSignificantB)
-#define jpxCoeffTouched (1 << jpxCoeffTouchedB)
-#define jpxCoeffFirstMagRef (1 << jpxCoeffFirstMagRefB)
-#define jpxCoeffSign (1 << jpxCoeffSignB)
-
-//------------------------------------------------------------------------
-
-struct JPXCodeBlock {
- //----- size
- Guint x0, y0, x1, y1; // bounds
-
- //----- persistent state
- GBool seen; // true if this code-block has already
- // been seen
- Guint lBlock; // base number of bits used for pkt data length
- Guint nextPass; // next coding pass
-
- //---- info from first packet
- Guint nZeroBitPlanes; // number of zero bit planes
-
- //----- info for the current packet
- Guint included; // code-block inclusion in this packet:
- // 0=not included, 1=included
- Guint nCodingPasses; // number of coding passes in this pkt
- Guint dataLen; // pkt data length
-
- //----- coefficient data
- JPXCoeff *coeffs; // the coefficients
- JArithmeticDecoderStats // arithmetic decoder stats
- *stats;
-};
-
-//------------------------------------------------------------------------
-
-struct JPXSubband {
- //----- computed
- Guint x0, y0, x1, y1; // bounds
- Guint nXCBs, nYCBs; // number of code-blocks in the x and y
- // directions
-
- //----- tag trees
- Guint maxTTLevel; // max tag tree level
- JPXTagTreeNode *inclusion; // inclusion tag tree for each subband
- JPXTagTreeNode *zeroBitPlane; // zero-bit plane tag tree for each
- // subband
-
- //----- children
- JPXCodeBlock *cbs; // the code-blocks (len = nXCBs * nYCBs)
-};
-
-//------------------------------------------------------------------------
-
-struct JPXPrecinct {
- //----- computed
- Guint x0, y0, x1, y1; // bounds of the precinct
-
- //----- children
- JPXSubband *subbands; // the subbands
-};
-
-//------------------------------------------------------------------------
-
-struct JPXResLevel {
- //----- from the COD and COC segments (main and tile)
- Guint precinctWidth; // log2(precinct width)
- Guint precinctHeight; // log2(precinct height)
-
- //----- computed
- Guint x0, y0, x1, y1; // bounds of the tile-comp (for this res level)
- Guint bx0[3], by0[3], // subband bounds
- bx1[3], by1[3];
-
- //---- children
- JPXPrecinct *precincts; // the precincts
-};
-
-//------------------------------------------------------------------------
-
-struct JPXTileComp {
- //----- from the SIZ segment
- GBool sgned; // 1 for signed, 0 for unsigned
- Guint prec; // precision, in bits
- Guint hSep; // horizontal separation of samples
- Guint vSep; // vertical separation of samples
-
- //----- from the COD and COC segments (main and tile)
- Guint style; // coding style parameter (Scod / Scoc)
- Guint nDecompLevels; // number of decomposition levels
- Guint codeBlockW; // log2(code-block width)
- Guint codeBlockH; // log2(code-block height)
- Guint codeBlockStyle; // code-block style
- Guint transform; // wavelet transformation
-
- //----- from the QCD and QCC segments (main and tile)
- Guint quantStyle; // quantization style
- Guint *quantSteps; // quantization step size for each subband
- Guint nQuantSteps; // number of entries in quantSteps
-
- //----- computed
- Guint x0, y0, x1, y1; // bounds of the tile-comp, in ref coords
- Guint cbW; // code-block width
- Guint cbH; // code-block height
-
- //----- image data
- int *data; // the decoded image data
- int *buf; // intermediate buffer for the inverse
- // transform
-
- //----- children
- JPXResLevel *resLevels; // the resolution levels
- // (len = nDecompLevels + 1)
-};
-
-//------------------------------------------------------------------------
-
-struct JPXTile {
- //----- from the COD segments (main and tile)
- Guint progOrder; // progression order
- Guint nLayers; // number of layers
- Guint multiComp; // multiple component transformation
-
- //----- computed
- Guint x0, y0, x1, y1; // bounds of the tile, in ref coords
- Guint maxNDecompLevels; // max number of decomposition levels used
- // in any component in this tile
-
- //----- progression order loop counters
- Guint comp; // component
- Guint res; // resolution level
- Guint precinct; // precinct
- Guint layer; // layer
-
- //----- children
- JPXTileComp *tileComps; // the tile-components (len = JPXImage.nComps)
-};
-
-//------------------------------------------------------------------------
-
-struct JPXImage {
- //----- from the SIZ segment
- Guint xSize, ySize; // size of reference grid
- Guint xOffset, yOffset; // image offset
- Guint xTileSize, yTileSize; // size of tiles
- Guint xTileOffset, // offset of first tile
- yTileOffset;
- Guint nComps; // number of components
-
- //----- computed
- Guint nXTiles; // number of tiles in x direction
- Guint nYTiles; // number of tiles in y direction
-
- //----- children
- JPXTile *tiles; // the tiles (len = nXTiles * nYTiles)
-};
-
-//------------------------------------------------------------------------
-
-class JPXStream: public FilterStream {
-public:
-
- JPXStream(Stream *strA);
- virtual ~JPXStream();
- virtual StreamKind getKind() { return strJPX; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- void fillReadBuf();
- GBool readBoxes();
- GBool readColorSpecBox(Guint dataLen);
- GBool readCodestream(Guint len);
- GBool readTilePart();
- GBool readTilePartData(Guint tileIdx,
- Guint tilePartLen, GBool tilePartToEOC);
- GBool readCodeBlockData(JPXTileComp *tileComp,
- JPXResLevel *resLevel,
- JPXPrecinct *precinct,
- JPXSubband *subband,
- Guint res, Guint sb,
- JPXCodeBlock *cb);
- void inverseTransform(JPXTileComp *tileComp);
- void inverseTransformLevel(JPXTileComp *tileComp,
- Guint r, JPXResLevel *resLevel,
- Guint nx0, Guint ny0,
- Guint nx1, Guint ny1);
- void inverseTransform1D(JPXTileComp *tileComp,
- int *data, Guint stride,
- Guint i0, Guint i1);
- GBool inverseMultiCompAndDC(JPXTile *tile);
- GBool readBoxHdr(Guint *boxType, Guint *boxLen, Guint *dataLen);
- int readMarkerHdr(int *segType, Guint *segLen);
- GBool readUByte(Guint *x);
- GBool readByte(int *x);
- GBool readUWord(Guint *x);
- GBool readULong(Guint *x);
- GBool readNBytes(int nBytes, GBool signd, int *x);
- GBool readBits(int nBits, Guint *x);
- void clearBitBuf();
-
- Guint nComps; // number of components
- Guint *bpc; // bits per component, for each component
- Guint width, height; // image size
- GBool haveImgHdr; // set if a JP2/JPX image header has been
- // found
- JPXColorSpec cs; // color specification
- GBool haveCS; // set if a color spec has been found
- JPXPalette palette; // the palette
- GBool havePalette; // set if a palette has been found
- JPXCompMap compMap; // the component mapping
- GBool haveCompMap; // set if a component mapping has been found
- JPXChannelDefn channelDefn; // channel definition
- GBool haveChannelDefn; // set if a channel defn has been found
-
- JPXImage img; // JPEG2000 decoder data
- Guint bitBuf; // buffer for bit reads
- int bitBufLen; // number of bits in bitBuf
- GBool bitBufSkip; // true if next bit should be skipped
- // (for bit stuffing)
- Guint byteCount; // number of bytes read since last call
- // to clearBitBuf
-
- Guint curX, curY, curComp; // current position for lookChar/getChar
- Guint readBuf; // read buffer
- Guint readBufLen; // number of valid bits in readBuf
-};
-
-#endif
diff --git a/pdf/xpdf/Lexer.cc b/pdf/xpdf/Lexer.cc
deleted file mode 100644
index 1fa166f..0000000
--- a/pdf/xpdf/Lexer.cc
+++ /dev/null
@@ -1,474 +0,0 @@
-//========================================================================
-//
-// Lexer.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <ctype.h>
-#include "Lexer.h"
-#include "Error.h"
-
-//------------------------------------------------------------------------
-
-// A '1' in this array means the character is white space. A '1' or
-// '2' means the character ends a name or command.
-static char specialChars[256] = {
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
- 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
-};
-
-//------------------------------------------------------------------------
-// Lexer
-//------------------------------------------------------------------------
-
-Lexer::Lexer(XRef *xref, Stream *str) {
- Object obj;
-
- curStr.initStream(str);
- streams = new Array(xref);
- streams->add(curStr.copy(&obj));
- strPtr = 0;
- freeArray = gTrue;
- curStr.streamReset();
-}
-
-Lexer::Lexer(XRef *xref, Object *obj) {
- Object obj2;
-
- if (obj->isStream()) {
- streams = new Array(xref);
- freeArray = gTrue;
- streams->add(obj->copy(&obj2));
- } else {
- streams = obj->getArray();
- freeArray = gFalse;
- }
- strPtr = 0;
- if (streams->getLength() > 0) {
- streams->get(strPtr, &curStr);
- curStr.streamReset();
- }
-}
-
-Lexer::~Lexer() {
- if (!curStr.isNone()) {
- curStr.streamClose();
- curStr.free();
- }
- if (freeArray) {
- delete streams;
- }
-}
-
-int Lexer::getChar() {
- int c;
-
- c = EOF;
- while (!curStr.isNone() && (c = curStr.streamGetChar()) == EOF) {
- curStr.streamClose();
- curStr.free();
- ++strPtr;
- if (strPtr < streams->getLength()) {
- streams->get(strPtr, &curStr);
- curStr.streamReset();
- }
- }
- return c;
-}
-
-int Lexer::lookChar() {
- if (curStr.isNone()) {
- return EOF;
- }
- return curStr.streamLookChar();
-}
-
-Object *Lexer::getObj(Object *obj) {
- char *p;
- int c, c2;
- GBool comment, neg, done;
- int numParen;
- int xi;
- double xf, scale;
- GString *s;
- int n, m;
-
- // skip whitespace and comments
- comment = gFalse;
- while (1) {
- if ((c = getChar()) == EOF) {
- return obj->initEOF();
- }
- if (comment) {
- if (c == '\r' || c == '\n')
- comment = gFalse;
- } else if (c == '%') {
- comment = gTrue;
- } else if (specialChars[c] != 1) {
- break;
- }
- }
-
- // start reading token
- switch (c) {
-
- // number
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case '-': case '.':
- neg = gFalse;
- xi = 0;
- if (c == '-') {
- neg = gTrue;
- } else if (c == '.') {
- goto doReal;
- } else {
- xi = c - '0';
- }
- while (1) {
- c = lookChar();
- if (isdigit(c)) {
- getChar();
- xi = xi * 10 + (c - '0');
- } else if (c == '.') {
- getChar();
- goto doReal;
- } else {
- break;
- }
- }
- if (neg)
- xi = -xi;
- obj->initInt(xi);
- break;
- doReal:
- xf = xi;
- scale = 0.1;
- while (1) {
- c = lookChar();
- if (!isdigit(c)) {
- break;
- }
- getChar();
- xf = xf + scale * (c - '0');
- scale *= 0.1;
- }
- if (neg)
- xf = -xf;
- obj->initReal(xf);
- break;
-
- // string
- case '(':
- p = tokBuf;
- n = 0;
- numParen = 1;
- done = gFalse;
- s = NULL;
- do {
- c2 = EOF;
- switch (c = getChar()) {
-
- case EOF:
-#if 0
- // This breaks some PDF files, e.g., ones from Photoshop.
- case '\r':
- case '\n':
-#endif
- error(getPos(), "Unterminated string");
- done = gTrue;
- break;
-
- case '(':
- ++numParen;
- c2 = c;
- break;
-
- case ')':
- if (--numParen == 0) {
- done = gTrue;
- } else {
- c2 = c;
- }
- break;
-
- case '\\':
- switch (c = getChar()) {
- case 'n':
- c2 = '\n';
- break;
- case 'r':
- c2 = '\r';
- break;
- case 't':
- c2 = '\t';
- break;
- case 'b':
- c2 = '\b';
- break;
- case 'f':
- c2 = '\f';
- break;
- case '\\':
- case '(':
- case ')':
- c2 = c;
- break;
- case '0': case '1': case '2': case '3':
- case '4': case '5': case '6': case '7':
- c2 = c - '0';
- c = lookChar();
- if (c >= '0' && c <= '7') {
- getChar();
- c2 = (c2 << 3) + (c - '0');
- c = lookChar();
- if (c >= '0' && c <= '7') {
- getChar();
- c2 = (c2 << 3) + (c - '0');
- }
- }
- break;
- case '\r':
- c = lookChar();
- if (c == '\n') {
- getChar();
- }
- break;
- case '\n':
- break;
- case EOF:
- error(getPos(), "Unterminated string");
- done = gTrue;
- break;
- default:
- c2 = c;
- break;
- }
- break;
-
- default:
- c2 = c;
- break;
- }
-
- if (c2 != EOF) {
- if (n == tokBufSize) {
- if (!s)
- s = new GString(tokBuf, tokBufSize);
- else
- s->append(tokBuf, tokBufSize);
- p = tokBuf;
- n = 0;
- }
- *p++ = (char)c2;
- ++n;
- }
- } while (!done);
- if (!s)
- s = new GString(tokBuf, n);
- else
- s->append(tokBuf, n);
- obj->initString(s);
- break;
-
- // name
- case '/':
- p = tokBuf;
- n = 0;
- while ((c = lookChar()) != EOF && !specialChars[c]) {
- getChar();
- if (c == '#') {
- c2 = lookChar();
- if (c2 >= '0' && c2 <= '9') {
- c = c2 - '0';
- } else if (c2 >= 'A' && c2 <= 'F') {
- c = c2 - 'A' + 10;
- } else if (c2 >= 'a' && c2 <= 'f') {
- c = c2 - 'a' + 10;
- } else {
- goto notEscChar;
- }
- getChar();
- c <<= 4;
- c2 = getChar();
- if (c2 >= '0' && c2 <= '9') {
- c += c2 - '0';
- } else if (c2 >= 'A' && c2 <= 'F') {
- c += c2 - 'A' + 10;
- } else if (c2 >= 'a' && c2 <= 'f') {
- c += c2 - 'a' + 10;
- } else {
- error(getPos(), "Illegal digit in hex char in name");
- }
- }
- notEscChar:
- if (++n == tokBufSize) {
- error(getPos(), "Name token too long");
- break;
- }
- *p++ = c;
- }
- *p = '\0';
- obj->initName(tokBuf);
- break;
-
- // array punctuation
- case '[':
- case ']':
- tokBuf[0] = c;
- tokBuf[1] = '\0';
- obj->initCmd(tokBuf);
- break;
-
- // hex string or dict punctuation
- case '<':
- c = lookChar();
-
- // dict punctuation
- if (c == '<') {
- getChar();
- tokBuf[0] = tokBuf[1] = '<';
- tokBuf[2] = '\0';
- obj->initCmd(tokBuf);
-
- // hex string
- } else {
- p = tokBuf;
- m = n = 0;
- c2 = 0;
- s = NULL;
- while (1) {
- c = getChar();
- if (c == '>') {
- break;
- } else if (c == EOF) {
- error(getPos(), "Unterminated hex string");
- break;
- } else if (specialChars[c] != 1) {
- c2 = c2 << 4;
- if (c >= '0' && c <= '9')
- c2 += c - '0';
- else if (c >= 'A' && c <= 'F')
- c2 += c - 'A' + 10;
- else if (c >= 'a' && c <= 'f')
- c2 += c - 'a' + 10;
- else
- error(getPos(), "Illegal character <%02x> in hex string", c);
- if (++m == 2) {
- if (n == tokBufSize) {
- if (!s)
- s = new GString(tokBuf, tokBufSize);
- else
- s->append(tokBuf, tokBufSize);
- p = tokBuf;
- n = 0;
- }
- *p++ = (char)c2;
- ++n;
- c2 = 0;
- m = 0;
- }
- }
- }
- if (!s)
- s = new GString(tokBuf, n);
- else
- s->append(tokBuf, n);
- if (m == 1)
- s->append((char)(c2 << 4));
- obj->initString(s);
- }
- break;
-
- // dict punctuation
- case '>':
- c = lookChar();
- if (c == '>') {
- getChar();
- tokBuf[0] = tokBuf[1] = '>';
- tokBuf[2] = '\0';
- obj->initCmd(tokBuf);
- } else {
- error(getPos(), "Illegal character '>'");
- obj->initError();
- }
- break;
-
- // error
- case ')':
- case '{':
- case '}':
- error(getPos(), "Illegal character '%c'", c);
- obj->initError();
- break;
-
- // command
- default:
- p = tokBuf;
- *p++ = c;
- n = 1;
- while ((c = lookChar()) != EOF && !specialChars[c]) {
- getChar();
- if (++n == tokBufSize) {
- error(getPos(), "Command token too long");
- break;
- }
- *p++ = c;
- }
- *p = '\0';
- if (tokBuf[0] == 't' && !strcmp(tokBuf, "true")) {
- obj->initBool(gTrue);
- } else if (tokBuf[0] == 'f' && !strcmp(tokBuf, "false")) {
- obj->initBool(gFalse);
- } else if (tokBuf[0] == 'n' && !strcmp(tokBuf, "null")) {
- obj->initNull();
- } else {
- obj->initCmd(tokBuf);
- }
- break;
- }
-
- return obj;
-}
-
-void Lexer::skipToNextLine() {
- int c;
-
- while (1) {
- c = getChar();
- if (c == EOF || c == '\n') {
- return;
- }
- if (c == '\r') {
- if ((c = lookChar()) == '\n') {
- getChar();
- }
- return;
- }
- }
-}
diff --git a/pdf/xpdf/Lexer.h b/pdf/xpdf/Lexer.h
deleted file mode 100644
index 398d27c..0000000
--- a/pdf/xpdf/Lexer.h
+++ /dev/null
@@ -1,77 +0,0 @@
-//========================================================================
-//
-// Lexer.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef LEXER_H
-#define LEXER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-#include "Stream.h"
-
-class XRef;
-
-#define tokBufSize 128 // size of token buffer
-
-//------------------------------------------------------------------------
-// Lexer
-//------------------------------------------------------------------------
-
-class Lexer {
-public:
-
- // Construct a lexer for a single stream. Deletes the stream when
- // lexer is deleted.
- Lexer(XRef *xref, Stream *str);
-
- // Construct a lexer for a stream or array of streams (assumes obj
- // is either a stream or array of streams).
- Lexer(XRef *xref, Object *obj);
-
- // Destructor.
- ~Lexer();
-
- // Get the next object from the input stream.
- Object *getObj(Object *obj);
-
- // Skip to the beginning of the next line in the input stream.
- void skipToNextLine();
-
- // Skip over one character.
- void skipChar() { getChar(); }
-
- // Get stream.
- Stream *getStream()
- { return curStr.isNone() ? (Stream *)NULL : curStr.getStream(); }
-
- // Get current position in file. This is only used for error
- // messages, so it returns an int instead of a Guint.
- int getPos()
- { return curStr.isNone() ? -1 : (int)curStr.streamGetPos(); }
-
- // Set position in file.
- void setPos(Guint pos, int dir = 0)
- { if (!curStr.isNone()) curStr.streamSetPos(pos, dir); }
-
-private:
-
- int getChar();
- int lookChar();
-
- Array *streams; // array of input streams
- int strPtr; // index of current stream
- Object curStr; // current stream
- GBool freeArray; // should lexer free the streams array?
- char tokBuf[tokBufSize]; // temporary token buffer
-};
-
-#endif
diff --git a/pdf/xpdf/Link.cc b/pdf/xpdf/Link.cc
deleted file mode 100644
index bfb41b7..0000000
--- a/pdf/xpdf/Link.cc
+++ /dev/null
@@ -1,851 +0,0 @@
-//========================================================================
-//
-// Link.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include <string.h>
-#include "gmem.h"
-#include "GString.h"
-#include "Error.h"
-#include "Object.h"
-#include "Array.h"
-#include "Dict.h"
-#include "Link.h"
-
-//------------------------------------------------------------------------
-// LinkAction
-//------------------------------------------------------------------------
-
-LinkAction *LinkAction::parseDest(Object *obj) {
- LinkAction *action;
-
- action = new LinkGoTo(obj);
- if (!action->isOk()) {
- delete action;
- return NULL;
- }
- return action;
-}
-
-LinkAction *LinkAction::parseAction(Object *obj, GString *baseURI) {
- LinkAction *action;
- Object obj2, obj3, obj4;
-
- if (!obj->isDict()) {
- error(-1, "parseAction: Bad annotation action for URI '%s'",
- baseURI ? baseURI->getCString() : "NULL");
- return NULL;
- }
-
- obj->dictLookup("S", &obj2);
-
- // GoTo action
- if (obj2.isName("GoTo")) {
- obj->dictLookup("D", &obj3);
- action = new LinkGoTo(&obj3);
- obj3.free();
-
- // GoToR action
- } else if (obj2.isName("GoToR")) {
- obj->dictLookup("F", &obj3);
- obj->dictLookup("D", &obj4);
- action = new LinkGoToR(&obj3, &obj4);
- obj3.free();
- obj4.free();
-
- // Launch action
- } else if (obj2.isName("Launch")) {
- action = new LinkLaunch(obj);
-
- // URI action
- } else if (obj2.isName("URI")) {
- obj->dictLookup("URI", &obj3);
- action = new LinkURI(&obj3, baseURI);
- obj3.free();
-
- // Named action
- } else if (obj2.isName("Named")) {
- obj->dictLookup("N", &obj3);
- action = new LinkNamed(&obj3);
- obj3.free();
-
- // Movie action
- } else if (obj2.isName("Movie")) {
- obj->dictLookupNF("Annot", &obj3);
- obj->dictLookup("T", &obj4);
- action = new LinkMovie(&obj3, &obj4);
- obj3.free();
- obj4.free();
-
- // unknown action
- } else if (obj2.isName()) {
- action = new LinkUnknown(obj2.getName());
-
- // action is missing or wrong type
- } else {
- error(-1, "parseAction: Unknown annotation action object: URI = '%s'",
- baseURI ? baseURI->getCString() : "NULL");
- action = NULL;
- }
-
- obj2.free();
-
- if (action && !action->isOk()) {
- delete action;
- return NULL;
- }
- return action;
-}
-
-GString *LinkAction::getFileSpecName(Object *fileSpecObj) {
- GString *name;
- Object obj1;
-
- name = NULL;
-
- // string
- if (fileSpecObj->isString()) {
- name = fileSpecObj->getString()->copy();
-
- // dictionary
- } else if (fileSpecObj->isDict()) {
- if (!fileSpecObj->dictLookup("Unix", &obj1)->isString()) {
- obj1.free();
- fileSpecObj->dictLookup("F", &obj1);
- }
- if (obj1.isString())
- name = obj1.getString()->copy();
- else
- error(-1, "Illegal file spec in link");
- obj1.free();
-
- // error
- } else {
- error(-1, "Illegal file spec in link");
- }
-
- return name;
-}
-
-//------------------------------------------------------------------------
-// LinkDest
-//------------------------------------------------------------------------
-
-LinkDest::LinkDest(Array *a) {
- Object obj1, obj2;
-
- // initialize fields
- left = bottom = right = top = zoom = 0;
- ok = gFalse;
-
- // get page
- if (a->getLength() < 2) {
- error(-1, "Annotation destination array is too short");
- return;
- }
- a->getNF(0, &obj1);
- if (obj1.isInt()) {
- pageNum = obj1.getInt() + 1;
- pageIsRef = gFalse;
- } else if (obj1.isRef()) {
- pageRef.num = obj1.getRefNum();
- pageRef.gen = obj1.getRefGen();
- pageIsRef = gTrue;
- } else {
- error(-1, "Bad annotation destination");
- goto err2;
- }
- obj1.free();
-
- // get destination type
- a->get(1, &obj1);
-
- // XYZ link
- if (obj1.isName("XYZ")) {
- kind = destXYZ;
- if (a->getLength() < 3) {
- changeLeft = gFalse;
- } else {
- a->get(2, &obj2);
- if (obj2.isNull()) {
- changeLeft = gFalse;
- } else if (obj2.isNum()) {
- changeLeft = gTrue;
- left = obj2.getNum();
- } else {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- obj2.free();
- }
- if (a->getLength() < 4) {
- changeTop = gFalse;
- } else {
- a->get(3, &obj2);
- if (obj2.isNull()) {
- changeTop = gFalse;
- } else if (obj2.isNum()) {
- changeTop = gTrue;
- top = obj2.getNum();
- } else {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- obj2.free();
- }
- if (a->getLength() < 5) {
- changeZoom = gFalse;
- } else {
- a->get(4, &obj2);
- if (obj2.isNull()) {
- changeZoom = gFalse;
- } else if (obj2.isNum()) {
- changeZoom = gTrue;
- zoom = obj2.getNum();
- } else {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- obj2.free();
- }
-
- // Fit link
- } else if (obj1.isName("Fit")) {
- if (a->getLength() < 2) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFit;
-
- // FitH link
- } else if (obj1.isName("FitH")) {
- if (a->getLength() < 3) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitH;
- if (!a->get(2, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- top = obj2.getNum();
- obj2.free();
-
- // FitV link
- } else if (obj1.isName("FitV")) {
- if (a->getLength() < 3) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitV;
- if (!a->get(2, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- left = obj2.getNum();
- obj2.free();
-
- // FitR link
- } else if (obj1.isName("FitR")) {
- if (a->getLength() < 6) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitR;
- if (!a->get(2, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- left = obj2.getNum();
- obj2.free();
- if (!a->get(3, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- bottom = obj2.getNum();
- obj2.free();
- if (!a->get(4, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- right = obj2.getNum();
- obj2.free();
- if (!a->get(5, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- top = obj2.getNum();
- obj2.free();
-
- // FitB link
- } else if (obj1.isName("FitB")) {
- if (a->getLength() < 2) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitB;
-
- // FitBH link
- } else if (obj1.isName("FitBH")) {
- if (a->getLength() < 3) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitBH;
- if (!a->get(2, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- top = obj2.getNum();
- obj2.free();
-
- // FitBV link
- } else if (obj1.isName("FitBV")) {
- if (a->getLength() < 3) {
- error(-1, "Annotation destination array is too short");
- goto err2;
- }
- kind = destFitBV;
- if (!a->get(2, &obj2)->isNum()) {
- error(-1, "Bad annotation destination position");
- goto err1;
- }
- left = obj2.getNum();
- obj2.free();
-
- // unknown link kind
- } else {
- error(-1, "Unknown annotation destination type");
- goto err2;
- }
-
- obj1.free();
- ok = gTrue;
- return;
-
- err1:
- obj2.free();
- err2:
- obj1.free();
-}
-
-LinkDest::LinkDest(LinkDest *dest) {
- kind = dest->kind;
- pageIsRef = dest->pageIsRef;
- if (pageIsRef)
- pageRef = dest->pageRef;
- else
- pageNum = dest->pageNum;
- left = dest->left;
- bottom = dest->bottom;
- right = dest->right;
- top = dest->top;
- zoom = dest->zoom;
- changeLeft = dest->changeLeft;
- changeTop = dest->changeTop;
- changeZoom = dest->changeZoom;
- ok = gTrue;
-}
-
-//------------------------------------------------------------------------
-// LinkGoTo
-//------------------------------------------------------------------------
-
-LinkGoTo::LinkGoTo(Object *destObj) {
- dest = NULL;
- namedDest = NULL;
-
- // named destination
- if (destObj->isName()) {
- namedDest = new GString(destObj->getName());
- } else if (destObj->isString()) {
- namedDest = destObj->getString()->copy();
-
- // destination dictionary
- } else if (destObj->isArray()) {
- dest = new LinkDest(destObj->getArray());
- if (!dest->isOk()) {
- delete dest;
- dest = NULL;
- }
-
- // error
- } else {
- error(-1, "Illegal annotation destination");
- }
-}
-
-LinkGoTo::~LinkGoTo() {
- if (dest)
- delete dest;
- if (namedDest)
- delete namedDest;
-}
-
-//------------------------------------------------------------------------
-// LinkGoToR
-//------------------------------------------------------------------------
-
-LinkGoToR::LinkGoToR(Object *fileSpecObj, Object *destObj) {
- dest = NULL;
- namedDest = NULL;
-
- // get file name
- fileName = getFileSpecName(fileSpecObj);
-
- // named destination
- if (destObj->isName()) {
- namedDest = new GString(destObj->getName());
- } else if (destObj->isString()) {
- namedDest = destObj->getString()->copy();
-
- // destination dictionary
- } else if (destObj->isArray()) {
- dest = new LinkDest(destObj->getArray());
- if (!dest->isOk()) {
- delete dest;
- dest = NULL;
- }
-
- // error
- } else {
- error(-1, "Illegal annotation destination");
- }
-}
-
-LinkGoToR::~LinkGoToR() {
- if (fileName)
- delete fileName;
- if (dest)
- delete dest;
- if (namedDest)
- delete namedDest;
-}
-
-
-//------------------------------------------------------------------------
-// LinkLaunch
-//------------------------------------------------------------------------
-
-LinkLaunch::LinkLaunch(Object *actionObj) {
- Object obj1, obj2;
-
- fileName = NULL;
- params = NULL;
-
- if (actionObj->isDict()) {
- if (!actionObj->dictLookup("F", &obj1)->isNull()) {
- fileName = getFileSpecName(&obj1);
- } else {
- obj1.free();
-#ifdef WIN32
- if (actionObj->dictLookup("Win", &obj1)->isDict()) {
- obj1.dictLookup("F", &obj2);
- fileName = getFileSpecName(&obj2);
- obj2.free();
- if (obj1.dictLookup("P", &obj2)->isString()) {
- params = obj2.getString()->copy();
- }
- obj2.free();
- } else {
- error(-1, "Bad launch-type link action");
- }
-#else
- //~ This hasn't been defined by Adobe yet, so assume it looks
- //~ just like the Win dictionary until they say otherwise.
- if (actionObj->dictLookup("Unix", &obj1)->isDict()) {
- obj1.dictLookup("F", &obj2);
- fileName = getFileSpecName(&obj2);
- obj2.free();
- if (obj1.dictLookup("P", &obj2)->isString()) {
- params = obj2.getString()->copy();
- }
- obj2.free();
- } else {
- error(-1, "Bad launch-type link action");
- }
-#endif
- }
- obj1.free();
- }
-}
-
-LinkLaunch::~LinkLaunch() {
- if (fileName)
- delete fileName;
- if (params)
- delete params;
-}
-
-//------------------------------------------------------------------------
-// LinkURI
-//------------------------------------------------------------------------
-
-LinkURI::LinkURI(Object *uriObj, GString *baseURI) {
- GString *uri2;
- int n;
- char c;
-
- uri = NULL;
- if (uriObj->isString()) {
- uri2 = uriObj->getString()->copy();
- if (baseURI) {
- n = strcspn(uri2->getCString(), "/:");
- if (n == uri2->getLength() || uri2->getChar(n) == '/') {
- uri = baseURI->copy();
- c = uri->getChar(uri->getLength() - 1);
- if (c == '/' || c == '?') {
- if (uri2->getChar(0) == '/') {
- uri2->del(0);
- }
- } else {
- if (uri2->getChar(0) != '/') {
- uri->append('/');
- }
- }
- uri->append(uri2);
- delete uri2;
- } else {
- uri = uri2;
- }
- } else {
- uri = uri2;
- }
- } else {
- error(-1, "Illegal URI-type link");
- }
-}
-
-LinkURI::~LinkURI() {
- if (uri)
- delete uri;
-}
-
-//------------------------------------------------------------------------
-// LinkNamed
-//------------------------------------------------------------------------
-
-LinkNamed::LinkNamed(Object *nameObj) {
- name = NULL;
- if (nameObj->isName()) {
- name = new GString(nameObj->getName());
- }
-}
-
-LinkNamed::~LinkNamed() {
- if (name) {
- delete name;
- }
-}
-
-//------------------------------------------------------------------------
-// LinkMovie
-//------------------------------------------------------------------------
-
-LinkMovie::LinkMovie(Object *annotObj, Object *titleObj) {
- annotRef.num = -1;
- title = NULL;
- if (annotObj->isRef()) {
- annotRef = annotObj->getRef();
- } else if (titleObj->isString()) {
- title = titleObj->getString()->copy();
- } else {
- error(-1, "Movie action is missing both the Annot and T keys");
- }
-}
-
-LinkMovie::~LinkMovie() {
- if (title) {
- delete title;
- }
-}
-
-//------------------------------------------------------------------------
-// LinkUnknown
-//------------------------------------------------------------------------
-
-LinkUnknown::LinkUnknown(char *actionA) {
- action = new GString(actionA);
-}
-
-LinkUnknown::~LinkUnknown() {
- delete action;
-}
-
-//------------------------------------------------------------------------
-// LinkBorderStyle
-//------------------------------------------------------------------------
-
-LinkBorderStyle::LinkBorderStyle(LinkBorderType typeA, double widthA,
- double *dashA, int dashLengthA,
- double rA, double gA, double bA) {
- type = typeA;
- width = widthA;
- dash = dashA;
- dashLength = dashLengthA;
- r = rA;
- g = gA;
- b = bA;
-}
-
-LinkBorderStyle::~LinkBorderStyle() {
- if (dash) {
- gfree(dash);
- }
-}
-
-//------------------------------------------------------------------------
-// Link
-//------------------------------------------------------------------------
-
-Link::Link(Dict *dict, GString *baseURI) {
- Object obj1, obj2, obj3;
- LinkBorderType borderType;
- double borderWidth;
- double *borderDash;
- int borderDashLength;
- double borderR, borderG, borderB;
- double t;
- int i;
-
- borderStyle = NULL;
- action = NULL;
- ok = gFalse;
-
- // get rectangle
- if (!dict->lookup("Rect", &obj1)->isArray()) {
- error(-1, "Annotation rectangle is wrong type");
- goto err2;
- }
- if (!obj1.arrayGet(0, &obj2)->isNum()) {
- error(-1, "Bad annotation rectangle");
- goto err1;
- }
- x1 = obj2.getNum();
- obj2.free();
- if (!obj1.arrayGet(1, &obj2)->isNum()) {
- error(-1, "Bad annotation rectangle");
- goto err1;
- }
- y1 = obj2.getNum();
- obj2.free();
- if (!obj1.arrayGet(2, &obj2)->isNum()) {
- error(-1, "Bad annotation rectangle");
- goto err1;
- }
- x2 = obj2.getNum();
- obj2.free();
- if (!obj1.arrayGet(3, &obj2)->isNum()) {
- error(-1, "Bad annotation rectangle");
- goto err1;
- }
- y2 = obj2.getNum();
- obj2.free();
- obj1.free();
- if (x1 > x2) {
- t = x1;
- x1 = x2;
- x2 = t;
- }
- if (y1 > y2) {
- t = y1;
- y1 = y2;
- y2 = t;
- }
-
- // get the border style info
- borderType = linkBorderSolid;
- borderWidth = 1;
- borderDash = NULL;
- borderDashLength = 0;
- borderR = 0;
- borderG = 0;
- borderB = 1;
- if (dict->lookup("BS", &obj1)->isDict()) {
- if (obj1.dictLookup("S", &obj2)->isName()) {
- if (obj2.isName("S")) {
- borderType = linkBorderSolid;
- } else if (obj2.isName("D")) {
- borderType = linkBorderDashed;
- } else if (obj2.isName("B")) {
- borderType = linkBorderEmbossed;
- } else if (obj2.isName("I")) {
- borderType = linkBorderEngraved;
- } else if (obj2.isName("U")) {
- borderType = linkBorderUnderlined;
- }
- }
- obj2.free();
- if (obj1.dictLookup("W", &obj2)->isNum()) {
- borderWidth = obj2.getNum();
- }
- obj2.free();
- if (obj1.dictLookup("D", &obj2)->isArray()) {
- borderDashLength = obj2.arrayGetLength();
- borderDash = (double *)gmalloc(borderDashLength * sizeof(double));
- for (i = 0; i < borderDashLength; ++i) {
- if (obj2.arrayGet(i, &obj3)->isNum()) {
- borderDash[i] = obj3.getNum();
- } else {
- borderDash[i] = 1;
- }
- obj3.free();
- }
- }
- obj2.free();
- } else {
- obj1.free();
- if (dict->lookup("Border", &obj1)->isArray()) {
- if (obj1.arrayGetLength() >= 3) {
- if (obj1.arrayGet(2, &obj2)->isNum()) {
- borderWidth = obj2.getNum();
- }
- obj2.free();
- if (obj1.arrayGetLength() >= 4) {
- if (obj1.arrayGet(3, &obj2)->isArray()) {
- borderType = linkBorderDashed;
- borderDashLength = obj2.arrayGetLength();
- borderDash = (double *)gmalloc(borderDashLength * sizeof(double));
- for (i = 0; i < borderDashLength; ++i) {
- if (obj2.arrayGet(i, &obj3)->isNum()) {
- borderDash[i] = obj3.getNum();
- } else {
- borderDash[i] = 1;
- }
- obj3.free();
- }
- }
- obj2.free();
- }
- }
- }
- }
- obj1.free();
- if (dict->lookup("C", &obj1)->isArray() && obj1.arrayGetLength() == 3) {
- if (obj1.arrayGet(0, &obj2)->isNum()) {
- borderR = obj2.getNum();
- }
- obj1.free();
- if (obj1.arrayGet(1, &obj2)->isNum()) {
- borderG = obj2.getNum();
- }
- obj1.free();
- if (obj1.arrayGet(2, &obj2)->isNum()) {
- borderB = obj2.getNum();
- }
- obj1.free();
- }
- obj1.free();
- borderStyle = new LinkBorderStyle(borderType, borderWidth,
- borderDash, borderDashLength,
- borderR, borderG, borderB);
-
- // look for destination
- if (!dict->lookup("Dest", &obj1)->isNull()) {
- action = LinkAction::parseDest(&obj1);
-
- // look for action
- } else {
- obj1.free();
- if (dict->lookup("A", &obj1)->isDict()) {
- action = LinkAction::parseAction(&obj1, baseURI);
- }
- }
- obj1.free();
-
- // check for bad action
- if (action) {
- ok = gTrue;
- }
-
- return;
-
- err1:
- obj2.free();
- err2:
- obj1.free();
-}
-
-Link::~Link() {
- if (borderStyle) {
- delete borderStyle;
- }
- if (action) {
- delete action;
- }
-}
-
-//------------------------------------------------------------------------
-// Links
-//------------------------------------------------------------------------
-
-Links::Links(Object *annots, GString *baseURI) {
- Link *link;
- Object obj1, obj2;
- int size;
- int i;
-
- links = NULL;
- size = 0;
- numLinks = 0;
-
- if (annots->isArray()) {
- for (i = 0; i < annots->arrayGetLength(); ++i) {
- if (annots->arrayGet(i, &obj1)->isDict()) {
- if (obj1.dictLookup("Subtype", &obj2)->isName("Link")) {
- link = new Link(obj1.getDict(), baseURI);
- if (link->isOk()) {
- if (numLinks >= size) {
- size += 16;
- links = (Link **)grealloc(links, size * sizeof(Link *));
- }
- links[numLinks++] = link;
- } else {
- delete link;
- }
- }
- obj2.free();
- }
- obj1.free();
- }
- }
-}
-
-Links::~Links() {
- int i;
-
- for (i = 0; i < numLinks; ++i)
- delete links[i];
- gfree(links);
-}
-
-LinkAction *Links::find(double x, double y) const {
- int i;
-
- for (i = numLinks - 1; i >= 0; --i) {
- if (links[i]->inRect(x, y)) {
- return links[i]->getAction();
- }
- }
- return NULL;
-}
-
-GBool Links::onLink(double x, double y) const {
- int i;
-
- for (i = 0; i < numLinks; ++i) {
- if (links[i]->inRect(x, y))
- return gTrue;
- }
- return gFalse;
-}
diff --git a/pdf/xpdf/Link.h b/pdf/xpdf/Link.h
deleted file mode 100644
index aa8727f..0000000
--- a/pdf/xpdf/Link.h
+++ /dev/null
@@ -1,409 +0,0 @@
-//========================================================================
-//
-// Link.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef LINK_H
-#define LINK_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-
-class GString;
-class Array;
-class Dict;
-
-//------------------------------------------------------------------------
-// LinkAction
-//------------------------------------------------------------------------
-
-enum LinkActionKind {
- actionGoTo, // go to destination
- actionGoToR, // go to destination in new file
- actionLaunch, // launch app (or open document)
- actionURI, // URI
- actionNamed, // named action
- actionMovie, // movie action
- actionUnknown // anything else
-};
-
-class LinkAction {
-public:
-
- // Destructor.
- virtual ~LinkAction() {}
-
- // Was the LinkAction created successfully?
- virtual GBool isOk() = 0;
-
- // Check link action type.
- virtual LinkActionKind getKind() = 0;
-
- // Parse a destination (old-style action) name, string, or array.
- static LinkAction *parseDest(Object *obj);
-
- // Parse an action dictionary.
- static LinkAction *parseAction(Object *obj, GString *baseURI = NULL);
-
- // Extract a file name from a file specification (string or
- // dictionary).
- static GString *getFileSpecName(Object *fileSpecObj);
-};
-
-//------------------------------------------------------------------------
-// LinkDest
-//------------------------------------------------------------------------
-
-enum LinkDestKind {
- destXYZ,
- destFit,
- destFitH,
- destFitV,
- destFitR,
- destFitB,
- destFitBH,
- destFitBV
-};
-
-class LinkDest {
-public:
-
- // Build a LinkDest from the array.
- LinkDest(Array *a);
-
- // Copy a LinkDest.
- LinkDest *copy() { return new LinkDest(this); }
-
- // Was the LinkDest created successfully?
- GBool isOk() { return ok; }
-
- // Accessors.
- LinkDestKind getKind() { return kind; }
- GBool isPageRef() { return pageIsRef; }
- int getPageNum() { return pageNum; }
- Ref getPageRef() { return pageRef; }
- double getLeft() { return left; }
- double getBottom() { return bottom; }
- double getRight() { return right; }
- double getTop() { return top; }
- double getZoom() { return zoom; }
- GBool getChangeLeft() { return changeLeft; }
- GBool getChangeTop() { return changeTop; }
- GBool getChangeZoom() { return changeZoom; }
-
-private:
-
- LinkDestKind kind; // destination type
- GBool pageIsRef; // is the page a reference or number?
- union {
- Ref pageRef; // reference to page
- int pageNum; // one-relative page number
- };
- double left, bottom; // position
- double right, top;
- double zoom; // zoom factor
- GBool changeLeft, changeTop; // for destXYZ links, which position
- GBool changeZoom; // components to change
- GBool ok; // set if created successfully
-
- LinkDest(LinkDest *dest);
-};
-
-//------------------------------------------------------------------------
-// LinkGoTo
-//------------------------------------------------------------------------
-
-class LinkGoTo: public LinkAction {
-public:
-
- // Build a LinkGoTo from a destination (dictionary, name, or string).
- LinkGoTo(Object *destObj);
-
- // Destructor.
- virtual ~LinkGoTo();
-
- // Was the LinkGoTo created successfully?
- virtual GBool isOk() { return dest || namedDest; }
-
- // Accessors.
- virtual LinkActionKind getKind() { return actionGoTo; }
- LinkDest *getDest() { return dest; }
- GString *getNamedDest() { return namedDest; }
-
-private:
-
- LinkDest *dest; // regular destination (NULL for remote
- // link with bad destination)
- GString *namedDest; // named destination (only one of dest and
- // and namedDest may be non-NULL)
-};
-
-//------------------------------------------------------------------------
-// LinkGoToR
-//------------------------------------------------------------------------
-
-class LinkGoToR: public LinkAction {
-public:
-
- // Build a LinkGoToR from a file spec (dictionary) and destination
- // (dictionary, name, or string).
- LinkGoToR(Object *fileSpecObj, Object *destObj);
-
- // Destructor.
- virtual ~LinkGoToR();
-
- // Was the LinkGoToR created successfully?
- virtual GBool isOk() { return fileName && (dest || namedDest); }
-
- // Accessors.
- virtual LinkActionKind getKind() { return actionGoToR; }
- GString *getFileName() { return fileName; }
- LinkDest *getDest() { return dest; }
- GString *getNamedDest() { return namedDest; }
-
-private:
-
- GString *fileName; // file name
- LinkDest *dest; // regular destination (NULL for remote
- // link with bad destination)
- GString *namedDest; // named destination (only one of dest and
- // and namedDest may be non-NULL)
-};
-
-//------------------------------------------------------------------------
-// LinkLaunch
-//------------------------------------------------------------------------
-
-class LinkLaunch: public LinkAction {
-public:
-
- // Build a LinkLaunch from an action dictionary.
- LinkLaunch(Object *actionObj);
-
- // Destructor.
- virtual ~LinkLaunch();
-
- // Was the LinkLaunch created successfully?
- virtual GBool isOk() { return fileName != NULL; }
-
- // Accessors.
- virtual LinkActionKind getKind() { return actionLaunch; }
- GString *getFileName() { return fileName; }
- GString *getParams() { return params; }
-
-private:
-
- GString *fileName; // file name
- GString *params; // parameters
-};
-
-//------------------------------------------------------------------------
-// LinkURI
-//------------------------------------------------------------------------
-
-class LinkURI: public LinkAction {
-public:
-
- // Build a LinkURI given the URI (string) and base URI.
- LinkURI(Object *uriObj, GString *baseURI);
-
- // Destructor.
- virtual ~LinkURI();
-
- // Was the LinkURI created successfully?
- virtual GBool isOk() { return uri != NULL; }
-
- // Accessors.
- virtual LinkActionKind getKind() { return actionURI; }
- GString *getURI() { return uri; }
-
-private:
-
- GString *uri; // the URI
-};
-
-//------------------------------------------------------------------------
-// LinkNamed
-//------------------------------------------------------------------------
-
-class LinkNamed: public LinkAction {
-public:
-
- // Build a LinkNamed given the action name.
- LinkNamed(Object *nameObj);
-
- virtual ~LinkNamed();
-
- virtual GBool isOk() { return name != NULL; }
-
- virtual LinkActionKind getKind() { return actionNamed; }
- GString *getName() { return name; }
-
-private:
-
- GString *name;
-};
-
-//------------------------------------------------------------------------
-// LinkMovie
-//------------------------------------------------------------------------
-
-class LinkMovie: public LinkAction {
-public:
-
- LinkMovie(Object *annotObj, Object *titleObj);
-
- virtual ~LinkMovie();
-
- virtual GBool isOk() { return annotRef.num >= 0 || title != NULL; }
-
- virtual LinkActionKind getKind() { return actionMovie; }
- GBool hasAnnotRef() { return annotRef.num >= 0; }
- Ref *getAnnotRef() { return &annotRef; }
- GString *getTitle() { return title; }
-
-private:
-
- Ref annotRef;
- GString *title;
-};
-
-//------------------------------------------------------------------------
-// LinkUnknown
-//------------------------------------------------------------------------
-
-class LinkUnknown: public LinkAction {
-public:
-
- // Build a LinkUnknown with the specified action type.
- LinkUnknown(char *actionA);
-
- // Destructor.
- virtual ~LinkUnknown();
-
- // Was the LinkUnknown create successfully?
- virtual GBool isOk() { return action != NULL; }
-
- // Accessors.
- virtual LinkActionKind getKind() { return actionUnknown; }
- GString *getAction() { return action; }
-
-private:
-
- GString *action; // action subtype
-};
-
-//------------------------------------------------------------------------
-// LinkBorderStyle
-//------------------------------------------------------------------------
-
-enum LinkBorderType {
- linkBorderSolid,
- linkBorderDashed,
- linkBorderEmbossed,
- linkBorderEngraved,
- linkBorderUnderlined
-};
-
-class LinkBorderStyle {
-public:
-
- LinkBorderStyle(LinkBorderType typeA, double widthA,
- double *dashA, int dashLengthA,
- double rA, double gA, double bA);
- ~LinkBorderStyle();
-
- LinkBorderType getType() { return type; }
- double getWidth() { return width; }
- void getDash(double **dashA, int *dashLengthA)
- { *dashA = dash; *dashLengthA = dashLength; }
- void getColor(double *rA, double *gA, double *bA)
- { *rA = r; *gA = g; *bA = b; }
-
-private:
-
- LinkBorderType type;
- double width;
- double *dash;
- int dashLength;
- double r, g, b;
-};
-
-//------------------------------------------------------------------------
-// Link
-//------------------------------------------------------------------------
-
-class Link {
-public:
-
- // Construct a link, given its dictionary.
- Link(Dict *dict, GString *baseURI);
-
- // Destructor.
- ~Link();
-
- // Was the link created successfully?
- GBool isOk() { return ok; }
-
- // Check if point is inside the link rectangle.
- GBool inRect(double x, double y)
- { return x1 <= x && x <= x2 && y1 <= y && y <= y2; }
-
- // Get action.
- LinkAction *getAction() { return action; }
-
- // Get the link rectangle.
- void getRect(double *xa1, double *ya1, double *xa2, double *ya2)
- { *xa1 = x1; *ya1 = y1; *xa2 = x2; *ya2 = y2; }
-
- // Get the border style info.
- LinkBorderStyle *getBorderStyle() { return borderStyle; }
-
-private:
-
- double x1, y1; // lower left corner
- double x2, y2; // upper right corner
- LinkBorderStyle *borderStyle; // border style
- LinkAction *action; // action
- GBool ok; // is link valid?
-};
-
-//------------------------------------------------------------------------
-// Links
-//------------------------------------------------------------------------
-
-class Links {
-public:
-
- // Extract links from array of annotations.
- Links(Object *annots, GString *baseURI);
-
- // Destructor.
- ~Links();
-
- // Iterate through list of links.
- int getNumLinks() const { return numLinks; }
- Link *getLink(int i) const { return links[i]; }
-
- // If point <x>,<y> is in a link, return the associated action;
- // else return NULL.
- LinkAction *find(double x, double y) const;
-
- // Return true if <x>,<y> is in a link.
- GBool onLink(double x, double y) const;
-
-private:
-
- Link **links;
- int numLinks;
-};
-
-#endif
diff --git a/pdf/xpdf/Makefile.am b/pdf/xpdf/Makefile.am
deleted file mode 100644
index 4e884cc..0000000
--- a/pdf/xpdf/Makefile.am
+++ /dev/null
@@ -1,131 +0,0 @@
-INCLUDES = \
- -I$(top_srcdir) \
- -I$(top_srcdir)/backend \
- -I$(top_srcdir)/pdf \
- -I$(top_srcdir)/pdf/goo \
- -I$(top_srcdir)/pdf/fofi \
- -I$(top_srcdir)/pdf/splash \
- $(GTK_CFLAGS) \
- -DDATADIR=\""$(datadir)"\"
-
-noinst_PROGRAMS = test-gdk-output-dev
-
-noinst_LTLIBRARIES = libxpdf.la libpdfdocument.la
-
-libxpdf_la_SOURCES = \
- Annot.cc \
- Annot.h \
- Array.cc \
- Array.h \
- BaseFile.h \
- BuiltinFont.cc \
- BuiltinFont.h \
- BuiltinFontTables.cc \
- BuiltinFontTables.h \
- Catalog.cc \
- Catalog.h \
- CharCodeToUnicode.cc \
- CharCodeToUnicode.h \
- CMap.cc \
- CMap.h \
- Decrypt.cc \
- Decrypt.h \
- Dict.cc \
- Dict.h \
- Error.cc \
- Error.h \
- FontEncodingTables.cc \
- FontEncodingTables.h \
- Function.cc \
- Function.h \
- Gfx.cc \
- Gfx.h \
- GfxFont.cc \
- GfxFont.h \
- GfxState.cc \
- GfxState.h \
- GlobalParams.cc \
- GlobalParams.h \
- JArithmeticDecoder.cc \
- JArithmeticDecoder.h \
- JBIG2Stream.cc \
- JBIG2Stream.h \
- JPXStream.cc \
- JPXStream.h \
- Lexer.cc \
- Lexer.h \
- Link.cc \
- Link.h \
- NameToCharCode.cc \
- NameToCharCode.h \
- Object.cc \
- Object.h \
- Outline.cc \
- Outline.h \
- OutputDev.cc \
- OutputDev.h \
- Page.cc \
- Page.h \
- Parser.cc \
- Parser.h \
- PDFDoc.cc \
- PDFDoc.h \
- PDFDocEncoding.cc \
- PDFDocEncoding.h \
- PSTokenizer.cc \
- PSTokenizer.h \
- SplashOutputDev.cc \
- SplashOutputDev.h \
- Stream-CCITT.h \
- Stream.cc \
- Stream.h \
- Thumb.cc \
- Thumb.h \
- UnicodeMap.cc \
- UnicodeMap.h \
- UnicodeMapTables.h \
- UnicodeTypeTable.cc \
- UnicodeTypeTable.h \
- XRef.cc \
- XRef.h \
- \
- CharTypes.h \
- CompactFontTables.h \
- ErrorCodes.h \
- NameToUnicodeTable.h \
- GDKSplashOutputDev.cc \
- GDKSplashOutputDev.h \
- PSOutputDev.cc \
- PSOutputDev.h \
- TextOutputDev.cc \
- TextOutputDev.h \
- UTF8.h \
- \
- gpdf-g-switch.h
-
-# The sources at the end are put in libxpdf.a for convenience here, but are
-# conceptually part of the apps not part of the libs.
-
-test_gdk_output_dev_SOURCES = \
- test-gdk-output-dev.cc
-
-test_gdk_output_dev_LDADD = \
- libxpdf.la \
- $(top_builddir)/pdf/goo/libGoo.la \
- $(top_builddir)/pdf/fofi/libfofi.la \
- $(top_builddir)/pdf/splash/libsplash.la \
- $(top_builddir)/backend/libevbackend.la \
- $(GTK_LIBS)
-
-libpdfdocument_la_SOURCES = \
- pdf-document.cc \
- pdf-document.h
-
-libpdfdocument_la_LIBADD = \
- libxpdf.la \
- $(top_builddir)/backend/libevbackend.la \
- $(top_builddir)/pdf/goo/libGoo.la \
- $(top_builddir)/pdf/fofi/libfofi.la \
- $(top_builddir)/pdf/splash/libsplash.la
-
-EXTRA_DIST = xpdfconfig.h
diff --git a/pdf/xpdf/NameToCharCode.cc b/pdf/xpdf/NameToCharCode.cc
deleted file mode 100644
index 8f22a90..0000000
--- a/pdf/xpdf/NameToCharCode.cc
+++ /dev/null
@@ -1,116 +0,0 @@
-//========================================================================
-//
-// NameToCharCode.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include "gmem.h"
-#include "NameToCharCode.h"
-
-//------------------------------------------------------------------------
-
-struct NameToCharCodeEntry {
- char *name;
- CharCode c;
-};
-
-//------------------------------------------------------------------------
-
-NameToCharCode::NameToCharCode() {
- int i;
-
- size = 31;
- len = 0;
- tab = (NameToCharCodeEntry *)gmalloc(size * sizeof(NameToCharCodeEntry));
- for (i = 0; i < size; ++i) {
- tab[i].name = NULL;
- }
-}
-
-NameToCharCode::~NameToCharCode() {
- int i;
-
- for (i = 0; i < size; ++i) {
- if (tab[i].name) {
- gfree(tab[i].name);
- }
- }
- gfree(tab);
-}
-
-void NameToCharCode::add(char *name, CharCode c) {
- NameToCharCodeEntry *oldTab;
- int h, i, oldSize;
-
- // expand the table if necessary
- if (len >= size / 2) {
- oldSize = size;
- oldTab = tab;
- size = 2*size + 1;
- tab = (NameToCharCodeEntry *)gmalloc(size * sizeof(NameToCharCodeEntry));
- for (h = 0; h < size; ++h) {
- tab[h].name = NULL;
- }
- for (i = 0; i < oldSize; ++i) {
- if (oldTab[i].name) {
- h = hash(oldTab[i].name);
- while (tab[h].name) {
- if (++h == size) {
- h = 0;
- }
- }
- tab[h] = oldTab[i];
- }
- }
- gfree(oldTab);
- }
-
- // add the new name
- h = hash(name);
- while (tab[h].name && strcmp(tab[h].name, name)) {
- if (++h == size) {
- h = 0;
- }
- }
- if (!tab[h].name) {
- tab[h].name = copyString(name);
- }
- tab[h].c = c;
-
- ++len;
-}
-
-CharCode NameToCharCode::lookup(char *name) {
- int h;
-
- h = hash(name);
- while (tab[h].name) {
- if (!strcmp(tab[h].name, name)) {
- return tab[h].c;
- }
- if (++h == size) {
- h = 0;
- }
- }
- return 0;
-}
-
-int NameToCharCode::hash(char *name) {
- char *p;
- unsigned int h;
-
- h = 0;
- for (p = name; *p; ++p) {
- h = 17 * h + (int)(*p & 0xff);
- }
- return (int)(h % size);
-}
diff --git a/pdf/xpdf/NameToCharCode.h b/pdf/xpdf/NameToCharCode.h
deleted file mode 100644
index 65453c3..0000000
--- a/pdf/xpdf/NameToCharCode.h
+++ /dev/null
@@ -1,42 +0,0 @@
-//========================================================================
-//
-// NameToCharCode.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef NAMETOCHARCODE_H
-#define NAMETOCHARCODE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "CharTypes.h"
-
-struct NameToCharCodeEntry;
-
-//------------------------------------------------------------------------
-
-class NameToCharCode {
-public:
-
- NameToCharCode();
- ~NameToCharCode();
-
- void add(char *name, CharCode c);
- CharCode lookup(char *name);
-
-private:
-
- int hash(char *name);
-
- NameToCharCodeEntry *tab;
- int size;
- int len;
-};
-
-#endif
diff --git a/pdf/xpdf/NameToUnicodeTable.h b/pdf/xpdf/NameToUnicodeTable.h
deleted file mode 100644
index 4f28fff..0000000
--- a/pdf/xpdf/NameToUnicodeTable.h
+++ /dev/null
@@ -1,1097 +0,0 @@
-//========================================================================
-//
-// NameToUnicodeTable.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-static struct {
- Unicode u;
- char *name;
-} nameToUnicodeTab[] = {
- {0x0021, "!"},
- {0x0023, "#"},
- {0x0024, "$"},
- {0x0025, "%"},
- {0x0026, "&"},
- {0x0027, "'"},
- {0x0028, "("},
- {0x0029, ")"},
- {0x002a, "*"},
- {0x002b, "+"},
- {0x002c, ","},
- {0x002d, "-"},
- {0x002e, "."},
- {0x002f, "/"},
- {0x0030, "0"},
- {0x0031, "1"},
- {0x0032, "2"},
- {0x0033, "3"},
- {0x0034, "4"},
- {0x0035, "5"},
- {0x0036, "6"},
- {0x0037, "7"},
- {0x0038, "8"},
- {0x0039, "9"},
- {0x003a, ":"},
- {0x003b, ";"},
- {0x003c, "<"},
- {0x003d, "="},
- {0x003e, ">"},
- {0x003f, "?"},
- {0x0040, "@"},
- {0x0041, "A"},
- {0x00c6, "AE"},
- {0x01fc, "AEacute"},
- {0x00c6, "AEsmall"},
- {0x00c1, "Aacute"},
- {0x00c1, "Aacutesmall"},
- {0x0102, "Abreve"},
- {0x00c2, "Acircumflex"},
- {0x00c2, "Acircumflexsmall"},
- {0xf6c9, "Acute"},
- {0xf6c9, "Acutesmall"},
- {0x00c4, "Adieresis"},
- {0x00c4, "Adieresissmall"},
- {0x00c0, "Agrave"},
- {0x00c0, "Agravesmall"},
- {0x0391, "Alpha"},
- {0x0386, "Alphatonos"},
- {0x0100, "Amacron"},
- {0x0104, "Aogonek"},
- {0x00c5, "Aring"},
- {0x01fa, "Aringacute"},
- {0x00c5, "Aringsmall"},
- {0x0041, "Asmall"},
- {0x00c3, "Atilde"},
- {0x00c3, "Atildesmall"},
- {0x0042, "B"},
- {0x0392, "Beta"},
- {0xf6f4, "Brevesmall"},
- {0x0042, "Bsmall"},
- {0x0043, "C"},
- {0x0106, "Cacute"},
- {0xf6ca, "Caron"},
- {0xf6ca, "Caronsmall"},
- {0x010c, "Ccaron"},
- {0x00c7, "Ccedilla"},
- {0x00c7, "Ccedillasmall"},
- {0x0108, "Ccircumflex"},
- {0x010a, "Cdotaccent"},
- {0xf7b8, "Cedillasmall"},
- {0x03a7, "Chi"},
- {0xf6f6, "Circumflexsmall"},
- {0x0043, "Csmall"},
- {0x0044, "D"},
- {0x010e, "Dcaron"},
- {0x0110, "Dcroat"},
- {0x2206, "Delta"},
- {0xf6cb, "Dieresis"},
- {0xf6cc, "DieresisAcute"},
- {0xf6cd, "DieresisGrave"},
- {0xf6cb, "Dieresissmall"},
- {0xf6f7, "Dotaccentsmall"},
- {0x0044, "Dsmall"},
- {0x0045, "E"},
- {0x00c9, "Eacute"},
- {0x00c9, "Eacutesmall"},
- {0x0114, "Ebreve"},
- {0x011a, "Ecaron"},
- {0x00ca, "Ecircumflex"},
- {0x00ca, "Ecircumflexsmall"},
- {0x00cb, "Edieresis"},
- {0x00cb, "Edieresissmall"},
- {0x0116, "Edotaccent"},
- {0x00c8, "Egrave"},
- {0x00c8, "Egravesmall"},
- {0x0112, "Emacron"},
- {0x014a, "Eng"},
- {0x0118, "Eogonek"},
- {0x0395, "Epsilon"},
- {0x0388, "Epsilontonos"},
- {0x0045, "Esmall"},
- {0x0397, "Eta"},
- {0x0389, "Etatonos"},
- {0x00d0, "Eth"},
- {0x00d0, "Ethsmall"},
- {0x20ac, "Euro"},
- {0x0046, "F"},
- {0x0046, "Fsmall"},
- {0x0047, "G"},
- {0x0393, "Gamma"},
- {0x011e, "Gbreve"},
- {0x01e6, "Gcaron"},
- {0x011c, "Gcircumflex"},
- {0x0122, "Gcommaaccent"},
- {0x0120, "Gdotaccent"},
- {0xf6ce, "Grave"},
- {0xf6ce, "Gravesmall"},
- {0x0047, "Gsmall"},
- {0x0048, "H"},
- {0x25cf, "H18533"},
- {0x25aa, "H18543"},
- {0x25ab, "H18551"},
- {0x25a1, "H22073"},
- {0x0126, "Hbar"},
- {0x0124, "Hcircumflex"},
- {0x0048, "Hsmall"},
- {0xf6cf, "Hungarumlaut"},
- {0xf6cf, "Hungarumlautsmall"},
- {0x0049, "I"},
- {0x0132, "IJ"},
- {0x00cd, "Iacute"},
- {0x00cd, "Iacutesmall"},
- {0x012c, "Ibreve"},
- {0x00ce, "Icircumflex"},
- {0x00ce, "Icircumflexsmall"},
- {0x00cf, "Idieresis"},
- {0x00cf, "Idieresissmall"},
- {0x0130, "Idotaccent"},
- {0x2111, "Ifraktur"},
- {0x00cc, "Igrave"},
- {0x00cc, "Igravesmall"},
- {0x012a, "Imacron"},
- {0x012e, "Iogonek"},
- {0x0399, "Iota"},
- {0x03aa, "Iotadieresis"},
- {0x038a, "Iotatonos"},
- {0x0049, "Ismall"},
- {0x0128, "Itilde"},
- {0x004a, "J"},
- {0x0134, "Jcircumflex"},
- {0x004a, "Jsmall"},
- {0x004b, "K"},
- {0x039a, "Kappa"},
- {0x0136, "Kcommaaccent"},
- {0x004b, "Ksmall"},
- {0x004c, "L"},
- {0xf6bf, "LL"},
- {0x0139, "Lacute"},
- {0x039b, "Lambda"},
- {0x013d, "Lcaron"},
- {0x013b, "Lcommaaccent"},
- {0x013f, "Ldot"},
- {0x0141, "Lslash"},
- {0x0141, "Lslashsmall"},
- {0x004c, "Lsmall"},
- {0x004d, "M"},
- {0xf6d0, "Macron"},
- {0xf6d0, "Macronsmall"},
- {0x004d, "Msmall"},
- {0x039c, "Mu"},
- {0x004e, "N"},
- {0x0143, "Nacute"},
- {0x0147, "Ncaron"},
- {0x0145, "Ncommaaccent"},
- {0x004e, "Nsmall"},
- {0x00d1, "Ntilde"},
- {0x00d1, "Ntildesmall"},
- {0x039d, "Nu"},
- {0x004f, "O"},
- {0x0152, "OE"},
- {0x0152, "OEsmall"},
- {0x00d3, "Oacute"},
- {0x00d3, "Oacutesmall"},
- {0x014e, "Obreve"},
- {0x00d4, "Ocircumflex"},
- {0x00d4, "Ocircumflexsmall"},
- {0x00d6, "Odieresis"},
- {0x00d6, "Odieresissmall"},
- {0xf6fb, "Ogoneksmall"},
- {0x00d2, "Ograve"},
- {0x00d2, "Ogravesmall"},
- {0x01a0, "Ohorn"},
- {0x0150, "Ohungarumlaut"},
- {0x014c, "Omacron"},
- {0x2126, "Omega"},
- {0x038f, "Omegatonos"},
- {0x039f, "Omicron"},
- {0x038c, "Omicrontonos"},
- {0x00d8, "Oslash"},
- {0x01fe, "Oslashacute"},
- {0x00d8, "Oslashsmall"},
- {0x004f, "Osmall"},
- {0x00d5, "Otilde"},
- {0x00d5, "Otildesmall"},
- {0x0050, "P"},
- {0x03a6, "Phi"},
- {0x03a0, "Pi"},
- {0x03a8, "Psi"},
- {0x0050, "Psmall"},
- {0x0051, "Q"},
- {0x0051, "Qsmall"},
- {0x0052, "R"},
- {0x0154, "Racute"},
- {0x0158, "Rcaron"},
- {0x0156, "Rcommaaccent"},
- {0x211c, "Rfraktur"},
- {0x03a1, "Rho"},
- {0xf6fc, "Ringsmall"},
- {0x0052, "Rsmall"},
- {0x0053, "S"},
- {0x250c, "SF010000"},
- {0x2514, "SF020000"},
- {0x2510, "SF030000"},
- {0x2518, "SF040000"},
- {0x253c, "SF050000"},
- {0x252c, "SF060000"},
- {0x2534, "SF070000"},
- {0x251c, "SF080000"},
- {0x2524, "SF090000"},
- {0x2500, "SF100000"},
- {0x2502, "SF110000"},
- {0x2561, "SF190000"},
- {0x2562, "SF200000"},
- {0x2556, "SF210000"},
- {0x2555, "SF220000"},
- {0x2563, "SF230000"},
- {0x2551, "SF240000"},
- {0x2557, "SF250000"},
- {0x255d, "SF260000"},
- {0x255c, "SF270000"},
- {0x255b, "SF280000"},
- {0x255e, "SF360000"},
- {0x255f, "SF370000"},
- {0x255a, "SF380000"},
- {0x2554, "SF390000"},
- {0x2569, "SF400000"},
- {0x2566, "SF410000"},
- {0x2560, "SF420000"},
- {0x2550, "SF430000"},
- {0x256c, "SF440000"},
- {0x2567, "SF450000"},
- {0x2568, "SF460000"},
- {0x2564, "SF470000"},
- {0x2565, "SF480000"},
- {0x2559, "SF490000"},
- {0x2558, "SF500000"},
- {0x2552, "SF510000"},
- {0x2553, "SF520000"},
- {0x256b, "SF530000"},
- {0x256a, "SF540000"},
- {0x015a, "Sacute"},
- {0x0160, "Scaron"},
- {0x0160, "Scaronsmall"},
- {0x015e, "Scedilla"},
- {0x015c, "Scircumflex"},
- {0x0218, "Scommaaccent"},
- {0x03a3, "Sigma"},
- {0x0053, "Ssmall"},
- {0x0054, "T"},
- {0x03a4, "Tau"},
- {0x0166, "Tbar"},
- {0x0164, "Tcaron"},
- {0x0162, "Tcommaaccent"},
- {0x0398, "Theta"},
- {0x00de, "Thorn"},
- {0x00de, "Thornsmall"},
- {0xf6fe, "Tildesmall"},
- {0x0054, "Tsmall"},
- {0x0055, "U"},
- {0x00da, "Uacute"},
- {0x00da, "Uacutesmall"},
- {0x016c, "Ubreve"},
- {0x00db, "Ucircumflex"},
- {0x00db, "Ucircumflexsmall"},
- {0x00dc, "Udieresis"},
- {0x00dc, "Udieresissmall"},
- {0x00d9, "Ugrave"},
- {0x00d9, "Ugravesmall"},
- {0x01af, "Uhorn"},
- {0x0170, "Uhungarumlaut"},
- {0x016a, "Umacron"},
- {0x0172, "Uogonek"},
- {0x03a5, "Upsilon"},
- {0x03d2, "Upsilon1"},
- {0x03ab, "Upsilondieresis"},
- {0x038e, "Upsilontonos"},
- {0x016e, "Uring"},
- {0x0055, "Usmall"},
- {0x0168, "Utilde"},
- {0x0056, "V"},
- {0x0056, "Vsmall"},
- {0x0057, "W"},
- {0x1e82, "Wacute"},
- {0x0174, "Wcircumflex"},
- {0x1e84, "Wdieresis"},
- {0x1e80, "Wgrave"},
- {0x0057, "Wsmall"},
- {0x0058, "X"},
- {0x039e, "Xi"},
- {0x0058, "Xsmall"},
- {0x0059, "Y"},
- {0x00dd, "Yacute"},
- {0x00dd, "Yacutesmall"},
- {0x0176, "Ycircumflex"},
- {0x0178, "Ydieresis"},
- {0x0178, "Ydieresissmall"},
- {0x1ef2, "Ygrave"},
- {0x0059, "Ysmall"},
- {0x005a, "Z"},
- {0x0179, "Zacute"},
- {0x017d, "Zcaron"},
- {0x017d, "Zcaronsmall"},
- {0x017b, "Zdotaccent"},
- {0x0396, "Zeta"},
- {0x005a, "Zsmall"},
- {0x0022, "\""},
- {0x005c, "\\"},
- {0x005d, "]"},
- {0x005e, "^"},
- {0x005f, "_"},
- {0x0060, "`"},
- {0x0061, "a"},
- {0x00e1, "aacute"},
- {0x0103, "abreve"},
- {0x00e2, "acircumflex"},
- {0x00b4, "acute"},
- {0x0301, "acutecomb"},
- {0x00e4, "adieresis"},
- {0x00e6, "ae"},
- {0x01fd, "aeacute"},
- {0x2015, "afii00208"},
- {0x0410, "afii10017"},
- {0x0411, "afii10018"},
- {0x0412, "afii10019"},
- {0x0413, "afii10020"},
- {0x0414, "afii10021"},
- {0x0415, "afii10022"},
- {0x0401, "afii10023"},
- {0x0416, "afii10024"},
- {0x0417, "afii10025"},
- {0x0418, "afii10026"},
- {0x0419, "afii10027"},
- {0x041a, "afii10028"},
- {0x041b, "afii10029"},
- {0x041c, "afii10030"},
- {0x041d, "afii10031"},
- {0x041e, "afii10032"},
- {0x041f, "afii10033"},
- {0x0420, "afii10034"},
- {0x0421, "afii10035"},
- {0x0422, "afii10036"},
- {0x0423, "afii10037"},
- {0x0424, "afii10038"},
- {0x0425, "afii10039"},
- {0x0426, "afii10040"},
- {0x0427, "afii10041"},
- {0x0428, "afii10042"},
- {0x0429, "afii10043"},
- {0x042a, "afii10044"},
- {0x042b, "afii10045"},
- {0x042c, "afii10046"},
- {0x042d, "afii10047"},
- {0x042e, "afii10048"},
- {0x042f, "afii10049"},
- {0x0490, "afii10050"},
- {0x0402, "afii10051"},
- {0x0403, "afii10052"},
- {0x0404, "afii10053"},
- {0x0405, "afii10054"},
- {0x0406, "afii10055"},
- {0x0407, "afii10056"},
- {0x0408, "afii10057"},
- {0x0409, "afii10058"},
- {0x040a, "afii10059"},
- {0x040b, "afii10060"},
- {0x040c, "afii10061"},
- {0x040e, "afii10062"},
- {0xf6c4, "afii10063"},
- {0xf6c5, "afii10064"},
- {0x0430, "afii10065"},
- {0x0431, "afii10066"},
- {0x0432, "afii10067"},
- {0x0433, "afii10068"},
- {0x0434, "afii10069"},
- {0x0435, "afii10070"},
- {0x0451, "afii10071"},
- {0x0436, "afii10072"},
- {0x0437, "afii10073"},
- {0x0438, "afii10074"},
- {0x0439, "afii10075"},
- {0x043a, "afii10076"},
- {0x043b, "afii10077"},
- {0x043c, "afii10078"},
- {0x043d, "afii10079"},
- {0x043e, "afii10080"},
- {0x043f, "afii10081"},
- {0x0440, "afii10082"},
- {0x0441, "afii10083"},
- {0x0442, "afii10084"},
- {0x0443, "afii10085"},
- {0x0444, "afii10086"},
- {0x0445, "afii10087"},
- {0x0446, "afii10088"},
- {0x0447, "afii10089"},
- {0x0448, "afii10090"},
- {0x0449, "afii10091"},
- {0x044a, "afii10092"},
- {0x044b, "afii10093"},
- {0x044c, "afii10094"},
- {0x044d, "afii10095"},
- {0x044e, "afii10096"},
- {0x044f, "afii10097"},
- {0x0491, "afii10098"},
- {0x0452, "afii10099"},
- {0x0453, "afii10100"},
- {0x0454, "afii10101"},
- {0x0455, "afii10102"},
- {0x0456, "afii10103"},
- {0x0457, "afii10104"},
- {0x0458, "afii10105"},
- {0x0459, "afii10106"},
- {0x045a, "afii10107"},
- {0x045b, "afii10108"},
- {0x045c, "afii10109"},
- {0x045e, "afii10110"},
- {0x040f, "afii10145"},
- {0x0462, "afii10146"},
- {0x0472, "afii10147"},
- {0x0474, "afii10148"},
- {0xf6c6, "afii10192"},
- {0x045f, "afii10193"},
- {0x0463, "afii10194"},
- {0x0473, "afii10195"},
- {0x0475, "afii10196"},
- {0xf6c7, "afii10831"},
- {0xf6c8, "afii10832"},
- {0x04d9, "afii10846"},
- {0x200e, "afii299"},
- {0x200f, "afii300"},
- {0x200d, "afii301"},
- {0x066a, "afii57381"},
- {0x060c, "afii57388"},
- {0x0660, "afii57392"},
- {0x0661, "afii57393"},
- {0x0662, "afii57394"},
- {0x0663, "afii57395"},
- {0x0664, "afii57396"},
- {0x0665, "afii57397"},
- {0x0666, "afii57398"},
- {0x0667, "afii57399"},
- {0x0668, "afii57400"},
- {0x0669, "afii57401"},
- {0x061b, "afii57403"},
- {0x061f, "afii57407"},
- {0x0621, "afii57409"},
- {0x0622, "afii57410"},
- {0x0623, "afii57411"},
- {0x0624, "afii57412"},
- {0x0625, "afii57413"},
- {0x0626, "afii57414"},
- {0x0627, "afii57415"},
- {0x0628, "afii57416"},
- {0x0629, "afii57417"},
- {0x062a, "afii57418"},
- {0x062b, "afii57419"},
- {0x062c, "afii57420"},
- {0x062d, "afii57421"},
- {0x062e, "afii57422"},
- {0x062f, "afii57423"},
- {0x0630, "afii57424"},
- {0x0631, "afii57425"},
- {0x0632, "afii57426"},
- {0x0633, "afii57427"},
- {0x0634, "afii57428"},
- {0x0635, "afii57429"},
- {0x0636, "afii57430"},
- {0x0637, "afii57431"},
- {0x0638, "afii57432"},
- {0x0639, "afii57433"},
- {0x063a, "afii57434"},
- {0x0640, "afii57440"},
- {0x0641, "afii57441"},
- {0x0642, "afii57442"},
- {0x0643, "afii57443"},
- {0x0644, "afii57444"},
- {0x0645, "afii57445"},
- {0x0646, "afii57446"},
- {0x0648, "afii57448"},
- {0x0649, "afii57449"},
- {0x064a, "afii57450"},
- {0x064b, "afii57451"},
- {0x064c, "afii57452"},
- {0x064d, "afii57453"},
- {0x064e, "afii57454"},
- {0x064f, "afii57455"},
- {0x0650, "afii57456"},
- {0x0651, "afii57457"},
- {0x0652, "afii57458"},
- {0x0647, "afii57470"},
- {0x06a4, "afii57505"},
- {0x067e, "afii57506"},
- {0x0686, "afii57507"},
- {0x0698, "afii57508"},
- {0x06af, "afii57509"},
- {0x0679, "afii57511"},
- {0x0688, "afii57512"},
- {0x0691, "afii57513"},
- {0x06ba, "afii57514"},
- {0x06d2, "afii57519"},
- {0x06d5, "afii57534"},
- {0x20aa, "afii57636"},
- {0x05be, "afii57645"},
- {0x05c3, "afii57658"},
- {0x05d0, "afii57664"},
- {0x05d1, "afii57665"},
- {0x05d2, "afii57666"},
- {0x05d3, "afii57667"},
- {0x05d4, "afii57668"},
- {0x05d5, "afii57669"},
- {0x05d6, "afii57670"},
- {0x05d7, "afii57671"},
- {0x05d8, "afii57672"},
- {0x05d9, "afii57673"},
- {0x05da, "afii57674"},
- {0x05db, "afii57675"},
- {0x05dc, "afii57676"},
- {0x05dd, "afii57677"},
- {0x05de, "afii57678"},
- {0x05df, "afii57679"},
- {0x05e0, "afii57680"},
- {0x05e1, "afii57681"},
- {0x05e2, "afii57682"},
- {0x05e3, "afii57683"},
- {0x05e4, "afii57684"},
- {0x05e5, "afii57685"},
- {0x05e6, "afii57686"},
- {0x05e7, "afii57687"},
- {0x05e8, "afii57688"},
- {0x05e9, "afii57689"},
- {0x05ea, "afii57690"},
- {0xfb2a, "afii57694"},
- {0xfb2b, "afii57695"},
- {0xfb4b, "afii57700"},
- {0xfb1f, "afii57705"},
- {0x05f0, "afii57716"},
- {0x05f1, "afii57717"},
- {0x05f2, "afii57718"},
- {0xfb35, "afii57723"},
- {0x05b4, "afii57793"},
- {0x05b5, "afii57794"},
- {0x05b6, "afii57795"},
- {0x05bb, "afii57796"},
- {0x05b8, "afii57797"},
- {0x05b7, "afii57798"},
- {0x05b0, "afii57799"},
- {0x05b2, "afii57800"},
- {0x05b1, "afii57801"},
- {0x05b3, "afii57802"},
- {0x05c2, "afii57803"},
- {0x05c1, "afii57804"},
- {0x05b9, "afii57806"},
- {0x05bc, "afii57807"},
- {0x05bd, "afii57839"},
- {0x05bf, "afii57841"},
- {0x05c0, "afii57842"},
- {0x02bc, "afii57929"},
- {0x2105, "afii61248"},
- {0x2113, "afii61289"},
- {0x2116, "afii61352"},
- {0x202c, "afii61573"},
- {0x202d, "afii61574"},
- {0x202e, "afii61575"},
- {0x200c, "afii61664"},
- {0x066d, "afii63167"},
- {0x02bd, "afii64937"},
- {0x00e0, "agrave"},
- {0x2135, "aleph"},
- {0x03b1, "alpha"},
- {0x03ac, "alphatonos"},
- {0x0101, "amacron"},
- {0x0026, "ampersand"},
- {0x0026, "ampersandsmall"},
- {0x2220, "angle"},
- {0x2329, "angleleft"},
- {0x232a, "angleright"},
- {0x0387, "anoteleia"},
- {0x0105, "aogonek"},
- {0x2248, "approxequal"},
- {0x00e5, "aring"},
- {0x01fb, "aringacute"},
- {0x2194, "arrowboth"},
- {0x21d4, "arrowdblboth"},
- {0x21d3, "arrowdbldown"},
- {0x21d0, "arrowdblleft"},
- {0x21d2, "arrowdblright"},
- {0x21d1, "arrowdblup"},
- {0x2193, "arrowdown"},
- {0xf8e7, "arrowhorizex"},
- {0x2190, "arrowleft"},
- {0x2192, "arrowright"},
- {0x2191, "arrowup"},
- {0x2195, "arrowupdn"},
- {0x21a8, "arrowupdnbse"},
- {0xf8e6, "arrowvertex"},
- {0x005e, "asciicircum"},
- {0x007e, "asciitilde"},
- {0x002a, "asterisk"},
- {0x2217, "asteriskmath"},
- {0xf6e9, "asuperior"},
- {0x0040, "at"},
- {0x00e3, "atilde"},
- {0x0062, "b"},
- {0x005c, "backslash"},
- {0x007c, "bar"},
- {0x03b2, "beta"},
- {0x2588, "block"},
- {0xf8f4, "braceex"},
- {0x007b, "braceleft"},
- {0xf8f3, "braceleftbt"},
- {0xf8f2, "braceleftmid"},
- {0xf8f1, "bracelefttp"},
- {0x007d, "braceright"},
- {0xf8fe, "bracerightbt"},
- {0xf8fd, "bracerightmid"},
- {0xf8fc, "bracerighttp"},
- {0x005b, "bracketleft"},
- {0xf8f0, "bracketleftbt"},
- {0xf8ef, "bracketleftex"},
- {0xf8ee, "bracketlefttp"},
- {0x005d, "bracketright"},
- {0xf8fb, "bracketrightbt"},
- {0xf8fa, "bracketrightex"},
- {0xf8f9, "bracketrighttp"},
- {0x02d8, "breve"},
- {0x00a6, "brokenbar"},
- {0xf6ea, "bsuperior"},
- {0x2022, "bullet"},
- {0x0063, "c"},
- {0x0107, "cacute"},
- {0x02c7, "caron"},
- {0x21b5, "carriagereturn"},
- {0x010d, "ccaron"},
- {0x00e7, "ccedilla"},
- {0x0109, "ccircumflex"},
- {0x010b, "cdotaccent"},
- {0x00b8, "cedilla"},
- {0x00a2, "cent"},
- {0xf6df, "centinferior"},
- {0x00a2, "centoldstyle"},
- {0xf6e0, "centsuperior"},
- {0x03c7, "chi"},
- {0x25cb, "circle"},
- {0x2297, "circlemultiply"},
- {0x2295, "circleplus"},
- {0x02c6, "circumflex"},
- {0x2663, "club"},
- {0x003a, "colon"},
- {0x20a1, "colonmonetary"},
- {0x002c, "comma"},
- {0xf6c3, "commaaccent"},
- {0xf6e1, "commainferior"},
- {0xf6e2, "commasuperior"},
- {0x2245, "congruent"},
- {0x00a9, "copyright"},
- {0x00a9, "copyrightsans"},
- {0x00a9, "copyrightserif"},
- {0x00a4, "currency"},
- {0xf6d1, "cyrBreve"},
- {0xf6d2, "cyrFlex"},
- {0xf6d4, "cyrbreve"},
- {0xf6d5, "cyrflex"},
- {0x0064, "d"},
- {0x2020, "dagger"},
- {0x2021, "daggerdbl"},
- {0xf6d3, "dblGrave"},
- {0xf6d6, "dblgrave"},
- {0x010f, "dcaron"},
- {0x0111, "dcroat"},
- {0x00b0, "degree"},
- {0x03b4, "delta"},
- {0x2666, "diamond"},
- {0x00a8, "dieresis"},
- {0xf6d7, "dieresisacute"},
- {0xf6d8, "dieresisgrave"},
- {0x0385, "dieresistonos"},
- {0x00f7, "divide"},
- {0x2593, "dkshade"},
- {0x2584, "dnblock"},
- {0x0024, "dollar"},
- {0xf6e3, "dollarinferior"},
- {0x0024, "dollaroldstyle"},
- {0xf6e4, "dollarsuperior"},
- {0x20ab, "dong"},
- {0x02d9, "dotaccent"},
- {0x0323, "dotbelowcomb"},
- {0x0131, "dotlessi"},
- {0xf6be, "dotlessj"},
- {0x22c5, "dotmath"},
- {0xf6eb, "dsuperior"},
- {0x0065, "e"},
- {0x00e9, "eacute"},
- {0x0115, "ebreve"},
- {0x011b, "ecaron"},
- {0x00ea, "ecircumflex"},
- {0x00eb, "edieresis"},
- {0x0117, "edotaccent"},
- {0x00e8, "egrave"},
- {0x0038, "eight"},
- {0x2088, "eightinferior"},
- {0x0038, "eightoldstyle"},
- {0x2078, "eightsuperior"},
- {0x2208, "element"},
- {0x2026, "ellipsis"},
- {0x0113, "emacron"},
- {0x2014, "emdash"},
- {0x2205, "emptyset"},
- {0x2013, "endash"},
- {0x014b, "eng"},
- {0x0119, "eogonek"},
- {0x03b5, "epsilon"},
- {0x03ad, "epsilontonos"},
- {0x003d, "equal"},
- {0x2261, "equivalence"},
- {0x212e, "estimated"},
- {0xf6ec, "esuperior"},
- {0x03b7, "eta"},
- {0x03ae, "etatonos"},
- {0x00f0, "eth"},
- {0x0021, "exclam"},
- {0x203c, "exclamdbl"},
- {0x00a1, "exclamdown"},
- {0x00a1, "exclamdownsmall"},
- {0x0021, "exclamleft"},
- {0x0021, "exclamsmall"},
- {0x2203, "existential"},
- {0x0066, "f"},
- {0x2640, "female"},
- {0xfb00, "ff"},
- {0xfb03, "ffi"},
- {0xfb04, "ffl"},
- {0xfb01, "fi"},
- {0x2012, "figuredash"},
- {0x25a0, "filledbox"},
- {0x25ac, "filledrect"},
- {0x0035, "five"},
- {0x215d, "fiveeighths"},
- {0x2085, "fiveinferior"},
- {0x0035, "fiveoldstyle"},
- {0x2075, "fivesuperior"},
- {0xfb02, "fl"},
- {0x0192, "florin"},
- {0x0034, "four"},
- {0x2084, "fourinferior"},
- {0x0034, "fouroldstyle"},
- {0x2074, "foursuperior"},
- {0x2044, "fraction"},
- {0x20a3, "franc"},
- {0x0067, "g"},
- {0x03b3, "gamma"},
- {0x011f, "gbreve"},
- {0x01e7, "gcaron"},
- {0x011d, "gcircumflex"},
- {0x0123, "gcommaaccent"},
- {0x0121, "gdotaccent"},
- {0x00df, "germandbls"},
- {0x2207, "gradient"},
- {0x0060, "grave"},
- {0x0300, "gravecomb"},
- {0x003e, "greater"},
- {0x2265, "greaterequal"},
- {0x00ab, "guillemotleft"},
- {0x00bb, "guillemotright"},
- {0x2039, "guilsinglleft"},
- {0x203a, "guilsinglright"},
- {0x0068, "h"},
- {0x0127, "hbar"},
- {0x0125, "hcircumflex"},
- {0x2665, "heart"},
- {0x0309, "hookabovecomb"},
- {0x2302, "house"},
- {0x02dd, "hungarumlaut"},
- {0x002d, "hyphen"},
- {0xf6e5, "hypheninferior"},
- {0xf6e6, "hyphensuperior"},
- {0x0069, "i"},
- {0x00ed, "iacute"},
- {0x012d, "ibreve"},
- {0x00ee, "icircumflex"},
- {0x00ef, "idieresis"},
- {0x00ec, "igrave"},
- {0x0133, "ij"},
- {0x012b, "imacron"},
- {0x221e, "infinity"},
- {0x222b, "integral"},
- {0x2321, "integralbt"},
- {0xf8f5, "integralex"},
- {0x2320, "integraltp"},
- {0x2229, "intersection"},
- {0x25d8, "invbullet"},
- {0x25d9, "invcircle"},
- {0x263b, "invsmileface"},
- {0x012f, "iogonek"},
- {0x03b9, "iota"},
- {0x03ca, "iotadieresis"},
- {0x0390, "iotadieresistonos"},
- {0x03af, "iotatonos"},
- {0xf6ed, "isuperior"},
- {0x0129, "itilde"},
- {0x006a, "j"},
- {0x0135, "jcircumflex"},
- {0x006b, "k"},
- {0x03ba, "kappa"},
- {0x0137, "kcommaaccent"},
- {0x0138, "kgreenlandic"},
- {0x006c, "l"},
- {0x013a, "lacute"},
- {0x03bb, "lambda"},
- {0x013e, "lcaron"},
- {0x013c, "lcommaaccent"},
- {0x0140, "ldot"},
- {0x003c, "less"},
- {0x2264, "lessequal"},
- {0x258c, "lfblock"},
- {0x20a4, "lira"},
- {0xf6c0, "ll"},
- {0x2227, "logicaland"},
- {0x00ac, "logicalnot"},
- {0x2228, "logicalor"},
- {0x017f, "longs"},
- {0x25ca, "lozenge"},
- {0x0142, "lslash"},
- {0xf6ee, "lsuperior"},
- {0x2591, "ltshade"},
- {0x006d, "m"},
- {0x00af, "macron"},
- {0x2642, "male"},
- {0x2212, "minus"},
- {0x2032, "minute"},
- {0xf6ef, "msuperior"},
- {0x00b5, "mu"},
- {0x00d7, "multiply"},
- {0x266a, "musicalnote"},
- {0x266b, "musicalnotedbl"},
- {0x006e, "n"},
- {0x0144, "nacute"},
- {0x0149, "napostrophe"},
- {0x00a0, "nbspace"},
- {0x0148, "ncaron"},
- {0x0146, "ncommaaccent"},
- {0x0039, "nine"},
- {0x2089, "nineinferior"},
- {0x0039, "nineoldstyle"},
- {0x2079, "ninesuperior"},
- {0x00a0, "nonbreakingspace"},
- {0x2209, "notelement"},
- {0x2260, "notequal"},
- {0x2284, "notsubset"},
- {0x207f, "nsuperior"},
- {0x00f1, "ntilde"},
- {0x03bd, "nu"},
- {0x0023, "numbersign"},
- {0x006f, "o"},
- {0x00f3, "oacute"},
- {0x014f, "obreve"},
- {0x00f4, "ocircumflex"},
- {0x00f6, "odieresis"},
- {0x0153, "oe"},
- {0x02db, "ogonek"},
- {0x00f2, "ograve"},
- {0x01a1, "ohorn"},
- {0x0151, "ohungarumlaut"},
- {0x014d, "omacron"},
- {0x03c9, "omega"},
- {0x03d6, "omega1"},
- {0x03ce, "omegatonos"},
- {0x03bf, "omicron"},
- {0x03cc, "omicrontonos"},
- {0x0031, "one"},
- {0x2024, "onedotenleader"},
- {0x215b, "oneeighth"},
- {0xf6dc, "onefitted"},
- {0x00bd, "onehalf"},
- {0x2081, "oneinferior"},
- {0x0031, "oneoldstyle"},
- {0x00bc, "onequarter"},
- {0x00b9, "onesuperior"},
- {0x2153, "onethird"},
- {0x25e6, "openbullet"},
- {0x00aa, "ordfeminine"},
- {0x00ba, "ordmasculine"},
- {0x221f, "orthogonal"},
- {0x00f8, "oslash"},
- {0x01ff, "oslashacute"},
- {0xf6f0, "osuperior"},
- {0x00f5, "otilde"},
- {0x0070, "p"},
- {0x00b6, "paragraph"},
- {0x0028, "parenleft"},
- {0xf8ed, "parenleftbt"},
- {0xf8ec, "parenleftex"},
- {0x208d, "parenleftinferior"},
- {0x207d, "parenleftsuperior"},
- {0xf8eb, "parenlefttp"},
- {0x0029, "parenright"},
- {0xf8f8, "parenrightbt"},
- {0xf8f7, "parenrightex"},
- {0x208e, "parenrightinferior"},
- {0x207e, "parenrightsuperior"},
- {0xf8f6, "parenrighttp"},
- {0x2202, "partialdiff"},
- {0x0025, "percent"},
- {0x002e, "period"},
- {0x00b7, "periodcentered"},
- {0xf6e7, "periodinferior"},
- {0xf6e8, "periodsuperior"},
- {0x22a5, "perpendicular"},
- {0x2030, "perthousand"},
- {0x20a7, "peseta"},
- {0x03c6, "phi"},
- {0x03d5, "phi1"},
- {0x03c0, "pi"},
- {0x002b, "plus"},
- {0x00b1, "plusminus"},
- {0x211e, "prescription"},
- {0x220f, "product"},
- {0x2282, "propersubset"},
- {0x2283, "propersuperset"},
- {0x221d, "proportional"},
- {0x03c8, "psi"},
- {0x0071, "q"},
- {0x003f, "question"},
- {0x00bf, "questiondown"},
- {0x00bf, "questiondownsmall"},
- {0x003f, "questionsmall"},
- {0x0022, "quotedbl"},
- {0x201e, "quotedblbase"},
- {0x201c, "quotedblleft"},
- {0x201d, "quotedblright"},
- {0x2018, "quoteleft"},
- {0x201b, "quotereversed"},
- {0x2019, "quoteright"},
- {0x201a, "quotesinglbase"},
- {0x0027, "quotesingle"},
- {0x0072, "r"},
- {0x0155, "racute"},
- {0x221a, "radical"},
- {0xf8e5, "radicalex"},
- {0x0159, "rcaron"},
- {0x0157, "rcommaaccent"},
- {0x2286, "reflexsubset"},
- {0x2287, "reflexsuperset"},
- {0x00ae, "registered"},
- {0x00ae, "registersans"},
- {0x00ae, "registerserif"},
- {0x2310, "revlogicalnot"},
- {0x03c1, "rho"},
- {0x02da, "ring"},
- {0xf6f1, "rsuperior"},
- {0x2590, "rtblock"},
- {0xf6dd, "rupiah"},
- {0x0073, "s"},
- {0x015b, "sacute"},
- {0x0161, "scaron"},
- {0x015f, "scedilla"},
- {0x015d, "scircumflex"},
- {0x0219, "scommaaccent"},
- {0x2033, "second"},
- {0x00a7, "section"},
- {0x003b, "semicolon"},
- {0x0037, "seven"},
- {0x215e, "seveneighths"},
- {0x2087, "seveninferior"},
- {0x0037, "sevenoldstyle"},
- {0x2077, "sevensuperior"},
- {0x2592, "shade"},
- {0x03c3, "sigma"},
- {0x03c2, "sigma1"},
- {0x223c, "similar"},
- {0x0036, "six"},
- {0x2086, "sixinferior"},
- {0x0036, "sixoldstyle"},
- {0x2076, "sixsuperior"},
- {0x002f, "slash"},
- {0x263a, "smileface"},
- {0x0020, "space"},
- {0x2660, "spade"},
- {0xf6f2, "ssuperior"},
- {0x00a3, "sterling"},
- {0x220b, "suchthat"},
- {0x2211, "summation"},
- {0x263c, "sun"},
- {0x0074, "t"},
- {0x03c4, "tau"},
- {0x0167, "tbar"},
- {0x0165, "tcaron"},
- {0x0163, "tcommaaccent"},
- {0x2234, "therefore"},
- {0x03b8, "theta"},
- {0x03d1, "theta1"},
- {0x00fe, "thorn"},
- {0x0033, "three"},
- {0x215c, "threeeighths"},
- {0x2083, "threeinferior"},
- {0x0033, "threeoldstyle"},
- {0x00be, "threequarters"},
- {0xf6de, "threequartersemdash"},
- {0x00b3, "threesuperior"},
- {0x02dc, "tilde"},
- {0x0303, "tildecomb"},
- {0x0384, "tonos"},
- {0x2122, "trademark"},
- {0x2122, "trademarksans"},
- {0x2122, "trademarkserif"},
- {0x25bc, "triagdn"},
- {0x25c4, "triaglf"},
- {0x25ba, "triagrt"},
- {0x25b2, "triagup"},
- {0xf6f3, "tsuperior"},
- {0x0032, "two"},
- {0x2025, "twodotenleader"},
- {0x2082, "twoinferior"},
- {0x0032, "twooldstyle"},
- {0x00b2, "twosuperior"},
- {0x2154, "twothirds"},
- {0x0075, "u"},
- {0x00fa, "uacute"},
- {0x016d, "ubreve"},
- {0x00fb, "ucircumflex"},
- {0x00fc, "udieresis"},
- {0x00f9, "ugrave"},
- {0x01b0, "uhorn"},
- {0x0171, "uhungarumlaut"},
- {0x016b, "umacron"},
- {0x005f, "underscore"},
- {0x2017, "underscoredbl"},
- {0x222a, "union"},
- {0x2200, "universal"},
- {0x0173, "uogonek"},
- {0x2580, "upblock"},
- {0x03c5, "upsilon"},
- {0x03cb, "upsilondieresis"},
- {0x03b0, "upsilondieresistonos"},
- {0x03cd, "upsilontonos"},
- {0x016f, "uring"},
- {0x0169, "utilde"},
- {0x0076, "v"},
- {0x0077, "w"},
- {0x1e83, "wacute"},
- {0x0175, "wcircumflex"},
- {0x1e85, "wdieresis"},
- {0x2118, "weierstrass"},
- {0x1e81, "wgrave"},
- {0x0078, "x"},
- {0x03be, "xi"},
- {0x0079, "y"},
- {0x00fd, "yacute"},
- {0x0177, "ycircumflex"},
- {0x00ff, "ydieresis"},
- {0x00a5, "yen"},
- {0x1ef3, "ygrave"},
- {0x007a, "z"},
- {0x017a, "zacute"},
- {0x017e, "zcaron"},
- {0x017c, "zdotaccent"},
- {0x0030, "zero"},
- {0x2080, "zeroinferior"},
- {0x0030, "zerooldstyle"},
- {0x2070, "zerosuperior"},
- {0x03b6, "zeta"},
- {0x007b, "{"},
- {0x007c, "|"},
- {0x007d, "}"},
- {0x007e, "~"},
- { 0, NULL }
-};
diff --git a/pdf/xpdf/Object.cc b/pdf/xpdf/Object.cc
deleted file mode 100644
index ddd6da6..0000000
--- a/pdf/xpdf/Object.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-//========================================================================
-//
-// Object.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include "Object.h"
-#include "Array.h"
-#include "Dict.h"
-#include "Error.h"
-#include "Stream.h"
-#include "XRef.h"
-
-//------------------------------------------------------------------------
-// Object
-//------------------------------------------------------------------------
-
-char *objTypeNames[numObjTypes] = {
- "boolean",
- "integer",
- "real",
- "string",
- "name",
- "null",
- "array",
- "dictionary",
- "stream",
- "ref",
- "cmd",
- "error",
- "eof",
- "none"
-};
-
-#ifdef DEBUG_MEM
-int Object::numAlloc[numObjTypes] =
- {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
-#endif
-
-Object *Object::initArray(XRef *xref) {
- initObj(objArray);
- array = new Array(xref);
- return this;
-}
-
-Object *Object::initDict(XRef *xref) {
- initObj(objDict);
- dict = new Dict(xref);
- return this;
-}
-
-Object *Object::initDict(Dict *dictA) {
- initObj(objDict);
- dict = dictA;
- dict->incRef();
- return this;
-}
-
-Object *Object::initStream(Stream *streamA) {
- initObj(objStream);
- stream = streamA;
- return this;
-}
-
-Object *Object::copy(Object *obj) {
- *obj = *this;
- switch (type) {
- case objString:
- obj->string = string->copy();
- break;
- case objName:
- obj->name = copyString(name);
- break;
- case objArray:
- array->incRef();
- break;
- case objDict:
- dict->incRef();
- break;
- case objStream:
- stream->incRef();
- break;
- case objCmd:
- obj->cmd = copyString(cmd);
- break;
- default:
- break;
- }
-#ifdef DEBUG_MEM
- ++numAlloc[type];
-#endif
- return obj;
-}
-
-Object *Object::fetch(XRef *xref, Object *obj) {
- return (type == objRef && xref) ?
- xref->fetch(ref.num, ref.gen, obj) : copy(obj);
-}
-
-void Object::free() {
- switch (type) {
- case objString:
- delete string;
- break;
- case objName:
- gfree(name);
- break;
- case objArray:
- if (!array->decRef()) {
- delete array;
- }
- break;
- case objDict:
- if (!dict->decRef()) {
- delete dict;
- }
- break;
- case objStream:
- if (!stream->decRef()) {
- delete stream;
- }
- break;
- case objCmd:
- gfree(cmd);
- break;
- default:
- break;
- }
-#ifdef DEBUG_MEM
- --numAlloc[type];
-#endif
- type = objNone;
-}
-
-char *Object::getTypeName() {
- return objTypeNames[type];
-}
-
-void Object::print(FILE *f) {
- Object obj;
- int i;
-
- switch (type) {
- case objBool:
- fprintf(f, "%s", booln ? "true" : "false");
- break;
- case objInt:
- fprintf(f, "%d", intg);
- break;
- case objReal:
- fprintf(f, "%g", real);
- break;
- case objString:
- fprintf(f, "(");
- fwrite(string->getCString(), 1, string->getLength(), stdout);
- fprintf(f, ")");
- break;
- case objName:
- fprintf(f, "/%s", name);
- break;
- case objNull:
- fprintf(f, "null");
- break;
- case objArray:
- fprintf(f, "[");
- for (i = 0; i < arrayGetLength(); ++i) {
- if (i > 0)
- fprintf(f, " ");
- arrayGetNF(i, &obj);
- obj.print(f);
- obj.free();
- }
- fprintf(f, "]");
- break;
- case objDict:
- fprintf(f, "<<");
- for (i = 0; i < dictGetLength(); ++i) {
- fprintf(f, " /%s ", dictGetKey(i));
- dictGetValNF(i, &obj);
- obj.print(f);
- obj.free();
- }
- fprintf(f, " >>");
- break;
- case objStream:
- fprintf(f, "<stream>");
- break;
- case objRef:
- fprintf(f, "%d %d R", ref.num, ref.gen);
- break;
- case objCmd:
- fprintf(f, "%s", cmd);
- break;
- case objError:
- fprintf(f, "<error>");
- break;
- case objEOF:
- fprintf(f, "<EOF>");
- break;
- case objNone:
- fprintf(f, "<none>");
- break;
- }
-}
-
-void Object::memCheck(FILE *f) {
-#ifdef DEBUG_MEM
- int i;
- int t;
-
- t = 0;
- for (i = 0; i < numObjTypes; ++i)
- t += numAlloc[i];
- if (t > 0) {
- fprintf(f, "Allocated objects:\n");
- for (i = 0; i < numObjTypes; ++i) {
- if (numAlloc[i] > 0)
- fprintf(f, " %-20s: %6d\n", objTypeNames[i], numAlloc[i]);
- }
- }
-#endif
-}
diff --git a/pdf/xpdf/Object.h b/pdf/xpdf/Object.h
deleted file mode 100644
index 8b1807c..0000000
--- a/pdf/xpdf/Object.h
+++ /dev/null
@@ -1,303 +0,0 @@
-//========================================================================
-//
-// Object.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef OBJECT_H
-#define OBJECT_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "gtypes.h"
-#include "gmem.h"
-#include "GString.h"
-
-class XRef;
-class Array;
-class Dict;
-class Stream;
-
-//------------------------------------------------------------------------
-// Ref
-//------------------------------------------------------------------------
-
-struct Ref {
- int num; // object number
- int gen; // generation number
-};
-
-//------------------------------------------------------------------------
-// object types
-//------------------------------------------------------------------------
-
-enum ObjType {
- // simple objects
- objBool, // boolean
- objInt, // integer
- objReal, // real
- objString, // string
- objName, // name
- objNull, // null
-
- // complex objects
- objArray, // array
- objDict, // dictionary
- objStream, // stream
- objRef, // indirect reference
-
- // special objects
- objCmd, // command name
- objError, // error return from Lexer
- objEOF, // end of file return from Lexer
- objNone // uninitialized object
-};
-
-#define numObjTypes 14 // total number of object types
-
-//------------------------------------------------------------------------
-// Object
-//------------------------------------------------------------------------
-
-#ifdef DEBUG_MEM
-#define initObj(t) ++numAlloc[type = t]
-#else
-#define initObj(t) type = t
-#endif
-
-class Object {
-public:
-
- // Default constructor.
- Object():
- type(objNone) {}
-
- // Initialize an object.
- Object *initBool(GBool boolnA)
- { initObj(objBool); booln = boolnA; return this; }
- Object *initInt(int intgA)
- { initObj(objInt); intg = intgA; return this; }
- Object *initReal(double realA)
- { initObj(objReal); real = realA; return this; }
- Object *initString(GString *stringA)
- { initObj(objString); string = stringA; return this; }
- Object *initName(char *nameA)
- { initObj(objName); name = copyString(nameA); return this; }
- Object *initNull()
- { initObj(objNull); return this; }
- Object *initArray(XRef *xref);
- Object *initDict(XRef *xref);
- Object *initDict(Dict *dictA);
- Object *initStream(Stream *streamA);
- Object *initRef(int numA, int genA)
- { initObj(objRef); ref.num = numA; ref.gen = genA; return this; }
- Object *initCmd(char *cmdA)
- { initObj(objCmd); cmd = copyString(cmdA); return this; }
- Object *initError()
- { initObj(objError); return this; }
- Object *initEOF()
- { initObj(objEOF); return this; }
-
- // Copy an object.
- Object *copy(Object *obj);
-
- // If object is a Ref, fetch and return the referenced object.
- // Otherwise, return a copy of the object.
- Object *fetch(XRef *xref, Object *obj);
-
- // Free object contents.
- void free();
-
- // Type checking.
- ObjType getType() { return type; }
- GBool isBool() { return type == objBool; }
- GBool isInt() { return type == objInt; }
- GBool isReal() { return type == objReal; }
- GBool isNum() { return type == objInt || type == objReal; }
- GBool isString() { return type == objString; }
- GBool isName() { return type == objName; }
- GBool isNull() { return type == objNull; }
- GBool isArray() { return type == objArray; }
- GBool isDict() { return type == objDict; }
- GBool isStream() { return type == objStream; }
- GBool isRef() { return type == objRef; }
- GBool isCmd() { return type == objCmd; }
- GBool isError() { return type == objError; }
- GBool isEOF() { return type == objEOF; }
- GBool isNone() { return type == objNone; }
-
- // Special type checking.
- GBool isName(char *nameA)
- { return type == objName && !strcmp(name, nameA); }
- GBool isDict(char *dictType);
- GBool isStream(char *dictType);
- GBool isCmd(char *cmdA)
- { return type == objCmd && !strcmp(cmd, cmdA); }
-
- // Accessors. NB: these assume object is of correct type.
- GBool getBool() { return booln; }
- int getInt() { return intg; }
- double getReal() { return real; }
- double getNum() { return type == objInt ? (double)intg : real; }
- GString *getString() { return string; }
- char *getName() { return name; }
- Array *getArray() { return array; }
- Dict *getDict() { return dict; }
- Stream *getStream() { return stream; }
- Ref getRef() { return ref; }
- int getRefNum() { return ref.num; }
- int getRefGen() { return ref.gen; }
- char *getCmd() { return cmd; }
-
- // Array accessors.
- int arrayGetLength();
- void arrayAdd(Object *elem);
- Object *arrayGet(int i, Object *obj);
- Object *arrayGetNF(int i, Object *obj);
-
- // Dict accessors.
- int dictGetLength();
- void dictAdd(char *key, Object *val);
- GBool dictIs(char *dictType);
- Object *dictLookup(char *key, Object *obj);
- Object *dictLookupNF(char *key, Object *obj);
- char *dictGetKey(int i);
- Object *dictGetVal(int i, Object *obj);
- Object *dictGetValNF(int i, Object *obj);
-
- // Stream accessors.
- GBool streamIs(char *dictType);
- void streamReset();
- void streamClose();
- int streamGetChar();
- int streamLookChar();
- char *streamGetLine(char *buf, int size);
- Guint streamGetPos();
- void streamSetPos(Guint pos, int dir = 0);
- Dict *streamGetDict();
-
- // Output.
- char *getTypeName();
- void print(FILE *f = stdout);
-
- // Memory testing.
- static void memCheck(FILE *f);
-
-private:
-
- ObjType type; // object type
- union { // value for each type:
- GBool booln; // boolean
- int intg; // integer
- double real; // real
- GString *string; // string
- char *name; // name
- Array *array; // array
- Dict *dict; // dictionary
- Stream *stream; // stream
- Ref ref; // indirect reference
- char *cmd; // command
- };
-
-#ifdef DEBUG_MEM
- static int // number of each type of object
- numAlloc[numObjTypes]; // currently allocated
-#endif
-};
-
-//------------------------------------------------------------------------
-// Array accessors.
-//------------------------------------------------------------------------
-
-#include "Array.h"
-
-inline int Object::arrayGetLength()
- { return array->getLength(); }
-
-inline void Object::arrayAdd(Object *elem)
- { array->add(elem); }
-
-inline Object *Object::arrayGet(int i, Object *obj)
- { return array->get(i, obj); }
-
-inline Object *Object::arrayGetNF(int i, Object *obj)
- { return array->getNF(i, obj); }
-
-//------------------------------------------------------------------------
-// Dict accessors.
-//------------------------------------------------------------------------
-
-#include "Dict.h"
-
-inline int Object::dictGetLength()
- { return dict->getLength(); }
-
-inline void Object::dictAdd(char *key, Object *val)
- { dict->add(key, val); }
-
-inline GBool Object::dictIs(char *dictType)
- { return dict->is(dictType); }
-
-inline GBool Object::isDict(char *dictType)
- { return type == objDict && dictIs(dictType); }
-
-inline Object *Object::dictLookup(char *key, Object *obj)
- { return dict->lookup(key, obj); }
-
-inline Object *Object::dictLookupNF(char *key, Object *obj)
- { return dict->lookupNF(key, obj); }
-
-inline char *Object::dictGetKey(int i)
- { return dict->getKey(i); }
-
-inline Object *Object::dictGetVal(int i, Object *obj)
- { return dict->getVal(i, obj); }
-
-inline Object *Object::dictGetValNF(int i, Object *obj)
- { return dict->getValNF(i, obj); }
-
-//------------------------------------------------------------------------
-// Stream accessors.
-//------------------------------------------------------------------------
-
-#include "Stream.h"
-
-inline GBool Object::streamIs(char *dictType)
- { return stream->getDict()->is(dictType); }
-
-inline GBool Object::isStream(char *dictType)
- { return type == objStream && streamIs(dictType); }
-
-inline void Object::streamReset()
- { stream->reset(); }
-
-inline void Object::streamClose()
- { stream->close(); }
-
-inline int Object::streamGetChar()
- { return stream->getChar(); }
-
-inline int Object::streamLookChar()
- { return stream->lookChar(); }
-
-inline char *Object::streamGetLine(char *buf, int size)
- { return stream->getLine(buf, size); }
-
-inline Guint Object::streamGetPos()
- { return stream->getPos(); }
-
-inline void Object::streamSetPos(Guint pos, int dir)
- { stream->setPos(pos, dir); }
-
-inline Dict *Object::streamGetDict()
- { return stream->getDict(); }
-
-#endif
diff --git a/pdf/xpdf/Outline.cc b/pdf/xpdf/Outline.cc
deleted file mode 100644
index b7e0645..0000000
--- a/pdf/xpdf/Outline.cc
+++ /dev/null
@@ -1,151 +0,0 @@
-//========================================================================
-//
-// Outline.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "gmem.h"
-#include "GString.h"
-#include "GList.h"
-#include "Link.h"
-#include "PDFDocEncoding.h"
-#include "Outline.h"
-
-//------------------------------------------------------------------------
-
-Outline::Outline(Object *outlineObj, XRef *xref) {
- Object first, last;
-
- items = NULL;
- if (!outlineObj->isDict()) {
- return;
- }
- items = OutlineItem::readItemList(outlineObj->dictLookupNF("First", &first),
- outlineObj->dictLookupNF("Last", &last),
- xref);
- first.free();
- last.free();
-}
-
-Outline::~Outline() {
- if (items) {
- deleteGList(items, OutlineItem);
- }
-}
-
-//------------------------------------------------------------------------
-
-OutlineItem::OutlineItem(Dict *dict, XRef *xrefA) {
- Object obj1, obj2;
- GString *s;
- int i;
-
- xref = xrefA;
- title = NULL;
- action = NULL;
- kids = NULL;
-
- if (dict->lookup("Title", &obj1)->isString()) {
- s = obj1.getString();
- if ((s->getChar(0) & 0xff) == 0xfe &&
- (s->getChar(1) & 0xff) == 0xff) {
- titleLen = (s->getLength() - 2) / 2;
- title = (Unicode *)gmalloc(titleLen * sizeof(Unicode));
- for (i = 0; i < titleLen; ++i) {
- title[i] = ((s->getChar(2 + 2*i) & 0xff) << 8) |
- (s->getChar(3 + 2*i) & 0xff);
- }
- } else {
- titleLen = s->getLength();
- title = (Unicode *)gmalloc(titleLen * sizeof(Unicode));
- for (i = 0; i < titleLen; ++i) {
- title[i] = pdfDocEncoding[s->getChar(i) & 0xff];
- }
- }
- } else {
- titleLen = 0;
- }
- obj1.free();
-
- if (!dict->lookup("Dest", &obj1)->isNull()) {
- action = LinkAction::parseDest(&obj1);
- } else {
- obj1.free();
- dict->lookup("A", &obj1);
- if (!obj1.isNull())
- action = LinkAction::parseAction(&obj1);
- }
- obj1.free();
-
- dict->lookupNF("First", &firstRef);
- dict->lookupNF("Last", &lastRef);
- dict->lookupNF("Next", &nextRef);
-
- startsOpen = gFalse;
- if (dict->lookup("Count", &obj1)->isInt()) {
- if (obj1.getInt() > 0) {
- startsOpen = gTrue;
- }
- }
- obj1.free();
-}
-
-OutlineItem::~OutlineItem() {
- close();
- if (title) {
- gfree(title);
- }
- if (action) {
- delete action;
- }
- firstRef.free();
- lastRef.free();
- nextRef.free();
-}
-
-GList *OutlineItem::readItemList(Object *firstItemRef, Object *lastItemRef,
- XRef *xrefA) {
- GList *items;
- OutlineItem *item;
- Object obj;
- Object *p;
-
- items = new GList();
- p = firstItemRef;
- while (p->isRef()) {
- if (!p->fetch(xrefA, &obj)->isDict()) {
- obj.free();
- break;
- }
- item = new OutlineItem(obj.getDict(), xrefA);
- obj.free();
- items->append(item);
- if (p->getRef().num == lastItemRef->getRef().num &&
- p->getRef().gen == lastItemRef->getRef().gen) {
- break;
- }
- p = &item->nextRef;
- }
- return items;
-}
-
-void OutlineItem::open() {
- if (!kids) {
- kids = readItemList(&firstRef, &lastRef, xref);
- }
-}
-
-void OutlineItem::close() {
- if (kids) {
- deleteGList(kids, OutlineItem);
- kids = NULL;
- }
-}
diff --git a/pdf/xpdf/Outline.h b/pdf/xpdf/Outline.h
deleted file mode 100644
index f38f8d1..0000000
--- a/pdf/xpdf/Outline.h
+++ /dev/null
@@ -1,76 +0,0 @@
-//========================================================================
-//
-// Outline.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef OUTLINE_H
-#define OUTLINE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-#include "CharTypes.h"
-
-class GString;
-class GList;
-class XRef;
-class LinkAction;
-
-//------------------------------------------------------------------------
-
-class Outline {
-public:
-
- Outline(Object *outlineObj, XRef *xref);
- ~Outline();
-
- GList *getItems() { return items; }
-
-private:
-
- GList *items; // NULL if document has no outline
- // [OutlineItem]
-};
-
-//------------------------------------------------------------------------
-
-class OutlineItem {
-public:
-
- OutlineItem(Dict *dict, XRef *xrefA);
- ~OutlineItem();
-
- static GList *readItemList(Object *firstItemRef, Object *lastItemRef,
- XRef *xrefA);
-
- void open();
- void close();
-
- Unicode *getTitle() { return title; }
- int getTitleLength() { return titleLen; }
- LinkAction *getAction() { return action; }
- GBool isOpen() { return startsOpen; }
- GBool hasKids() { return firstRef.isRef(); }
- GList *getKids() { return kids; }
-
-private:
-
- XRef *xref;
- Unicode *title;
- int titleLen;
- LinkAction *action;
- Object firstRef;
- Object lastRef;
- Object nextRef;
- GBool startsOpen;
- GList *kids; // NULL unless this item is open [OutlineItem]
-};
-
-#endif
diff --git a/pdf/xpdf/OutputDev.cc b/pdf/xpdf/OutputDev.cc
deleted file mode 100644
index e83882d..0000000
--- a/pdf/xpdf/OutputDev.cc
+++ /dev/null
@@ -1,104 +0,0 @@
-//========================================================================
-//
-// OutputDev.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include "Object.h"
-#include "Stream.h"
-#include "GfxState.h"
-#include "OutputDev.h"
-
-//------------------------------------------------------------------------
-// OutputDev
-//------------------------------------------------------------------------
-
-void OutputDev::setDefaultCTM(double *ctm) {
- int i;
- double det;
-
- for (i = 0; i < 6; ++i) {
- defCTM[i] = ctm[i];
- }
- det = 1 / (defCTM[0] * defCTM[3] - defCTM[1] * defCTM[2]);
- defICTM[0] = defCTM[3] * det;
- defICTM[1] = -defCTM[1] * det;
- defICTM[2] = -defCTM[2] * det;
- defICTM[3] = defCTM[0] * det;
- defICTM[4] = (defCTM[2] * defCTM[5] - defCTM[3] * defCTM[4]) * det;
- defICTM[5] = (defCTM[1] * defCTM[4] - defCTM[0] * defCTM[5]) * det;
-}
-
-void OutputDev::cvtDevToUser(double dx, double dy, double *ux, double *uy) {
- *ux = defICTM[0] * dx + defICTM[2] * dy + defICTM[4];
- *uy = defICTM[1] * dx + defICTM[3] * dy + defICTM[5];
-}
-
-void OutputDev::cvtUserToDev(double ux, double uy, int *dx, int *dy) {
- *dx = (int)(defCTM[0] * ux + defCTM[2] * uy + defCTM[4] + 0.5);
- *dy = (int)(defCTM[1] * ux + defCTM[3] * uy + defCTM[5] + 0.5);
-}
-
-void OutputDev::updateAll(GfxState *state) {
- updateLineDash(state);
- updateFlatness(state);
- updateLineJoin(state);
- updateLineCap(state);
- updateMiterLimit(state);
- updateLineWidth(state);
- updateFillColor(state);
- updateStrokeColor(state);
- updateFont(state);
-}
-
-GBool OutputDev::beginType3Char(GfxState *state, double x, double y,
- double dx, double dy,
- CharCode code, Unicode *u, int uLen) {
- return gFalse;
-}
-
-void OutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
- int width, int height, GBool invert,
- GBool inlineImg) {
- int i, j;
-
- if (inlineImg) {
- str->reset();
- j = height * ((width + 7) / 8);
- for (i = 0; i < j; ++i)
- str->getChar();
- str->close();
- }
-}
-
-void OutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
- int *maskColors, GBool inlineImg) {
- int i, j;
-
- if (inlineImg) {
- str->reset();
- j = height * ((width * colorMap->getNumPixelComps() *
- colorMap->getBits() + 7) / 8);
- for (i = 0; i < j; ++i)
- str->getChar();
- str->close();
- }
-}
-
-#if OPI_SUPPORT
-void OutputDev::opiBegin(GfxState *state, Dict *opiDict) {
-}
-
-void OutputDev::opiEnd(GfxState *state, Dict *opiDict) {
-}
-#endif
diff --git a/pdf/xpdf/OutputDev.h b/pdf/xpdf/OutputDev.h
deleted file mode 100644
index bbf8b69..0000000
--- a/pdf/xpdf/OutputDev.h
+++ /dev/null
@@ -1,163 +0,0 @@
-//========================================================================
-//
-// OutputDev.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef OUTPUTDEV_H
-#define OUTPUTDEV_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "CharTypes.h"
-
-class GString;
-class Object;
-class GfxState;
-class GfxColorSpace;
-class GfxImageColorMap;
-class Stream;
-class Link;
-class Catalog;
-
-//------------------------------------------------------------------------
-// OutputDev
-//------------------------------------------------------------------------
-
-class OutputDev {
-public:
-
- // Constructor.
- OutputDev() {}
-
- // Destructor.
- virtual ~OutputDev() {}
-
- //----- 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() = 0;
-
- // Does this device use drawChar() or drawString()?
- virtual GBool useDrawChar() = 0;
-
- // Does this device use beginType3Char/endType3Char? Otherwise,
- // text in Type 3 fonts will be drawn with drawChar/drawString.
- virtual GBool interpretType3Chars() = 0;
-
- // 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 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) {}
- virtual void updateFillOpacity(GfxState *state) {}
- virtual void updateStrokeOpacity(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 beginString(GfxState *state, GString *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 drawString(GfxState *state, GString *s) {}
- 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);
-
-#if OPI_SUPPORT
- //----- OPI functions
- virtual void opiBegin(GfxState *state, Dict *opiDict);
- virtual void opiEnd(GfxState *state, Dict *opiDict);
-#endif
-
- //----- 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) {}
-
-private:
-
- double defCTM[6]; // default coordinate transform matrix
- double defICTM[6]; // inverse of default CTM
-};
-
-#endif
diff --git a/pdf/xpdf/PDFDoc.cc b/pdf/xpdf/PDFDoc.cc
deleted file mode 100644
index 031ffc5..0000000
--- a/pdf/xpdf/PDFDoc.cc
+++ /dev/null
@@ -1,322 +0,0 @@
-//========================================================================
-//
-// PDFDoc.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <locale.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "GString.h"
-#include "xpdfconfig.h"
-#include "GlobalParams.h"
-#include "Page.h"
-#include "Catalog.h"
-#include "Stream.h"
-#include "XRef.h"
-#include "Link.h"
-#include "OutputDev.h"
-#include "Error.h"
-#include "ErrorCodes.h"
-#include "Lexer.h"
-#include "Parser.h"
-#ifndef DISABLE_OUTLINE
-#include "Outline.h"
-#endif
-#include "PDFDoc.h"
-
-//------------------------------------------------------------------------
-
-#define headerSearchSize 1024 // read this many bytes at beginning of
- // file to look for '%PDF'
-
-//------------------------------------------------------------------------
-// PDFDoc
-//------------------------------------------------------------------------
-
-PDFDoc::PDFDoc(GString *fileNameA, GString *ownerPassword,
- GString *userPassword) {
- Object obj;
- GString *fileName1, *fileName2;
-
- ok = gFalse;
- errCode = errNone;
-
- file = NULL;
- str = NULL;
- xref = NULL;
- catalog = NULL;
- links = NULL;
-#ifndef DISABLE_OUTLINE
- outline = NULL;
-#endif
-
- fileName = fileNameA;
- fileName1 = fileName;
-
-
- // try to open file
- fileName2 = NULL;
-#ifdef VMS
- if (!(file = fopen(fileName1->getCString(), "rb", "ctx=stm"))) {
- error(-1, "Couldn't open file '%s'", fileName1->getCString());
- errCode = errOpenFile;
- return;
- }
-#else
- if (!(file = fopen(fileName1->getCString(), "rb"))) {
- fileName2 = fileName->copy();
- fileName2->lowerCase();
- if (!(file = fopen(fileName2->getCString(), "rb"))) {
- fileName2->upperCase();
- if (!(file = fopen(fileName2->getCString(), "rb"))) {
- error(-1, "Couldn't open file '%s'", fileName->getCString());
- delete fileName2;
- errCode = errOpenFile;
- return;
- }
- }
- delete fileName2;
- }
-#endif
-
- // create stream
- obj.initNull();
- str = new FileStream(file, 0, gFalse, 0, &obj);
-
- ok = setup(ownerPassword, userPassword);
-}
-
-PDFDoc::PDFDoc(BaseStream *strA, GString *ownerPassword,
- GString *userPassword) {
- ok = gFalse;
- errCode = errNone;
- fileName = NULL;
- file = NULL;
- str = strA;
- xref = NULL;
- catalog = NULL;
- links = NULL;
-#ifndef DISABLE_OUTLINE
- outline = NULL;
-#endif
- ok = setup(ownerPassword, userPassword);
-}
-
-GBool PDFDoc::setup(GString *ownerPassword, GString *userPassword) {
- str->reset();
-
- // check header
- checkHeader();
-
- // read xref table
- xref = new XRef(str, ownerPassword, userPassword);
- if (!xref->isOk()) {
- error(-1, "Couldn't read xref table");
- errCode = xref->getErrorCode();
- return gFalse;
- }
-
- // read catalog
- catalog = new Catalog(xref);
- if (!catalog->isOk()) {
- error(-1, "Couldn't read page catalog");
- errCode = errBadCatalog;
- return gFalse;
- }
-
-#ifndef DISABLE_OUTLINE
- // read outline
- outline = new Outline(catalog->getOutline(), xref);
-#endif
-
- // done
- return gTrue;
-}
-
-PDFDoc::~PDFDoc() {
-#ifndef DISABLE_OUTLINE
- if (outline) {
- delete outline;
- }
-#endif
- if (catalog) {
- delete catalog;
- }
- if (xref) {
- delete xref;
- }
- if (str) {
- delete str;
- }
- if (file) {
- fclose(file);
- }
- if (fileName) {
- delete fileName;
- }
- if (links) {
- delete links;
- }
-}
-
-// Check for a PDF header on this stream. Skip past some garbage
-// if necessary.
-void PDFDoc::checkHeader() {
- char hdrBuf[headerSearchSize+1];
- char *p;
- int i;
-
- pdfVersion = 0;
- for (i = 0; i < headerSearchSize; ++i) {
- hdrBuf[i] = str->getChar();
- }
- hdrBuf[headerSearchSize] = '\0';
- for (i = 0; i < headerSearchSize - 5; ++i) {
- if (!strncmp(&hdrBuf[i], "%PDF-", 5)) {
- break;
- }
- }
- if (i >= headerSearchSize - 5) {
- error(-1, "May not be a PDF file (continuing anyway)");
- return;
- }
- str->moveStart(i);
- p = strtok(&hdrBuf[i+5], " \t\n\r");
- {
- char *theLocale = setlocale(LC_NUMERIC, "C");
- pdfVersion = atof(p);
- setlocale(LC_NUMERIC, theLocale);
- }
- if (!(hdrBuf[i+5] >= '0' && hdrBuf[i+5] <= '9') ||
- pdfVersion > supportedPDFVersionNum + 0.0001) {
- error(-1, "PDF version %s -- xpdf supports version %s"
- " (continuing anyway)", p, supportedPDFVersionStr);
- }
-}
-
-void PDFDoc::displayPage(OutputDev *out, int page, double hDPI, double vDPI,
- int rotate, GBool crop, GBool doLinks,
- GBool (*abortCheckCbk)(void *data),
- void *abortCheckCbkData,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
- void *annotDisplayDecideCbkData) {
- Page *p;
-
- if (globalParams->getPrintCommands()) {
- printf("***** page %d *****\n", page);
- }
- p = catalog->getPage(page);
- if (doLinks) {
- if (links) {
- delete links;
- links = NULL;
- }
- getLinks(p);
- p->display(out, hDPI, vDPI, rotate, crop, links, catalog,
- abortCheckCbk, abortCheckCbkData,
- annotDisplayDecideCbk, annotDisplayDecideCbkData);
- } else {
- p->display(out, hDPI, vDPI, rotate, crop, NULL, catalog,
- abortCheckCbk, abortCheckCbkData,
- annotDisplayDecideCbk, annotDisplayDecideCbkData);
- }
-}
-
-void PDFDoc::displayPages(OutputDev *out, int firstPage, int lastPage,
- double hDPI, double vDPI, int rotate,
- GBool crop, GBool doLinks,
- GBool (*abortCheckCbk)(void *data),
- void *abortCheckCbkData,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
- void *annotDisplayDecideCbkData) {
- int page;
-
- for (page = firstPage; page <= lastPage; ++page) {
- displayPage(out, page, hDPI, vDPI, rotate, crop, doLinks,
- abortCheckCbk, abortCheckCbkData,
- annotDisplayDecideCbk, annotDisplayDecideCbkData);
- }
-}
-
-void PDFDoc::displayPageSlice(OutputDev *out, int page,
- double hDPI, double vDPI,
- int rotate, GBool crop,
- int sliceX, int sliceY, int sliceW, int sliceH,
- GBool (*abortCheckCbk)(void *data),
- void *abortCheckCbkData,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
- void *annotDisplayDecideCbkData) {
- Page *p;
-
- p = catalog->getPage(page);
- p->displaySlice(out, hDPI, vDPI, rotate, crop,
- sliceX, sliceY, sliceW, sliceH,
- NULL, catalog,
- abortCheckCbk, abortCheckCbkData,
- annotDisplayDecideCbk, annotDisplayDecideCbkData);
-}
-
-GBool PDFDoc::isLinearized() {
- Parser *parser;
- Object obj1, obj2, obj3, obj4, obj5;
- GBool lin;
-
- lin = gFalse;
- obj1.initNull();
- parser = new Parser(xref,
- new Lexer(xref,
- str->makeSubStream(str->getStart(), gFalse, 0, &obj1)));
- parser->getObj(&obj1);
- parser->getObj(&obj2);
- parser->getObj(&obj3);
- parser->getObj(&obj4);
- if (obj1.isInt() && obj2.isInt() && obj3.isCmd("obj") &&
- obj4.isDict()) {
- obj4.dictLookup("Linearized", &obj5);
- if (obj5.isNum() && obj5.getNum() > 0) {
- lin = gTrue;
- }
- obj5.free();
- }
- obj4.free();
- obj3.free();
- obj2.free();
- obj1.free();
- delete parser;
- return lin;
-}
-
-GBool PDFDoc::saveAs(GString *name) {
- FILE *f;
- int c;
-
- if (!(f = fopen(name->getCString(), "wb"))) {
- error(-1, "Couldn't open file '%s'", name->getCString());
- return gFalse;
- }
- str->reset();
- while ((c = str->getChar()) != EOF) {
- fputc(c, f);
- }
- str->close();
- fclose(f);
- return gTrue;
-}
-
-void PDFDoc::getLinks(Page *page) {
- Object obj;
-
- links = new Links(page->getAnnots(&obj), catalog->getBaseURI());
- obj.free();
-}
diff --git a/pdf/xpdf/PDFDoc.h b/pdf/xpdf/PDFDoc.h
deleted file mode 100644
index 57e37a2..0000000
--- a/pdf/xpdf/PDFDoc.h
+++ /dev/null
@@ -1,178 +0,0 @@
-//========================================================================
-//
-// PDFDoc.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PDFDOC_H
-#define PDFDOC_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include "XRef.h"
-#include "Link.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "Annot.h"
-
-class GString;
-class BaseStream;
-class OutputDev;
-class Links;
-class LinkAction;
-class LinkDest;
-class Outline;
-
-//------------------------------------------------------------------------
-// PDFDoc
-//------------------------------------------------------------------------
-
-class PDFDoc {
-public:
-
- PDFDoc(GString *fileNameA, GString *ownerPassword = NULL,
- GString *userPassword = NULL);
- PDFDoc(BaseStream *strA, GString *ownerPassword = NULL,
- GString *userPassword = NULL);
- ~PDFDoc();
-
- // Was PDF document successfully opened?
- GBool isOk() { return ok; }
-
- // Get the error code (if isOk() returns false).
- int getErrorCode() { return errCode; }
-
- // Get file name.
- GString *getFileName() { return fileName; }
-
- // Get the xref table.
- XRef *getXRef() { return xref; }
-
- // Get catalog.
- Catalog *getCatalog() { return catalog; }
-
- // Get base stream.
- BaseStream *getBaseStream() { return str; }
-
- // Get page parameters.
- double getPageWidth(int page)
- { return catalog->getPage(page)->getWidth(); }
- double getPageHeight(int page)
- { return catalog->getPage(page)->getHeight(); }
- int getPageRotate(int page)
- { return catalog->getPage(page)->getRotate(); }
-
- // Get number of pages.
- int getNumPages() { return catalog->getNumPages(); }
-
- // Return the contents of the metadata stream, or NULL if there is
- // no metadata.
- GString *readMetadata() { return catalog->readMetadata(); }
-
- // Return the structure tree root object.
- Object *getStructTreeRoot() { return catalog->getStructTreeRoot(); }
-
- // Display a page.
- void displayPage(OutputDev *out, int page, double hDPI, double vDPI,
- int rotate, GBool crop, GBool doLinks,
- GBool (*abortCheckCbk)(void *data) = NULL,
- void *abortCheckCbkData = NULL,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
- void *annotDisplayDecideCbkData = NULL);
-
- // Display a range of pages.
- void displayPages(OutputDev *out, int firstPage, int lastPage,
- double hDPI, double vDPI, int rotate,
- GBool crop, GBool doLinks,
- GBool (*abortCheckCbk)(void *data) = NULL,
- void *abortCheckCbkData = NULL,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
- void *annotDisplayDecideCbkData = NULL);
-
- // Display part of a page.
- void displayPageSlice(OutputDev *out, int page,
- double hDPI, double vDPI,
- int rotate, GBool crop,
- int sliceX, int sliceY, int sliceW, int sliceH,
- GBool (*abortCheckCbk)(void *data) = NULL,
- void *abortCheckCbkData = NULL,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
- void *annotDisplayDecideCbkData = NULL);
-
- // Find a page, given its object ID. Returns page number, or 0 if
- // not found.
- int findPage(int num, int gen) { return catalog->findPage(num, gen); }
-
- // If point <x>,<y> is in a link, return the associated action;
- // else return NULL.
- LinkAction *findLink(double x, double y)
- { return links ? links->find(x, y) : (LinkAction *)NULL; }
-
- // Return true if <x>,<y> is in a link.
- GBool onLink(double x, double y) { return links->onLink(x, y); }
-
- // Find a named destination. Returns the link destination, or
- // NULL if <name> is not a destination.
- LinkDest *findDest(GString *name)
- { return catalog->findDest(name); }
-
-#ifndef DISABLE_OUTLINE
- // Return the outline object.
- Outline *getOutline() { return outline; }
-#endif
-
- // Is the file encrypted?
- GBool isEncrypted() { return xref->isEncrypted(); }
-
- // Check various permissions.
- GBool okToPrint(GBool ignoreOwnerPW = gFalse)
- { return xref->okToPrint(ignoreOwnerPW); }
- GBool okToChange(GBool ignoreOwnerPW = gFalse)
- { return xref->okToChange(ignoreOwnerPW); }
- GBool okToCopy(GBool ignoreOwnerPW = gFalse)
- { return xref->okToCopy(ignoreOwnerPW); }
- GBool okToAddNotes(GBool ignoreOwnerPW = gFalse)
- { return xref->okToAddNotes(ignoreOwnerPW); }
-
- // Is this document linearized?
- GBool isLinearized();
-
- // Return the document's Info dictionary (if any).
- Object *getDocInfo(Object *obj) { return xref->getDocInfo(obj); }
- Object *getDocInfoNF(Object *obj) { return xref->getDocInfoNF(obj); }
-
- // Return the PDF version specified by the file.
- double getPDFVersion() { return pdfVersion; }
-
- // Save this file with another name.
- GBool saveAs(GString *name);
-
-private:
-
- GBool setup(GString *ownerPassword, GString *userPassword);
- void checkHeader();
- void getLinks(Page *page);
-
- GString *fileName;
- FILE *file;
- BaseStream *str;
- double pdfVersion;
- XRef *xref;
- Catalog *catalog;
- Links *links;
-#ifndef DISABLE_OUTLINE
- Outline *outline;
-#endif
-
- GBool ok;
- int errCode;
-};
-
-#endif
diff --git a/pdf/xpdf/PDFDocEncoding.cc b/pdf/xpdf/PDFDocEncoding.cc
deleted file mode 100644
index 89dc382..0000000
--- a/pdf/xpdf/PDFDocEncoding.cc
+++ /dev/null
@@ -1,44 +0,0 @@
-//========================================================================
-//
-// PDFDocEncoding.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include "PDFDocEncoding.h"
-
-Unicode pdfDocEncoding[256] = {
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 00
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
- 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, // 10
- 0x02d8, 0x02c7, 0x02c6, 0x02d9, 0x02dd, 0x02db, 0x02da, 0x02dc,
- 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, // 20
- 0x0028, 0x0029, 0x002a, 0x002b, 0x002c, 0x002d, 0x002e, 0x002f,
- 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, // 30
- 0x0038, 0x0039, 0x003a, 0x003b, 0x003c, 0x003d, 0x003e, 0x003f,
- 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, // 40
- 0x0048, 0x0049, 0x004a, 0x004b, 0x004c, 0x004d, 0x004e, 0x004f,
- 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, // 50
- 0x0058, 0x0059, 0x005a, 0x005b, 0x005c, 0x005d, 0x005e, 0x005f,
- 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, // 60
- 0x0068, 0x0069, 0x006a, 0x006b, 0x006c, 0x006d, 0x006e, 0x006f,
- 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, // 70
- 0x0078, 0x0079, 0x007a, 0x007b, 0x007c, 0x007d, 0x007e, 0x0000,
- 0x2022, 0x2020, 0x2021, 0x2026, 0x2014, 0x2013, 0x0192, 0x2044, // 80
- 0x2039, 0x203a, 0x2212, 0x2030, 0x201e, 0x201c, 0x201d, 0x2018,
- 0x2019, 0x201a, 0x2122, 0xfb01, 0xfb02, 0x0141, 0x0152, 0x0160, // 90
- 0x0178, 0x017d, 0x0131, 0x0142, 0x0153, 0x0161, 0x017e, 0x0000,
- 0x20ac, 0x00a1, 0x00a2, 0x00a3, 0x00a4, 0x00a5, 0x00a6, 0x00a7, // a0
- 0x00a8, 0x00a9, 0x00aa, 0x00ab, 0x00ac, 0x0000, 0x00ae, 0x00af,
- 0x00b0, 0x00b1, 0x00b2, 0x00b3, 0x00b4, 0x00b5, 0x00b6, 0x00b7, // b0
- 0x00b8, 0x00b9, 0x00ba, 0x00bb, 0x00bc, 0x00bd, 0x00be, 0x00bf,
- 0x00c0, 0x00c1, 0x00c2, 0x00c3, 0x00c4, 0x00c5, 0x00c6, 0x00c7, // c0
- 0x00c8, 0x00c9, 0x00ca, 0x00cb, 0x00cc, 0x00cd, 0x00ce, 0x00cf,
- 0x00d0, 0x00d1, 0x00d2, 0x00d3, 0x00d4, 0x00d5, 0x00d6, 0x00d7, // d0
- 0x00d8, 0x00d9, 0x00da, 0x00db, 0x00dc, 0x00dd, 0x00de, 0x00df,
- 0x00e0, 0x00e1, 0x00e2, 0x00e3, 0x00e4, 0x00e5, 0x00e6, 0x00e7, // e0
- 0x00e8, 0x00e9, 0x00ea, 0x00eb, 0x00ec, 0x00ed, 0x00ee, 0x00ef,
- 0x00f0, 0x00f1, 0x00f2, 0x00f3, 0x00f4, 0x00f5, 0x00f6, 0x00f7, // f0
- 0x00f8, 0x00f9, 0x00fa, 0x00fb, 0x00fc, 0x00fd, 0x00fe, 0x00ff
-};
diff --git a/pdf/xpdf/PDFDocEncoding.h b/pdf/xpdf/PDFDocEncoding.h
deleted file mode 100644
index 3259d3e..0000000
--- a/pdf/xpdf/PDFDocEncoding.h
+++ /dev/null
@@ -1,16 +0,0 @@
-//========================================================================
-//
-// PDFDocEncoding.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PDFDOCENCODING_H
-#define PDFDOCENCODING_H
-
-#include "CharTypes.h"
-
-extern Unicode pdfDocEncoding[256];
-
-#endif
diff --git a/pdf/xpdf/PSOutputDev.cc b/pdf/xpdf/PSOutputDev.cc
deleted file mode 100644
index 28811a8..0000000
--- a/pdf/xpdf/PSOutputDev.cc
+++ /dev/null
@@ -1,3803 +0,0 @@
-//========================================================================
-//
-// PSOutputDev.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stddef.h>
-#include <stdarg.h>
-#include <signal.h>
-#include <math.h>
-#include "GString.h"
-#include "GList.h"
-#include "xpdfconfig.h"
-#include "GlobalParams.h"
-#include "Object.h"
-#include "Error.h"
-#include "Function.h"
-#include "Gfx.h"
-#include "GfxState.h"
-#include "GfxFont.h"
-#include "UnicodeMap.h"
-#include "FoFiType1C.h"
-#include "FoFiTrueType.h"
-#include "Catalog.h"
-#include "Page.h"
-#include "Stream.h"
-#include "Annot.h"
-#include "PSOutputDev.h"
-
-#ifdef MACOS
-// needed for setting type/creator of MacOS files
-#include "ICSupport.h"
-#endif
-
-//------------------------------------------------------------------------
-// PostScript prolog and setup
-//------------------------------------------------------------------------
-
-static char *prolog[] = {
- "/xpdf 75 dict def xpdf begin",
- "% PDF special state",
- "/pdfDictSize 15 def",
- "~1",
- "/pdfStates 64 array def",
- " 0 1 63 {",
- " pdfStates exch pdfDictSize dict",
- " dup /pdfStateIdx 3 index put",
- " put",
- " } for",
- "~a",
- "/pdfSetup {",
- " 3 1 roll 2 array astore",
- " /setpagedevice where {",
- " pop 3 dict begin",
- " /PageSize exch def",
- " /ImagingBBox null def",
- " /Policies 1 dict dup begin /PageSize 3 def end def",
- " { /Duplex true def } if",
- " currentdict end setpagedevice",
- " } {",
- " pop pop",
- " } ifelse",
- "} def",
- "~1",
- "/pdfOpNames [",
- " /pdfFill /pdfStroke /pdfLastFill /pdfLastStroke",
- " /pdfTextMat /pdfFontSize /pdfCharSpacing /pdfTextRender",
- " /pdfTextRise /pdfWordSpacing /pdfHorizScaling /pdfTextClipPath",
- "] def",
- "~a",
- "/pdfStartPage {",
- "~1",
- " pdfStates 0 get begin",
- "~2",
- " pdfDictSize dict begin",
- "~a",
- " /pdfFill [0] def",
- " /pdfStroke [0] def",
- " /pdfLastFill false def",
- " /pdfLastStroke false def",
- " /pdfTextMat [1 0 0 1 0 0] def",
- " /pdfFontSize 0 def",
- " /pdfCharSpacing 0 def",
- " /pdfTextRender 0 def",
- " /pdfTextRise 0 def",
- " /pdfWordSpacing 0 def",
- " /pdfHorizScaling 1 def",
- " /pdfTextClipPath [] def",
- "} def",
- "/pdfEndPage { end } def",
- "% separation convention operators",
- "/findcmykcustomcolor where {",
- " pop",
- "}{",
- " /findcmykcustomcolor { 5 array astore } def",
- "} ifelse",
- "/setcustomcolor where {",
- " pop",
- "}{",
- " /setcustomcolor {",
- " exch",
- " [ exch /Separation exch dup 4 get exch /DeviceCMYK exch",
- " 0 4 getinterval cvx",
- " [ exch /dup load exch { mul exch dup } /forall load",
- " /pop load dup ] cvx",
- " ] setcolorspace setcolor",
- " } def",
- "} ifelse",
- "/customcolorimage where {",
- " pop",
- "}{",
- " /customcolorimage {",
- " gsave",
- " [ exch /Separation exch dup 4 get exch /DeviceCMYK exch",
- " 0 4 getinterval",
- " [ exch /dup load exch { mul exch dup } /forall load",
- " /pop load dup ] cvx",
- " ] setcolorspace",
- " 10 dict begin",
- " /ImageType 1 def",
- " /DataSource exch def",
- " /ImageMatrix exch def",
- " /BitsPerComponent exch def",
- " /Height exch def",
- " /Width exch def",
- " /Decode [1 0] def",
- " currentdict end",
- " image",
- " grestore",
- " } def",
- "} ifelse",
- "% PDF color state",
- "/sCol {",
- " pdfLastStroke not {",
- " pdfStroke aload length",
- " dup 1 eq {",
- " pop setgray",
- " }{",
- " dup 3 eq {",
- " pop setrgbcolor",
- " }{",
- " 4 eq {",
- " setcmykcolor",
- " }{",
- " findcmykcustomcolor exch setcustomcolor",
- " } ifelse",
- " } ifelse",
- " } ifelse",
- " /pdfLastStroke true def /pdfLastFill false def",
- " } if",
- "} def",
- "/fCol {",
- " pdfLastFill not {",
- " pdfFill aload length",
- " dup 1 eq {",
- " pop setgray",
- " }{",
- " dup 3 eq {",
- " pop setrgbcolor",
- " }{",
- " 4 eq {",
- " setcmykcolor",
- " }{",
- " findcmykcustomcolor exch setcustomcolor",
- " } ifelse",
- " } ifelse",
- " } ifelse",
- " /pdfLastFill true def /pdfLastStroke false def",
- " } if",
- "} def",
- "% build a font",
- "/pdfMakeFont {",
- " 4 3 roll findfont",
- " 4 2 roll matrix scale makefont",
- " dup length dict begin",
- " { 1 index /FID ne { def } { pop pop } ifelse } forall",
- " /Encoding exch def",
- " currentdict",
- " end",
- " definefont pop",
- "} def",
- "/pdfMakeFont16 {",
- " exch findfont",
- " dup length dict begin",
- " { 1 index /FID ne { def } { pop pop } ifelse } forall",
- " /WMode exch def",
- " currentdict",
- " end",
- " definefont pop",
- "} def",
- "/pdfMakeFont16L3 {",
- " 1 index /CIDFont resourcestatus {",
- " pop pop 1 index /CIDFont findresource /CIDFontType known",
- " } {",
- " false",
- " } ifelse",
- " {",
- " 0 eq { /Identity-H } { /Identity-V } ifelse",
- " exch 1 array astore composefont pop",
- " } {",
- " pdfMakeFont16",
- " } ifelse",
- "} def",
- "% graphics state operators",
- "~1",
- "/q {",
- " gsave",
- " pdfOpNames length 1 sub -1 0 { pdfOpNames exch get load } for",
- " pdfStates pdfStateIdx 1 add get begin",
- " pdfOpNames { exch def } forall",
- "} def",
- "~2",
- "/q { gsave pdfDictSize dict begin } def",
- "~a",
- "/Q { end grestore } def",
- "/cm { concat } def",
- "/d { setdash } def",
- "/i { setflat } def",
- "/j { setlinejoin } def",
- "/J { setlinecap } def",
- "/M { setmiterlimit } def",
- "/w { setlinewidth } def",
- "% color operators",
- "/g { dup 1 array astore /pdfFill exch def setgray",
- " /pdfLastFill true def /pdfLastStroke false def } def",
- "/G { dup 1 array astore /pdfStroke exch def setgray",
- " /pdfLastStroke true def /pdfLastFill false def } def",
- "/rg { 3 copy 3 array astore /pdfFill exch def setrgbcolor",
- " /pdfLastFill true def /pdfLastStroke false def } def",
- "/RG { 3 copy 3 array astore /pdfStroke exch def setrgbcolor",
- " /pdfLastStroke true def /pdfLastFill false def } def",
- "/k { 4 copy 4 array astore /pdfFill exch def setcmykcolor",
- " /pdfLastFill true def /pdfLastStroke false def } def",
- "/K { 4 copy 4 array astore /pdfStroke exch def setcmykcolor",
- " /pdfLastStroke true def /pdfLastFill false def } def",
- "/ck { 6 copy 6 array astore /pdfFill exch def",
- " findcmykcustomcolor exch setcustomcolor",
- " /pdfLastFill true def /pdfLastStroke false def } def",
- "/CK { 6 copy 6 array astore /pdfStroke exch def",
- " findcmykcustomcolor exch setcustomcolor",
- " /pdfLastStroke true def /pdfLastFill false def } def",
- "% path segment operators",
- "/m { moveto } def",
- "/l { lineto } def",
- "/c { curveto } def",
- "/re { 4 2 roll moveto 1 index 0 rlineto 0 exch rlineto",
- " neg 0 rlineto closepath } def",
- "/h { closepath } def",
- "% path painting operators",
- "/S { sCol stroke } def",
- "/Sf { fCol stroke } def",
- "/f { fCol fill } def",
- "/f* { fCol eofill } def",
- "% clipping operators",
- "/W { clip newpath } def",
- "/W* { eoclip newpath } def",
- "% text state operators",
- "/Tc { /pdfCharSpacing exch def } def",
- "/Tf { dup /pdfFontSize exch def",
- " dup pdfHorizScaling mul exch matrix scale",
- " pdfTextMat matrix concatmatrix dup 4 0 put dup 5 0 put",
- " exch findfont exch makefont setfont } def",
- "/Tr { /pdfTextRender exch def } def",
- "/Ts { /pdfTextRise exch def } def",
- "/Tw { /pdfWordSpacing exch def } def",
- "/Tz { /pdfHorizScaling exch def } def",
- "% text positioning operators",
- "/Td { pdfTextMat transform moveto } def",
- "/Tm { /pdfTextMat exch def } def",
- "% text string operators",
- "/cshow where {",
- " pop",
- " /cshow2 {",
- " dup {",
- " pop pop",
- " 1 string dup 0 3 index put 3 index exec",
- " } exch cshow",
- " pop pop",
- " } def",
- "}{",
- " /cshow2 {",
- " currentfont /FontType get 0 eq {",
- " 0 2 2 index length 1 sub {",
- " 2 copy get exch 1 add 2 index exch get",
- " 2 copy exch 256 mul add",
- " 2 string dup 0 6 5 roll put dup 1 5 4 roll put",
- " 3 index exec",
- " } for",
- " } {",
- " dup {",
- " 1 string dup 0 3 index put 3 index exec",
- " } forall",
- " } ifelse",
- " pop pop",
- " } def",
- "} ifelse",
- "/awcp {", // awidthcharpath
- " exch {",
- " false charpath",
- " 5 index 5 index rmoveto",
- " 6 index eq { 7 index 7 index rmoveto } if",
- " } exch cshow2",
- " 6 {pop} repeat",
- "} def",
- "/Tj {",
- " fCol", // because stringwidth has to draw Type 3 chars
- " 1 index stringwidth pdfTextMat idtransform pop",
- " sub 1 index length dup 0 ne { div } { pop pop 0 } ifelse",
- " pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32",
- " 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0",
- " pdfTextMat dtransform",
- " 6 5 roll Tj1",
- "} def",
- "/Tj16 {",
- " fCol", // because stringwidth has to draw Type 3 chars
- " 2 index stringwidth pdfTextMat idtransform pop",
- " sub exch div",
- " pdfWordSpacing pdfHorizScaling mul 0 pdfTextMat dtransform 32",
- " 4 3 roll pdfCharSpacing pdfHorizScaling mul add 0",
- " pdfTextMat dtransform",
- " 6 5 roll Tj1",
- "} def",
- "/Tj16V {",
- " fCol", // because stringwidth has to draw Type 3 chars
- " 2 index stringwidth pdfTextMat idtransform exch pop",
- " sub exch div",
- " 0 pdfWordSpacing pdfTextMat dtransform 32",
- " 4 3 roll pdfCharSpacing add 0 exch",
- " pdfTextMat dtransform",
- " 6 5 roll Tj1",
- "} def",
- "/Tj1 {",
- " 0 pdfTextRise pdfTextMat dtransform rmoveto",
- " currentpoint 8 2 roll",
- " pdfTextRender 1 and 0 eq {",
- " 6 copy awidthshow",
- " } if",
- " pdfTextRender 3 and dup 1 eq exch 2 eq or {",
- " 7 index 7 index moveto",
- " 6 copy",
- " currentfont /FontType get 3 eq { fCol } { sCol } ifelse",
- " false awcp currentpoint stroke moveto",
- " } if",
- " pdfTextRender 4 and 0 ne {",
- " 8 6 roll moveto",
- " false awcp",
- " /pdfTextClipPath [ pdfTextClipPath aload pop",
- " {/moveto cvx}",
- " {/lineto cvx}",
- " {/curveto cvx}",
- " {/closepath cvx}",
- " pathforall ] def",
- " currentpoint newpath moveto",
- " } {",
- " 8 {pop} repeat",
- " } ifelse",
- " 0 pdfTextRise neg pdfTextMat dtransform rmoveto",
- "} def",
- "/TJm { pdfFontSize 0.001 mul mul neg 0",
- " pdfTextMat dtransform rmoveto } def",
- "/TJmV { pdfFontSize 0.001 mul mul neg 0 exch",
- " pdfTextMat dtransform rmoveto } def",
- "/Tclip { pdfTextClipPath cvx exec clip newpath",
- " /pdfTextClipPath [] def } def",
- "~1",
- "% Level 1 image operators",
- "/pdfIm1 {",
- " /pdfImBuf1 4 index string def",
- " { currentfile pdfImBuf1 readhexstring pop } image",
- "} def",
- "/pdfIm1Sep {",
- " /pdfImBuf1 4 index string def",
- " /pdfImBuf2 4 index string def",
- " /pdfImBuf3 4 index string def",
- " /pdfImBuf4 4 index string def",
- " { currentfile pdfImBuf1 readhexstring pop }",
- " { currentfile pdfImBuf2 readhexstring pop }",
- " { currentfile pdfImBuf3 readhexstring pop }",
- " { currentfile pdfImBuf4 readhexstring pop }",
- " true 4 colorimage",
- "} def",
- "/pdfImM1 {",
- " /pdfImBuf1 4 index 7 add 8 idiv string def",
- " { currentfile pdfImBuf1 readhexstring pop } imagemask",
- "} def",
- "/pdfImM1a {",
- " { 2 copy get exch 1 add exch } imagemask",
- " pop pop",
- "} def",
- "~2",
- "% Level 2 image operators",
- "/pdfImBuf 100 string def",
- "/pdfIm {",
- " image",
- " { currentfile pdfImBuf readline",
- " not { pop exit } if",
- " (%-EOD-) eq { exit } if } loop",
- "} def",
- "/pdfImSep {",
- " findcmykcustomcolor exch",
- " dup /Width get /pdfImBuf1 exch string def",
- " dup /Decode get aload pop 1 index sub /pdfImDecodeRange exch def",
- " /pdfImDecodeLow exch def",
- " begin Width Height BitsPerComponent ImageMatrix DataSource end",
- " /pdfImData exch def",
- " { pdfImData pdfImBuf1 readstring pop",
- " 0 1 2 index length 1 sub {",
- " 1 index exch 2 copy get",
- " pdfImDecodeRange mul 255 div pdfImDecodeLow add round cvi",
- " 255 exch sub put",
- " } for }",
- " 6 5 roll customcolorimage",
- " { currentfile pdfImBuf readline",
- " not { pop exit } if",
- " (%-EOD-) eq { exit } if } loop",
- "} def",
- "/pdfImM {",
- " fCol imagemask",
- " { currentfile pdfImBuf readline",
- " not { pop exit } if",
- " (%-EOD-) eq { exit } if } loop",
- "} def",
- "~a",
- "end",
- NULL
-};
-
-static char *cmapProlog[] = {
- "/CIDInit /ProcSet findresource begin",
- "10 dict begin",
- " begincmap",
- " /CMapType 1 def",
- " /CMapName /Identity-H def",
- " /CIDSystemInfo 3 dict dup begin",
- " /Registry (Adobe) def",
- " /Ordering (Identity) def",
- " /Supplement 0 def",
- " end def",
- " 1 begincodespacerange",
- " <0000> <ffff>",
- " endcodespacerange",
- " 0 usefont",
- " 1 begincidrange",
- " <0000> <ffff> 0",
- " endcidrange",
- " endcmap",
- " currentdict CMapName exch /CMap defineresource pop",
- "end",
- "10 dict begin",
- " begincmap",
- " /CMapType 1 def",
- " /CMapName /Identity-V def",
- " /CIDSystemInfo 3 dict dup begin",
- " /Registry (Adobe) def",
- " /Ordering (Identity) def",
- " /Supplement 0 def",
- " end def",
- " /WMode 1 def",
- " 1 begincodespacerange",
- " <0000> <ffff>",
- " endcodespacerange",
- " 0 usefont",
- " 1 begincidrange",
- " <0000> <ffff> 0",
- " endcidrange",
- " endcmap",
- " currentdict CMapName exch /CMap defineresource pop",
- "end",
- "end",
- NULL
-};
-
-//------------------------------------------------------------------------
-// Fonts
-//------------------------------------------------------------------------
-
-struct PSSubstFont {
- char *psName; // PostScript name
- double mWidth; // width of 'm' character
-};
-
-static char *psFonts[] = {
- "Courier",
- "Courier-Bold",
- "Courier-Oblique",
- "Courier-BoldOblique",
- "Helvetica",
- "Helvetica-Bold",
- "Helvetica-Oblique",
- "Helvetica-BoldOblique",
- "Symbol",
- "Times-Roman",
- "Times-Bold",
- "Times-Italic",
- "Times-BoldItalic",
- "ZapfDingbats",
- NULL
-};
-
-static PSSubstFont psSubstFonts[] = {
- {"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}
-};
-
-// Encoding info for substitute 16-bit font
-struct PSFont16Enc {
- Ref fontID;
- GString *enc;
-};
-
-//------------------------------------------------------------------------
-// process colors
-//------------------------------------------------------------------------
-
-#define psProcessCyan 1
-#define psProcessMagenta 2
-#define psProcessYellow 4
-#define psProcessBlack 8
-#define psProcessCMYK 15
-
-//------------------------------------------------------------------------
-// PSOutCustomColor
-//------------------------------------------------------------------------
-
-class PSOutCustomColor {
-public:
-
- PSOutCustomColor(double cA, double mA,
- double yA, double kA, GString *nameA);
- ~PSOutCustomColor();
-
- double c, m, y, k;
- GString *name;
- PSOutCustomColor *next;
-};
-
-PSOutCustomColor::PSOutCustomColor(double cA, double mA,
- double yA, double kA, GString *nameA) {
- c = cA;
- m = mA;
- y = yA;
- k = kA;
- name = nameA;
- next = NULL;
-}
-
-PSOutCustomColor::~PSOutCustomColor() {
- delete name;
-}
-
-//------------------------------------------------------------------------
-// DeviceNRecoder
-//------------------------------------------------------------------------
-
-class DeviceNRecoder: public FilterStream {
-public:
-
- DeviceNRecoder(Stream *strA, int widthA, int heightA,
- GfxImageColorMap *colorMapA);
- virtual ~DeviceNRecoder();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual int getChar()
- { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx++]; }
- virtual int lookChar()
- { return (bufIdx >= bufSize && !fillBuf()) ? EOF : buf[bufIdx]; }
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue) { return gTrue; }
- virtual GBool isEncoder() { return gTrue; }
-
-private:
-
- GBool fillBuf();
-
- int width, height;
- GfxImageColorMap *colorMap;
- Function *func;
- ImageStream *imgStr;
- int buf[gfxColorMaxComps];
- int pixelIdx;
- int bufIdx;
- int bufSize;
-};
-
-DeviceNRecoder::DeviceNRecoder(Stream *strA, int widthA, int heightA,
- GfxImageColorMap *colorMapA):
- FilterStream(strA) {
- width = widthA;
- height = heightA;
- colorMap = colorMapA;
- imgStr = NULL;
- pixelIdx = 0;
- bufIdx = gfxColorMaxComps;
- bufSize = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
- getAlt()->getNComps();
- func = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
- getTintTransformFunc();
-}
-
-DeviceNRecoder::~DeviceNRecoder() {
- if (imgStr) {
- delete imgStr;
- }
-}
-
-void DeviceNRecoder::reset() {
- imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
- colorMap->getBits());
- imgStr->reset();
-}
-
-GBool DeviceNRecoder::fillBuf() {
- Guchar pixBuf[gfxColorMaxComps];
- GfxColor color;
- double y[gfxColorMaxComps];
- int i;
-
- if (pixelIdx >= width * height) {
- return gFalse;
- }
- imgStr->getPixel(pixBuf);
- colorMap->getColor(pixBuf, &color);
- func->transform(color.c, y);
- for (i = 0; i < bufSize; ++i) {
- buf[i] = (int)(y[i] * 255 + 0.5);
- }
- bufIdx = 0;
- ++pixelIdx;
- return gTrue;
-}
-
-//------------------------------------------------------------------------
-// PSOutputDev
-//------------------------------------------------------------------------
-
-extern "C" {
-typedef void (*SignalFunc)(int);
-}
-
-static void outputToFile(void *stream, char *data, int len) {
- fwrite(data, 1, len, (FILE *)stream);
-}
-
-PSOutputDev::PSOutputDev(char *fileName, XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
- GBool manualCtrlA) {
- FILE *f;
- PSFileType fileTypeA;
-
- underlayCbk = NULL;
- underlayCbkData = NULL;
- overlayCbk = NULL;
- overlayCbkData = NULL;
-
- fontIDs = NULL;
- fontFileIDs = NULL;
- fontFileNames = NULL;
- font16Enc = NULL;
- xobjStack = NULL;
- embFontList = NULL;
- customColors = NULL;
- haveTextClip = gFalse;
- t3String = NULL;
-
- // open file or pipe
- if (!strcmp(fileName, "-")) {
- fileTypeA = psStdout;
- f = stdout;
- } else if (fileName[0] == '|') {
- fileTypeA = psPipe;
-#ifdef HAVE_POPEN
-#ifndef WIN32
- signal(SIGPIPE, (SignalFunc)SIG_IGN);
-#endif
- if (!(f = popen(fileName + 1, "w"))) {
- error(-1, "Couldn't run print command '%s'", fileName);
- ok = gFalse;
- return;
- }
-#else
- error(-1, "Print commands are not supported ('%s')", fileName);
- ok = gFalse;
- return;
-#endif
- } else {
- fileTypeA = psFile;
- if (!(f = fopen(fileName, "w"))) {
- error(-1, "Couldn't open PostScript file '%s'", fileName);
- ok = gFalse;
- return;
- }
- }
-
- init(outputToFile, f, fileTypeA,
- xrefA, catalog, firstPage, lastPage, modeA,
- imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA);
-}
-
-PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
- XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
- GBool manualCtrlA) {
- underlayCbk = NULL;
- underlayCbkData = NULL;
- overlayCbk = NULL;
- overlayCbkData = NULL;
-
- fontIDs = NULL;
- fontFileIDs = NULL;
- fontFileNames = NULL;
- font16Enc = NULL;
- xobjStack = NULL;
- embFontList = NULL;
- customColors = NULL;
- haveTextClip = gFalse;
- t3String = NULL;
-
- init(outputFuncA, outputStreamA, psGeneric,
- xrefA, catalog, firstPage, lastPage, modeA,
- imgLLXA, imgLLYA, imgURXA, imgURYA, manualCtrlA);
-}
-
-void PSOutputDev::init(PSOutputFunc outputFuncA, void *outputStreamA,
- PSFileType fileTypeA, XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
- GBool manualCtrlA) {
- Page *page;
- PDFRectangle *box;
-
- // initialize
- ok = gTrue;
- outputFunc = outputFuncA;
- outputStream = outputStreamA;
- fileType = fileTypeA;
- xref = xrefA;
- level = globalParams->getPSLevel();
- mode = modeA;
- paperWidth = globalParams->getPSPaperWidth();
- paperHeight = globalParams->getPSPaperHeight();
- imgLLX = imgLLXA;
- imgLLY = imgLLYA;
- imgURX = imgURXA;
- imgURY = imgURYA;
- if (imgLLX == 0 && imgURX == 0 && imgLLY == 0 && imgURY == 0) {
- globalParams->getPSImageableArea(&imgLLX, &imgLLY, &imgURX, &imgURY);
- }
- if (paperWidth < 0 || paperHeight < 0) {
- // this check is needed in case the document has zero pages
- if (firstPage > 0 && firstPage <= catalog->getNumPages()) {
- page = catalog->getPage(firstPage);
- paperWidth = (int)(page->getWidth() + 0.5);
- paperHeight = (int)(page->getHeight() + 0.5);
- } else {
- paperWidth = 1;
- paperHeight = 1;
- }
- imgLLX = imgLLY = 0;
- imgURX = paperWidth;
- imgURY = paperHeight;
- }
- manualCtrl = manualCtrlA;
- if (mode == psModeForm) {
- lastPage = firstPage;
- }
- processColors = 0;
- inType3Char = gFalse;
-
-#if OPI_SUPPORT
- // initialize OPI nesting levels
- opi13Nest = 0;
- opi20Nest = 0;
-#endif
-
- tx0 = ty0 = 0;
- xScale0 = yScale0 = 1;
- rotate0 = 0;
- clipLLX0 = clipLLY0 = 0;
- clipURX0 = clipURY0 = -1;
-
- // initialize fontIDs, fontFileIDs, and fontFileNames lists
- fontIDSize = 64;
- fontIDLen = 0;
- fontIDs = (Ref *)gmalloc(fontIDSize * sizeof(Ref));
- fontFileIDSize = 64;
- fontFileIDLen = 0;
- fontFileIDs = (Ref *)gmalloc(fontFileIDSize * sizeof(Ref));
- fontFileNameSize = 64;
- fontFileNameLen = 0;
- fontFileNames = (GString **)gmalloc(fontFileNameSize * sizeof(GString *));
- nextTrueTypeNum = 0;
- font16EncLen = 0;
- font16EncSize = 0;
-
- xobjStack = new GList();
- numSaves = 0;
-
- // initialize embedded font resource comment list
- embFontList = new GString();
-
- if (!manualCtrl) {
- // this check is needed in case the document has zero pages
- if (firstPage > 0 && firstPage <= catalog->getNumPages()) {
- writeHeader(firstPage, lastPage,
- catalog->getPage(firstPage)->getBox(),
- catalog->getPage(firstPage)->getCropBox());
- } else {
- box = new PDFRectangle(0, 0, 1, 1);
- writeHeader(firstPage, lastPage, box, box);
- delete box;
- }
- if (mode != psModeForm) {
- writePS("%%BeginProlog\n");
- }
- writeXpdfProcset();
- if (mode != psModeForm) {
- writePS("%%EndProlog\n");
- writePS("%%BeginSetup\n");
- }
- writeDocSetup(catalog, firstPage, lastPage);
- if (mode != psModeForm) {
- writePS("%%EndSetup\n");
- }
- }
-
- // initialize sequential page number
- seqPage = 1;
-}
-
-PSOutputDev::~PSOutputDev() {
- PSOutCustomColor *cc;
- int i;
-
- if (ok) {
- if (!manualCtrl) {
- writePS("%%Trailer\n");
- writeTrailer();
- if (mode != psModeForm) {
- writePS("%%EOF\n");
- }
- }
- if (fileType == psFile) {
-#ifdef MACOS
- ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle);
-#endif
- fclose((FILE *)outputStream);
- }
-#ifdef HAVE_POPEN
- else if (fileType == psPipe) {
- pclose((FILE *)outputStream);
-#ifndef WIN32
- signal(SIGPIPE, (SignalFunc)SIG_DFL);
-#endif
- }
-#endif
- }
- if (embFontList) {
- delete embFontList;
- }
- if (fontIDs) {
- gfree(fontIDs);
- }
- if (fontFileIDs) {
- gfree(fontFileIDs);
- }
- if (fontFileNames) {
- for (i = 0; i < fontFileNameLen; ++i) {
- delete fontFileNames[i];
- }
- gfree(fontFileNames);
- }
- if (font16Enc) {
- for (i = 0; i < font16EncLen; ++i) {
- delete font16Enc[i].enc;
- }
- gfree(font16Enc);
- }
- if (xobjStack) {
- delete xobjStack;
- }
- while (customColors) {
- cc = customColors;
- customColors = cc->next;
- delete cc;
- }
-}
-
-void PSOutputDev::writeHeader(int firstPage, int lastPage,
- PDFRectangle *mediaBox, PDFRectangle *cropBox) {
- switch (mode) {
- case psModePS:
- writePS("%!PS-Adobe-3.0\n");
- writePSFmt("%%%%Creator: xpdf/pdftops %s\n", xpdfVersion);
- writePSFmt("%%%%LanguageLevel: %d\n",
- (level == psLevel1 || level == psLevel1Sep) ? 1 :
- (level == psLevel2 || level == psLevel2Sep) ? 2 : 3);
- if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) {
- writePS("%%DocumentProcessColors: (atend)\n");
- writePS("%%DocumentCustomColors: (atend)\n");
- }
- writePS("%%DocumentSuppliedResources: (atend)\n");
- writePSFmt("%%%%DocumentMedia: plain %d %d 0 () ()\n",
- paperWidth, paperHeight);
- writePSFmt("%%%%BoundingBox: 0 0 %d %d\n", paperWidth, paperHeight);
- writePSFmt("%%%%Pages: %d\n", lastPage - firstPage + 1);
- writePS("%%EndComments\n");
- writePS("%%BeginDefaults\n");
- writePS("%%PageMedia: plain\n");
- writePS("%%EndDefaults\n");
- break;
- case psModeEPS:
- writePS("%!PS-Adobe-3.0 EPSF-3.0\n");
- writePSFmt("%%%%Creator: xpdf/pdftops %s\n", xpdfVersion);
- writePSFmt("%%%%LanguageLevel: %d\n",
- (level == psLevel1 || level == psLevel1Sep) ? 1 :
- (level == psLevel2 || level == psLevel2Sep) ? 2 : 3);
- if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) {
- writePS("%%DocumentProcessColors: (atend)\n");
- writePS("%%DocumentCustomColors: (atend)\n");
- }
- writePSFmt("%%%%BoundingBox: %d %d %d %d\n",
- (int)floor(cropBox->x1), (int)floor(cropBox->y1),
- (int)ceil(cropBox->x2), (int)ceil(cropBox->y2));
- if (floor(cropBox->x1) != ceil(cropBox->x1) ||
- floor(cropBox->y1) != ceil(cropBox->y1) ||
- floor(cropBox->x2) != ceil(cropBox->x2) ||
- floor(cropBox->y2) != ceil(cropBox->y2)) {
- writePSFmt("%%%%HiResBoundingBox: %g %g %g %g\n",
- cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
- }
- writePS("%%DocumentSuppliedResources: (atend)\n");
- writePS("%%EndComments\n");
- break;
- case psModeForm:
- writePS("%!PS-Adobe-3.0 Resource-Form\n");
- writePSFmt("%%%%Creator: xpdf/pdftops %s\n", xpdfVersion);
- writePSFmt("%%%%LanguageLevel: %d\n",
- (level == psLevel1 || level == psLevel1Sep) ? 1 :
- (level == psLevel2 || level == psLevel2Sep) ? 2 : 3);
- if (level == psLevel1Sep || level == psLevel2Sep || level == psLevel3Sep) {
- writePS("%%DocumentProcessColors: (atend)\n");
- writePS("%%DocumentCustomColors: (atend)\n");
- }
- writePS("%%DocumentSuppliedResources: (atend)\n");
- writePS("%%EndComments\n");
- writePS("32 dict dup begin\n");
- writePSFmt("/BBox [%d %d %d %d] def\n",
- (int)floor(mediaBox->x1), (int)floor(mediaBox->y1),
- (int)ceil(mediaBox->x2), (int)ceil(mediaBox->y2));
- writePS("/FormType 1 def\n");
- writePS("/Matrix [1 0 0 1 0 0] def\n");
- break;
- }
-}
-
-void PSOutputDev::writeXpdfProcset() {
- char prologLevel;
- char **p;
-
- writePSFmt("%%%%BeginResource: procset xpdf %s 0\n", xpdfVersion);
- prologLevel = 'a';
- for (p = prolog; *p; ++p) {
- if ((*p)[0] == '~' && (*p)[1] == '1') {
- prologLevel = '1';
- } else if ((*p)[0] == '~' && (*p)[1] == '2') {
- prologLevel = '2';
- } else if ((*p)[0] == '~' && (*p)[1] == 'a') {
- prologLevel = 'a';
- } else if (prologLevel == 'a' ||
- (prologLevel == '1' && level < psLevel2) ||
- (prologLevel == '2' && level >= psLevel2)) {
- writePSFmt("%s\n", *p);
- }
- }
- writePS("%%EndResource\n");
-
- if (level >= psLevel3) {
- for (p = cmapProlog; *p; ++p) {
- writePSFmt("%s\n", *p);
- }
- }
-}
-
-void PSOutputDev::writeDocSetup(Catalog *catalog,
- int firstPage, int lastPage) {
- Page *page;
- Dict *resDict;
- Annots *annots;
- Object obj1, obj2;
- int pg, i;
-
- if (mode == psModeForm) {
- // swap the form and xpdf dicts
- writePS("xpdf end begin dup begin\n");
- } else {
- writePS("xpdf begin\n");
- }
- for (pg = firstPage; pg <= lastPage; ++pg) {
- page = catalog->getPage(pg);
- if ((resDict = page->getResourceDict())) {
- setupResources(resDict);
- }
- annots = new Annots(xref, 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()) {
- setupResources(obj2.getDict());
- }
- obj2.free();
- }
- obj1.free();
- }
- delete annots;
- }
- if (mode != psModeForm) {
- if (mode != psModeEPS && !manualCtrl) {
- writePSFmt("%d %d %s pdfSetup\n",
- paperWidth, paperHeight,
- globalParams->getPSDuplex() ? "true" : "false");
- }
-#if OPI_SUPPORT
- if (globalParams->getPSOPI()) {
- writePS("/opiMatrix matrix currentmatrix def\n");
- }
-#endif
- }
-}
-
-void PSOutputDev::writePageTrailer() {
- if (mode != psModeForm) {
- writePS("pdfEndPage\n");
- }
-}
-
-void PSOutputDev::writeTrailer() {
- PSOutCustomColor *cc;
-
- if (mode == psModeForm) {
- writePS("/Foo exch /Form defineresource pop\n");
- } else {
- writePS("end\n");
- writePS("%%DocumentSuppliedResources:\n");
- writePS(embFontList->getCString());
- if (level == psLevel1Sep || level == psLevel2Sep ||
- level == psLevel3Sep) {
- writePS("%%DocumentProcessColors:");
- if (processColors & psProcessCyan) {
- writePS(" Cyan");
- }
- if (processColors & psProcessMagenta) {
- writePS(" Magenta");
- }
- if (processColors & psProcessYellow) {
- writePS(" Yellow");
- }
- if (processColors & psProcessBlack) {
- writePS(" Black");
- }
- writePS("\n");
- writePS("%%DocumentCustomColors:");
- for (cc = customColors; cc; cc = cc->next) {
- writePSFmt(" (%s)", cc->name->getCString());
- }
- writePS("\n");
- writePS("%%CMYKCustomColor:\n");
- for (cc = customColors; cc; cc = cc->next) {
- writePSFmt("%%%%+ %g %g %g %g (%s)\n",
- cc->c, cc->m, cc->y, cc->k, cc->name->getCString());
- }
- }
- }
-}
-
-void PSOutputDev::setupResources(Dict *resDict) {
- Object xObjDict, xObjRef, xObj, resObj;
- Ref ref0, ref1;
- GBool skip;
- int i, j;
-
- setupFonts(resDict);
- setupImages(resDict);
-
- resDict->lookup("XObject", &xObjDict);
- if (xObjDict.isDict()) {
- for (i = 0; i < xObjDict.dictGetLength(); ++i) {
-
- // avoid infinite recursion on XObjects
- skip = gFalse;
- if ((xObjDict.dictGetValNF(i, &xObjRef)->isRef())) {
- ref0 = xObjRef.getRef();
- for (j = 0; j < xobjStack->getLength(); ++j) {
- ref1 = *(Ref *)xobjStack->get(j);
- if (ref1.num == ref0.num && ref1.gen == ref0.gen) {
- skip = gTrue;
- break;
- }
- }
- if (!skip) {
- xobjStack->append(&ref0);
- }
- }
- if (!skip) {
-
- // process the XObject's resource dictionary
- xObjDict.dictGetVal(i, &xObj);
- if (xObj.isStream()) {
- xObj.streamGetDict()->lookup("Resources", &resObj);
- if (resObj.isDict()) {
- setupResources(resObj.getDict());
- }
- resObj.free();
- }
- xObj.free();
- }
-
- if (xObjRef.isRef() && !skip) {
- xobjStack->del(xobjStack->getLength() - 1);
- }
- xObjRef.free();
- }
- }
- xObjDict.free();
-}
-
-void PSOutputDev::setupFonts(Dict *resDict) {
- Object obj1, obj2;
- Ref r;
- GfxFontDict *gfxFontDict;
- GfxFont *font;
- int i;
-
- gfxFontDict = NULL;
- resDict->lookupNF("Font", &obj1);
- if (obj1.isRef()) {
- obj1.fetch(xref, &obj2);
- if (obj2.isDict()) {
- r = obj1.getRef();
- gfxFontDict = new GfxFontDict(xref, &r, obj2.getDict());
- }
- obj2.free();
- } else if (obj1.isDict()) {
- gfxFontDict = new GfxFontDict(xref, NULL, obj1.getDict());
- }
- if (gfxFontDict) {
- for (i = 0; i < gfxFontDict->getNumFonts(); ++i) {
- if ((font = gfxFontDict->getFont(i))) {
- setupFont(font, resDict);
- }
- }
- delete gfxFontDict;
- }
- obj1.free();
-}
-
-void PSOutputDev::setupFont(GfxFont *font, Dict *parentResDict) {
- Ref fontFileID;
- GString *name;
- PSFontParam *fontParam;
- GString *psName;
- char type3Name[64], buf[16];
- GBool subst;
- UnicodeMap *uMap;
- char *charName;
- double xs, ys;
- int code;
- double w1, w2;
- double *fm;
- int i, j;
-
- // check if font is already set up
- for (i = 0; i < fontIDLen; ++i) {
- if (fontIDs[i].num == font->getID()->num &&
- fontIDs[i].gen == font->getID()->gen) {
- return;
- }
- }
-
- // add entry to fontIDs list
- if (fontIDLen >= fontIDSize) {
- fontIDSize += 64;
- fontIDs = (Ref *)grealloc(fontIDs, fontIDSize * sizeof(Ref));
- }
- fontIDs[fontIDLen++] = *font->getID();
-
- xs = ys = 1;
- subst = gFalse;
-
- // check for resident 8-bit font
- if (font->getName() &&
- (fontParam = globalParams->getPSFont(font->getName()))) {
- psName = new GString(fontParam->psFontName->getCString());
-
- // check for embedded Type 1 font
- } else if (globalParams->getPSEmbedType1() &&
- font->getType() == fontType1 &&
- font->getEmbeddedFontID(&fontFileID)) {
- psName = filterPSName(font->getEmbeddedFontName());
- setupEmbeddedType1Font(&fontFileID, psName);
-
- // check for embedded Type 1C font
- } else if (globalParams->getPSEmbedType1() &&
- font->getType() == fontType1C &&
- font->getEmbeddedFontID(&fontFileID)) {
- psName = filterPSName(font->getEmbeddedFontName());
- setupEmbeddedType1CFont(font, &fontFileID, psName);
-
- // check for external Type 1 font file
- } else if (globalParams->getPSEmbedType1() &&
- font->getType() == fontType1 &&
- font->getExtFontFile()) {
- // this assumes that the PS font name matches the PDF font name
- psName = font->getName()->copy();
- setupExternalType1Font(font->getExtFontFile(), psName);
-
- // check for embedded TrueType font
- } else if (globalParams->getPSEmbedTrueType() &&
- font->getType() == fontTrueType &&
- font->getEmbeddedFontID(&fontFileID)) {
- psName = filterPSName(font->getEmbeddedFontName());
- setupEmbeddedTrueTypeFont(font, &fontFileID, psName);
-
- // check for external TrueType font file
- } else if (globalParams->getPSEmbedTrueType() &&
- font->getType() == fontTrueType &&
- font->getExtFontFile()) {
- psName = filterPSName(font->getName());
- setupExternalTrueTypeFont(font, psName);
-
- // check for embedded CID PostScript font
- } else if (globalParams->getPSEmbedCIDPostScript() &&
- font->getType() == fontCIDType0C &&
- font->getEmbeddedFontID(&fontFileID)) {
- psName = filterPSName(font->getEmbeddedFontName());
- setupEmbeddedCIDType0Font(font, &fontFileID, psName);
-
- // check for embedded CID TrueType font
- } else if (globalParams->getPSEmbedCIDTrueType() &&
- font->getType() == fontCIDType2 &&
- font->getEmbeddedFontID(&fontFileID)) {
- psName = filterPSName(font->getEmbeddedFontName());
- setupEmbeddedCIDTrueTypeFont(font, &fontFileID, psName);
-
- } else if (font->getType() == fontType3) {
- sprintf(type3Name, "T3_%d_%d",
- font->getID()->num, font->getID()->gen);
- psName = new GString(type3Name);
- setupType3Font(font, psName, parentResDict);
-
- // do 8-bit font substitution
- } else if (!font->isCIDFont()) {
- subst = gTrue;
- name = font->getName();
- psName = NULL;
- if (name) {
- for (i = 0; psFonts[i]; ++i) {
- if (name->cmp(psFonts[i]) == 0) {
- psName = new GString(psFonts[i]);
- break;
- }
- }
- }
- if (!psName) {
- if (font->isFixedWidth()) {
- i = 8;
- } else if (font->isSerif()) {
- i = 4;
- } else {
- i = 0;
- }
- if (font->isBold()) {
- i += 2;
- }
- if (font->isItalic()) {
- i += 1;
- }
- psName = new GString(psSubstFonts[i].psName);
- for (code = 0; code < 256; ++code) {
- if ((charName = ((Gfx8BitFont *)font)->getCharName(code)) &&
- charName[0] == 'm' && charName[1] == '\0') {
- break;
- }
- }
- if (code < 256) {
- w1 = ((Gfx8BitFont *)font)->getWidth(code);
- } else {
- w1 = 0;
- }
- w2 = psSubstFonts[i].mWidth;
- xs = w1 / w2;
- if (xs < 0.1) {
- xs = 1;
- }
- if (font->getType() == fontType3) {
- // This is a hack which makes it possible to substitute for 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.
- ys = xs;
- fm = font->getFontMatrix();
- if (fm[0] != 0) {
- ys *= fm[3] / fm[0];
- }
- } else {
- ys = 1;
- }
- }
-
- // do 16-bit font substitution
- } else if ((fontParam = globalParams->
- getPSFont16(font->getName(),
- ((GfxCIDFont *)font)->getCollection(),
- font->getWMode()))) {
- subst = gTrue;
- psName = fontParam->psFontName->copy();
- if (font16EncLen >= font16EncSize) {
- font16EncSize += 16;
- font16Enc = (PSFont16Enc *)grealloc(font16Enc,
- font16EncSize * sizeof(PSFont16Enc));
- }
- font16Enc[font16EncLen].fontID = *font->getID();
- font16Enc[font16EncLen].enc = fontParam->encoding->copy();
- if ((uMap = globalParams->getUnicodeMap(font16Enc[font16EncLen].enc))) {
- uMap->decRefCnt();
- ++font16EncLen;
- } else {
- error(-1, "Couldn't find Unicode map for 16-bit font encoding '%s'",
- font16Enc[font16EncLen].enc->getCString());
- }
-
- // give up - can't do anything with this font
- } else {
- error(-1, "Couldn't find a font to substitute for '%s' ('%s' character collection)",
- font->getName() ? font->getName()->getCString() : "(unnamed)",
- ((GfxCIDFont *)font)->getCollection()
- ? ((GfxCIDFont *)font)->getCollection()->getCString()
- : "(unknown)");
- return;
- }
-
- // generate PostScript code to set up the font
- if (font->isCIDFont()) {
- if (level == psLevel3 || level == psLevel3Sep) {
- writePSFmt("/F%d_%d /%s %d pdfMakeFont16L3\n",
- font->getID()->num, font->getID()->gen, psName->getCString(),
- font->getWMode());
- } else {
- writePSFmt("/F%d_%d /%s %d pdfMakeFont16\n",
- font->getID()->num, font->getID()->gen, psName->getCString(),
- font->getWMode());
- }
- } else {
- writePSFmt("/F%d_%d /%s %g %g\n",
- font->getID()->num, font->getID()->gen, psName->getCString(),
- xs, ys);
- for (i = 0; i < 256; i += 8) {
- writePSFmt((i == 0) ? "[ " : " ");
- for (j = 0; j < 8; ++j) {
- if (font->getType() == fontTrueType &&
- !subst &&
- !((Gfx8BitFont *)font)->getHasEncoding()) {
- sprintf(buf, "c%02x", i+j);
- charName = buf;
- } else {
- charName = ((Gfx8BitFont *)font)->getCharName(i+j);
- // this is a kludge for broken PDF files that encode char 32
- // as .notdef
- if (i+j == 32 && charName && !strcmp(charName, ".notdef")) {
- charName = "space";
- }
- }
- writePS("/");
- writePSName(charName ? charName : (char *)".notdef");
- }
- writePS((i == 256-8) ? (char *)"]\n" : (char *)"\n");
- }
- writePS("pdfMakeFont\n");
- }
-
- delete psName;
-}
-
-void PSOutputDev::setupEmbeddedType1Font(Ref *id, GString *psName) {
- static char hexChar[17] = "0123456789abcdef";
- Object refObj, strObj, obj1, obj2, obj3;
- Dict *dict;
- int length1, length2, length3;
- int c;
- int start[4];
- GBool binMode;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileIDLen; ++i) {
- if (fontFileIDs[i].num == id->num &&
- fontFileIDs[i].gen == id->gen)
- return;
- }
-
- // add entry to fontFileIDs list
- if (fontFileIDLen >= fontFileIDSize) {
- fontFileIDSize += 64;
- fontFileIDs = (Ref *)grealloc(fontFileIDs, fontFileIDSize * sizeof(Ref));
- }
- fontFileIDs[fontFileIDLen++] = *id;
-
- // get the font stream and info
- refObj.initRef(id->num, id->gen);
- refObj.fetch(xref, &strObj);
- refObj.free();
- if (!strObj.isStream()) {
- error(-1, "Embedded font file object is not a stream");
- goto err1;
- }
- if (!(dict = strObj.streamGetDict())) {
- error(-1, "Embedded font stream is missing its dictionary");
- goto err1;
- }
- dict->lookup("Length1", &obj1);
- dict->lookup("Length2", &obj2);
- dict->lookup("Length3", &obj3);
- if (!obj1.isInt() || !obj2.isInt() || !obj3.isInt()) {
- error(-1, "Missing length fields in embedded font stream dictionary");
- obj1.free();
- obj2.free();
- obj3.free();
- goto err1;
- }
- length1 = obj1.getInt();
- length2 = obj2.getInt();
- length3 = obj3.getInt();
- obj1.free();
- obj2.free();
- obj3.free();
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // copy ASCII portion of font
- strObj.streamReset();
- for (i = 0; i < length1 && (c = strObj.streamGetChar()) != EOF; ++i) {
- writePSChar(c);
- }
-
- // figure out if encrypted portion is binary or ASCII
- binMode = gFalse;
- for (i = 0; i < 4; ++i) {
- start[i] = strObj.streamGetChar();
- if (start[i] == EOF) {
- error(-1, "Unexpected end of file in embedded font stream");
- goto err1;
- }
- if (!((start[i] >= '0' && start[i] <= '9') ||
- (start[i] >= 'A' && start[i] <= 'F') ||
- (start[i] >= 'a' && start[i] <= 'f')))
- binMode = gTrue;
- }
-
- // convert binary data to ASCII
- if (binMode) {
- for (i = 0; i < 4; ++i) {
- writePSChar(hexChar[(start[i] >> 4) & 0x0f]);
- writePSChar(hexChar[start[i] & 0x0f]);
- }
- // if Length2 is incorrect (too small), font data gets chopped, so
- // we take a few extra characters from the trailer just in case
- length2 += length3 >= 8 ? 8 : length3;
- while (i < length2) {
- if ((c = strObj.streamGetChar()) == EOF) {
- break;
- }
- writePSChar(hexChar[(c >> 4) & 0x0f]);
- writePSChar(hexChar[c & 0x0f]);
- if (++i % 32 == 0) {
- writePSChar('\n');
- }
- }
- if (i % 32 > 0) {
- writePSChar('\n');
- }
-
- // already in ASCII format -- just copy it
- } else {
- for (i = 0; i < 4; ++i) {
- writePSChar(start[i]);
- }
- for (i = 4; i < length2; ++i) {
- if ((c = strObj.streamGetChar()) == EOF) {
- break;
- }
- writePSChar(c);
- }
- }
-
- // write padding and "cleartomark"
- for (i = 0; i < 8; ++i) {
- writePS("00000000000000000000000000000000"
- "00000000000000000000000000000000\n");
- }
- writePS("cleartomark\n");
-
- // ending comment
- writePS("%%EndResource\n");
-
- err1:
- strObj.streamClose();
- strObj.free();
-}
-
-//~ This doesn't handle .pfb files or binary eexec data (which only
-//~ happens in pfb files?).
-void PSOutputDev::setupExternalType1Font(GString *fileName, GString *psName) {
- FILE *fontFile;
- int c;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileNameLen; ++i) {
- if (!fontFileNames[i]->cmp(fileName)) {
- return;
- }
- }
-
- // add entry to fontFileNames list
- if (fontFileNameLen >= fontFileNameSize) {
- fontFileNameSize += 64;
- fontFileNames = (GString **)grealloc(fontFileNames,
- fontFileNameSize * sizeof(GString *));
- }
- fontFileNames[fontFileNameLen++] = fileName->copy();
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // copy the font file
- if (!(fontFile = fopen(fileName->getCString(), "rb"))) {
- error(-1, "Couldn't open external font file");
- return;
- }
- while ((c = fgetc(fontFile)) != EOF) {
- writePSChar(c);
- }
- fclose(fontFile);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupEmbeddedType1CFont(GfxFont *font, Ref *id,
- GString *psName) {
- char *fontBuf;
- int fontLen;
- FoFiType1C *ffT1C;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileIDLen; ++i) {
- if (fontFileIDs[i].num == id->num &&
- fontFileIDs[i].gen == id->gen)
- return;
- }
-
- // add entry to fontFileIDs list
- if (fontFileIDLen >= fontFileIDSize) {
- fontFileIDSize += 64;
- fontFileIDs = (Ref *)grealloc(fontFileIDs, fontFileIDSize * sizeof(Ref));
- }
- fontFileIDs[fontFileIDLen++] = *id;
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // convert it to a Type 1 font
- fontBuf = font->readEmbFontFile(xref, &fontLen);
- if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) {
- ffT1C->convertToType1(NULL, gTrue, outputFunc, outputStream);
- delete ffT1C;
- }
- gfree(fontBuf);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id,
- GString *psName) {
- char unique[32];
- char *fontBuf;
- int fontLen;
- FoFiTrueType *ffTT;
- Gushort *codeToGID;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileIDLen; ++i) {
- if (fontFileIDs[i].num == id->num &&
- fontFileIDs[i].gen == id->gen) {
- sprintf(unique, "_%d", nextTrueTypeNum++);
- psName->append(unique);
- break;
- }
- }
-
- // add entry to fontFileIDs list
- if (i == fontFileIDLen) {
- if (fontFileIDLen >= fontFileIDSize) {
- fontFileIDSize += 64;
- fontFileIDs = (Ref *)grealloc(fontFileIDs, fontFileIDSize * sizeof(Ref));
- }
- fontFileIDs[fontFileIDLen++] = *id;
- }
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // convert it to a Type 42 font
- fontBuf = font->readEmbFontFile(xref, &fontLen);
- if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
- codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT);
- ffTT->convertToType42(psName->getCString(),
- ((Gfx8BitFont *)font)->getHasEncoding()
- ? ((Gfx8BitFont *)font)->getEncoding()
- : (char **)NULL,
- codeToGID, outputFunc, outputStream);
- gfree(codeToGID);
- delete ffTT;
- }
- gfree(fontBuf);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupExternalTrueTypeFont(GfxFont *font, GString *psName) {
- char unique[32];
- GString *fileName;
- char *fontBuf;
- int fontLen;
- FoFiTrueType *ffTT;
- Gushort *codeToGID;
- int i;
-
- // check if font is already embedded
- fileName = font->getExtFontFile();
- for (i = 0; i < fontFileNameLen; ++i) {
- if (!fontFileNames[i]->cmp(fileName)) {
- sprintf(unique, "_%d", nextTrueTypeNum++);
- psName->append(unique);
- break;
- }
- }
-
- // add entry to fontFileNames list
- if (i == fontFileNameLen) {
- if (fontFileNameLen >= fontFileNameSize) {
- fontFileNameSize += 64;
- fontFileNames =
- (GString **)grealloc(fontFileNames,
- fontFileNameSize * sizeof(GString *));
- }
- }
- fontFileNames[fontFileNameLen++] = fileName->copy();
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // convert it to a Type 42 font
- fontBuf = font->readExtFontFile(&fontLen);
- if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
- codeToGID = ((Gfx8BitFont *)font)->getCodeToGIDMap(ffTT);
- ffTT->convertToType42(psName->getCString(),
- ((Gfx8BitFont *)font)->getHasEncoding()
- ? ((Gfx8BitFont *)font)->getEncoding()
- : (char **)NULL,
- codeToGID, outputFunc, outputStream);
- delete ffTT;
- }
- gfree(fontBuf);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupEmbeddedCIDType0Font(GfxFont *font, Ref *id,
- GString *psName) {
- char *fontBuf;
- int fontLen;
- FoFiType1C *ffT1C;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileIDLen; ++i) {
- if (fontFileIDs[i].num == id->num &&
- fontFileIDs[i].gen == id->gen)
- return;
- }
-
- // add entry to fontFileIDs list
- if (fontFileIDLen >= fontFileIDSize) {
- fontFileIDSize += 64;
- fontFileIDs = (Ref *)grealloc(fontFileIDs, fontFileIDSize * sizeof(Ref));
- }
- fontFileIDs[fontFileIDLen++] = *id;
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // convert it to a Type 0 font
- fontBuf = font->readEmbFontFile(xref, &fontLen);
- if ((ffT1C = FoFiType1C::make(fontBuf, fontLen))) {
- if (globalParams->getPSLevel() >= psLevel3) {
- // Level 3: use a CID font
- ffT1C->convertToCIDType0(psName->getCString(), outputFunc, outputStream);
- } else {
- // otherwise: use a non-CID composite font
- ffT1C->convertToType0(psName->getCString(), outputFunc, outputStream);
- }
- delete ffT1C;
- }
- gfree(fontBuf);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id,
- GString *psName) {
- char *fontBuf;
- int fontLen;
- FoFiTrueType *ffTT;
- int i;
-
- // check if font is already embedded
- for (i = 0; i < fontFileIDLen; ++i) {
- if (fontFileIDs[i].num == id->num &&
- fontFileIDs[i].gen == id->gen)
- return;
- }
-
- // add entry to fontFileIDs list
- if (fontFileIDLen >= fontFileIDSize) {
- fontFileIDSize += 64;
- fontFileIDs = (Ref *)grealloc(fontFileIDs, fontFileIDSize * sizeof(Ref));
- }
- fontFileIDs[fontFileIDLen++] = *id;
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // convert it to a Type 0 font
- fontBuf = font->readEmbFontFile(xref, &fontLen);
- if ((ffTT = FoFiTrueType::make(fontBuf, fontLen))) {
- if (globalParams->getPSLevel() >= psLevel3) {
- // Level 3: use a CID font
- ffTT->convertToCIDType2(psName->getCString(),
- ((GfxCIDFont *)font)->getCIDToGID(),
- ((GfxCIDFont *)font)->getCIDToGIDLen(),
- outputFunc, outputStream);
- } else {
- // otherwise: use a non-CID composite font
- ffTT->convertToType0(psName->getCString(),
- ((GfxCIDFont *)font)->getCIDToGID(),
- ((GfxCIDFont *)font)->getCIDToGIDLen(),
- outputFunc, outputStream);
- }
- delete ffTT;
- }
- gfree(fontBuf);
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupType3Font(GfxFont *font, GString *psName,
- Dict *parentResDict) {
- Dict *resDict;
- Dict *charProcs;
- Object charProc;
- Gfx *gfx;
- PDFRectangle box;
- double *m;
- char buf[256];
- int i;
-
- // set up resources used by font
- if ((resDict = ((Gfx8BitFont *)font)->getResources())) {
- inType3Char = gTrue;
- setupResources(resDict);
- inType3Char = gFalse;
- } else {
- resDict = parentResDict;
- }
-
- // beginning comment
- writePSFmt("%%%%BeginResource: font %s\n", psName->getCString());
- embFontList->append("%%+ font ");
- embFontList->append(psName->getCString());
- embFontList->append("\n");
-
- // font dictionary
- writePS("8 dict begin\n");
- writePS("/FontType 3 def\n");
- m = font->getFontMatrix();
- writePSFmt("/FontMatrix [%g %g %g %g %g %g] def\n",
- m[0], m[1], m[2], m[3], m[4], m[5]);
- m = font->getFontBBox();
- writePSFmt("/FontBBox [%g %g %g %g] def\n",
- m[0], m[1], m[2], m[3]);
- writePS("/Encoding 256 array def\n");
- writePS(" 0 1 255 { Encoding exch /.notdef put } for\n");
- writePS("/BuildGlyph {\n");
- writePS(" exch /CharProcs get exch\n");
- writePS(" 2 copy known not { pop /.notdef } if\n");
- writePS(" get exec\n");
- writePS("} bind def\n");
- writePS("/BuildChar {\n");
- writePS(" 1 index /Encoding get exch get\n");
- writePS(" 1 index /BuildGlyph get exec\n");
- writePS("} bind def\n");
- if ((charProcs = ((Gfx8BitFont *)font)->getCharProcs())) {
- writePSFmt("/CharProcs %d dict def\n", charProcs->getLength());
- writePS("CharProcs begin\n");
- box.x1 = m[0];
- box.y1 = m[1];
- box.x2 = m[2];
- box.y2 = m[3];
- gfx = new Gfx(xref, this, resDict, &box, gFalse, NULL);
- inType3Char = gTrue;
- t3Cacheable = gFalse;
- for (i = 0; i < charProcs->getLength(); ++i) {
- writePS("/");
- writePSName(charProcs->getKey(i));
- writePS(" {\n");
- gfx->display(charProcs->getVal(i, &charProc));
- charProc.free();
- if (t3String) {
- if (t3Cacheable) {
- sprintf(buf, "%g %g %g %g %g %g setcachedevice\n",
- t3WX, t3WY, t3LLX, t3LLY, t3URX, t3URY);
- } else {
- sprintf(buf, "%g %g setcharwidth\n", t3WX, t3WY);
- }
- (*outputFunc)(outputStream, buf, strlen(buf));
- (*outputFunc)(outputStream, t3String->getCString(),
- t3String->getLength());
- delete t3String;
- t3String = NULL;
- }
- (*outputFunc)(outputStream, "Q\n", 2);
- writePS("} def\n");
- }
- inType3Char = gFalse;
- delete gfx;
- writePS("end\n");
- }
- writePS("currentdict end\n");
- writePSFmt("/%s exch definefont pop\n", psName->getCString());
-
- // ending comment
- writePS("%%EndResource\n");
-}
-
-void PSOutputDev::setupImages(Dict *resDict) {
- Object xObjDict, xObj, xObjRef, subtypeObj;
- int i;
-
- if (!(mode == psModeForm || inType3Char)) {
- return;
- }
-
- resDict->lookup("XObject", &xObjDict);
- if (xObjDict.isDict()) {
- for (i = 0; i < xObjDict.dictGetLength(); ++i) {
- xObjDict.dictGetValNF(i, &xObjRef);
- xObjDict.dictGetVal(i, &xObj);
- if (xObj.isStream()) {
- xObj.streamGetDict()->lookup("Subtype", &subtypeObj);
- if (subtypeObj.isName("Image")) {
- if (xObjRef.isRef()) {
- setupImage(xObjRef.getRef(), xObj.getStream());
- } else {
- error(-1, "Image in resource dict is not an indirect reference");
- }
- }
- subtypeObj.free();
- }
- xObj.free();
- xObjRef.free();
- }
- }
- xObjDict.free();
-}
-
-void PSOutputDev::setupImage(Ref id, Stream *str) {
- GBool useASCIIHex;
- int c;
- int size, line, col, i;
-
- // construct an encoder stream
- useASCIIHex = level == psLevel1 || level == psLevel1Sep ||
- globalParams->getPSASCIIHex();
- if (useASCIIHex) {
- str = new ASCIIHexEncoder(str);
- } else {
- str = new ASCII85Encoder(str);
- }
-
- // compute image data size
- str->reset();
- col = size = 0;
- do {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- if (c == 'z') {
- ++col;
- } else {
- ++col;
- for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- ++col;
- }
- }
- if (col > 225) {
- ++size;
- col = 0;
- }
- } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
- ++size;
- writePSFmt("%d array dup /ImData_%d_%d exch def\n", size, id.num, id.gen);
- str->close();
-
- // write the data into the array
- str->reset();
- line = col = 0;
- writePS((char *)(useASCIIHex ? "dup 0 <" : "dup 0 <~"));
- do {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- if (c == 'z') {
- writePSChar(c);
- ++col;
- } else {
- writePSChar(c);
- ++col;
- for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- writePSChar(c);
- ++col;
- }
- }
- // each line is: "dup nnnnn <~...data...~> put<eol>"
- // so max data length = 255 - 20 = 235
- // chunks are 1 or 4 bytes each, so we have to stop at 232
- // but make it 225 just to be safe
- if (col > 225) {
- writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n"));
- ++line;
- writePSFmt((char *)(useASCIIHex ? "dup %d <" : "dup %d <~"), line);
- col = 0;
- }
- } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
- writePS((char *)(useASCIIHex ? "> put\n" : "~> put\n"));
- writePS("pop\n");
- str->close();
-
- delete str;
-}
-
-void PSOutputDev::startPage(int pageNum, GfxState *state) {
- int x1, y1, x2, y2, width, height;
- int imgWidth, imgHeight, imgWidth2, imgHeight2;
-
-
- switch (mode) {
-
- case psModePS:
- writePSFmt("%%%%Page: %d %d\n", pageNum, seqPage);
- writePS("%%BeginPageSetup\n");
-
- // rotate, translate, and scale page
- imgWidth = imgURX - imgLLX;
- imgHeight = imgURY - imgLLY;
- x1 = (int)(state->getX1() + 0.5);
- y1 = (int)(state->getY1() + 0.5);
- x2 = (int)(state->getX2() + 0.5);
- y2 = (int)(state->getY2() + 0.5);
- width = x2 - x1;
- height = y2 - y1;
- tx = ty = 0;
- // portrait or landscape
- if (width > height && width > imgWidth) {
- rotate = 90;
- writePSFmt("%%%%PageOrientation: %s\n",
- state->getCTM()[0] ? "Landscape" : "Portrait");
- writePS("pdfStartPage\n");
- writePS("90 rotate\n");
- ty = -imgWidth;
- imgWidth2 = imgHeight;
- imgHeight2 = imgWidth;
- } else {
- rotate = 0;
- writePSFmt("%%%%PageOrientation: %s\n",
- state->getCTM()[0] ? "Portrait" : "Landscape");
- writePS("pdfStartPage\n");
- imgWidth2 = imgWidth;
- imgHeight2 = imgHeight;
- }
- // shrink or expand
- if ((globalParams->getPSShrinkLarger() &&
- (width > imgWidth2 || height > imgHeight2)) ||
- (globalParams->getPSExpandSmaller() &&
- (width < imgWidth2 && height < imgHeight2))) {
- xScale = (double)imgWidth2 / (double)width;
- yScale = (double)imgHeight2 / (double)height;
- if (yScale < xScale) {
- xScale = yScale;
- } else {
- yScale = xScale;
- }
- } else {
- xScale = yScale = 1;
- }
- // deal with odd bounding boxes
- tx -= xScale * x1;
- ty -= yScale * y1;
- // center
- if (globalParams->getPSCenter()) {
- tx += (imgWidth2 - xScale * width) / 2;
- ty += (imgHeight2 - yScale * height) / 2;
- }
- tx += imgLLX + tx0;
- ty += imgLLY + ty0;
- xScale *= xScale0;
- yScale *= yScale0;
- if (tx != 0 || ty != 0) {
- writePSFmt("%g %g translate\n", tx, ty);
- }
- if (xScale != 1 || yScale != 1) {
- writePSFmt("%0.4f %0.4f scale\n", xScale, xScale);
- }
- if (clipLLX0 < clipURX0 && clipLLY0 < clipURY0) {
- writePSFmt("%g %g %g %g re W\n",
- clipLLX0, clipLLY0, clipURX0 - clipLLX0, clipURY0 - clipLLY0);
- }
-
- writePS("%%EndPageSetup\n");
- ++seqPage;
- break;
-
- case psModeEPS:
- writePS("pdfStartPage\n");
- tx = ty = 0;
- xScale = yScale = 1;
- rotate = 0;
- break;
-
- case psModeForm:
- writePS("/PaintProc {\n");
- writePS("begin xpdf begin\n");
- writePS("pdfStartPage\n");
- tx = ty = 0;
- xScale = yScale = 1;
- rotate = 0;
- break;
- }
-
- if (underlayCbk) {
- (*underlayCbk)(this, underlayCbkData);
- }
-}
-
-void PSOutputDev::endPage() {
- if (overlayCbk) {
- (*overlayCbk)(this, overlayCbkData);
- }
-
-
- if (mode == psModeForm) {
- writePS("pdfEndPage\n");
- writePS("end end\n");
- writePS("} def\n");
- writePS("end end\n");
- } else {
- if (!manualCtrl) {
- writePS("showpage\n");
- writePS("%%PageTrailer\n");
- writePageTrailer();
- }
- }
-}
-
-void PSOutputDev::saveState(GfxState *state) {
- writePS("q\n");
- ++numSaves;
-}
-
-void PSOutputDev::restoreState(GfxState *state) {
- writePS("Q\n");
- --numSaves;
-}
-
-void PSOutputDev::updateCTM(GfxState *state, double m11, double m12,
- double m21, double m22, double m31, double m32) {
- writePSFmt("[%g %g %g %g %g %g] cm\n", m11, m12, m21, m22, m31, m32);
-}
-
-void PSOutputDev::updateLineDash(GfxState *state) {
- double *dash;
- double start;
- int length, i;
-
- state->getLineDash(&dash, &length, &start);
- writePS("[");
- for (i = 0; i < length; ++i)
- writePSFmt("%g%s", dash[i], (i == length-1) ? "" : " ");
- writePSFmt("] %g d\n", start);
-}
-
-void PSOutputDev::updateFlatness(GfxState *state) {
- writePSFmt("%d i\n", state->getFlatness());
-}
-
-void PSOutputDev::updateLineJoin(GfxState *state) {
- writePSFmt("%d j\n", state->getLineJoin());
-}
-
-void PSOutputDev::updateLineCap(GfxState *state) {
- writePSFmt("%d J\n", state->getLineCap());
-}
-
-void PSOutputDev::updateMiterLimit(GfxState *state) {
- writePSFmt("%g M\n", state->getMiterLimit());
-}
-
-void PSOutputDev::updateLineWidth(GfxState *state) {
- writePSFmt("%g w\n", state->getLineWidth());
-}
-
-void PSOutputDev::updateFillColor(GfxState *state) {
- GfxColor color;
- double gray;
- GfxRGB rgb;
- GfxCMYK cmyk;
- GfxSeparationColorSpace *sepCS;
-
- switch (level) {
- case psLevel1:
- state->getFillGray(&gray);
- writePSFmt("%g g\n", gray);
- break;
- case psLevel1Sep:
- state->getFillCMYK(&cmyk);
- writePSFmt("%g %g %g %g k\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- break;
- case psLevel2:
- case psLevel3:
- if (state->getFillColorSpace()->getMode() == csDeviceCMYK) {
- state->getFillCMYK(&cmyk);
- writePSFmt("%g %g %g %g k\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- } else {
- state->getFillRGB(&rgb);
- if (rgb.r == rgb.g && rgb.g == rgb.b) {
- writePSFmt("%g g\n", rgb.r);
- } else {
- writePSFmt("%g %g %g rg\n", rgb.r, rgb.g, rgb.b);
- }
- }
- break;
- case psLevel2Sep:
- case psLevel3Sep:
- if (state->getFillColorSpace()->getMode() == csSeparation) {
- sepCS = (GfxSeparationColorSpace *)state->getFillColorSpace();
- color.c[0] = 1;
- sepCS->getCMYK(&color, &cmyk);
- writePSFmt("%g %g %g %g %g (%s) ck\n",
- state->getFillColor()->c[0],
- cmyk.c, cmyk.m, cmyk.y, cmyk.k,
- sepCS->getName()->getCString());
- addCustomColor(sepCS);
- } else {
- state->getFillCMYK(&cmyk);
- writePSFmt("%g %g %g %g k\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- }
- break;
- }
- t3Cacheable = gFalse;
-}
-
-void PSOutputDev::updateStrokeColor(GfxState *state) {
- GfxColor color;
- double gray;
- GfxRGB rgb;
- GfxCMYK cmyk;
- GfxSeparationColorSpace *sepCS;
-
- switch (level) {
- case psLevel1:
- state->getStrokeGray(&gray);
- writePSFmt("%g G\n", gray);
- break;
- case psLevel1Sep:
- state->getStrokeCMYK(&cmyk);
- writePSFmt("%g %g %g %g K\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- break;
- case psLevel2:
- case psLevel3:
- if (state->getStrokeColorSpace()->getMode() == csDeviceCMYK) {
- state->getStrokeCMYK(&cmyk);
- writePSFmt("%g %g %g %g K\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- } else {
- state->getStrokeRGB(&rgb);
- if (rgb.r == rgb.g && rgb.g == rgb.b) {
- writePSFmt("%g G\n", rgb.r);
- } else {
- writePSFmt("%g %g %g RG\n", rgb.r, rgb.g, rgb.b);
- }
- }
- break;
- case psLevel2Sep:
- case psLevel3Sep:
- if (state->getStrokeColorSpace()->getMode() == csSeparation) {
- sepCS = (GfxSeparationColorSpace *)state->getStrokeColorSpace();
- color.c[0] = 1;
- sepCS->getCMYK(&color, &cmyk);
- writePSFmt("%g %g %g %g %g (%s) CK\n",
- state->getStrokeColor()->c[0],
- cmyk.c, cmyk.m, cmyk.y, cmyk.k,
- sepCS->getName()->getCString());
- addCustomColor(sepCS);
- } else {
- state->getStrokeCMYK(&cmyk);
- writePSFmt("%g %g %g %g K\n", cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- }
- break;
- }
- t3Cacheable = gFalse;
-}
-
-void PSOutputDev::addProcessColor(double c, double m, double y, double k) {
- if (c > 0) {
- processColors |= psProcessCyan;
- }
- if (m > 0) {
- processColors |= psProcessMagenta;
- }
- if (y > 0) {
- processColors |= psProcessYellow;
- }
- if (k > 0) {
- processColors |= psProcessBlack;
- }
-}
-
-void PSOutputDev::addCustomColor(GfxSeparationColorSpace *sepCS) {
- PSOutCustomColor *cc;
- GfxColor color;
- GfxCMYK cmyk;
-
- for (cc = customColors; cc; cc = cc->next) {
- if (!cc->name->cmp(sepCS->getName())) {
- return;
- }
- }
- color.c[0] = 1;
- sepCS->getCMYK(&color, &cmyk);
- cc = new PSOutCustomColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k,
- sepCS->getName()->copy());
- cc->next = customColors;
- customColors = cc;
-}
-
-void PSOutputDev::updateFont(GfxState *state) {
- if (state->getFont()) {
- writePSFmt("/F%d_%d %g Tf\n",
- state->getFont()->getID()->num, state->getFont()->getID()->gen,
- state->getFontSize());
- }
-}
-
-void PSOutputDev::updateTextMat(GfxState *state) {
- double *mat;
-
- mat = state->getTextMat();
- writePSFmt("[%g %g %g %g %g %g] Tm\n",
- mat[0], mat[1], mat[2], mat[3], mat[4], mat[5]);
-}
-
-void PSOutputDev::updateCharSpace(GfxState *state) {
- writePSFmt("%g Tc\n", state->getCharSpace());
-}
-
-void PSOutputDev::updateRender(GfxState *state) {
- int rm;
-
- rm = state->getRender();
- writePSFmt("%d Tr\n", rm);
- rm &= 3;
- if (rm != 0 && rm != 3) {
- t3Cacheable = gFalse;
- }
-}
-
-void PSOutputDev::updateRise(GfxState *state) {
- writePSFmt("%g Ts\n", state->getRise());
-}
-
-void PSOutputDev::updateWordSpace(GfxState *state) {
- writePSFmt("%g Tw\n", state->getWordSpace());
-}
-
-void PSOutputDev::updateHorizScaling(GfxState *state) {
- double h;
-
- if ((h = state->getHorizScaling()) < 0.01) {
- h = 0.01;
- }
- writePSFmt("%g Tz\n", h);
-}
-
-void PSOutputDev::updateTextPos(GfxState *state) {
- writePSFmt("%g %g Td\n", state->getLineX(), state->getLineY());
-}
-
-void PSOutputDev::updateTextShift(GfxState *state, double shift) {
- if (state->getFont()->getWMode()) {
- writePSFmt("%g TJmV\n", shift);
- } else {
- writePSFmt("%g TJm\n", shift);
- }
-}
-
-void PSOutputDev::stroke(GfxState *state) {
- doPath(state->getPath());
- if (t3String) {
- // if we're construct a cacheable Type 3 glyph, we need to do
- // everything in the fill color
- writePS("Sf\n");
- } else {
- writePS("S\n");
- }
-}
-
-void PSOutputDev::fill(GfxState *state) {
- doPath(state->getPath());
- writePS("f\n");
-}
-
-void PSOutputDev::eoFill(GfxState *state) {
- doPath(state->getPath());
- writePS("f*\n");
-}
-
-void PSOutputDev::clip(GfxState *state) {
- doPath(state->getPath());
- writePS("W\n");
-}
-
-void PSOutputDev::eoClip(GfxState *state) {
- doPath(state->getPath());
- writePS("W*\n");
-}
-
-void PSOutputDev::doPath(GfxPath *path) {
- GfxSubpath *subpath;
- double x0, y0, x1, y1, x2, y2, x3, y3, x4, y4;
- int n, m, i, j;
-
- n = path->getNumSubpaths();
-
- if (n == 1 && path->getSubpath(0)->getNumPoints() == 5) {
- subpath = path->getSubpath(0);
- x0 = subpath->getX(0);
- y0 = subpath->getY(0);
- x4 = subpath->getX(4);
- y4 = subpath->getY(4);
- if (x4 == x0 && y4 == y0) {
- x1 = subpath->getX(1);
- y1 = subpath->getY(1);
- x2 = subpath->getX(2);
- y2 = subpath->getY(2);
- x3 = subpath->getX(3);
- y3 = subpath->getY(3);
- if (x0 == x1 && x2 == x3 && y0 == y3 && y1 == y2) {
- writePSFmt("%g %g %g %g re\n",
- x0 < x2 ? x0 : x2, y0 < y1 ? y0 : y1,
- fabs(x2 - x0), fabs(y1 - y0));
- return;
- } else if (x0 == x3 && x1 == x2 && y0 == y1 && y2 == y3) {
- writePSFmt("%g %g %g %g re\n",
- x0 < x1 ? x0 : x1, y0 < y2 ? y0 : y2,
- fabs(x1 - x0), fabs(y2 - y0));
- return;
- }
- }
- }
-
- for (i = 0; i < n; ++i) {
- subpath = path->getSubpath(i);
- m = subpath->getNumPoints();
- writePSFmt("%g %g m\n", subpath->getX(0), subpath->getY(0));
- j = 1;
- while (j < m) {
- if (subpath->getCurve(j)) {
- writePSFmt("%g %g %g %g %g %g c\n", subpath->getX(j), subpath->getY(j),
- subpath->getX(j+1), subpath->getY(j+1),
- subpath->getX(j+2), subpath->getY(j+2));
- j += 3;
- } else {
- writePSFmt("%g %g l\n", subpath->getX(j), subpath->getY(j));
- ++j;
- }
- }
- if (subpath->isClosed()) {
- writePS("h\n");
- }
- }
-}
-
-void PSOutputDev::drawString(GfxState *state, GString *s) {
- GfxFont *font;
- int wMode;
- GString *s2;
- double dx, dy, dx2, dy2, originX, originY;
- char *p;
- UnicodeMap *uMap;
- CharCode code;
- Unicode u[8];
- char buf[8];
- int len, nChars, uLen, n, m, i, j;
-
- // check for invisible text -- this is used by Acrobat Capture
- if (state->getRender() == 3) {
- return;
- }
-
- // ignore empty strings
- if (s->getLength() == 0) {
- return;
- }
-
- // get the font
- if (!(font = state->getFont())) {
- return;
- }
- wMode = font->getWMode();
-
- // check for a subtitute 16-bit font
- uMap = NULL;
- if (font->isCIDFont()) {
- for (i = 0; i < font16EncLen; ++i) {
- if (font->getID()->num == font16Enc[i].fontID.num &&
- font->getID()->gen == font16Enc[i].fontID.gen) {
- uMap = globalParams->getUnicodeMap(font16Enc[i].enc);
- break;
- }
- }
- }
-
- // compute width of chars in string, ignoring char spacing and word
- // spacing -- the Tj operator will adjust for the metrics of the
- // font that's actually used
- dx = dy = 0;
- nChars = 0;
- p = s->getCString();
- len = s->getLength();
- if (font->isCIDFont()) {
- s2 = new GString();
- } else {
- s2 = s;
- }
- while (len > 0) {
- n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
- &dx2, &dy2, &originX, &originY);
- if (font->isCIDFont()) {
- if (uMap) {
- for (i = 0; i < uLen; ++i) {
- m = uMap->mapUnicode(u[i], buf, (int)sizeof(buf));
- for (j = 0; j < m; ++j) {
- s2->append(buf[j]);
- }
- }
- //~ this really needs to get the number of chars in the target
- //~ encoding - which may be more than the number of Unicode
- //~ chars
- nChars += uLen;
- } else {
- s2->append((char)((code >> 8) & 0xff));
- s2->append((char)(code & 0xff));
- ++nChars;
- }
- }
- dx += dx2;
- dy += dy2;
- p += n;
- len -= n;
- }
- dx *= state->getFontSize() * state->getHorizScaling();
- dy *= state->getFontSize();
- if (uMap) {
- uMap->decRefCnt();
- }
-
- if (s2->getLength() > 0) {
- writePSString(s2);
- if (font->isCIDFont()) {
- if (wMode) {
- writePSFmt(" %d %g Tj16V\n", nChars, dy);
- } else {
- writePSFmt(" %d %g Tj16\n", nChars, dx);
- }
- } else {
- writePSFmt(" %g Tj\n", dx);
- }
- }
- if (font->isCIDFont()) {
- delete s2;
- }
-
- if (state->getRender() & 4) {
- haveTextClip = gTrue;
- }
-}
-
-void PSOutputDev::endTextObject(GfxState *state) {
- if (haveTextClip) {
- writePS("Tclip\n");
- haveTextClip = gFalse;
- }
-}
-
-void PSOutputDev::drawImageMask(GfxState *state, Object *ref, Stream *str,
- int width, int height, GBool invert,
- GBool inlineImg) {
- int len;
-
- len = height * ((width + 7) / 8);
- if (level == psLevel1 || level == psLevel1Sep) {
- doImageL1(ref, NULL, invert, inlineImg, str, width, height, len);
- } else {
- doImageL2(ref, NULL, invert, inlineImg, str, width, height, len);
- }
-}
-
-void PSOutputDev::drawImage(GfxState *state, Object *ref, Stream *str,
- int width, int height, GfxImageColorMap *colorMap,
- int *maskColors, GBool inlineImg) {
- int len;
-
- len = height * ((width * colorMap->getNumPixelComps() *
- colorMap->getBits() + 7) / 8);
- switch (level) {
- case psLevel1:
- doImageL1(ref, colorMap, gFalse, inlineImg, str, width, height, len);
- break;
- case psLevel1Sep:
- //~ handle indexed, separation, ... color spaces
- doImageL1Sep(colorMap, gFalse, inlineImg, str, width, height, len);
- break;
- case psLevel2:
- case psLevel2Sep:
- case psLevel3:
- case psLevel3Sep:
- doImageL2(ref, colorMap, gFalse, inlineImg, str, width, height, len);
- break;
- }
- t3Cacheable = gFalse;
-}
-
-void PSOutputDev::doImageL1(Object *ref, GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len) {
- ImageStream *imgStr;
- Guchar pixBuf[gfxColorMaxComps];
- double gray;
- int col, x, y, c, i;
-
- if (inType3Char && !colorMap) {
- if (inlineImg) {
- // create an array
- str = new FixedLengthEncoder(str, len);
- str = new ASCIIHexEncoder(str);
- str->reset();
- col = 0;
- writePS("[<");
- do {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == '>' || c == EOF) {
- break;
- }
- writePSChar(c);
- ++col;
- // each line is: "<...data...><eol>"
- // so max data length = 255 - 4 = 251
- // but make it 240 just to be safe
- // chunks are 2 bytes each, so we need to stop on an even col number
- if (col == 240) {
- writePS(">\n<");
- col = 0;
- }
- } while (c != '>' && c != EOF);
- writePS(">]\n");
- writePS("0\n");
- str->close();
- delete str;
- } else {
- // set up to use the array already created by setupImages()
- writePSFmt("ImData_%d_%d 0\n", ref->getRefNum(), ref->getRefGen());
- }
- }
-
- // image/imagemask command
- if (inType3Char && !colorMap) {
- writePSFmt("%d %d %s [%d 0 0 %d 0 %d] pdfImM1a\n",
- width, height, invert ? "true" : "false",
- width, -height, height);
- } else if (colorMap) {
- writePSFmt("%d %d 8 [%d 0 0 %d 0 %d] pdfIm1\n",
- width, height,
- width, -height, height);
- } else {
- writePSFmt("%d %d %s [%d 0 0 %d 0 %d] pdfImM1\n",
- width, height, invert ? "true" : "false",
- width, -height, height);
- }
-
- // image data
- if (!(inType3Char && !colorMap)) {
-
- if (colorMap) {
-
- // set up to process the data stream
- imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
- colorMap->getBits());
- imgStr->reset();
-
- // process the data stream
- i = 0;
- for (y = 0; y < height; ++y) {
-
- // write the line
- for (x = 0; x < width; ++x) {
- imgStr->getPixel(pixBuf);
- colorMap->getGray(pixBuf, &gray);
- writePSFmt("%02x", (int)(gray * 255 + 0.5));
- if (++i == 32) {
- writePSChar('\n');
- i = 0;
- }
- }
- }
- if (i != 0) {
- writePSChar('\n');
- }
- delete imgStr;
-
- // imagemask
- } else {
- str->reset();
- i = 0;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; x += 8) {
- writePSFmt("%02x", str->getChar() & 0xff);
- if (++i == 32) {
- writePSChar('\n');
- i = 0;
- }
- }
- }
- if (i != 0) {
- writePSChar('\n');
- }
- str->close();
- }
- }
-}
-
-void PSOutputDev::doImageL1Sep(GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len) {
- ImageStream *imgStr;
- Guchar *lineBuf;
- Guchar pixBuf[gfxColorMaxComps];
- GfxCMYK cmyk;
- int x, y, i, comp;
-
- // width, height, matrix, bits per component
- writePSFmt("%d %d 8 [%d 0 0 %d 0 %d] pdfIm1Sep\n",
- width, height,
- width, -height, height);
-
- // allocate a line buffer
- lineBuf = (Guchar *)gmalloc(4 * width);
-
- // set up to process the data stream
- imgStr = new ImageStream(str, width, colorMap->getNumPixelComps(),
- colorMap->getBits());
- imgStr->reset();
-
- // process the data stream
- i = 0;
- for (y = 0; y < height; ++y) {
-
- // read the line
- for (x = 0; x < width; ++x) {
- imgStr->getPixel(pixBuf);
- colorMap->getCMYK(pixBuf, &cmyk);
- lineBuf[4*x+0] = (int)(255 * cmyk.c + 0.5);
- lineBuf[4*x+1] = (int)(255 * cmyk.m + 0.5);
- lineBuf[4*x+2] = (int)(255 * cmyk.y + 0.5);
- lineBuf[4*x+3] = (int)(255 * cmyk.k + 0.5);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- }
-
- // write one line of each color component
- for (comp = 0; comp < 4; ++comp) {
- for (x = 0; x < width; ++x) {
- writePSFmt("%02x", lineBuf[4*x + comp]);
- if (++i == 32) {
- writePSChar('\n');
- i = 0;
- }
- }
- }
- }
-
- if (i != 0) {
- writePSChar('\n');
- }
-
- delete imgStr;
- gfree(lineBuf);
-}
-
-void PSOutputDev::doImageL2(Object *ref, GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len) {
- GString *s;
- int n, numComps;
- GBool useRLE, useASCII, useASCIIHex, useCompressed;
- GfxSeparationColorSpace *sepCS;
- GfxColor color;
- GfxCMYK cmyk;
- int c;
- int col, i;
-
- // color space
- if (colorMap) {
- dumpColorSpaceL2(colorMap->getColorSpace());
- writePS(" setcolorspace\n");
- }
-
- useASCIIHex = globalParams->getPSASCIIHex();
-
- // set up the image data
- if (mode == psModeForm || inType3Char) {
- if (inlineImg) {
- // create an array
- str = new FixedLengthEncoder(str, len);
- if (useASCIIHex) {
- str = new ASCIIHexEncoder(str);
- } else {
- str = new ASCII85Encoder(str);
- }
- str->reset();
- col = 0;
- writePS((char *)(useASCIIHex ? "[<" : "[<~"));
- do {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- if (c == 'z') {
- writePSChar(c);
- ++col;
- } else {
- writePSChar(c);
- ++col;
- for (i = 1; i <= (useASCIIHex ? 1 : 4); ++i) {
- do {
- c = str->getChar();
- } while (c == '\n' || c == '\r');
- if (c == (useASCIIHex ? '>' : '~') || c == EOF) {
- break;
- }
- writePSChar(c);
- ++col;
- }
- }
- // each line is: "<~...data...~><eol>"
- // so max data length = 255 - 6 = 249
- // chunks are 1 or 5 bytes each, so we have to stop at 245
- // but make it 240 just to be safe
- if (col > 240) {
- writePS((char *)(useASCIIHex ? ">\n<" : "~>\n<~"));
- col = 0;
- }
- } while (c != (useASCIIHex ? '>' : '~') && c != EOF);
- writePS((char *)(useASCIIHex ? ">]\n" : "~>]\n"));
- writePS("0\n");
- str->close();
- delete str;
- } else {
- // set up to use the array already created by setupImages()
- writePSFmt("ImData_%d_%d 0\n", ref->getRefNum(), ref->getRefGen());
- }
- }
-
- // image dictionary
- writePS("<<\n /ImageType 1\n");
-
- // width, height, matrix, bits per component
- writePSFmt(" /Width %d\n", width);
- writePSFmt(" /Height %d\n", height);
- writePSFmt(" /ImageMatrix [%d 0 0 %d 0 %d]\n", width, -height, height);
- if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) {
- writePSFmt(" /BitsPerComponent 8\n");
- } else {
- writePSFmt(" /BitsPerComponent %d\n",
- colorMap ? colorMap->getBits() : 1);
- }
-
- // decode
- if (colorMap) {
- writePS(" /Decode [");
- if (colorMap->getColorSpace()->getMode() == csSeparation) {
- //~ this is a kludge -- see comment in dumpColorSpaceL2
- n = (1 << colorMap->getBits()) - 1;
- writePSFmt("%g %g", colorMap->getDecodeLow(0) * n,
- colorMap->getDecodeHigh(0) * n);
- } else if (colorMap->getColorSpace()->getMode() == csDeviceN) {
- numComps = ((GfxDeviceNColorSpace *)colorMap->getColorSpace())->
- getAlt()->getNComps();
- for (i = 0; i < numComps; ++i) {
- if (i > 0) {
- writePS(" ");
- }
- writePSFmt("0 1", colorMap->getDecodeLow(i),
- colorMap->getDecodeHigh(i));
- }
- } else {
- numComps = colorMap->getNumPixelComps();
- for (i = 0; i < numComps; ++i) {
- if (i > 0) {
- writePS(" ");
- }
- writePSFmt("%g %g", colorMap->getDecodeLow(i),
- colorMap->getDecodeHigh(i));
- }
- }
- writePS("]\n");
- } else {
- writePSFmt(" /Decode [%d %d]\n", invert ? 1 : 0, invert ? 0 : 1);
- }
-
- if (mode == psModeForm || inType3Char) {
-
- // data source
- writePS(" /DataSource { 2 copy get exch 1 add exch }\n");
-
- // end of image dictionary
- writePSFmt(">>\n%s\n", colorMap ? "image" : "imagemask");
-
- // get rid of the array and index
- writePS("pop pop\n");
-
- } else {
-
- // data source
- writePS(" /DataSource currentfile\n");
- s = str->getPSFilter(level < psLevel2 ? 1 : level < psLevel3 ? 2 : 3,
- " ");
- if ((colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) ||
- inlineImg || !s) {
- useRLE = gTrue;
- useASCII = gTrue;
- useCompressed = gFalse;
- } else {
- useRLE = gFalse;
- useASCII = str->isBinary();
- useCompressed = gTrue;
- }
- if (useASCII) {
- writePSFmt(" /ASCII%sDecode filter\n",
- useASCIIHex ? "Hex" : "85");
- }
- if (useRLE) {
- writePS(" /RunLengthDecode filter\n");
- }
- if (useCompressed) {
- writePS(s->getCString());
- }
- if (s) {
- delete s;
- }
-
- // cut off inline image streams at appropriate length
- if (inlineImg) {
- str = new FixedLengthEncoder(str, len);
- } else if (useCompressed) {
- str = str->getBaseStream();
- }
-
- // recode DeviceN data
- if (colorMap && colorMap->getColorSpace()->getMode() == csDeviceN) {
- str = new DeviceNRecoder(str, width, height, colorMap);
- }
-
- // add RunLengthEncode and ASCIIHex/85 encode filters
- if (useRLE) {
- str = new RunLengthEncoder(str);
- }
- if (useASCII) {
- if (useASCIIHex) {
- str = new ASCIIHexEncoder(str);
- } else {
- str = new ASCII85Encoder(str);
- }
- }
-
- // end of image dictionary
- writePS(">>\n");
-#if OPI_SUPPORT
- if (opi13Nest) {
- if (inlineImg) {
- // this can't happen -- OPI dictionaries are in XObjects
- error(-1, "Internal: OPI in inline image");
- n = 0;
- } else {
- // need to read the stream to count characters -- the length
- // is data-dependent (because of ASCII and RLE filters)
- str->reset();
- n = 0;
- while ((c = str->getChar()) != EOF) {
- ++n;
- }
- str->close();
- }
- // +6/7 for "pdfIm\n" / "pdfImM\n"
- // +8 for newline + trailer
- n += colorMap ? 14 : 15;
- writePSFmt("%%%%BeginData: %d Hex Bytes\n", n);
- }
-#endif
- if ((level == psLevel2Sep || level == psLevel3Sep) && colorMap &&
- colorMap->getColorSpace()->getMode() == csSeparation) {
- color.c[0] = 1;
- sepCS = (GfxSeparationColorSpace *)colorMap->getColorSpace();
- sepCS->getCMYK(&color, &cmyk);
- writePSFmt("%g %g %g %g (%s) pdfImSep\n",
- cmyk.c, cmyk.m, cmyk.y, cmyk.k,
- sepCS->getName()->getCString());
- } else {
- writePSFmt("%s\n", colorMap ? "pdfIm" : "pdfImM");
- }
-
- // copy the stream data
- str->reset();
- while ((c = str->getChar()) != EOF) {
- writePSChar(c);
- }
- str->close();
-
- // add newline and trailer to the end
- writePSChar('\n');
- writePS("%-EOD-\n");
-#if OPI_SUPPORT
- if (opi13Nest) {
- writePS("%%EndData\n");
- }
-#endif
-
- // delete encoders
- if (useRLE || useASCII || inlineImg) {
- delete str;
- }
- }
-}
-
-void PSOutputDev::dumpColorSpaceL2(GfxColorSpace *colorSpace) {
- GfxCalGrayColorSpace *calGrayCS;
- GfxCalRGBColorSpace *calRGBCS;
- GfxLabColorSpace *labCS;
- GfxIndexedColorSpace *indexedCS;
- GfxSeparationColorSpace *separationCS;
- GfxColorSpace *baseCS;
- Guchar *lookup, *p;
- double x[gfxColorMaxComps], y[gfxColorMaxComps];
- GfxColor color;
- GfxCMYK cmyk;
- Function *func;
- int n, numComps, numAltComps;
- int byte;
- int i, j, k;
-
- switch (colorSpace->getMode()) {
-
- case csDeviceGray:
- writePS("/DeviceGray");
- processColors |= psProcessBlack;
- break;
-
- case csCalGray:
- calGrayCS = (GfxCalGrayColorSpace *)colorSpace;
- writePS("[/CIEBasedA <<\n");
- writePSFmt(" /DecodeA {%g exp} bind\n", calGrayCS->getGamma());
- writePSFmt(" /MatrixA [%g %g %g]\n",
- calGrayCS->getWhiteX(), calGrayCS->getWhiteY(),
- calGrayCS->getWhiteZ());
- writePSFmt(" /WhitePoint [%g %g %g]\n",
- calGrayCS->getWhiteX(), calGrayCS->getWhiteY(),
- calGrayCS->getWhiteZ());
- writePSFmt(" /BlackPoint [%g %g %g]\n",
- calGrayCS->getBlackX(), calGrayCS->getBlackY(),
- calGrayCS->getBlackZ());
- writePS(">>]");
- processColors |= psProcessBlack;
- break;
-
- case csDeviceRGB:
- writePS("/DeviceRGB");
- processColors |= psProcessCMYK;
- break;
-
- case csCalRGB:
- calRGBCS = (GfxCalRGBColorSpace *)colorSpace;
- writePS("[/CIEBasedABC <<\n");
- writePSFmt(" /DecodeABC [{%g exp} bind {%g exp} bind {%g exp} bind]\n",
- calRGBCS->getGammaR(), calRGBCS->getGammaG(),
- calRGBCS->getGammaB());
- writePSFmt(" /MatrixABC [%g %g %g %g %g %g %g %g %g]\n",
- calRGBCS->getMatrix()[0], calRGBCS->getMatrix()[1],
- calRGBCS->getMatrix()[2], calRGBCS->getMatrix()[3],
- calRGBCS->getMatrix()[4], calRGBCS->getMatrix()[5],
- calRGBCS->getMatrix()[6], calRGBCS->getMatrix()[7],
- calRGBCS->getMatrix()[8]);
- writePSFmt(" /WhitePoint [%g %g %g]\n",
- calRGBCS->getWhiteX(), calRGBCS->getWhiteY(),
- calRGBCS->getWhiteZ());
- writePSFmt(" /BlackPoint [%g %g %g]\n",
- calRGBCS->getBlackX(), calRGBCS->getBlackY(),
- calRGBCS->getBlackZ());
- writePS(">>]");
- processColors |= psProcessCMYK;
- break;
-
- case csDeviceCMYK:
- writePS("/DeviceCMYK");
- processColors |= psProcessCMYK;
- break;
-
- case csLab:
- labCS = (GfxLabColorSpace *)colorSpace;
- writePS("[/CIEBasedABC <<\n");
- writePSFmt(" /RangeABC [0 100 %g %g %g %g]\n",
- labCS->getAMin(), labCS->getAMax(),
- labCS->getBMin(), labCS->getBMax());
- writePS(" /DecodeABC [{16 add 116 div} bind {500 div} bind {200 div} bind]\n");
- writePS(" /MatrixABC [1 1 1 1 0 0 0 0 -1]\n");
- writePS(" /DecodeLMN\n");
- writePS(" [{dup 6 29 div ge {dup dup mul mul}\n");
- writePSFmt(" {4 29 div sub 108 841 div mul } ifelse %g mul} bind\n",
- labCS->getWhiteX());
- writePS(" {dup 6 29 div ge {dup dup mul mul}\n");
- writePSFmt(" {4 29 div sub 108 841 div mul } ifelse %g mul} bind\n",
- labCS->getWhiteY());
- writePS(" {dup 6 29 div ge {dup dup mul mul}\n");
- writePSFmt(" {4 29 div sub 108 841 div mul } ifelse %g mul} bind]\n",
- labCS->getWhiteZ());
- writePSFmt(" /WhitePoint [%g %g %g]\n",
- labCS->getWhiteX(), labCS->getWhiteY(), labCS->getWhiteZ());
- writePSFmt(" /BlackPoint [%g %g %g]\n",
- labCS->getBlackX(), labCS->getBlackY(), labCS->getBlackZ());
- writePS(">>]");
- processColors |= psProcessCMYK;
- break;
-
- case csICCBased:
- // there is no transform function to the alternate color space, so
- // we can use it directly
- dumpColorSpaceL2(((GfxICCBasedColorSpace *)colorSpace)->getAlt());
- break;
-
- case csIndexed:
- indexedCS = (GfxIndexedColorSpace *)colorSpace;
- baseCS = indexedCS->getBase();
- writePS("[/Indexed ");
- dumpColorSpaceL2(baseCS);
- n = indexedCS->getIndexHigh();
- numComps = baseCS->getNComps();
- lookup = indexedCS->getLookup();
- writePSFmt(" %d <\n", n);
- if (baseCS->getMode() == csDeviceN) {
- func = ((GfxDeviceNColorSpace *)baseCS)->getTintTransformFunc();
- numAltComps = ((GfxDeviceNColorSpace *)baseCS)->getAlt()->getNComps();
- p = lookup;
- for (i = 0; i <= n; i += 8) {
- writePS(" ");
- for (j = i; j < i+8 && j <= n; ++j) {
- for (k = 0; k < numComps; ++k) {
- x[k] = *p++ / 255.0;
- }
- func->transform(x, y);
- for (k = 0; k < numAltComps; ++k) {
- byte = (int)(y[k] * 255 + 0.5);
- if (byte < 0) {
- byte = 0;
- } else if (byte > 255) {
- byte = 255;
- }
- writePSFmt("%02x", byte);
- }
- color.c[0] = j;
- indexedCS->getCMYK(&color, &cmyk);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- }
- writePS("\n");
- }
- } else {
- for (i = 0; i <= n; i += 8) {
- writePS(" ");
- for (j = i; j < i+8 && j <= n; ++j) {
- for (k = 0; k < numComps; ++k) {
- writePSFmt("%02x", lookup[j * numComps + k]);
- }
- color.c[0] = j;
- indexedCS->getCMYK(&color, &cmyk);
- addProcessColor(cmyk.c, cmyk.m, cmyk.y, cmyk.k);
- }
- writePS("\n");
- }
- }
- writePS(">]");
- break;
-
- case csSeparation:
- //~ this is a kludge -- the correct thing would to ouput a
- //~ separation color space, with the specified alternate color
- //~ space and tint transform
- separationCS = (GfxSeparationColorSpace *)colorSpace;
- writePS("[/Indexed ");
- dumpColorSpaceL2(separationCS->getAlt());
- writePS(" 255 <\n");
- numComps = separationCS->getAlt()->getNComps();
- for (i = 0; i <= 255; i += 8) {
- writePS(" ");
- for (j = i; j < i+8 && j <= 255; ++j) {
- x[0] = (double)j / 255.0;
- separationCS->getFunc()->transform(x, y);
- for (k = 0; k < numComps; ++k) {
- writePSFmt("%02x", (int)(255 * y[k] + 0.5));
- }
- }
- writePS("\n");
- }
- writePS(">]");
-#if 0 //~ this shouldn't be here since the PS file doesn't actually refer
- //~ to this colorant (it's converted to CMYK instead)
- addCustomColor(separationCS);
-#endif
- break;
-
- case csDeviceN:
- // DeviceN color spaces are a Level 3 PostScript feature.
- dumpColorSpaceL2(((GfxDeviceNColorSpace *)colorSpace)->getAlt());
- break;
-
- case csPattern:
- //~ unimplemented
- break;
-
- }
-}
-
-#if OPI_SUPPORT
-void PSOutputDev::opiBegin(GfxState *state, Dict *opiDict) {
- Object dict;
-
- if (globalParams->getPSOPI()) {
- opiDict->lookup("2.0", &dict);
- if (dict.isDict()) {
- opiBegin20(state, dict.getDict());
- dict.free();
- } else {
- dict.free();
- opiDict->lookup("1.3", &dict);
- if (dict.isDict()) {
- opiBegin13(state, dict.getDict());
- }
- dict.free();
- }
- }
-}
-
-void PSOutputDev::opiBegin20(GfxState *state, Dict *dict) {
- Object obj1, obj2, obj3, obj4;
- double width, height, left, right, top, bottom;
- int w, h;
- int i;
-
- writePS("%%BeginOPI: 2.0\n");
- writePS("%%Distilled\n");
-
- dict->lookup("F", &obj1);
- if (getFileSpec(&obj1, &obj2)) {
- writePSFmt("%%%%ImageFileName: %s\n",
- obj2.getString()->getCString());
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("MainImage", &obj1);
- if (obj1.isString()) {
- writePSFmt("%%%%MainImage: %s\n", obj1.getString()->getCString());
- }
- obj1.free();
-
- //~ ignoring 'Tags' entry
- //~ need to use writePSString() and deal with >255-char lines
-
- dict->lookup("Size", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
- width = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- height = obj2.getNum();
- obj2.free();
- writePSFmt("%%%%ImageDimensions: %g %g\n", width, height);
- }
- obj1.free();
-
- dict->lookup("CropRect", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 4) {
- obj1.arrayGet(0, &obj2);
- left = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- top = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- right = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- bottom = obj2.getNum();
- obj2.free();
- writePSFmt("%%%%ImageCropRect: %g %g %g %g\n", left, top, right, bottom);
- }
- obj1.free();
-
- dict->lookup("Overprint", &obj1);
- if (obj1.isBool()) {
- writePSFmt("%%%%ImageOverprint: %s\n", obj1.getBool() ? "true" : "false");
- }
- obj1.free();
-
- dict->lookup("Inks", &obj1);
- if (obj1.isName()) {
- writePSFmt("%%%%ImageInks: %s\n", obj1.getName());
- } else if (obj1.isArray() && obj1.arrayGetLength() >= 1) {
- obj1.arrayGet(0, &obj2);
- if (obj2.isName()) {
- writePSFmt("%%%%ImageInks: %s %d",
- obj2.getName(), (obj1.arrayGetLength() - 1) / 2);
- for (i = 1; i+1 < obj1.arrayGetLength(); i += 2) {
- obj1.arrayGet(i, &obj3);
- obj1.arrayGet(i+1, &obj4);
- if (obj3.isString() && obj4.isNum()) {
- writePS(" ");
- writePSString(obj3.getString());
- writePSFmt(" %g", obj4.getNum());
- }
- obj3.free();
- obj4.free();
- }
- writePS("\n");
- }
- obj2.free();
- }
- obj1.free();
-
- writePS("gsave\n");
-
- writePS("%%BeginIncludedImage\n");
-
- dict->lookup("IncludedImageDimensions", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
- w = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- h = obj2.getInt();
- obj2.free();
- writePSFmt("%%%%IncludedImageDimensions: %d %d\n", w, h);
- }
- obj1.free();
-
- dict->lookup("IncludedImageQuality", &obj1);
- if (obj1.isNum()) {
- writePSFmt("%%%%IncludedImageQuality: %g\n", obj1.getNum());
- }
- obj1.free();
-
- ++opi20Nest;
-}
-
-void PSOutputDev::opiBegin13(GfxState *state, Dict *dict) {
- Object obj1, obj2;
- int left, right, top, bottom, samples, bits, width, height;
- double c, m, y, k;
- double llx, lly, ulx, uly, urx, ury, lrx, lry;
- double tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry;
- double horiz, vert;
- int i, j;
-
- writePS("save\n");
- writePS("/opiMatrix2 matrix currentmatrix def\n");
- writePS("opiMatrix setmatrix\n");
-
- dict->lookup("F", &obj1);
- if (getFileSpec(&obj1, &obj2)) {
- writePSFmt("%%ALDImageFileName: %s\n",
- obj2.getString()->getCString());
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("CropRect", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 4) {
- obj1.arrayGet(0, &obj2);
- left = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- top = obj2.getInt();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- right = obj2.getInt();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- bottom = obj2.getInt();
- obj2.free();
- writePSFmt("%%ALDImageCropRect: %d %d %d %d\n", left, top, right, bottom);
- }
- obj1.free();
-
- dict->lookup("Color", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 5) {
- obj1.arrayGet(0, &obj2);
- c = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- m = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- y = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- k = obj2.getNum();
- obj2.free();
- obj1.arrayGet(4, &obj2);
- if (obj2.isString()) {
- writePSFmt("%%ALDImageColor: %g %g %g %g ", c, m, y, k);
- writePSString(obj2.getString());
- writePS("\n");
- }
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("ColorType", &obj1);
- if (obj1.isName()) {
- writePSFmt("%%ALDImageColorType: %s\n", obj1.getName());
- }
- obj1.free();
-
- //~ ignores 'Comments' entry
- //~ need to handle multiple lines
-
- dict->lookup("CropFixed", &obj1);
- if (obj1.isArray()) {
- obj1.arrayGet(0, &obj2);
- ulx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- uly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- lrx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- lry = obj2.getNum();
- obj2.free();
- writePSFmt("%%ALDImageCropFixed: %g %g %g %g\n", ulx, uly, lrx, lry);
- }
- obj1.free();
-
- dict->lookup("GrayMap", &obj1);
- if (obj1.isArray()) {
- writePS("%ALDImageGrayMap:");
- for (i = 0; i < obj1.arrayGetLength(); i += 16) {
- if (i > 0) {
- writePS("\n%%+");
- }
- for (j = 0; j < 16 && i+j < obj1.arrayGetLength(); ++j) {
- obj1.arrayGet(i+j, &obj2);
- writePSFmt(" %d", obj2.getInt());
- obj2.free();
- }
- }
- writePS("\n");
- }
- obj1.free();
-
- dict->lookup("ID", &obj1);
- if (obj1.isString()) {
- writePSFmt("%%ALDImageID: %s\n", obj1.getString()->getCString());
- }
- obj1.free();
-
- dict->lookup("ImageType", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
- samples = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- bits = obj2.getInt();
- obj2.free();
- writePSFmt("%%ALDImageType: %d %d\n", samples, bits);
- }
- obj1.free();
-
- dict->lookup("Overprint", &obj1);
- if (obj1.isBool()) {
- writePSFmt("%%ALDImageOverprint: %s\n", obj1.getBool() ? "true" : "false");
- }
- obj1.free();
-
- dict->lookup("Position", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 8) {
- obj1.arrayGet(0, &obj2);
- llx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- lly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(2, &obj2);
- ulx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(3, &obj2);
- uly = obj2.getNum();
- obj2.free();
- obj1.arrayGet(4, &obj2);
- urx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(5, &obj2);
- ury = obj2.getNum();
- obj2.free();
- obj1.arrayGet(6, &obj2);
- lrx = obj2.getNum();
- obj2.free();
- obj1.arrayGet(7, &obj2);
- lry = obj2.getNum();
- obj2.free();
- opiTransform(state, llx, lly, &tllx, &tlly);
- opiTransform(state, ulx, uly, &tulx, &tuly);
- opiTransform(state, urx, ury, &turx, &tury);
- opiTransform(state, lrx, lry, &tlrx, &tlry);
- writePSFmt("%%ALDImagePosition: %g %g %g %g %g %g %g %g\n",
- tllx, tlly, tulx, tuly, turx, tury, tlrx, tlry);
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("Resolution", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
- horiz = obj2.getNum();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- vert = obj2.getNum();
- obj2.free();
- writePSFmt("%%ALDImageResoution: %g %g\n", horiz, vert);
- obj2.free();
- }
- obj1.free();
-
- dict->lookup("Size", &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 2) {
- obj1.arrayGet(0, &obj2);
- width = obj2.getInt();
- obj2.free();
- obj1.arrayGet(1, &obj2);
- height = obj2.getInt();
- obj2.free();
- writePSFmt("%%ALDImageDimensions: %d %d\n", width, height);
- }
- obj1.free();
-
- //~ ignoring 'Tags' entry
- //~ need to use writePSString() and deal with >255-char lines
-
- dict->lookup("Tint", &obj1);
- if (obj1.isNum()) {
- writePSFmt("%%ALDImageTint: %g\n", obj1.getNum());
- }
- obj1.free();
-
- dict->lookup("Transparency", &obj1);
- if (obj1.isBool()) {
- writePSFmt("%%ALDImageTransparency: %s\n", obj1.getBool() ? "true" : "false");
- }
- obj1.free();
-
- writePS("%%BeginObject: image\n");
- writePS("opiMatrix2 setmatrix\n");
- ++opi13Nest;
-}
-
-// Convert PDF user space coordinates to PostScript default user space
-// coordinates. This has to account for both the PDF CTM and the
-// PSOutputDev page-fitting transform.
-void PSOutputDev::opiTransform(GfxState *state, double x0, double y0,
- double *x1, double *y1) {
- double t;
-
- state->transform(x0, y0, x1, y1);
- *x1 += tx;
- *y1 += ty;
- if (rotate == 90) {
- t = *x1;
- *x1 = -*y1;
- *y1 = t;
- } else if (rotate == 180) {
- *x1 = -*x1;
- *y1 = -*y1;
- } else if (rotate == 270) {
- t = *x1;
- *x1 = *y1;
- *y1 = -t;
- }
- *x1 *= xScale;
- *y1 *= yScale;
-}
-
-void PSOutputDev::opiEnd(GfxState *state, Dict *opiDict) {
- Object dict;
-
- if (globalParams->getPSOPI()) {
- opiDict->lookup("2.0", &dict);
- if (dict.isDict()) {
- writePS("%%EndIncludedImage\n");
- writePS("%%EndOPI\n");
- writePS("grestore\n");
- --opi20Nest;
- dict.free();
- } else {
- dict.free();
- opiDict->lookup("1.3", &dict);
- if (dict.isDict()) {
- writePS("%%EndObject\n");
- writePS("restore\n");
- --opi13Nest;
- }
- dict.free();
- }
- }
-}
-
-GBool PSOutputDev::getFileSpec(Object *fileSpec, Object *fileName) {
- if (fileSpec->isString()) {
- fileSpec->copy(fileName);
- return gTrue;
- }
- if (fileSpec->isDict()) {
- fileSpec->dictLookup("DOS", fileName);
- if (fileName->isString()) {
- return gTrue;
- }
- fileName->free();
- fileSpec->dictLookup("Mac", fileName);
- if (fileName->isString()) {
- return gTrue;
- }
- fileName->free();
- fileSpec->dictLookup("Unix", fileName);
- if (fileName->isString()) {
- return gTrue;
- }
- fileName->free();
- fileSpec->dictLookup("F", fileName);
- if (fileName->isString()) {
- return gTrue;
- }
- fileName->free();
- }
- return gFalse;
-}
-#endif // OPI_SUPPORT
-
-void PSOutputDev::type3D0(GfxState *state, double wx, double wy) {
- writePSFmt("%g %g setcharwidth\n", wx, wy);
- writePS("q\n");
-}
-
-void PSOutputDev::type3D1(GfxState *state, double wx, double wy,
- double llx, double lly, double urx, double ury) {
- t3WX = wx;
- t3WY = wy;
- t3LLX = llx;
- t3LLY = lly;
- t3URX = urx;
- t3URY = ury;
- t3String = new GString();
- writePS("q\n");
- t3Cacheable = gTrue;
-}
-
-void PSOutputDev::psXObject(Stream *psStream, Stream *level1Stream) {
- Stream *str;
- int c;
-
- if ((level == psLevel1 || level == psLevel1Sep) && level1Stream) {
- str = level1Stream;
- } else {
- str = psStream;
- }
- str->reset();
- while ((c = str->getChar()) != EOF) {
- writePSChar(c);
- }
- str->close();
-}
-
-void PSOutputDev::writePSChar(char c) {
- if (t3String) {
- t3String->append(c);
- } else {
- (*outputFunc)(outputStream, &c, 1);
- }
-}
-
-void PSOutputDev::writePS(char *s) {
- if (t3String) {
- t3String->append(s);
- } else {
- (*outputFunc)(outputStream, s, strlen(s));
- }
-}
-
-void PSOutputDev::writePSFmt(const char *fmt, ...) {
- va_list args;
- char buf[512];
-
- va_start(args, fmt);
- vsprintf(buf, fmt, args);
- va_end(args);
- if (t3String) {
- t3String->append(buf);
- } else {
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
-}
-
-void PSOutputDev::writePSString(GString *s) {
- Guchar *p;
- int n;
- char buf[8];
-
- writePSChar('(');
- for (p = (Guchar *)s->getCString(), n = s->getLength(); n; ++p, --n) {
- if (*p == '(' || *p == ')' || *p == '\\') {
- writePSChar('\\');
- writePSChar((char)*p);
- } else if (*p < 0x20 || *p >= 0x80) {
- sprintf(buf, "\\%03o", *p);
- if (t3String) {
- t3String->append(buf);
- } else {
- (*outputFunc)(outputStream, buf, strlen(buf));
- }
- } else {
- writePSChar((char)*p);
- }
- }
- writePSChar(')');
-}
-
-void PSOutputDev::writePSName(char *s) {
- char *p;
- char c;
-
- p = s;
- while ((c = *p++)) {
- if (c <= (char)0x20 || c >= (char)0x7f ||
- c == '(' || c == ')' || c == '<' || c == '>' ||
- c == '[' || c == ']' || c == '{' || c == '}' ||
- c == '/' || c == '%') {
- writePSFmt("#%02x", c & 0xff);
- } else {
- writePSChar(c);
- }
- }
-}
-
-GString *PSOutputDev::filterPSName(GString *name) {
- GString *name2;
- char buf[8];
- int i;
- char c;
-
- name2 = new GString();
-
- // ghostscript chokes on names that begin with out-of-limits
- // numbers, e.g., 1e4foo is handled correctly (as a name), but
- // 1e999foo generates a limitcheck error
- c = name->getChar(0);
- if (c >= '0' && c <= '9') {
- name2->append('f');
- }
-
- for (i = 0; i < name->getLength(); ++i) {
- c = name->getChar(i);
- if (c <= (char)0x20 || c >= (char)0x7f ||
- c == '(' || c == ')' || c == '<' || c == '>' ||
- c == '[' || c == ']' || c == '{' || c == '}' ||
- c == '/' || c == '%') {
- sprintf(buf, "#%02x", c & 0xff);
- name2->append(buf);
- } else {
- name2->append(c);
- }
- }
- return name2;
-}
diff --git a/pdf/xpdf/PSOutputDev.h b/pdf/xpdf/PSOutputDev.h
deleted file mode 100644
index fed328a..0000000
--- a/pdf/xpdf/PSOutputDev.h
+++ /dev/null
@@ -1,314 +0,0 @@
-//========================================================================
-//
-// PSOutputDev.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PSOUTPUTDEV_H
-#define PSOUTPUTDEV_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stddef.h>
-#include "xpdfconfig.h"
-#include "Object.h"
-#include "GlobalParams.h"
-#include "OutputDev.h"
-
-class GfxPath;
-class GfxFont;
-class GfxColorSpace;
-class GfxSeparationColorSpace;
-class PDFRectangle;
-struct PSFont16Enc;
-class PSOutCustomColor;
-
-//------------------------------------------------------------------------
-// PSOutputDev
-//------------------------------------------------------------------------
-
-enum PSOutMode {
- psModePS,
- psModeEPS,
- psModeForm
-};
-
-enum PSFileType {
- psFile, // write to file
- psPipe, // write to pipe
- psStdout, // write to stdout
- psGeneric // write to a generic stream
-};
-
-typedef void (*PSOutputFunc)(void *stream, char *data, int len);
-
-class PSOutputDev: public OutputDev {
-public:
-
- // Open a PostScript output file, and write the prolog.
- PSOutputDev(char *fileName, XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA = 0, int imgLLYA = 0,
- int imgURXA = 0, int imgURYA = 0,
- GBool manualCtrlA = gFalse);
-
- // Open a PSOutputDev that will write to a generic stream.
- PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA,
- XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA = 0, int imgLLYA = 0,
- int imgURXA = 0, int imgURYA = 0,
- GBool manualCtrlA = gFalse);
-
- // Destructor -- writes the trailer and closes the file.
- virtual ~PSOutputDev();
-
- // 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 gFalse; }
-
- // Does this device use drawChar() or drawString()?
- virtual GBool useDrawChar() { return gFalse; }
-
- // Does this device use beginType3Char/endType3Char? Otherwise,
- // text in Type 3 fonts will be drawn with drawChar/drawString.
- virtual GBool interpretType3Chars() { return gFalse; }
-
- //----- header/trailer (used only if manualCtrl is true)
-
- // Write the document-level header.
- void writeHeader(int firstPage, int lastPage,
- PDFRectangle *mediaBox, PDFRectangle *cropBox);
-
- // Write the Xpdf procset.
- void writeXpdfProcset();
-
- // Write the document-level setup.
- void writeDocSetup(Catalog *catalog, int firstPage, int lastPage);
-
- // Write the setup for the current page.
- void writePageSetup();
-
- // Write the trailer for the current page.
- void writePageTrailer();
-
- // Write the document trailer.
- void writeTrailer();
-
- //----- initialization and control
-
- // Start a page.
- virtual void startPage(int pageNum, GfxState *state);
-
- // End a page.
- virtual void endPage();
-
- //----- save/restore graphics state
- virtual void saveState(GfxState *state);
- virtual void restoreState(GfxState *state);
-
- //----- update graphics 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);
- 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 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);
-
-#if OPI_SUPPORT
- //----- OPI functions
- virtual void opiBegin(GfxState *state, Dict *opiDict);
- virtual void opiEnd(GfxState *state, Dict *opiDict);
-#endif
-
- //----- 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);
-
- //----- miscellaneous
- void setOffset(double x, double y)
- { tx0 = x; ty0 = y; }
- void setScale(double x, double y)
- { xScale0 = x; yScale0 = y; }
- void setRotate(int rotateA)
- { rotate0 = rotateA; }
- void setClip(double llx, double lly, double urx, double ury)
- { clipLLX0 = llx; clipLLY0 = lly; clipURX0 = urx; clipURY0 = ury; }
- void setUnderlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
- void *data)
- { underlayCbk = cbk; underlayCbkData = data; }
- void setOverlayCbk(void (*cbk)(PSOutputDev *psOut, void *data),
- void *data)
- { overlayCbk = cbk; overlayCbkData = data; }
-
-private:
-
- void init(PSOutputFunc outputFuncA, void *outputStreamA,
- PSFileType fileTypeA, XRef *xrefA, Catalog *catalog,
- int firstPage, int lastPage, PSOutMode modeA,
- int imgLLXA, int imgLLYA, int imgURXA, int imgURYA,
- GBool manualCtrlA);
- void setupResources(Dict *resDict);
- void setupFonts(Dict *resDict);
- void setupFont(GfxFont *font, Dict *parentResDict);
- void setupEmbeddedType1Font(Ref *id, GString *psName);
- void setupExternalType1Font(GString *fileName, GString *psName);
- void setupEmbeddedType1CFont(GfxFont *font, Ref *id, GString *psName);
- void setupEmbeddedTrueTypeFont(GfxFont *font, Ref *id, GString *psName);
- void setupExternalTrueTypeFont(GfxFont *font, GString *psName);
- void setupEmbeddedCIDType0Font(GfxFont *font, Ref *id, GString *psName);
- void setupEmbeddedCIDTrueTypeFont(GfxFont *font, Ref *id, GString *psName);
- void setupType3Font(GfxFont *font, GString *psName, Dict *parentResDict);
- void setupImages(Dict *resDict);
- void setupImage(Ref id, Stream *str);
- void addProcessColor(double c, double m, double y, double k);
- void addCustomColor(GfxSeparationColorSpace *sepCS);
- void doPath(GfxPath *path);
- void doImageL1(Object *ref, GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len);
- void doImageL1Sep(GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len);
- void doImageL2(Object *ref, GfxImageColorMap *colorMap,
- GBool invert, GBool inlineImg,
- Stream *str, int width, int height, int len);
- void dumpColorSpaceL2(GfxColorSpace *colorSpace);
-#if OPI_SUPPORT
- void opiBegin20(GfxState *state, Dict *dict);
- void opiBegin13(GfxState *state, Dict *dict);
- void opiTransform(GfxState *state, double x0, double y0,
- double *x1, double *y1);
- GBool getFileSpec(Object *fileSpec, Object *fileName);
-#endif
- void writePSChar(char c);
- void writePS(char *s);
- void writePSFmt(const char *fmt, ...);
- void writePSString(GString *s);
- void writePSName(char *s);
- GString *filterPSName(GString *name);
-
- PSLevel level; // PostScript level (1, 2, separation)
- PSOutMode mode; // PostScript mode (PS, EPS, form)
- int paperWidth; // width of paper, in pts
- int paperHeight; // height of paper, in pts
- int imgLLX, imgLLY, // imageable area, in pts
- imgURX, imgURY;
-
- PSOutputFunc outputFunc;
- void *outputStream;
- PSFileType fileType; // file / pipe / stdout
- GBool manualCtrl;
- int seqPage; // current sequential page number
- void (*underlayCbk)(PSOutputDev *psOut, void *data);
- void *underlayCbkData;
- void (*overlayCbk)(PSOutputDev *psOut, void *data);
- void *overlayCbkData;
-
- XRef *xref; // the xref table for this PDF file
-
- Ref *fontIDs; // list of object IDs of all used fonts
- int fontIDLen; // number of entries in fontIDs array
- int fontIDSize; // size of fontIDs array
- Ref *fontFileIDs; // list of object IDs of all embedded fonts
- int fontFileIDLen; // number of entries in fontFileIDs array
- int fontFileIDSize; // size of fontFileIDs array
- GString **fontFileNames; // list of names of all embedded external fonts
- int fontFileNameLen; // number of entries in fontFileNames array
- int fontFileNameSize; // size of fontFileNames array
- int nextTrueTypeNum; // next unique number to append to a TrueType
- // font name
- PSFont16Enc *font16Enc; // encodings for substitute 16-bit fonts
- int font16EncLen; // number of entries in font16Enc array
- int font16EncSize; // size of font16Enc array
- GList *xobjStack; // stack of XObject dicts currently being
- // processed
- int numSaves; // current number of gsaves
-
- double tx0, ty0; // global translation
- double xScale0, yScale0; // global scaling
- int rotate0; // rotation angle (0, 90, 180, 270)
- double clipLLX0, clipLLY0,
- clipURX0, clipURY0;
- double tx, ty; // global translation for current page
- double xScale, yScale; // global scaling for current page
- int rotate; // rotation angle for current page
-
- GString *embFontList; // resource comments for embedded fonts
-
- int processColors; // used process colors
- PSOutCustomColor // used custom colors
- *customColors;
-
- GBool haveTextClip; // set if text has been drawn with a
- // clipping render mode
-
- GBool inType3Char; // inside a Type 3 CharProc
- GString *t3String; // Type 3 content string
- double t3WX, t3WY, // Type 3 character parameters
- t3LLX, t3LLY, t3URX, t3URY;
- GBool t3Cacheable; // cleared if char is not cacheable
-
-#if OPI_SUPPORT
- int opi13Nest; // nesting level of OPI 1.3 objects
- int opi20Nest; // nesting level of OPI 2.0 objects
-#endif
-
- GBool ok; // set up ok?
-
-
- friend class WinPDFPrinter;
-};
-
-#endif
diff --git a/pdf/xpdf/PSTokenizer.cc b/pdf/xpdf/PSTokenizer.cc
deleted file mode 100644
index a65c324..0000000
--- a/pdf/xpdf/PSTokenizer.cc
+++ /dev/null
@@ -1,135 +0,0 @@
-//========================================================================
-//
-// PSTokenizer.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include "PSTokenizer.h"
-
-//------------------------------------------------------------------------
-
-// A '1' in this array means the character is white space. A '1' or
-// '2' means the character ends a name or command.
-static char specialChars[256] = {
- 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, // 0x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
- 1, 0, 0, 0, 0, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 2, // 2x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, // 3x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 4x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 5x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 6x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, // 7x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ax
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // bx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // cx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // dx
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // ex
- 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 // fx
-};
-
-//------------------------------------------------------------------------
-
-PSTokenizer::PSTokenizer(int (*getCharFuncA)(void *), void *dataA) {
- getCharFunc = getCharFuncA;
- data = dataA;
- charBuf = -1;
-}
-
-PSTokenizer::~PSTokenizer() {
-}
-
-GBool PSTokenizer::getToken(char *buf, int size, int *length) {
- GBool comment, backslash;
- int c;
- int i;
-
- // skip whitespace and comments
- comment = gFalse;
- while (1) {
- if ((c = getChar()) == EOF) {
- buf[0] = '\0';
- *length = 0;
- return gFalse;
- }
- if (comment) {
- if (c == '\x0a' || c == '\x0d') {
- comment = gFalse;
- }
- } else if (c == '%') {
- comment = gTrue;
- } else if (specialChars[c] != 1) {
- break;
- }
- }
-
- // read a token
- i = 0;
- buf[i++] = c;
- if (c == '(') {
- backslash = gFalse;
- while ((c = lookChar()) != EOF) {
- if (i < size - 1) {
- buf[i++] = c;
- }
- getChar();
- if (c == '\\') {
- backslash = gTrue;
- } else if (!backslash && c == ')') {
- break;
- } else {
- backslash = gFalse;
- }
- }
- } else if (c == '<') {
- while ((c = lookChar()) != EOF) {
- getChar();
- if (i < size - 1) {
- buf[i++] = c;
- }
- if (c == '>') {
- break;
- }
- }
- } else if (c != '[' && c != ']') {
- while ((c = lookChar()) != EOF && !specialChars[c]) {
- getChar();
- if (i < size - 1) {
- buf[i++] = c;
- }
- }
- }
- buf[i] = '\0';
- *length = i;
-
- return gTrue;
-}
-
-int PSTokenizer::lookChar() {
- if (charBuf < 0) {
- charBuf = (*getCharFunc)(data);
- }
- return charBuf;
-}
-
-int PSTokenizer::getChar() {
- int c;
-
- if (charBuf < 0) {
- charBuf = (*getCharFunc)(data);
- }
- c = charBuf;
- charBuf = -1;
- return c;
-}
diff --git a/pdf/xpdf/PSTokenizer.h b/pdf/xpdf/PSTokenizer.h
deleted file mode 100644
index 4d5ee97..0000000
--- a/pdf/xpdf/PSTokenizer.h
+++ /dev/null
@@ -1,41 +0,0 @@
-//========================================================================
-//
-// PSTokenizer.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PSTOKENIZER_H
-#define PSTOKENIZER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-
-//------------------------------------------------------------------------
-
-class PSTokenizer {
-public:
-
- PSTokenizer(int (*getCharFuncA)(void *), void *dataA);
- ~PSTokenizer();
-
- // Get the next PostScript token. Returns false at end-of-stream.
- GBool getToken(char *buf, int size, int *length);
-
-private:
-
- int lookChar();
- int getChar();
-
- int (*getCharFunc)(void *);
- void *data;
- int charBuf;
-};
-
-#endif
diff --git a/pdf/xpdf/Page.cc b/pdf/xpdf/Page.cc
deleted file mode 100644
index 817e1d5..0000000
--- a/pdf/xpdf/Page.cc
+++ /dev/null
@@ -1,370 +0,0 @@
-//========================================================================
-//
-// Page.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include "GlobalParams.h"
-#include "Object.h"
-#include "Array.h"
-#include "Dict.h"
-#include "XRef.h"
-#include "Link.h"
-#include "OutputDev.h"
-#ifndef PDF_PARSER_ONLY
-#include "Gfx.h"
-#include "Annot.h"
-#endif
-#include "Error.h"
-#include "Page.h"
-
-//------------------------------------------------------------------------
-// PageAttrs
-//------------------------------------------------------------------------
-
-PageAttrs::PageAttrs(PageAttrs *attrs, Dict *dict) {
- Object obj1;
- double w, h;
-
- // get old/default values
- if (attrs) {
- mediaBox = attrs->mediaBox;
- cropBox = attrs->cropBox;
- haveCropBox = attrs->haveCropBox;
- rotate = attrs->rotate;
- attrs->resources.copy(&resources);
- } else {
- // set default MediaBox to 8.5" x 11" -- this shouldn't be necessary
- // but some (non-compliant) PDF files don't specify a MediaBox
- mediaBox.x1 = 0;
- mediaBox.y1 = 0;
- mediaBox.x2 = 612;
- mediaBox.y2 = 792;
- cropBox.x1 = cropBox.y1 = cropBox.x2 = cropBox.y2 = 0;
- haveCropBox = gFalse;
- rotate = 0;
- resources.initNull();
- }
-
- // media box
- readBox(dict, "MediaBox", &mediaBox);
-
- // crop box
- if (readBox(dict, "CropBox", &cropBox)) {
- haveCropBox = gTrue;
- }
- if (!haveCropBox) {
- cropBox = mediaBox;
- }
-
- // if the MediaBox is excessively larger than the CropBox,
- // just use the CropBox
- limitToCropBox = gFalse;
- if (haveCropBox) {
- w = 0.25 * (cropBox.x2 - cropBox.x1);
- h = 0.25 * (cropBox.y2 - cropBox.y1);
- if ((cropBox.x1 - mediaBox.x1) + (mediaBox.x2 - cropBox.x2) > w ||
- (cropBox.y1 - mediaBox.y1) + (mediaBox.y2 - cropBox.y2) > h) {
- limitToCropBox = gTrue;
- }
- }
-
- // other boxes
- bleedBox = cropBox;
- readBox(dict, "BleedBox", &bleedBox);
- trimBox = cropBox;
- readBox(dict, "TrimBox", &trimBox);
- artBox = cropBox;
- readBox(dict, "ArtBox", &artBox);
-
- // rotate
- dict->lookup("Rotate", &obj1);
- if (obj1.isInt()) {
- rotate = obj1.getInt();
- }
- obj1.free();
- while (rotate < 0) {
- rotate += 360;
- }
- while (rotate >= 360) {
- rotate -= 360;
- }
-
- // misc attributes
- dict->lookup("LastModified", &lastModified);
- dict->lookup("BoxColorInfo", &boxColorInfo);
- dict->lookup("Group", &group);
- dict->lookup("Metadata", &metadata);
- dict->lookup("PieceInfo", &pieceInfo);
- dict->lookup("SeparationInfo", &separationInfo);
-
- // resource dictionary
- dict->lookup("Resources", &obj1);
- if (obj1.isDict()) {
- resources.free();
- obj1.copy(&resources);
- }
- obj1.free();
-}
-
-PageAttrs::~PageAttrs() {
- lastModified.free();
- boxColorInfo.free();
- group.free();
- metadata.free();
- pieceInfo.free();
- separationInfo.free();
- resources.free();
-}
-
-GBool PageAttrs::readBox(Dict *dict, char *key, PDFRectangle *box) {
- PDFRectangle tmp;
- Object obj1, obj2;
- GBool ok;
-
- dict->lookup(key, &obj1);
- if (obj1.isArray() && obj1.arrayGetLength() == 4) {
- ok = gTrue;
- obj1.arrayGet(0, &obj2);
- if (obj2.isNum()) {
- tmp.x1 = obj2.getNum();
- } else {
- ok = gFalse;
- }
- obj2.free();
- obj1.arrayGet(1, &obj2);
- if (obj2.isNum()) {
- tmp.y1 = obj2.getNum();
- } else {
- ok = gFalse;
- }
- obj2.free();
- obj1.arrayGet(2, &obj2);
- if (obj2.isNum()) {
- tmp.x2 = obj2.getNum();
- } else {
- ok = gFalse;
- }
- obj2.free();
- obj1.arrayGet(3, &obj2);
- if (obj2.isNum()) {
- tmp.y2 = obj2.getNum();
- } else {
- ok = gFalse;
- }
- obj2.free();
- if (ok) {
- *box = tmp;
- }
- } else {
- ok = gFalse;
- }
- obj1.free();
- return ok;
-}
-
-//------------------------------------------------------------------------
-// Page
-//------------------------------------------------------------------------
-
-Page::Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA) {
- ok = gTrue;
- xref = xrefA;
- num = numA;
-
- // get attributes
- attrs = attrsA;
-
- // annotations
- pageDict->lookupNF("Annots", &annots);
- if (!(annots.isRef() || annots.isArray() || annots.isNull())) {
- error(-1, "Page annotations object (page %d) is wrong type (%s)",
- num, annots.getTypeName());
- annots.free();
- goto err2;
- }
-
- // contents
- pageDict->lookupNF("Contents", &contents);
- if (!(contents.isRef() || contents.isArray() ||
- contents.isNull())) {
- error(-1, "Page contents object (page %d) is wrong type (%s)",
- num, contents.getTypeName());
- contents.free();
- goto err1;
- }
-
- // thumb
- pageDict->lookupNF("Thumb", &thumb);
- if (!(thumb.isStream() || thumb.isNull() || thumb.isRef())) {
- error(-1, "Page thumb object (page %d) is wrong type (%s)",
- num, thumb.getTypeName());
- thumb.initNull();
- }
-
- return;
-
- err2:
- annots.initNull();
- err1:
- contents.initNull();
- ok = gFalse;
-}
-
-Page::~Page() {
- delete attrs;
- annots.free();
- contents.free();
-}
-
-void Page::display(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
- Links *links, Catalog *catalog,
- GBool (*abortCheckCbk)(void *data),
- void *abortCheckCbkData,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
- void *annotDisplayDecideCbkData) {
- displaySlice(out, hDPI, vDPI, rotate, crop, -1, -1, -1, -1, links, catalog,
- abortCheckCbk, abortCheckCbkData,
- annotDisplayDecideCbk, annotDisplayDecideCbkData);
-}
-
-void Page::displaySlice(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
- int sliceX, int sliceY, int sliceW, int sliceH,
- Links *links, Catalog *catalog,
- GBool (*abortCheckCbk)(void *data),
- void *abortCheckCbkData,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data),
- void *annotDisplayDecideCbkData) {
-#ifndef PDF_PARSER_ONLY
- PDFRectangle *mediaBox, *cropBox;
- PDFRectangle box;
- Gfx *gfx;
- Object obj;
- Link *link;
- Annots *annotList;
- double kx, ky;
- int i;
-
- rotate += getRotate();
- if (rotate >= 360) {
- rotate -= 360;
- } else if (rotate < 0) {
- rotate += 360;
- }
-
- mediaBox = getBox();
- if (sliceW >= 0 && sliceH >= 0) {
- kx = 72.0 / hDPI;
- ky = 72.0 / vDPI;
- if (rotate == 90) {
- if (out->upsideDown()) {
- box.x1 = mediaBox->x1 + ky * sliceY;
- box.x2 = mediaBox->x1 + ky * (sliceY + sliceH);
- } else {
- box.x1 = mediaBox->x2 - ky * (sliceY + sliceH);
- box.x2 = mediaBox->x2 - ky * sliceY;
- }
- box.y1 = mediaBox->y1 + kx * sliceX;
- box.y2 = mediaBox->y1 + kx * (sliceX + sliceW);
- } else if (rotate == 180) {
- box.x1 = mediaBox->x2 - kx * (sliceX + sliceW);
- box.x2 = mediaBox->x2 - kx * sliceX;
- if (out->upsideDown()) {
- box.y1 = mediaBox->y1 + ky * sliceY;
- box.y2 = mediaBox->y1 + ky * (sliceY + sliceH);
- } else {
- box.y1 = mediaBox->y2 - ky * (sliceY + sliceH);
- box.y2 = mediaBox->y2 - ky * sliceY;
- }
- } else if (rotate == 270) {
- if (out->upsideDown()) {
- box.x1 = mediaBox->x2 - ky * (sliceY + sliceH);
- box.x2 = mediaBox->x2 - ky * sliceY;
- } else {
- box.x1 = mediaBox->x1 + ky * sliceY;
- box.x2 = mediaBox->x1 + ky * (sliceY + sliceH);
- }
- box.y1 = mediaBox->y2 - kx * (sliceX + sliceW);
- box.y2 = mediaBox->y2 - kx * sliceX;
- } else {
- box.x1 = mediaBox->x1 + kx * sliceX;
- box.x2 = mediaBox->x1 + kx * (sliceX + sliceW);
- if (out->upsideDown()) {
- box.y1 = mediaBox->y2 - ky * (sliceY + sliceH);
- box.y2 = mediaBox->y2 - ky * sliceY;
- } else {
- box.y1 = mediaBox->y1 + ky * sliceY;
- box.y2 = mediaBox->y1 + ky * (sliceY + sliceH);
- }
- }
- } else {
- box = *mediaBox;
- }
- cropBox = getCropBox();
-
- if (globalParams->getPrintCommands()) {
- printf("***** MediaBox = ll:%g,%g ur:%g,%g\n",
- box.x1, box.y1, box.x2, box.y2);
- if (isCropped()) {
- printf("***** CropBox = ll:%g,%g ur:%g,%g\n",
- cropBox->x1, cropBox->y1, cropBox->x2, cropBox->y2);
- }
- printf("***** Rotate = %d\n", attrs->getRotate());
- }
-
- gfx = new Gfx(xref, out, num, attrs->getResourceDict(),
- hDPI, vDPI, &box, crop && isCropped(), cropBox, rotate,
- abortCheckCbk, abortCheckCbkData);
- contents.fetch(xref, &obj);
- if (!obj.isNull()) {
- gfx->saveState();
- gfx->display(&obj);
- gfx->restoreState();
- }
- obj.free();
-
- // draw links
- if (links) {
- gfx->saveState();
- for (i = 0; i < links->getNumLinks(); ++i) {
- link = links->getLink(i);
- out->drawLink(link, catalog);
- }
- gfx->restoreState();
- out->dump();
- }
-
- // draw non-link annotations
- annotList = new Annots(xref, annots.fetch(xref, &obj));
- obj.free();
-#ifdef USE_ANNOTS_VIEW
- if (annotList->getNumAnnots() > 0) {
- if (globalParams->getPrintCommands()) {
- printf("***** Annotations\n");
- }
- for (i = 0; i < annotList->getNumAnnots(); ++i) {
- Annot *annot = annotList->getAnnot(i);
- if ((annotDisplayDecideCbk &&
- (*annotDisplayDecideCbk)(annot, annotDisplayDecideCbkData)) ||
- !annotDisplayDecideCbk)
- annot->draw(gfx);
- }
- out->dump();
- }
-#endif
- delete annotList;
-
- delete gfx;
-#endif
-}
diff --git a/pdf/xpdf/Page.h b/pdf/xpdf/Page.h
deleted file mode 100644
index ab6442c..0000000
--- a/pdf/xpdf/Page.h
+++ /dev/null
@@ -1,178 +0,0 @@
-//========================================================================
-//
-// Page.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PAGE_H
-#define PAGE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Object.h"
-
-class Dict;
-class XRef;
-class OutputDev;
-class Links;
-class Catalog;
-class Annots;
-class Annot;
-
-//------------------------------------------------------------------------
-
-class PDFRectangle {
-public:
- double x1, y1, x2, y2;
-
- PDFRectangle() { x1 = y1 = x2 = y2 = 0; }
- PDFRectangle(double x1A, double y1A, double x2A, double y2A)
- { x1 = x1A; y1 = y1A; x2 = x2A; y2 = y2A; }
- GBool isValid() { return x1 != 0 || y1 != 0 || x2 != 0 || y2 != 0; }
-};
-
-//------------------------------------------------------------------------
-// PageAttrs
-//------------------------------------------------------------------------
-
-class PageAttrs {
-public:
-
- // Construct a new PageAttrs object by merging a dictionary
- // (of type Pages or Page) into another PageAttrs object. If
- // <attrs> is NULL, uses defaults.
- PageAttrs(PageAttrs *attrs, Dict *dict);
-
- // Destructor.
- ~PageAttrs();
-
- // Accessors.
- PDFRectangle *getBox() { return limitToCropBox ? &cropBox : &mediaBox; }
- PDFRectangle *getMediaBox() { return &mediaBox; }
- PDFRectangle *getCropBox() { return &cropBox; }
- GBool isCropped() { return haveCropBox; }
- PDFRectangle *getBleedBox() { return &bleedBox; }
- PDFRectangle *getTrimBox() { return &trimBox; }
- PDFRectangle *getArtBox() { return &artBox; }
- int getRotate() { return rotate; }
- GString *getLastModified()
- { return lastModified.isString()
- ? lastModified.getString() : (GString *)NULL; }
- Dict *getBoxColorInfo()
- { return boxColorInfo.isDict() ? boxColorInfo.getDict() : (Dict *)NULL; }
- Dict *getGroup()
- { return group.isDict() ? group.getDict() : (Dict *)NULL; }
- Stream *getMetadata()
- { return metadata.isStream() ? metadata.getStream() : (Stream *)NULL; }
- Dict *getPieceInfo()
- { return pieceInfo.isDict() ? pieceInfo.getDict() : (Dict *)NULL; }
- Dict *getSeparationInfo()
- { return separationInfo.isDict()
- ? separationInfo.getDict() : (Dict *)NULL; }
- Dict *getResourceDict()
- { return resources.isDict() ? resources.getDict() : (Dict *)NULL; }
-
-private:
-
- GBool readBox(Dict *dict, char *key, PDFRectangle *box);
-
- PDFRectangle mediaBox;
- PDFRectangle cropBox;
- GBool haveCropBox;
- GBool limitToCropBox;
- PDFRectangle bleedBox;
- PDFRectangle trimBox;
- PDFRectangle artBox;
- int rotate;
- Object lastModified;
- Object boxColorInfo;
- Object group;
- Object metadata;
- Object pieceInfo;
- Object separationInfo;
- Object resources;
-};
-
-//------------------------------------------------------------------------
-// Page
-//------------------------------------------------------------------------
-
-class Page {
-public:
-
- // Constructor.
- Page(XRef *xrefA, int numA, Dict *pageDict, PageAttrs *attrsA);
-
- // Destructor.
- ~Page();
-
- // Is page valid?
- GBool isOk() { return ok; }
-
- // Get page parameters.
- PDFRectangle *getBox() { return attrs->getBox(); }
- PDFRectangle *getMediaBox() { return attrs->getMediaBox(); }
- PDFRectangle *getCropBox() { return attrs->getCropBox(); }
- GBool isCropped() { return attrs->isCropped(); }
- double getWidth() { return attrs->getBox()->x2 - attrs->getBox()->x1; }
- double getHeight() { return attrs->getBox()->y2 - attrs->getBox()->y1; }
- PDFRectangle *getBleedBox() { return attrs->getBleedBox(); }
- PDFRectangle *getTrimBox() { return attrs->getTrimBox(); }
- PDFRectangle *getArtBox() { return attrs->getArtBox(); }
- int getRotate() { return attrs->getRotate(); }
- GString *getLastModified() { return attrs->getLastModified(); }
- Dict *getBoxColorInfo() { return attrs->getBoxColorInfo(); }
- Dict *getGroup() { return attrs->getGroup(); }
- Stream *getMetadata() { return attrs->getMetadata(); }
- Dict *getPieceInfo() { return attrs->getPieceInfo(); }
- Dict *getSeparationInfo() { return attrs->getSeparationInfo(); }
-
- // Get resource dictionary.
- Dict *getResourceDict() { return attrs->getResourceDict(); }
-
- // Get annotations array.
- Object *getAnnots(Object *obj) { return annots.fetch(xref, obj); }
-
- // Get contents.
- Object *getContents(Object *obj) { return contents.fetch(xref, obj); }
-
- // Get thumb.
- Object *getThumb(Object *obj) { return thumb.fetch(xref, obj); }
-
- // Display a page.
- void display(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
- Links *links, Catalog *catalog,
- GBool (*abortCheckCbk)(void *data) = NULL,
- void *abortCheckCbkData = NULL,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
- void *annotDisplayDecideCbkData = NULL);
-
- // Display part of a page.
- void displaySlice(OutputDev *out, double hDPI, double vDPI,
- int rotate, GBool crop,
- int sliceX, int sliceY, int sliceW, int sliceH,
- Links *links, Catalog *catalog,
- GBool (*abortCheckCbk)(void *data) = NULL,
- void *abortCheckCbkData = NULL,
- GBool (*annotDisplayDecideCbk)(Annot *annot, void *user_data) = NULL,
- void *annotDisplayDecideCbkData = NULL);
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- int num; // page number
- PageAttrs *attrs; // page attributes
- Object annots; // annotations array
- Object contents; // page contents
- Object thumb; // page thumbnail
- GBool ok; // true if page is valid
-};
-
-#endif
diff --git a/pdf/xpdf/Parser.cc b/pdf/xpdf/Parser.cc
deleted file mode 100644
index 0aa66d3..0000000
--- a/pdf/xpdf/Parser.cc
+++ /dev/null
@@ -1,231 +0,0 @@
-//========================================================================
-//
-// Parser.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stddef.h>
-#include "Object.h"
-#include "Array.h"
-#include "Dict.h"
-#include "Parser.h"
-#include "XRef.h"
-#include "Error.h"
-#ifndef NO_DECRYPTION
-#include "Decrypt.h"
-#endif
-
-Parser::Parser(XRef *xrefA, Lexer *lexerA) {
- xref = xrefA;
- lexer = lexerA;
- inlineImg = 0;
- lexer->getObj(&buf1);
- lexer->getObj(&buf2);
-}
-
-Parser::~Parser() {
- buf1.free();
- buf2.free();
- delete lexer;
-}
-
-#ifndef NO_DECRYPTION
-Object *Parser::getObj(Object *obj,
- Guchar *fileKey, int keyLength,
- int objNum, int objGen) {
-#else
-Object *Parser::getObj(Object *obj) {
-#endif
- char *key;
- Stream *str;
- Object obj2;
- int num;
-#ifndef NO_DECRYPTION
- Decrypt *decrypt;
- GString *s;
- char *p;
- int i;
-#endif
-
- // refill buffer after inline image data
- if (inlineImg == 2) {
- buf1.free();
- buf2.free();
- lexer->getObj(&buf1);
- lexer->getObj(&buf2);
- inlineImg = 0;
- }
-
- // array
- if (buf1.isCmd("[")) {
- shift();
- obj->initArray(xref);
- while (!buf1.isCmd("]") && !buf1.isEOF())
-#ifndef NO_DECRYPTION
- obj->arrayAdd(getObj(&obj2, fileKey, keyLength, objNum, objGen));
-#else
- obj->arrayAdd(getObj(&obj2));
-#endif
- if (buf1.isEOF())
- error(getPos(), "End of file inside array");
- shift();
-
- // dictionary or stream
- } else if (buf1.isCmd("<<")) {
- shift();
- obj->initDict(xref);
- while (!buf1.isCmd(">>") && !buf1.isEOF()) {
- if (!buf1.isName()) {
- error(getPos(), "Dictionary key must be a name object");
- shift();
- } else {
- key = copyString(buf1.getName());
- shift();
- if (buf1.isEOF() || buf1.isError()) {
- gfree(key);
- break;
- }
-#ifndef NO_DECRYPTION
- obj->dictAdd(key, getObj(&obj2, fileKey, keyLength, objNum, objGen));
-#else
- obj->dictAdd(key, getObj(&obj2));
-#endif
- }
- }
- if (buf1.isEOF())
- error(getPos(), "End of file inside dictionary");
- if (buf2.isCmd("stream")) {
- if ((str = makeStream(obj))) {
- obj->initStream(str);
-#ifndef NO_DECRYPTION
- if (fileKey) {
- str->getBaseStream()->doDecryption(fileKey, keyLength,
- objNum, objGen);
- }
-#endif
- } else {
- obj->free();
- obj->initError();
- }
- } else {
- shift();
- }
-
- // indirect reference or integer
- } else if (buf1.isInt()) {
- num = buf1.getInt();
- shift();
- if (buf1.isInt() && buf2.isCmd("R")) {
- obj->initRef(num, buf1.getInt());
- shift();
- shift();
- } else {
- obj->initInt(num);
- }
-
-#ifndef NO_DECRYPTION
- // string
- } else if (buf1.isString() && fileKey) {
- buf1.copy(obj);
- s = obj->getString();
- decrypt = new Decrypt(fileKey, keyLength, objNum, objGen);
- for (i = 0, p = obj->getString()->getCString();
- i < s->getLength();
- ++i, ++p) {
- *p = decrypt->decryptByte(*p);
- }
- delete decrypt;
- shift();
-#endif
-
- // simple object
- } else {
- buf1.copy(obj);
- shift();
- }
-
- return obj;
-}
-
-Stream *Parser::makeStream(Object *dict) {
- Object obj;
- Stream *str;
- Guint pos, endPos, length;
-
- // get stream start position
- lexer->skipToNextLine();
- pos = lexer->getPos();
-
- // get length
- dict->dictLookup("Length", &obj);
- if (obj.isInt()) {
- length = (Guint)obj.getInt();
- obj.free();
- } else {
- error(getPos(), "Bad 'Length' attribute in stream");
- obj.free();
- return NULL;
- }
-
- // check for length in damaged file
- if (xref && xref->getStreamEnd(pos, &endPos)) {
- length = endPos - pos;
- }
-
- // in badly damaged PDF files, we can run off the end of the input
- // stream immediately after the "stream" token
- if (!lexer->getStream()) {
- return NULL;
- }
-
- // make base stream
- str = lexer->getStream()->getBaseStream()->makeSubStream(pos, gTrue,
- length, dict);
-
- // get filters
- str = str->addFilters(dict);
-
- // skip over stream data
- lexer->setPos(pos + length);
-
- // refill token buffers and check for 'endstream'
- shift(); // kill '>>'
- shift(); // kill 'stream'
- if (buf1.isCmd("endstream")) {
- shift();
- } else {
- error(getPos(), "Missing 'endstream'");
- str->ignoreLength();
- }
-
- return str;
-}
-
-void Parser::shift() {
- if (inlineImg > 0) {
- if (inlineImg < 2) {
- ++inlineImg;
- } else {
- // in a damaged content stream, if 'ID' shows up in the middle
- // of a dictionary, we need to reset
- inlineImg = 0;
- }
- } else if (buf2.isCmd("ID")) {
- lexer->skipChar(); // skip char after 'ID' command
- inlineImg = 1;
- }
- buf1.free();
- buf1 = buf2;
- if (inlineImg > 0) // don't buffer inline image data
- buf2.initNull();
- else
- lexer->getObj(&buf2);
-}
diff --git a/pdf/xpdf/Parser.h b/pdf/xpdf/Parser.h
deleted file mode 100644
index 3bc3ab2..0000000
--- a/pdf/xpdf/Parser.h
+++ /dev/null
@@ -1,60 +0,0 @@
-//========================================================================
-//
-// Parser.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef PARSER_H
-#define PARSER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "Lexer.h"
-
-//------------------------------------------------------------------------
-// Parser
-//------------------------------------------------------------------------
-
-class Parser {
-public:
-
- // Constructor.
- Parser(XRef *xrefA, Lexer *lexerA);
-
- // Destructor.
- ~Parser();
-
- // Get the next object from the input stream.
-#ifndef NO_DECRYPTION
- Object *getObj(Object *obj,
- Guchar *fileKey = NULL, int keyLength = 0,
- int objNum = 0, int objGen = 0);
-#else
- Object *getObj(Object *obj);
-#endif
-
- // Get stream.
- Stream *getStream() { return lexer->getStream(); }
-
- // Get current position in file.
- int getPos() { return lexer->getPos(); }
-
-private:
-
- XRef *xref; // the xref table for this PDF file
- Lexer *lexer; // input stream
- Object buf1, buf2; // next two tokens
- int inlineImg; // set when inline image data is encountered
-
- Stream *makeStream(Object *dict);
- void shift();
-};
-
-#endif
-
diff --git a/pdf/xpdf/SplashOutputDev.cc b/pdf/xpdf/SplashOutputDev.cc
deleted file mode 100644
index 58da12c..0000000
--- a/pdf/xpdf/SplashOutputDev.cc
+++ /dev/null
@@ -1,1348 +0,0 @@
-//========================================================================
-//
-// SplashOutputDev.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <string.h>
-#include <math.h>
-#include "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 "FoFiTrueType.h"
-#include "SplashBitmap.h"
-#include "SplashGlyphBitmap.h"
-#include "SplashPattern.h"
-#include "SplashScreen.h"
-#include "SplashPath.h"
-#include "SplashState.h"
-#include "SplashErrorCodes.h"
-#include "SplashFontEngine.h"
-#include "SplashFont.h"
-#include "SplashFontFile.h"
-#include "SplashFontFileID.h"
-#include "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:
- case splashModeRGB8Packed: 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:
- case splashModeRGB8Packed:
- 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;
- GString *tmpFileName, *fileName, *substName;
- FILE *tmpFile;
- Gushort *codeToGID;
- DisplayFontParam *dfp;
- double m11, m12, m21, m22, w1, w2;
- SplashCoord mat[4];
- char *name;
- int c, substIdx, n, code;
-
- needFontUpdate = gFalse;
- font = NULL;
- tmpFileName = NULL;
- substIdx = -1;
-
- 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
- dfp = NULL;
- 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 GString(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:
- 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:
- case splashModeRGB8Packed:
- 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(GString *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 --git a/pdf/xpdf/SplashOutputDev.h b/pdf/xpdf/SplashOutputDev.h
deleted file mode 100644
index b2ecfea..0000000
--- a/pdf/xpdf/SplashOutputDev.h
+++ /dev/null
@@ -1,196 +0,0 @@
-//========================================================================
-//
-// SplashOutputDev.h
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef SPLASHOUTPUTDEV_H
-#define SPLASHOUTPUTDEV_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "SplashTypes.h"
-#include "xpdfconfig.h"
-#include "OutputDev.h"
-
-class GfxState;
-class GfxPath;
-class Gfx8BitFont;
-class SplashBitmap;
-class Splash;
-class SplashPath;
-class SplashPattern;
-class SplashFontEngine;
-class SplashFont;
-class T3FontCache;
-class XRef;
-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(GString *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
diff --git a/pdf/xpdf/Stream-CCITT.h b/pdf/xpdf/Stream-CCITT.h
deleted file mode 100644
index c4458fe..0000000
--- a/pdf/xpdf/Stream-CCITT.h
+++ /dev/null
@@ -1,459 +0,0 @@
-//========================================================================
-//
-// Stream-CCITT.h
-//
-// Tables for CCITT Fax decoding.
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-struct CCITTCode {
- short bits;
- short n;
-};
-
-#define ccittEOL -2
-
-//------------------------------------------------------------------------
-// 2D codes
-//------------------------------------------------------------------------
-
-#define twoDimPass 0
-#define twoDimHoriz 1
-#define twoDimVert0 2
-#define twoDimVertR1 3
-#define twoDimVertL1 4
-#define twoDimVertR2 5
-#define twoDimVertL2 6
-#define twoDimVertR3 7
-#define twoDimVertL3 8
-
-// 1-7 bit codes
-static CCITTCode twoDimTab1[128] = {
- {-1, -1}, {-1, -1}, // 000000x
- {7, twoDimVertL3}, // 0000010
- {7, twoDimVertR3}, // 0000011
- {6, twoDimVertL2}, {6, twoDimVertL2}, // 000010x
- {6, twoDimVertR2}, {6, twoDimVertR2}, // 000011x
- {4, twoDimPass}, {4, twoDimPass}, // 0001xxx
- {4, twoDimPass}, {4, twoDimPass},
- {4, twoDimPass}, {4, twoDimPass},
- {4, twoDimPass}, {4, twoDimPass},
- {3, twoDimHoriz}, {3, twoDimHoriz}, // 001xxxx
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimHoriz}, {3, twoDimHoriz},
- {3, twoDimVertL1}, {3, twoDimVertL1}, // 010xxxx
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertL1}, {3, twoDimVertL1},
- {3, twoDimVertR1}, {3, twoDimVertR1}, // 011xxxx
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {3, twoDimVertR1}, {3, twoDimVertR1},
- {1, twoDimVert0}, {1, twoDimVert0}, // 1xxxxxx
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0},
- {1, twoDimVert0}, {1, twoDimVert0}
-};
-
-//------------------------------------------------------------------------
-// white run lengths
-//------------------------------------------------------------------------
-
-// 11-12 bit codes (upper 7 bits are 0)
-static CCITTCode whiteTab1[32] = {
- {-1, -1}, // 00000
- {12, ccittEOL}, // 00001
- {-1, -1}, {-1, -1}, // 0001x
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 001xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 010xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 011xx
- {11, 1792}, {11, 1792}, // 1000x
- {12, 1984}, // 10010
- {12, 2048}, // 10011
- {12, 2112}, // 10100
- {12, 2176}, // 10101
- {12, 2240}, // 10110
- {12, 2304}, // 10111
- {11, 1856}, {11, 1856}, // 1100x
- {11, 1920}, {11, 1920}, // 1101x
- {12, 2368}, // 11100
- {12, 2432}, // 11101
- {12, 2496}, // 11110
- {12, 2560} // 11111
-};
-
-// 1-9 bit codes
-static CCITTCode whiteTab2[512] = {
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000000xx
- {8, 29}, {8, 29}, // 00000010x
- {8, 30}, {8, 30}, // 00000011x
- {8, 45}, {8, 45}, // 00000100x
- {8, 46}, {8, 46}, // 00000101x
- {7, 22}, {7, 22}, {7, 22}, {7, 22}, // 0000011xx
- {7, 23}, {7, 23}, {7, 23}, {7, 23}, // 0000100xx
- {8, 47}, {8, 47}, // 00001010x
- {8, 48}, {8, 48}, // 00001011x
- {6, 13}, {6, 13}, {6, 13}, {6, 13}, // 000011xxx
- {6, 13}, {6, 13}, {6, 13}, {6, 13},
- {7, 20}, {7, 20}, {7, 20}, {7, 20}, // 0001000xx
- {8, 33}, {8, 33}, // 00010010x
- {8, 34}, {8, 34}, // 00010011x
- {8, 35}, {8, 35}, // 00010100x
- {8, 36}, {8, 36}, // 00010101x
- {8, 37}, {8, 37}, // 00010110x
- {8, 38}, {8, 38}, // 00010111x
- {7, 19}, {7, 19}, {7, 19}, {7, 19}, // 0001100xx
- {8, 31}, {8, 31}, // 00011010x
- {8, 32}, {8, 32}, // 00011011x
- {6, 1}, {6, 1}, {6, 1}, {6, 1}, // 000111xxx
- {6, 1}, {6, 1}, {6, 1}, {6, 1},
- {6, 12}, {6, 12}, {6, 12}, {6, 12}, // 001000xxx
- {6, 12}, {6, 12}, {6, 12}, {6, 12},
- {8, 53}, {8, 53}, // 00100100x
- {8, 54}, {8, 54}, // 00100101x
- {7, 26}, {7, 26}, {7, 26}, {7, 26}, // 0010011xx
- {8, 39}, {8, 39}, // 00101000x
- {8, 40}, {8, 40}, // 00101001x
- {8, 41}, {8, 41}, // 00101010x
- {8, 42}, {8, 42}, // 00101011x
- {8, 43}, {8, 43}, // 00101100x
- {8, 44}, {8, 44}, // 00101101x
- {7, 21}, {7, 21}, {7, 21}, {7, 21}, // 0010111xx
- {7, 28}, {7, 28}, {7, 28}, {7, 28}, // 0011000xx
- {8, 61}, {8, 61}, // 00110010x
- {8, 62}, {8, 62}, // 00110011x
- {8, 63}, {8, 63}, // 00110100x
- {8, 0}, {8, 0}, // 00110101x
- {8, 320}, {8, 320}, // 00110110x
- {8, 384}, {8, 384}, // 00110111x
- {5, 10}, {5, 10}, {5, 10}, {5, 10}, // 00111xxxx
- {5, 10}, {5, 10}, {5, 10}, {5, 10},
- {5, 10}, {5, 10}, {5, 10}, {5, 10},
- {5, 10}, {5, 10}, {5, 10}, {5, 10},
- {5, 11}, {5, 11}, {5, 11}, {5, 11}, // 01000xxxx
- {5, 11}, {5, 11}, {5, 11}, {5, 11},
- {5, 11}, {5, 11}, {5, 11}, {5, 11},
- {5, 11}, {5, 11}, {5, 11}, {5, 11},
- {7, 27}, {7, 27}, {7, 27}, {7, 27}, // 0100100xx
- {8, 59}, {8, 59}, // 01001010x
- {8, 60}, {8, 60}, // 01001011x
- {9, 1472}, // 010011000
- {9, 1536}, // 010011001
- {9, 1600}, // 010011010
- {9, 1728}, // 010011011
- {7, 18}, {7, 18}, {7, 18}, {7, 18}, // 0100111xx
- {7, 24}, {7, 24}, {7, 24}, {7, 24}, // 0101000xx
- {8, 49}, {8, 49}, // 01010010x
- {8, 50}, {8, 50}, // 01010011x
- {8, 51}, {8, 51}, // 01010100x
- {8, 52}, {8, 52}, // 01010101x
- {7, 25}, {7, 25}, {7, 25}, {7, 25}, // 0101011xx
- {8, 55}, {8, 55}, // 01011000x
- {8, 56}, {8, 56}, // 01011001x
- {8, 57}, {8, 57}, // 01011010x
- {8, 58}, {8, 58}, // 01011011x
- {6, 192}, {6, 192}, {6, 192}, {6, 192}, // 010111xxx
- {6, 192}, {6, 192}, {6, 192}, {6, 192},
- {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664}, // 011000xxx
- {6, 1664}, {6, 1664}, {6, 1664}, {6, 1664},
- {8, 448}, {8, 448}, // 01100100x
- {8, 512}, {8, 512}, // 01100101x
- {9, 704}, // 011001100
- {9, 768}, // 011001101
- {8, 640}, {8, 640}, // 01100111x
- {8, 576}, {8, 576}, // 01101000x
- {9, 832}, // 011010010
- {9, 896}, // 011010011
- {9, 960}, // 011010100
- {9, 1024}, // 011010101
- {9, 1088}, // 011010110
- {9, 1152}, // 011010111
- {9, 1216}, // 011011000
- {9, 1280}, // 011011001
- {9, 1344}, // 011011010
- {9, 1408}, // 011011011
- {7, 256}, {7, 256}, {7, 256}, {7, 256}, // 0110111xx
- {4, 2}, {4, 2}, {4, 2}, {4, 2}, // 0111xxxxx
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 2}, {4, 2}, {4, 2}, {4, 2},
- {4, 3}, {4, 3}, {4, 3}, {4, 3}, // 1000xxxxx
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {4, 3}, {4, 3}, {4, 3}, {4, 3},
- {5, 128}, {5, 128}, {5, 128}, {5, 128}, // 10010xxxx
- {5, 128}, {5, 128}, {5, 128}, {5, 128},
- {5, 128}, {5, 128}, {5, 128}, {5, 128},
- {5, 128}, {5, 128}, {5, 128}, {5, 128},
- {5, 8}, {5, 8}, {5, 8}, {5, 8}, // 10011xxxx
- {5, 8}, {5, 8}, {5, 8}, {5, 8},
- {5, 8}, {5, 8}, {5, 8}, {5, 8},
- {5, 8}, {5, 8}, {5, 8}, {5, 8},
- {5, 9}, {5, 9}, {5, 9}, {5, 9}, // 10100xxxx
- {5, 9}, {5, 9}, {5, 9}, {5, 9},
- {5, 9}, {5, 9}, {5, 9}, {5, 9},
- {5, 9}, {5, 9}, {5, 9}, {5, 9},
- {6, 16}, {6, 16}, {6, 16}, {6, 16}, // 101010xxx
- {6, 16}, {6, 16}, {6, 16}, {6, 16},
- {6, 17}, {6, 17}, {6, 17}, {6, 17}, // 101011xxx
- {6, 17}, {6, 17}, {6, 17}, {6, 17},
- {4, 4}, {4, 4}, {4, 4}, {4, 4}, // 1011xxxxx
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 4}, {4, 4}, {4, 4}, {4, 4},
- {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 1100xxxxx
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {4, 5}, {4, 5}, {4, 5}, {4, 5},
- {6, 14}, {6, 14}, {6, 14}, {6, 14}, // 110100xxx
- {6, 14}, {6, 14}, {6, 14}, {6, 14},
- {6, 15}, {6, 15}, {6, 15}, {6, 15}, // 110101xxx
- {6, 15}, {6, 15}, {6, 15}, {6, 15},
- {5, 64}, {5, 64}, {5, 64}, {5, 64}, // 11011xxxx
- {5, 64}, {5, 64}, {5, 64}, {5, 64},
- {5, 64}, {5, 64}, {5, 64}, {5, 64},
- {5, 64}, {5, 64}, {5, 64}, {5, 64},
- {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 1110xxxxx
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 6}, {4, 6}, {4, 6}, {4, 6},
- {4, 7}, {4, 7}, {4, 7}, {4, 7}, // 1111xxxxx
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7},
- {4, 7}, {4, 7}, {4, 7}, {4, 7}
-};
-
-//------------------------------------------------------------------------
-// black run lengths
-//------------------------------------------------------------------------
-
-// 10-13 bit codes (upper 6 bits are 0)
-static CCITTCode blackTab1[128] = {
- {-1, -1}, {-1, -1}, // 000000000000x
- {12, ccittEOL}, {12, ccittEOL}, // 000000000001x
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000001xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000010xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000011xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000100xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000101xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000110xx
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 00000000111xx
- {11, 1792}, {11, 1792}, {11, 1792}, {11, 1792}, // 00000001000xx
- {12, 1984}, {12, 1984}, // 000000010010x
- {12, 2048}, {12, 2048}, // 000000010011x
- {12, 2112}, {12, 2112}, // 000000010100x
- {12, 2176}, {12, 2176}, // 000000010101x
- {12, 2240}, {12, 2240}, // 000000010110x
- {12, 2304}, {12, 2304}, // 000000010111x
- {11, 1856}, {11, 1856}, {11, 1856}, {11, 1856}, // 00000001100xx
- {11, 1920}, {11, 1920}, {11, 1920}, {11, 1920}, // 00000001101xx
- {12, 2368}, {12, 2368}, // 000000011100x
- {12, 2432}, {12, 2432}, // 000000011101x
- {12, 2496}, {12, 2496}, // 000000011110x
- {12, 2560}, {12, 2560}, // 000000011111x
- {10, 18}, {10, 18}, {10, 18}, {10, 18}, // 0000001000xxx
- {10, 18}, {10, 18}, {10, 18}, {10, 18},
- {12, 52}, {12, 52}, // 000000100100x
- {13, 640}, // 0000001001010
- {13, 704}, // 0000001001011
- {13, 768}, // 0000001001100
- {13, 832}, // 0000001001101
- {12, 55}, {12, 55}, // 000000100111x
- {12, 56}, {12, 56}, // 000000101000x
- {13, 1280}, // 0000001010010
- {13, 1344}, // 0000001010011
- {13, 1408}, // 0000001010100
- {13, 1472}, // 0000001010101
- {12, 59}, {12, 59}, // 000000101011x
- {12, 60}, {12, 60}, // 000000101100x
- {13, 1536}, // 0000001011010
- {13, 1600}, // 0000001011011
- {11, 24}, {11, 24}, {11, 24}, {11, 24}, // 00000010111xx
- {11, 25}, {11, 25}, {11, 25}, {11, 25}, // 00000011000xx
- {13, 1664}, // 0000001100100
- {13, 1728}, // 0000001100101
- {12, 320}, {12, 320}, // 000000110011x
- {12, 384}, {12, 384}, // 000000110100x
- {12, 448}, {12, 448}, // 000000110101x
- {13, 512}, // 0000001101100
- {13, 576}, // 0000001101101
- {12, 53}, {12, 53}, // 000000110111x
- {12, 54}, {12, 54}, // 000000111000x
- {13, 896}, // 0000001110010
- {13, 960}, // 0000001110011
- {13, 1024}, // 0000001110100
- {13, 1088}, // 0000001110101
- {13, 1152}, // 0000001110110
- {13, 1216}, // 0000001110111
- {10, 64}, {10, 64}, {10, 64}, {10, 64}, // 0000001111xxx
- {10, 64}, {10, 64}, {10, 64}, {10, 64}
-};
-
-// 7-12 bit codes (upper 4 bits are 0)
-static CCITTCode blackTab2[192] = {
- {8, 13}, {8, 13}, {8, 13}, {8, 13}, // 00000100xxxx
- {8, 13}, {8, 13}, {8, 13}, {8, 13},
- {8, 13}, {8, 13}, {8, 13}, {8, 13},
- {8, 13}, {8, 13}, {8, 13}, {8, 13},
- {11, 23}, {11, 23}, // 00000101000x
- {12, 50}, // 000001010010
- {12, 51}, // 000001010011
- {12, 44}, // 000001010100
- {12, 45}, // 000001010101
- {12, 46}, // 000001010110
- {12, 47}, // 000001010111
- {12, 57}, // 000001011000
- {12, 58}, // 000001011001
- {12, 61}, // 000001011010
- {12, 256}, // 000001011011
- {10, 16}, {10, 16}, {10, 16}, {10, 16}, // 0000010111xx
- {10, 17}, {10, 17}, {10, 17}, {10, 17}, // 0000011000xx
- {12, 48}, // 000001100100
- {12, 49}, // 000001100101
- {12, 62}, // 000001100110
- {12, 63}, // 000001100111
- {12, 30}, // 000001101000
- {12, 31}, // 000001101001
- {12, 32}, // 000001101010
- {12, 33}, // 000001101011
- {12, 40}, // 000001101100
- {12, 41}, // 000001101101
- {11, 22}, {11, 22}, // 00000110111x
- {8, 14}, {8, 14}, {8, 14}, {8, 14}, // 00000111xxxx
- {8, 14}, {8, 14}, {8, 14}, {8, 14},
- {8, 14}, {8, 14}, {8, 14}, {8, 14},
- {8, 14}, {8, 14}, {8, 14}, {8, 14},
- {7, 10}, {7, 10}, {7, 10}, {7, 10}, // 0000100xxxxx
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 10}, {7, 10}, {7, 10}, {7, 10},
- {7, 11}, {7, 11}, {7, 11}, {7, 11}, // 0000101xxxxx
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {7, 11}, {7, 11}, {7, 11}, {7, 11},
- {9, 15}, {9, 15}, {9, 15}, {9, 15}, // 000011000xxx
- {9, 15}, {9, 15}, {9, 15}, {9, 15},
- {12, 128}, // 000011001000
- {12, 192}, // 000011001001
- {12, 26}, // 000011001010
- {12, 27}, // 000011001011
- {12, 28}, // 000011001100
- {12, 29}, // 000011001101
- {11, 19}, {11, 19}, // 00001100111x
- {11, 20}, {11, 20}, // 00001101000x
- {12, 34}, // 000011010010
- {12, 35}, // 000011010011
- {12, 36}, // 000011010100
- {12, 37}, // 000011010101
- {12, 38}, // 000011010110
- {12, 39}, // 000011010111
- {11, 21}, {11, 21}, // 00001101100x
- {12, 42}, // 000011011010
- {12, 43}, // 000011011011
- {10, 0}, {10, 0}, {10, 0}, {10, 0}, // 0000110111xx
- {7, 12}, {7, 12}, {7, 12}, {7, 12}, // 0000111xxxxx
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12},
- {7, 12}, {7, 12}, {7, 12}, {7, 12}
-};
-
-// 2-6 bit codes
-static CCITTCode blackTab3[64] = {
- {-1, -1}, {-1, -1}, {-1, -1}, {-1, -1}, // 0000xx
- {6, 9}, // 000100
- {6, 8}, // 000101
- {5, 7}, {5, 7}, // 00011x
- {4, 6}, {4, 6}, {4, 6}, {4, 6}, // 0010xx
- {4, 5}, {4, 5}, {4, 5}, {4, 5}, // 0011xx
- {3, 1}, {3, 1}, {3, 1}, {3, 1}, // 010xxx
- {3, 1}, {3, 1}, {3, 1}, {3, 1},
- {3, 4}, {3, 4}, {3, 4}, {3, 4}, // 011xxx
- {3, 4}, {3, 4}, {3, 4}, {3, 4},
- {2, 3}, {2, 3}, {2, 3}, {2, 3}, // 10xxxx
- {2, 3}, {2, 3}, {2, 3}, {2, 3},
- {2, 3}, {2, 3}, {2, 3}, {2, 3},
- {2, 3}, {2, 3}, {2, 3}, {2, 3},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}, // 11xxxx
- {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2},
- {2, 2}, {2, 2}, {2, 2}, {2, 2}
-};
diff --git a/pdf/xpdf/Stream.cc b/pdf/xpdf/Stream.cc
deleted file mode 100644
index 3d19436..0000000
--- a/pdf/xpdf/Stream.cc
+++ /dev/null
@@ -1,3979 +0,0 @@
-//========================================================================
-//
-// Stream.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#ifndef WIN32
-#include <unistd.h>
-#endif
-#include <string.h>
-#include <ctype.h>
-#include "gmem.h"
-#include "gfile.h"
-#include "xpdfconfig.h"
-#include "Error.h"
-#include "Object.h"
-#ifndef NO_DECRYPTION
-#include "Decrypt.h"
-#endif
-#include "Stream.h"
-#include "JBIG2Stream.h"
-#include "JPXStream.h"
-#include "Stream-CCITT.h"
-
-#ifdef __DJGPP__
-static GBool setDJSYSFLAGS = gFalse;
-#endif
-
-#ifdef VMS
-#ifdef __GNUC__
-#define SEEK_SET 0
-#define SEEK_CUR 1
-#define SEEK_END 2
-#endif
-#endif
-
-//------------------------------------------------------------------------
-// Stream (base class)
-//------------------------------------------------------------------------
-
-Stream::Stream() {
- ref = 1;
-}
-
-Stream::~Stream() {
-}
-
-void Stream::close() {
-}
-
-int Stream::getRawChar() {
- error(-1, "Internal: called getRawChar() on non-predictor stream");
- return EOF;
-}
-
-char *Stream::getLine(char *buf, int size) {
- int i;
- int c;
-
- if (lookChar() == EOF)
- return NULL;
- for (i = 0; i < size - 1; ++i) {
- c = getChar();
- if (c == EOF || c == '\n')
- break;
- if (c == '\r') {
- if ((c = lookChar()) == '\n')
- getChar();
- break;
- }
- buf[i] = c;
- }
- buf[i] = '\0';
- return buf;
-}
-
-GString *Stream::getPSFilter(int psLevel, char *indent) {
- return new GString();
-}
-
-Stream *Stream::addFilters(Object *dict) {
- Object obj, obj2;
- Object params, params2;
- Stream *str;
- int i;
-
- str = this;
- dict->dictLookup("Filter", &obj);
- if (obj.isNull()) {
- obj.free();
- dict->dictLookup("F", &obj);
- }
- dict->dictLookup("DecodeParms", &params);
- if (params.isNull()) {
- params.free();
- dict->dictLookup("DP", &params);
- }
- if (obj.isName()) {
- str = makeFilter(obj.getName(), str, &params);
- } else if (obj.isArray()) {
- for (i = 0; i < obj.arrayGetLength(); ++i) {
- obj.arrayGet(i, &obj2);
- if (params.isArray())
- params.arrayGet(i, &params2);
- else
- params2.initNull();
- if (obj2.isName()) {
- str = makeFilter(obj2.getName(), str, &params2);
- } else {
- error(getPos(), "Bad filter name");
- str = new EOFStream(str);
- }
- obj2.free();
- params2.free();
- }
- } else if (!obj.isNull()) {
- error(getPos(), "Bad 'Filter' attribute in stream");
- }
- obj.free();
- params.free();
-
- return str;
-}
-
-Stream *Stream::makeFilter(char *name, Stream *str, Object *params) {
- int pred; // parameters
- int colors;
- int bits;
- int early;
- int encoding;
- GBool endOfLine, byteAlign, endOfBlock, black;
- int columns, rows;
- Object globals, obj;
-
- if (!strcmp(name, "ASCIIHexDecode") || !strcmp(name, "AHx")) {
- str = new ASCIIHexStream(str);
- } else if (!strcmp(name, "ASCII85Decode") || !strcmp(name, "A85")) {
- str = new ASCII85Stream(str);
- } else if (!strcmp(name, "LZWDecode") || !strcmp(name, "LZW")) {
- pred = 1;
- columns = 1;
- colors = 1;
- bits = 8;
- early = 1;
- if (params->isDict()) {
- params->dictLookup("Predictor", &obj);
- if (obj.isInt())
- pred = obj.getInt();
- obj.free();
- params->dictLookup("Columns", &obj);
- if (obj.isInt())
- columns = obj.getInt();
- obj.free();
- params->dictLookup("Colors", &obj);
- if (obj.isInt())
- colors = obj.getInt();
- obj.free();
- params->dictLookup("BitsPerComponent", &obj);
- if (obj.isInt())
- bits = obj.getInt();
- obj.free();
- params->dictLookup("EarlyChange", &obj);
- if (obj.isInt())
- early = obj.getInt();
- obj.free();
- }
- str = new LZWStream(str, pred, columns, colors, bits, early);
- } else if (!strcmp(name, "RunLengthDecode") || !strcmp(name, "RL")) {
- str = new RunLengthStream(str);
- } else if (!strcmp(name, "CCITTFaxDecode") || !strcmp(name, "CCF")) {
- encoding = 0;
- endOfLine = gFalse;
- byteAlign = gFalse;
- columns = 1728;
- rows = 0;
- endOfBlock = gTrue;
- black = gFalse;
- if (params->isDict()) {
- params->dictLookup("K", &obj);
- if (obj.isInt()) {
- encoding = obj.getInt();
- }
- obj.free();
- params->dictLookup("EndOfLine", &obj);
- if (obj.isBool()) {
- endOfLine = obj.getBool();
- }
- obj.free();
- params->dictLookup("EncodedByteAlign", &obj);
- if (obj.isBool()) {
- byteAlign = obj.getBool();
- }
- obj.free();
- params->dictLookup("Columns", &obj);
- if (obj.isInt()) {
- columns = obj.getInt();
- }
- obj.free();
- params->dictLookup("Rows", &obj);
- if (obj.isInt()) {
- rows = obj.getInt();
- }
- obj.free();
- params->dictLookup("EndOfBlock", &obj);
- if (obj.isBool()) {
- endOfBlock = obj.getBool();
- }
- obj.free();
- params->dictLookup("BlackIs1", &obj);
- if (obj.isBool()) {
- black = obj.getBool();
- }
- obj.free();
- }
- str = new CCITTFaxStream(str, encoding, endOfLine, byteAlign,
- columns, rows, endOfBlock, black);
- } else if (!strcmp(name, "DCTDecode") || !strcmp(name, "DCT")) {
- str = new DCTStream(str);
- } else if (!strcmp(name, "FlateDecode") || !strcmp(name, "Fl")) {
- pred = 1;
- columns = 1;
- colors = 1;
- bits = 8;
- if (params->isDict()) {
- params->dictLookup("Predictor", &obj);
- if (obj.isInt())
- pred = obj.getInt();
- obj.free();
- params->dictLookup("Columns", &obj);
- if (obj.isInt())
- columns = obj.getInt();
- obj.free();
- params->dictLookup("Colors", &obj);
- if (obj.isInt())
- colors = obj.getInt();
- obj.free();
- params->dictLookup("BitsPerComponent", &obj);
- if (obj.isInt())
- bits = obj.getInt();
- obj.free();
- }
- str = new FlateStream(str, pred, columns, colors, bits);
- } else if (!strcmp(name, "JBIG2Decode")) {
- if (params->isDict()) {
- params->dictLookup("JBIG2Globals", &globals);
- }
- str = new JBIG2Stream(str, &globals);
- globals.free();
- } else if (!strcmp(name, "JPXDecode")) {
- str = new JPXStream(str);
- } else {
- error(getPos(), "Unknown filter '%s'", name);
- str = new EOFStream(str);
- }
- return str;
-}
-
-//------------------------------------------------------------------------
-// BaseStream
-//------------------------------------------------------------------------
-
-BaseStream::BaseStream(Object *dictA) {
- dict = *dictA;
-#ifndef NO_DECRYPTION
- decrypt = NULL;
-#endif
-}
-
-BaseStream::~BaseStream() {
- dict.free();
-#ifndef NO_DECRYPTION
- if (decrypt)
- delete decrypt;
-#endif
-}
-
-#ifndef NO_DECRYPTION
-void BaseStream::doDecryption(Guchar *fileKey, int keyLength,
- int objNum, int objGen) {
- decrypt = new Decrypt(fileKey, keyLength, objNum, objGen);
-}
-#endif
-
-//------------------------------------------------------------------------
-// FilterStream
-//------------------------------------------------------------------------
-
-FilterStream::FilterStream(Stream *strA) {
- str = strA;
-}
-
-FilterStream::~FilterStream() {
-}
-
-void FilterStream::close() {
- str->close();
-}
-
-void FilterStream::setPos(Guint pos, int dir) {
- error(-1, "Internal: called setPos() on FilterStream");
-}
-
-//------------------------------------------------------------------------
-// ImageStream
-//------------------------------------------------------------------------
-
-ImageStream::ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA) {
- int imgLineSize;
-
- str = strA;
- width = widthA;
- nComps = nCompsA;
- nBits = nBitsA;
-
- nVals = width * nComps;
- if (nBits == 1) {
- imgLineSize = (nVals + 7) & ~7;
- } else {
- imgLineSize = nVals;
- }
- imgLine = (Guchar *)gmalloc(imgLineSize * sizeof(Guchar));
- imgIdx = nVals;
-}
-
-ImageStream::~ImageStream() {
- gfree(imgLine);
-}
-
-void ImageStream::reset() {
- str->reset();
-}
-
-GBool ImageStream::getPixel(Guchar *pix) {
- int i;
-
- if (imgIdx >= nVals) {
- getLine();
- imgIdx = 0;
- }
- for (i = 0; i < nComps; ++i) {
- pix[i] = imgLine[imgIdx++];
- }
- return gTrue;
-}
-
-Guchar *ImageStream::getLine() {
- Gulong buf, bitMask;
- int bits;
- int c;
- int i;
-
- if (nBits == 1) {
- for (i = 0; i < nVals; i += 8) {
- c = str->getChar();
- imgLine[i+0] = (Guchar)((c >> 7) & 1);
- imgLine[i+1] = (Guchar)((c >> 6) & 1);
- imgLine[i+2] = (Guchar)((c >> 5) & 1);
- imgLine[i+3] = (Guchar)((c >> 4) & 1);
- imgLine[i+4] = (Guchar)((c >> 3) & 1);
- imgLine[i+5] = (Guchar)((c >> 2) & 1);
- imgLine[i+6] = (Guchar)((c >> 1) & 1);
- imgLine[i+7] = (Guchar)(c & 1);
- }
- } else if (nBits == 8) {
- for (i = 0; i < nVals; ++i) {
- imgLine[i] = str->getChar();
- }
- } else {
- bitMask = (1 << nBits) - 1;
- buf = 0;
- bits = 0;
- for (i = 0; i < nVals; ++i) {
- if (bits < nBits) {
- buf = (buf << 8) | (str->getChar() & 0xff);
- bits += 8;
- }
- imgLine[i] = (Guchar)((buf >> (bits - nBits)) & bitMask);
- bits -= nBits;
- }
- }
- return imgLine;
-}
-
-void ImageStream::skipLine() {
- int n, i;
-
- n = (nVals * nBits + 7) >> 3;
- for (i = 0; i < n; ++i) {
- str->getChar();
- }
-}
-
-//------------------------------------------------------------------------
-// StreamPredictor
-//------------------------------------------------------------------------
-
-StreamPredictor::StreamPredictor(Stream *strA, int predictorA,
- int widthA, int nCompsA, int nBitsA) {
- str = strA;
- predictor = predictorA;
- width = widthA;
- nComps = nCompsA;
- nBits = nBitsA;
-
- nVals = width * nComps;
- pixBytes = (nComps * nBits + 7) >> 3;
- rowBytes = ((nVals * nBits + 7) >> 3) + pixBytes;
- predLine = (Guchar *)gmalloc(rowBytes);
- memset(predLine, 0, rowBytes);
- predIdx = rowBytes;
-}
-
-StreamPredictor::~StreamPredictor() {
- gfree(predLine);
-}
-
-int StreamPredictor::lookChar() {
- if (predIdx >= rowBytes) {
- if (!getNextLine()) {
- return EOF;
- }
- }
- return predLine[predIdx];
-}
-
-int StreamPredictor::getChar() {
- if (predIdx >= rowBytes) {
- if (!getNextLine()) {
- return EOF;
- }
- }
- return predLine[predIdx++];
-}
-
-GBool StreamPredictor::getNextLine() {
- int curPred;
- Guchar upLeftBuf[4];
- int left, up, upLeft, p, pa, pb, pc;
- int c;
- Gulong inBuf, outBuf, bitMask;
- int inBits, outBits;
- int i, j, k;
-
- // get PNG optimum predictor number
- if (predictor >= 10) {
- if ((curPred = str->getRawChar()) == EOF) {
- return gFalse;
- }
- curPred += 10;
- } else {
- curPred = predictor;
- }
-
- // read the raw line, apply PNG (byte) predictor
- upLeftBuf[0] = upLeftBuf[1] = upLeftBuf[2] = upLeftBuf[3] = 0;
- for (i = pixBytes; i < rowBytes; ++i) {
- upLeftBuf[3] = upLeftBuf[2];
- upLeftBuf[2] = upLeftBuf[1];
- upLeftBuf[1] = upLeftBuf[0];
- upLeftBuf[0] = predLine[i];
- if ((c = str->getRawChar()) == EOF) {
- return gFalse;
- }
- switch (curPred) {
- case 11: // PNG sub
- predLine[i] = predLine[i - pixBytes] + (Guchar)c;
- break;
- case 12: // PNG up
- predLine[i] = predLine[i] + (Guchar)c;
- break;
- case 13: // PNG average
- predLine[i] = ((predLine[i - pixBytes] + predLine[i]) >> 1) +
- (Guchar)c;
- break;
- case 14: // PNG Paeth
- left = predLine[i - pixBytes];
- up = predLine[i];
- upLeft = upLeftBuf[pixBytes];
- p = left + up - upLeft;
- if ((pa = p - left) < 0)
- pa = -pa;
- if ((pb = p - up) < 0)
- pb = -pb;
- if ((pc = p - upLeft) < 0)
- pc = -pc;
- if (pa <= pb && pa <= pc)
- predLine[i] = left + (Guchar)c;
- else if (pb <= pc)
- predLine[i] = up + (Guchar)c;
- else
- predLine[i] = upLeft + (Guchar)c;
- break;
- case 10: // PNG none
- default: // no predictor or TIFF predictor
- predLine[i] = (Guchar)c;
- break;
- }
- }
-
- // apply TIFF (component) predictor
- if (predictor == 2) {
- if (nBits == 1) {
- inBuf = predLine[pixBytes - 1];
- for (i = pixBytes; i < rowBytes; i += 8) {
- // 1-bit add is just xor
- inBuf = (inBuf << 8) | predLine[i];
- predLine[i] ^= inBuf >> nComps;
- }
- } else if (nBits == 8) {
- for (i = pixBytes; i < rowBytes; ++i) {
- predLine[i] += predLine[i - nComps];
- }
- } else {
- upLeftBuf[0] = upLeftBuf[1] = upLeftBuf[2] = upLeftBuf[3] = 0;
- bitMask = (1 << nBits) - 1;
- inBuf = outBuf = 0;
- inBits = outBits = 0;
- j = k = pixBytes;
- for (i = 0; i < nVals; ++i) {
- if (inBits < nBits) {
- inBuf = (inBuf << 8) | (predLine[j++] & 0xff);
- inBits += 8;
- }
- upLeftBuf[3] = upLeftBuf[2];
- upLeftBuf[2] = upLeftBuf[1];
- upLeftBuf[1] = upLeftBuf[0];
- upLeftBuf[0] = (upLeftBuf[nComps] +
- (inBuf >> (inBits - nBits))) & bitMask;
- outBuf = (outBuf << nBits) | upLeftBuf[0];
- inBits -= nBits;
- outBits += nBits;
- if (outBits > 8) {
- predLine[k++] = (Guchar)(outBuf >> (outBits - 8));
- }
- }
- if (outBits > 0) {
- predLine[k++] = (Guchar)(outBuf << (8 - outBits));
- }
- }
- }
-
- // reset to start of line
- predIdx = pixBytes;
-
- return gTrue;
-}
-
-//------------------------------------------------------------------------
-// FileStream
-//------------------------------------------------------------------------
-
-FileStream::FileStream(FILE *fA, Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA):
- BaseStream(dictA) {
- f = fA;
- start = startA;
- limited = limitedA;
- length = lengthA;
- bufPtr = bufEnd = buf;
- bufPos = start;
- savePos = 0;
- saved = gFalse;
-}
-
-FileStream::~FileStream() {
- close();
-}
-
-Stream *FileStream::makeSubStream(Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA) {
- return new FileStream(f, startA, limitedA, lengthA, dictA);
-}
-
-void FileStream::reset() {
-#if HAVE_FSEEKO
- savePos = (Guint)ftello(f);
- fseeko(f, start, SEEK_SET);
-#elif HAVE_FSEEK64
- savePos = (Guint)ftell64(f);
- fseek64(f, start, SEEK_SET);
-#else
- savePos = (Guint)ftell(f);
- fseek(f, start, SEEK_SET);
-#endif
- saved = gTrue;
- bufPtr = bufEnd = buf;
- bufPos = start;
-#ifndef NO_DECRYPTION
- if (decrypt)
- decrypt->reset();
-#endif
-}
-
-void FileStream::close() {
- if (saved) {
-#if HAVE_FSEEKO
- fseeko(f, savePos, SEEK_SET);
-#elif HAVE_FSEEK64
- fseek64(f, savePos, SEEK_SET);
-#else
- fseek(f, savePos, SEEK_SET);
-#endif
- saved = gFalse;
- }
-}
-
-GBool FileStream::fillBuf() {
- int n;
-#ifndef NO_DECRYPTION
- char *p;
-#endif
-
- bufPos += bufEnd - buf;
- bufPtr = bufEnd = buf;
- if (limited && bufPos >= start + length) {
- return gFalse;
- }
- if (limited && bufPos + fileStreamBufSize > start + length) {
- n = start + length - bufPos;
- } else {
- n = fileStreamBufSize;
- }
- n = fread(buf, 1, n, f);
- bufEnd = buf + n;
- if (bufPtr >= bufEnd) {
- return gFalse;
- }
-#ifndef NO_DECRYPTION
- if (decrypt) {
- for (p = buf; p < bufEnd; ++p) {
- *p = (char)decrypt->decryptByte((Guchar)*p);
- }
- }
-#endif
- return gTrue;
-}
-
-void FileStream::setPos(Guint pos, int dir) {
- Guint size;
-
- if (dir >= 0) {
-#if HAVE_FSEEKO
- fseeko(f, pos, SEEK_SET);
-#elif HAVE_FSEEK64
- fseek64(f, pos, SEEK_SET);
-#else
- fseek(f, pos, SEEK_SET);
-#endif
- bufPos = pos;
- } else {
-#if HAVE_FSEEKO
- fseeko(f, 0, SEEK_END);
- size = (Guint)ftello(f);
-#elif HAVE_FSEEK64
- fseek64(f, 0, SEEK_END);
- size = (Guint)ftell64(f);
-#else
- fseek(f, 0, SEEK_END);
- size = (Guint)ftell(f);
-#endif
- if (pos > size)
- pos = (Guint)size;
-#ifdef __CYGWIN32__
- //~ work around a bug in cygwin's implementation of fseek
- rewind(f);
-#endif
-#if HAVE_FSEEKO
- fseeko(f, -(int)pos, SEEK_END);
- bufPos = (Guint)ftello(f);
-#elif HAVE_FSEEK64
- fseek64(f, -(int)pos, SEEK_END);
- bufPos = (Guint)ftell64(f);
-#else
- fseek(f, -(int)pos, SEEK_END);
- bufPos = (Guint)ftell(f);
-#endif
- }
- bufPtr = bufEnd = buf;
-}
-
-void FileStream::moveStart(int delta) {
- start += delta;
- bufPtr = bufEnd = buf;
- bufPos = start;
-}
-
-//------------------------------------------------------------------------
-// MemStream
-//------------------------------------------------------------------------
-
-MemStream::MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA):
- BaseStream(dictA) {
- buf = bufA;
- start = startA;
- length = lengthA;
- bufEnd = buf + start + length;
- bufPtr = buf + start;
- needFree = gFalse;
-}
-
-MemStream::~MemStream() {
- if (needFree) {
- gfree(buf);
- }
-}
-
-Stream *MemStream::makeSubStream(Guint startA, GBool limited,
- Guint lengthA, Object *dictA) {
- MemStream *subStr;
- Guint newLength;
-
- if (!limited || startA + lengthA > start + length) {
- newLength = start + length - startA;
- } else {
- newLength = lengthA;
- }
- subStr = new MemStream(buf, startA, newLength, dictA);
- return subStr;
-}
-
-void MemStream::reset() {
- bufPtr = buf + start;
-#ifndef NO_DECRYPTION
- if (decrypt) {
- decrypt->reset();
- }
-#endif
-}
-
-void MemStream::close() {
-}
-
-void MemStream::setPos(Guint pos, int dir) {
- Guint i;
-
- if (dir >= 0) {
- i = pos;
- } else {
- i = start + length - pos;
- }
- if (i < start) {
- i = start;
- } else if (i > start + length) {
- i = start + length;
- }
- bufPtr = buf + i;
-}
-
-void MemStream::moveStart(int delta) {
- start += delta;
- bufPtr = buf + start;
-}
-
-#ifndef NO_DECRYPTION
-void MemStream::doDecryption(Guchar *fileKey, int keyLength,
- int objNum, int objGen) {
- char *newBuf;
- char *p, *q;
-
- this->BaseStream::doDecryption(fileKey, keyLength, objNum, objGen);
- if (decrypt) {
- newBuf = (char *)gmalloc(length);
- for (p = buf + start, q = newBuf; p < bufEnd; ++p, ++q) {
- *q = (char)decrypt->decryptByte((Guchar)*p);
- }
- bufEnd = newBuf + length;
- bufPtr = newBuf + (bufPtr - (buf + start));
- start = 0;
- buf = newBuf;
- needFree = gTrue;
- }
-}
-#endif
-
-//------------------------------------------------------------------------
-// EmbedStream
-//------------------------------------------------------------------------
-
-EmbedStream::EmbedStream(Stream *strA, Object *dictA,
- GBool limitedA, Guint lengthA):
- BaseStream(dictA) {
- str = strA;
- limited = limitedA;
- length = lengthA;
-}
-
-EmbedStream::~EmbedStream() {
-}
-
-Stream *EmbedStream::makeSubStream(Guint start, GBool limitedA,
- Guint lengthA, Object *dictA) {
- error(-1, "Internal: called makeSubStream() on EmbedStream");
- return NULL;
-}
-
-int EmbedStream::getChar() {
- if (limited && !length) {
- return EOF;
- }
- --length;
- return str->getChar();
-}
-
-int EmbedStream::lookChar() {
- if (limited && !length) {
- return EOF;
- }
- return str->lookChar();
-}
-
-void EmbedStream::setPos(Guint pos, int dir) {
- error(-1, "Internal: called setPos() on EmbedStream");
-}
-
-Guint EmbedStream::getStart() {
- error(-1, "Internal: called getStart() on EmbedStream");
- return 0;
-}
-
-void EmbedStream::moveStart(int delta) {
- error(-1, "Internal: called moveStart() on EmbedStream");
-}
-
-//------------------------------------------------------------------------
-// ASCIIHexStream
-//------------------------------------------------------------------------
-
-ASCIIHexStream::ASCIIHexStream(Stream *strA):
- FilterStream(strA) {
- buf = EOF;
- eof = gFalse;
-}
-
-ASCIIHexStream::~ASCIIHexStream() {
- delete str;
-}
-
-void ASCIIHexStream::reset() {
- str->reset();
- buf = EOF;
- eof = gFalse;
-}
-
-int ASCIIHexStream::lookChar() {
- int c1, c2, x;
-
- if (buf != EOF)
- return buf;
- if (eof) {
- buf = EOF;
- return EOF;
- }
- do {
- c1 = str->getChar();
- } while (isspace(c1));
- if (c1 == '>') {
- eof = gTrue;
- buf = EOF;
- return buf;
- }
- do {
- c2 = str->getChar();
- } while (isspace(c2));
- if (c2 == '>') {
- eof = gTrue;
- c2 = '0';
- }
- if (c1 >= '0' && c1 <= '9') {
- x = (c1 - '0') << 4;
- } else if (c1 >= 'A' && c1 <= 'F') {
- x = (c1 - 'A' + 10) << 4;
- } else if (c1 >= 'a' && c1 <= 'f') {
- x = (c1 - 'a' + 10) << 4;
- } else if (c1 == EOF) {
- eof = gTrue;
- x = 0;
- } else {
- error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c1);
- x = 0;
- }
- if (c2 >= '0' && c2 <= '9') {
- x += c2 - '0';
- } else if (c2 >= 'A' && c2 <= 'F') {
- x += c2 - 'A' + 10;
- } else if (c2 >= 'a' && c2 <= 'f') {
- x += c2 - 'a' + 10;
- } else if (c2 == EOF) {
- eof = gTrue;
- x = 0;
- } else {
- error(getPos(), "Illegal character <%02x> in ASCIIHex stream", c2);
- }
- buf = x & 0xff;
- return buf;
-}
-
-GString *ASCIIHexStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 2) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("/ASCIIHexDecode filter\n");
- return s;
-}
-
-GBool ASCIIHexStream::isBinary(GBool last) {
- return str->isBinary(gFalse);
-}
-
-//------------------------------------------------------------------------
-// ASCII85Stream
-//------------------------------------------------------------------------
-
-ASCII85Stream::ASCII85Stream(Stream *strA):
- FilterStream(strA) {
- index = n = 0;
- eof = gFalse;
-}
-
-ASCII85Stream::~ASCII85Stream() {
- delete str;
-}
-
-void ASCII85Stream::reset() {
- str->reset();
- index = n = 0;
- eof = gFalse;
-}
-
-int ASCII85Stream::lookChar() {
- int k;
- Gulong t;
-
- if (index >= n) {
- if (eof)
- return EOF;
- index = 0;
- do {
- c[0] = str->getChar();
- } while (c[0] == '\n' || c[0] == '\r');
- if (c[0] == '~' || c[0] == EOF) {
- eof = gTrue;
- n = 0;
- return EOF;
- } else if (c[0] == 'z') {
- b[0] = b[1] = b[2] = b[3] = 0;
- n = 4;
- } else {
- for (k = 1; k < 5; ++k) {
- do {
- c[k] = str->getChar();
- } while (c[k] == '\n' || c[k] == '\r');
- if (c[k] == '~' || c[k] == EOF)
- break;
- }
- n = k - 1;
- if (k < 5 && (c[k] == '~' || c[k] == EOF)) {
- for (++k; k < 5; ++k)
- c[k] = 0x21 + 84;
- eof = gTrue;
- }
- t = 0;
- for (k = 0; k < 5; ++k)
- t = t * 85 + (c[k] - 0x21);
- for (k = 3; k >= 0; --k) {
- b[k] = (int)(t & 0xff);
- t >>= 8;
- }
- }
- }
- return b[index];
-}
-
-GString *ASCII85Stream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 2) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("/ASCII85Decode filter\n");
- return s;
-}
-
-GBool ASCII85Stream::isBinary(GBool last) {
- return str->isBinary(gFalse);
-}
-
-//------------------------------------------------------------------------
-// LZWStream
-//------------------------------------------------------------------------
-
-LZWStream::LZWStream(Stream *strA, int predictor, int columns, int colors,
- int bits, int earlyA):
- FilterStream(strA) {
- if (predictor != 1) {
- pred = new StreamPredictor(this, predictor, columns, colors, bits);
- } else {
- pred = NULL;
- }
- early = earlyA;
- eof = gFalse;
- inputBits = 0;
- clearTable();
-}
-
-LZWStream::~LZWStream() {
- if (pred) {
- delete pred;
- }
- delete str;
-}
-
-int LZWStream::getChar() {
- if (pred) {
- return pred->getChar();
- }
- if (eof) {
- return EOF;
- }
- if (seqIndex >= seqLength) {
- if (!processNextCode()) {
- return EOF;
- }
- }
- return seqBuf[seqIndex++];
-}
-
-int LZWStream::lookChar() {
- if (pred) {
- return pred->lookChar();
- }
- if (eof) {
- return EOF;
- }
- if (seqIndex >= seqLength) {
- if (!processNextCode()) {
- return EOF;
- }
- }
- return seqBuf[seqIndex];
-}
-
-int LZWStream::getRawChar() {
- if (eof) {
- return EOF;
- }
- if (seqIndex >= seqLength) {
- if (!processNextCode()) {
- return EOF;
- }
- }
- return seqBuf[seqIndex++];
-}
-
-void LZWStream::reset() {
- str->reset();
- eof = gFalse;
- inputBits = 0;
- clearTable();
-}
-
-GBool LZWStream::processNextCode() {
- int code;
- int nextLength;
- int i, j;
-
- // check for EOF
- if (eof) {
- return gFalse;
- }
-
- // check for eod and clear-table codes
- start:
- code = getCode();
- if (code == EOF || code == 257) {
- eof = gTrue;
- return gFalse;
- }
- if (code == 256) {
- clearTable();
- goto start;
- }
- if (nextCode >= 4097) {
- error(getPos(), "Bad LZW stream - expected clear-table code");
- clearTable();
- }
-
- // process the next code
- nextLength = seqLength + 1;
- if (code < 256) {
- seqBuf[0] = code;
- seqLength = 1;
- } else if (code < nextCode) {
- seqLength = table[code].length;
- for (i = seqLength - 1, j = code; i > 0; --i) {
- seqBuf[i] = table[j].tail;
- j = table[j].head;
- }
- seqBuf[0] = j;
- } else if (code == nextCode) {
- seqBuf[seqLength] = newChar;
- ++seqLength;
- } else {
- error(getPos(), "Bad LZW stream - unexpected code");
- eof = gTrue;
- return gFalse;
- }
- newChar = seqBuf[0];
- if (first) {
- first = gFalse;
- } else {
- table[nextCode].length = nextLength;
- table[nextCode].head = prevCode;
- table[nextCode].tail = newChar;
- ++nextCode;
- if (nextCode + early == 512)
- nextBits = 10;
- else if (nextCode + early == 1024)
- nextBits = 11;
- else if (nextCode + early == 2048)
- nextBits = 12;
- }
- prevCode = code;
-
- // reset buffer
- seqIndex = 0;
-
- return gTrue;
-}
-
-void LZWStream::clearTable() {
- nextCode = 258;
- nextBits = 9;
- seqIndex = seqLength = 0;
- first = gTrue;
-}
-
-int LZWStream::getCode() {
- int c;
- int code;
-
- while (inputBits < nextBits) {
- if ((c = str->getChar()) == EOF)
- return EOF;
- inputBuf = (inputBuf << 8) | (c & 0xff);
- inputBits += 8;
- }
- code = (inputBuf >> (inputBits - nextBits)) & ((1 << nextBits) - 1);
- inputBits -= nextBits;
- return code;
-}
-
-GString *LZWStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 2 || pred) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("/LZWDecode filter\n");
- return s;
-}
-
-GBool LZWStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-//------------------------------------------------------------------------
-// RunLengthStream
-//------------------------------------------------------------------------
-
-RunLengthStream::RunLengthStream(Stream *strA):
- FilterStream(strA) {
- bufPtr = bufEnd = buf;
- eof = gFalse;
-}
-
-RunLengthStream::~RunLengthStream() {
- delete str;
-}
-
-void RunLengthStream::reset() {
- str->reset();
- bufPtr = bufEnd = buf;
- eof = gFalse;
-}
-
-GString *RunLengthStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 2) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("/RunLengthDecode filter\n");
- return s;
-}
-
-GBool RunLengthStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-GBool RunLengthStream::fillBuf() {
- int c;
- int n, i;
-
- if (eof)
- return gFalse;
- c = str->getChar();
- if (c == 0x80 || c == EOF) {
- eof = gTrue;
- return gFalse;
- }
- if (c < 0x80) {
- n = c + 1;
- for (i = 0; i < n; ++i)
- buf[i] = (char)str->getChar();
- } else {
- n = 0x101 - c;
- c = str->getChar();
- for (i = 0; i < n; ++i)
- buf[i] = (char)c;
- }
- bufPtr = buf;
- bufEnd = buf + n;
- return gTrue;
-}
-
-//------------------------------------------------------------------------
-// CCITTFaxStream
-//------------------------------------------------------------------------
-
-CCITTFaxStream::CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA,
- GBool byteAlignA, int columnsA, int rowsA,
- GBool endOfBlockA, GBool blackA):
- FilterStream(strA) {
- encoding = encodingA;
- endOfLine = endOfLineA;
- byteAlign = byteAlignA;
- columns = columnsA;
- rows = rowsA;
- endOfBlock = endOfBlockA;
- black = blackA;
- refLine = (short *)gmalloc((columns + 3) * sizeof(short));
- codingLine = (short *)gmalloc((columns + 2) * sizeof(short));
-
- eof = gFalse;
- row = 0;
- nextLine2D = encoding < 0;
- inputBits = 0;
- codingLine[0] = 0;
- codingLine[1] = refLine[2] = columns;
- a0 = 1;
-
- buf = EOF;
-}
-
-CCITTFaxStream::~CCITTFaxStream() {
- delete str;
- gfree(refLine);
- gfree(codingLine);
-}
-
-void CCITTFaxStream::reset() {
- short code1;
-
- str->reset();
- eof = gFalse;
- row = 0;
- nextLine2D = encoding < 0;
- inputBits = 0;
- codingLine[0] = 0;
- codingLine[1] = refLine[2] = columns;
- a0 = 1;
- buf = EOF;
-
- // skip any initial zero bits and end-of-line marker, and get the 2D
- // encoding tag
- while ((code1 = lookBits(12)) == 0) {
- eatBits(1);
- }
- if (code1 == 0x001) {
- eatBits(12);
- }
- if (encoding > 0) {
- nextLine2D = !lookBits(1);
- eatBits(1);
- }
-}
-
-int CCITTFaxStream::lookChar() {
- short code1, code2, code3;
- int a0New;
- GBool err, gotEOL;
- int ret;
- int bits, i;
-
- // if at eof just return EOF
- if (eof && codingLine[a0] >= columns) {
- return EOF;
- }
-
- // read the next row
- err = gFalse;
- if (codingLine[a0] >= columns) {
-
- // 2-D encoding
- if (nextLine2D) {
- for (i = 0; codingLine[i] < columns; ++i)
- refLine[i] = codingLine[i];
- refLine[i] = refLine[i + 1] = columns;
- b1 = 1;
- a0New = codingLine[a0 = 0] = 0;
- do {
- code1 = getTwoDimCode();
- switch (code1) {
- case twoDimPass:
- if (refLine[b1] < columns) {
- a0New = refLine[b1 + 1];
- b1 += 2;
- }
- break;
- case twoDimHoriz:
- if ((a0 & 1) == 0) {
- code1 = code2 = 0;
- do {
- code1 += code3 = getWhiteCode();
- } while (code3 >= 64);
- do {
- code2 += code3 = getBlackCode();
- } while (code3 >= 64);
- } else {
- code1 = code2 = 0;
- do {
- code1 += code3 = getBlackCode();
- } while (code3 >= 64);
- do {
- code2 += code3 = getWhiteCode();
- } while (code3 >= 64);
- }
- if (code1 > 0 || code2 > 0) {
- codingLine[a0 + 1] = a0New + code1;
- ++a0;
- a0New = codingLine[a0 + 1] = codingLine[a0] + code2;
- ++a0;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- }
- break;
- case twoDimVert0:
- a0New = codingLine[++a0] = refLine[b1];
- if (refLine[b1] < columns) {
- ++b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- }
- break;
- case twoDimVertR1:
- a0New = codingLine[++a0] = refLine[b1] + 1;
- if (refLine[b1] < columns) {
- ++b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- }
- break;
- case twoDimVertL1:
- a0New = codingLine[++a0] = refLine[b1] - 1;
- --b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- break;
- case twoDimVertR2:
- a0New = codingLine[++a0] = refLine[b1] + 2;
- if (refLine[b1] < columns) {
- ++b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- }
- break;
- case twoDimVertL2:
- a0New = codingLine[++a0] = refLine[b1] - 2;
- --b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- break;
- case twoDimVertR3:
- a0New = codingLine[++a0] = refLine[b1] + 3;
- if (refLine[b1] < columns) {
- ++b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- }
- break;
- case twoDimVertL3:
- a0New = codingLine[++a0] = refLine[b1] - 3;
- --b1;
- while (refLine[b1] <= codingLine[a0] && refLine[b1] < columns)
- b1 += 2;
- break;
- case EOF:
- eof = gTrue;
- codingLine[a0 = 0] = columns;
- return EOF;
- default:
- error(getPos(), "Bad 2D code %04x in CCITTFax stream", code1);
- err = gTrue;
- break;
- }
- } while (codingLine[a0] < columns);
-
- // 1-D encoding
- } else {
- codingLine[a0 = 0] = 0;
- while (1) {
- code1 = 0;
- do {
- code1 += code3 = getWhiteCode();
- } while (code3 >= 64);
- codingLine[a0+1] = codingLine[a0] + code1;
- ++a0;
- if (codingLine[a0] >= columns)
- break;
- code2 = 0;
- do {
- code2 += code3 = getBlackCode();
- } while (code3 >= 64);
- codingLine[a0+1] = codingLine[a0] + code2;
- ++a0;
- if (codingLine[a0] >= columns)
- break;
- }
- }
-
- if (codingLine[a0] != columns) {
- error(getPos(), "CCITTFax row is wrong length (%d)", codingLine[a0]);
- // force the row to be the correct length
- while (codingLine[a0] > columns) {
- --a0;
- }
- codingLine[++a0] = columns;
- err = gTrue;
- }
-
- // byte-align the row
- if (byteAlign) {
- inputBits &= ~7;
- }
-
- // check for end-of-line marker, skipping over any extra zero bits
- gotEOL = gFalse;
- if (!endOfBlock && row == rows - 1) {
- eof = gTrue;
- } else {
- code1 = lookBits(12);
- while (code1 == 0) {
- eatBits(1);
- code1 = lookBits(12);
- }
- if (code1 == 0x001) {
- eatBits(12);
- gotEOL = gTrue;
- } else if (code1 == EOF) {
- eof = gTrue;
- }
- }
-
- // get 2D encoding tag
- if (!eof && encoding > 0) {
- nextLine2D = !lookBits(1);
- eatBits(1);
- }
-
- // check for end-of-block marker
- if (endOfBlock && gotEOL) {
- code1 = lookBits(12);
- if (code1 == 0x001) {
- eatBits(12);
- if (encoding > 0) {
- lookBits(1);
- eatBits(1);
- }
- if (encoding >= 0) {
- for (i = 0; i < 4; ++i) {
- code1 = lookBits(12);
- if (code1 != 0x001) {
- error(getPos(), "Bad RTC code in CCITTFax stream");
- }
- eatBits(12);
- if (encoding > 0) {
- lookBits(1);
- eatBits(1);
- }
- }
- }
- eof = gTrue;
- }
-
- // look for an end-of-line marker after an error -- we only do
- // this if we know the stream contains end-of-line markers because
- // the "just plow on" technique tends to work better otherwise
- } else if (err && endOfLine) {
- do {
- if (code1 == EOF) {
- eof = gTrue;
- return EOF;
- }
- eatBits(1);
- code1 = lookBits(13);
- } while ((code1 >> 1) != 0x001);
- eatBits(12);
- if (encoding > 0) {
- eatBits(1);
- nextLine2D = !(code1 & 1);
- }
- }
-
- a0 = 0;
- outputBits = codingLine[1] - codingLine[0];
- if (outputBits == 0) {
- a0 = 1;
- outputBits = codingLine[2] - codingLine[1];
- }
-
- ++row;
- }
-
- // get a byte
- if (outputBits >= 8) {
- ret = ((a0 & 1) == 0) ? 0xff : 0x00;
- if ((outputBits -= 8) == 0) {
- ++a0;
- if (codingLine[a0] < columns) {
- outputBits = codingLine[a0 + 1] - codingLine[a0];
- }
- }
- } else {
- bits = 8;
- ret = 0;
- do {
- if (outputBits > bits) {
- i = bits;
- bits = 0;
- if ((a0 & 1) == 0) {
- ret |= 0xff >> (8 - i);
- }
- outputBits -= i;
- } else {
- i = outputBits;
- bits -= outputBits;
- if ((a0 & 1) == 0) {
- ret |= (0xff >> (8 - i)) << bits;
- }
- outputBits = 0;
- ++a0;
- if (codingLine[a0] < columns) {
- outputBits = codingLine[a0 + 1] - codingLine[a0];
- }
- }
- } while (bits > 0 && codingLine[a0] < columns);
- }
- buf = black ? (ret ^ 0xff) : ret;
- return buf;
-}
-
-short CCITTFaxStream::getTwoDimCode() {
- short code;
- CCITTCode *p;
- int n;
-
- code = 0; // make gcc happy
- if (endOfBlock) {
- code = lookBits(7);
- p = &twoDimTab1[code];
- if (p->bits > 0) {
- eatBits(p->bits);
- return p->n;
- }
- } else {
- for (n = 1; n <= 7; ++n) {
- code = lookBits(n);
- if (n < 7) {
- code <<= 7 - n;
- }
- p = &twoDimTab1[code];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- }
- error(getPos(), "Bad two dim code (%04x) in CCITTFax stream", code);
- return EOF;
-}
-
-short CCITTFaxStream::getWhiteCode() {
- short code;
- CCITTCode *p;
- int n;
-
- code = 0; // make gcc happy
- if (endOfBlock) {
- code = lookBits(12);
- if ((code >> 5) == 0) {
- p = &whiteTab1[code];
- } else {
- p = &whiteTab2[code >> 3];
- }
- if (p->bits > 0) {
- eatBits(p->bits);
- return p->n;
- }
- } else {
- for (n = 1; n <= 9; ++n) {
- code = lookBits(n);
- if (n < 9) {
- code <<= 9 - n;
- }
- p = &whiteTab2[code];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- for (n = 11; n <= 12; ++n) {
- code = lookBits(n);
- if (n < 12) {
- code <<= 12 - n;
- }
- p = &whiteTab1[code];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- }
- error(getPos(), "Bad white code (%04x) in CCITTFax stream", code);
- // eat a bit and return a positive number so that the caller doesn't
- // go into an infinite loop
- eatBits(1);
- return 1;
-}
-
-short CCITTFaxStream::getBlackCode() {
- short code;
- CCITTCode *p;
- int n;
-
- code = 0; // make gcc happy
- if (endOfBlock) {
- code = lookBits(13);
- if ((code >> 7) == 0) {
- p = &blackTab1[code];
- } else if ((code >> 9) == 0) {
- p = &blackTab2[(code >> 1) - 64];
- } else {
- p = &blackTab3[code >> 7];
- }
- if (p->bits > 0) {
- eatBits(p->bits);
- return p->n;
- }
- } else {
- for (n = 2; n <= 6; ++n) {
- code = lookBits(n);
- if (n < 6) {
- code <<= 6 - n;
- }
- p = &blackTab3[code];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- for (n = 7; n <= 12; ++n) {
- code = lookBits(n);
- if (n < 12) {
- code <<= 12 - n;
- }
- if (code >= 64) {
- p = &blackTab2[code - 64];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- }
- for (n = 10; n <= 13; ++n) {
- code = lookBits(n);
- if (n < 13) {
- code <<= 13 - n;
- }
- p = &blackTab1[code];
- if (p->bits == n) {
- eatBits(n);
- return p->n;
- }
- }
- }
- error(getPos(), "Bad black code (%04x) in CCITTFax stream", code);
- // eat a bit and return a positive number so that the caller doesn't
- // go into an infinite loop
- eatBits(1);
- return 1;
-}
-
-short CCITTFaxStream::lookBits(int n) {
- int c;
-
- while (inputBits < n) {
- if ((c = str->getChar()) == EOF) {
- if (inputBits == 0) {
- return EOF;
- }
- // near the end of the stream, the caller may ask for more bits
- // than are available, but there may still be a valid code in
- // however many bits are available -- we need to return correct
- // data in this case
- return (inputBuf << (n - inputBits)) & (0xffff >> (16 - n));
- }
- inputBuf = (inputBuf << 8) + c;
- inputBits += 8;
- }
- return (inputBuf >> (inputBits - n)) & (0xffff >> (16 - n));
-}
-
-GString *CCITTFaxStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
- char s1[50];
-
- if (psLevel < 2) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("<< ");
- if (encoding != 0) {
- sprintf(s1, "/K %d ", encoding);
- s->append(s1);
- }
- if (endOfLine) {
- s->append("/EndOfLine true ");
- }
- if (byteAlign) {
- s->append("/EncodedByteAlign true ");
- }
- sprintf(s1, "/Columns %d ", columns);
- s->append(s1);
- if (rows != 0) {
- sprintf(s1, "/Rows %d ", rows);
- s->append(s1);
- }
- if (!endOfBlock) {
- s->append("/EndOfBlock false ");
- }
- if (black) {
- s->append("/BlackIs1 true ");
- }
- s->append(">> /CCITTFaxDecode filter\n");
- return s;
-}
-
-GBool CCITTFaxStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-//------------------------------------------------------------------------
-// DCTStream
-//------------------------------------------------------------------------
-
-// IDCT constants (20.12 fixed point format)
-#define dctCos1 4017 // cos(pi/16)
-#define dctSin1 799 // sin(pi/16)
-#define dctCos3 3406 // cos(3*pi/16)
-#define dctSin3 2276 // sin(3*pi/16)
-#define dctCos6 1567 // cos(6*pi/16)
-#define dctSin6 3784 // sin(6*pi/16)
-#define dctSqrt2 5793 // sqrt(2)
-#define dctSqrt1d2 2896 // sqrt(2) / 2
-
-// color conversion parameters (16.16 fixed point format)
-#define dctCrToR 91881 // 1.4020
-#define dctCbToG -22553 // -0.3441363
-#define dctCrToG -46802 // -0.71413636
-#define dctCbToB 116130 // 1.772
-
-// clip [-256,511] --> [0,255]
-#define dctClipOffset 256
-static Guchar dctClip[768];
-static int dctClipInit = 0;
-
-// zig zag decode map
-static int dctZigZag[64] = {
- 0,
- 1, 8,
- 16, 9, 2,
- 3, 10, 17, 24,
- 32, 25, 18, 11, 4,
- 5, 12, 19, 26, 33, 40,
- 48, 41, 34, 27, 20, 13, 6,
- 7, 14, 21, 28, 35, 42, 49, 56,
- 57, 50, 43, 36, 29, 22, 15,
- 23, 30, 37, 44, 51, 58,
- 59, 52, 45, 38, 31,
- 39, 46, 53, 60,
- 61, 54, 47,
- 55, 62,
- 63
-};
-
-DCTStream::DCTStream(Stream *strA):
- FilterStream(strA) {
- int i, j;
-
- progressive = interleaved = gFalse;
- width = height = 0;
- mcuWidth = mcuHeight = 0;
- numComps = 0;
- comp = 0;
- x = y = dy = 0;
- for (i = 0; i < 4; ++i) {
- for (j = 0; j < 32; ++j) {
- rowBuf[i][j] = NULL;
- }
- frameBuf[i] = NULL;
- }
-
- if (!dctClipInit) {
- for (i = -256; i < 0; ++i)
- dctClip[dctClipOffset + i] = 0;
- for (i = 0; i < 256; ++i)
- dctClip[dctClipOffset + i] = i;
- for (i = 256; i < 512; ++i)
- dctClip[dctClipOffset + i] = 255;
- dctClipInit = 1;
- }
-}
-
-DCTStream::~DCTStream() {
- int i, j;
-
- delete str;
- if (progressive || !interleaved) {
- for (i = 0; i < numComps; ++i) {
- gfree(frameBuf[i]);
- }
- } else {
- for (i = 0; i < numComps; ++i) {
- for (j = 0; j < mcuHeight; ++j) {
- gfree(rowBuf[i][j]);
- }
- }
- }
-}
-
-void DCTStream::reset() {
- int minHSample, minVSample;
- int i, j;
-
- str->reset();
-
- progressive = interleaved = gFalse;
- width = height = 0;
- numComps = 0;
- numQuantTables = 0;
- numDCHuffTables = 0;
- numACHuffTables = 0;
- colorXform = 0;
- gotJFIFMarker = gFalse;
- gotAdobeMarker = gFalse;
- restartInterval = 0;
-
- if (!readHeader()) {
- y = height;
- return;
- }
-
- // compute MCU size
- mcuWidth = minHSample = compInfo[0].hSample;
- mcuHeight = minVSample = compInfo[0].vSample;
- for (i = 1; i < numComps; ++i) {
- if (compInfo[i].hSample < minHSample)
- minHSample = compInfo[i].hSample;
- if (compInfo[i].vSample < minVSample)
- minVSample = compInfo[i].vSample;
- if (compInfo[i].hSample > mcuWidth)
- mcuWidth = compInfo[i].hSample;
- if (compInfo[i].vSample > mcuHeight)
- mcuHeight = compInfo[i].vSample;
- }
- for (i = 0; i < numComps; ++i) {
- compInfo[i].hSample /= minHSample;
- compInfo[i].vSample /= minVSample;
- }
- mcuWidth = (mcuWidth / minHSample) * 8;
- mcuHeight = (mcuHeight / minVSample) * 8;
-
- // figure out color transform
- if (!gotAdobeMarker && numComps == 3) {
- if (gotJFIFMarker) {
- colorXform = 1;
- } else if (compInfo[0].id == 82 && compInfo[1].id == 71 &&
- compInfo[2].id == 66) { // ASCII "RGB"
- colorXform = 0;
- } else {
- colorXform = 1;
- }
- }
-
- if (progressive || !interleaved) {
-
- // allocate a buffer for the whole image
- bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;
- bufHeight = ((height + mcuHeight - 1) / mcuHeight) * mcuHeight;
- for (i = 0; i < numComps; ++i) {
- frameBuf[i] = (int *)gmalloc(bufWidth * bufHeight * sizeof(int));
- memset(frameBuf[i], 0, bufWidth * bufHeight * sizeof(int));
- }
-
- // read the image data
- do {
- restartMarker = 0xd0;
- restart();
- readScan();
- } while (readHeader());
-
- // decode
- decodeImage();
-
- // initialize counters
- comp = 0;
- x = 0;
- y = 0;
-
- } else {
-
- // allocate a buffer for one row of MCUs
- bufWidth = ((width + mcuWidth - 1) / mcuWidth) * mcuWidth;
- for (i = 0; i < numComps; ++i) {
- for (j = 0; j < mcuHeight; ++j) {
- rowBuf[i][j] = (Guchar *)gmalloc(bufWidth * sizeof(Guchar));
- }
- }
-
- // initialize counters
- comp = 0;
- x = 0;
- y = 0;
- dy = mcuHeight;
-
- restartMarker = 0xd0;
- restart();
- }
-}
-
-int DCTStream::getChar() {
- int c;
-
- if (y >= height) {
- return EOF;
- }
- if (progressive || !interleaved) {
- c = frameBuf[comp][y * bufWidth + x];
- if (++comp == numComps) {
- comp = 0;
- if (++x == width) {
- x = 0;
- ++y;
- }
- }
- } else {
- if (dy >= mcuHeight) {
- if (!readMCURow()) {
- y = height;
- return EOF;
- }
- comp = 0;
- x = 0;
- dy = 0;
- }
- c = rowBuf[comp][dy][x];
- if (++comp == numComps) {
- comp = 0;
- if (++x == width) {
- x = 0;
- ++y;
- ++dy;
- if (y == height) {
- readTrailer();
- }
- }
- }
- }
- return c;
-}
-
-int DCTStream::lookChar() {
- if (y >= height) {
- return EOF;
- }
- if (progressive || !interleaved) {
- return frameBuf[comp][y * bufWidth + x];
- } else {
- if (dy >= mcuHeight) {
- if (!readMCURow()) {
- y = height;
- return EOF;
- }
- comp = 0;
- x = 0;
- dy = 0;
- }
- return rowBuf[comp][dy][x];
- }
-}
-
-void DCTStream::restart() {
- int i;
-
- inputBits = 0;
- restartCtr = restartInterval;
- for (i = 0; i < numComps; ++i) {
- compInfo[i].prevDC = 0;
- }
- eobRun = 0;
-}
-
-// Read one row of MCUs from a sequential JPEG stream.
-GBool DCTStream::readMCURow() {
- int data1[64];
- Guchar data2[64];
- Guchar *p1, *p2;
- int pY, pCb, pCr, pR, pG, pB;
- int h, v, horiz, vert, hSub, vSub;
- int x1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;
- int c;
-
- for (x1 = 0; x1 < width; x1 += mcuWidth) {
-
- // deal with restart marker
- if (restartInterval > 0 && restartCtr == 0) {
- c = readMarker();
- if (c != restartMarker) {
- error(getPos(), "Bad DCT data: incorrect restart marker");
- return gFalse;
- }
- if (++restartMarker == 0xd8)
- restartMarker = 0xd0;
- restart();
- }
-
- // read one MCU
- for (cc = 0; cc < numComps; ++cc) {
- h = compInfo[cc].hSample;
- v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
- hSub = horiz / 8;
- vSub = vert / 8;
- for (y2 = 0; y2 < mcuHeight; y2 += vert) {
- for (x2 = 0; x2 < mcuWidth; x2 += horiz) {
- if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],
- &acHuffTables[scanInfo.acHuffTable[cc]],
- &compInfo[cc].prevDC,
- data1)) {
- return gFalse;
- }
- transformDataUnit(quantTables[compInfo[cc].quantTable],
- data1, data2);
- if (hSub == 1 && vSub == 1) {
- for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
- p1 = &rowBuf[cc][y2+y3][x1+x2];
- p1[0] = data2[i];
- p1[1] = data2[i+1];
- p1[2] = data2[i+2];
- p1[3] = data2[i+3];
- p1[4] = data2[i+4];
- p1[5] = data2[i+5];
- p1[6] = data2[i+6];
- p1[7] = data2[i+7];
- }
- } else if (hSub == 2 && vSub == 2) {
- for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {
- p1 = &rowBuf[cc][y2+y3][x1+x2];
- p2 = &rowBuf[cc][y2+y3+1][x1+x2];
- p1[0] = p1[1] = p2[0] = p2[1] = data2[i];
- p1[2] = p1[3] = p2[2] = p2[3] = data2[i+1];
- p1[4] = p1[5] = p2[4] = p2[5] = data2[i+2];
- p1[6] = p1[7] = p2[6] = p2[7] = data2[i+3];
- p1[8] = p1[9] = p2[8] = p2[9] = data2[i+4];
- p1[10] = p1[11] = p2[10] = p2[11] = data2[i+5];
- p1[12] = p1[13] = p2[12] = p2[13] = data2[i+6];
- p1[14] = p1[15] = p2[14] = p2[15] = data2[i+7];
- }
- } else {
- i = 0;
- for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {
- for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {
- for (y5 = 0; y5 < vSub; ++y5)
- for (x5 = 0; x5 < hSub; ++x5)
- rowBuf[cc][y2+y4+y5][x1+x2+x4+x5] = data2[i];
- ++i;
- }
- }
- }
- }
- }
- }
- --restartCtr;
-
- // color space conversion
- if (colorXform) {
- // convert YCbCr to RGB
- if (numComps == 3) {
- for (y2 = 0; y2 < mcuHeight; ++y2) {
- for (x2 = 0; x2 < mcuWidth; ++x2) {
- pY = rowBuf[0][y2][x1+x2];
- pCb = rowBuf[1][y2][x1+x2] - 128;
- pCr = rowBuf[2][y2][x1+x2] - 128;
- pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
- rowBuf[0][y2][x1+x2] = dctClip[dctClipOffset + pR];
- pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;
- rowBuf[1][y2][x1+x2] = dctClip[dctClipOffset + pG];
- pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
- rowBuf[2][y2][x1+x2] = dctClip[dctClipOffset + pB];
- }
- }
- // convert YCbCrK to CMYK (K is passed through unchanged)
- } else if (numComps == 4) {
- for (y2 = 0; y2 < mcuHeight; ++y2) {
- for (x2 = 0; x2 < mcuWidth; ++x2) {
- pY = rowBuf[0][y2][x1+x2];
- pCb = rowBuf[1][y2][x1+x2] - 128;
- pCr = rowBuf[2][y2][x1+x2] - 128;
- pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
- rowBuf[0][y2][x1+x2] = 255 - dctClip[dctClipOffset + pR];
- pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr + 32768) >> 16;
- rowBuf[1][y2][x1+x2] = 255 - dctClip[dctClipOffset + pG];
- pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
- rowBuf[2][y2][x1+x2] = 255 - dctClip[dctClipOffset + pB];
- }
- }
- }
- }
- }
- return gTrue;
-}
-
-// Read one scan from a progressive or non-interleaved JPEG stream.
-void DCTStream::readScan() {
- int data[64];
- int x1, y1, dx1, dy1, x2, y2, y3, cc, i;
- int h, v, horiz, vert, vSub;
- int *p1;
- int c;
-
- if (scanInfo.numComps == 1) {
- for (cc = 0; cc < numComps; ++cc) {
- if (scanInfo.comp[cc]) {
- break;
- }
- }
- dx1 = mcuWidth / compInfo[cc].hSample;
- dy1 = mcuHeight / compInfo[cc].vSample;
- } else {
- dx1 = mcuWidth;
- dy1 = mcuHeight;
- }
-
- for (y1 = 0; y1 < height; y1 += dy1) {
- for (x1 = 0; x1 < width; x1 += dx1) {
-
- // deal with restart marker
- if (restartInterval > 0 && restartCtr == 0) {
- c = readMarker();
- if (c != restartMarker) {
- error(getPos(), "Bad DCT data: incorrect restart marker");
- return;
- }
- if (++restartMarker == 0xd8) {
- restartMarker = 0xd0;
- }
- restart();
- }
-
- // read one MCU
- for (cc = 0; cc < numComps; ++cc) {
- if (!scanInfo.comp[cc]) {
- continue;
- }
-
- h = compInfo[cc].hSample;
- v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
- vSub = vert / 8;
- for (y2 = 0; y2 < dy1; y2 += vert) {
- for (x2 = 0; x2 < dx1; x2 += horiz) {
-
- // pull out the current values
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
- for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
- data[i] = p1[0];
- data[i+1] = p1[1];
- data[i+2] = p1[2];
- data[i+3] = p1[3];
- data[i+4] = p1[4];
- data[i+5] = p1[5];
- data[i+6] = p1[6];
- data[i+7] = p1[7];
- p1 += bufWidth * vSub;
- }
-
- // read one data unit
- if (progressive) {
- if (!readProgressiveDataUnit(
- &dcHuffTables[scanInfo.dcHuffTable[cc]],
- &acHuffTables[scanInfo.acHuffTable[cc]],
- &compInfo[cc].prevDC,
- data)) {
- return;
- }
- } else {
- if (!readDataUnit(&dcHuffTables[scanInfo.dcHuffTable[cc]],
- &acHuffTables[scanInfo.acHuffTable[cc]],
- &compInfo[cc].prevDC,
- data)) {
- return;
- }
- }
-
- // add the data unit into frameBuf
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
- for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
- p1[0] = data[i];
- p1[1] = data[i+1];
- p1[2] = data[i+2];
- p1[3] = data[i+3];
- p1[4] = data[i+4];
- p1[5] = data[i+5];
- p1[6] = data[i+6];
- p1[7] = data[i+7];
- p1 += bufWidth * vSub;
- }
- }
- }
- }
- --restartCtr;
- }
- }
-}
-
-// Read one data unit from a sequential JPEG stream.
-GBool DCTStream::readDataUnit(DCTHuffTable *dcHuffTable,
- DCTHuffTable *acHuffTable,
- int *prevDC, int data[64]) {
- int run, size, amp;
- int c;
- int i, j;
-
- if ((size = readHuffSym(dcHuffTable)) == 9999) {
- return gFalse;
- }
- if (size > 0) {
- if ((amp = readAmp(size)) == 9999) {
- return gFalse;
- }
- } else {
- amp = 0;
- }
- data[0] = *prevDC += amp;
- for (i = 1; i < 64; ++i) {
- data[i] = 0;
- }
- i = 1;
- while (i < 64) {
- run = 0;
- while ((c = readHuffSym(acHuffTable)) == 0xf0 && run < 0x30) {
- run += 0x10;
- }
- if (c == 9999) {
- return gFalse;
- }
- if (c == 0x00) {
- break;
- } else {
- run += (c >> 4) & 0x0f;
- size = c & 0x0f;
- amp = readAmp(size);
- if (amp == 9999) {
- return gFalse;
- }
- i += run;
- if (i < 64) {
- j = dctZigZag[i++];
- data[j] = amp;
- }
- }
- }
- return gTrue;
-}
-
-// Read one data unit from a sequential JPEG stream.
-GBool DCTStream::readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
- DCTHuffTable *acHuffTable,
- int *prevDC, int data[64]) {
- int run, size, amp, bit, c;
- int i, j, k;
-
- // get the DC coefficient
- i = scanInfo.firstCoeff;
- if (i == 0) {
- if (scanInfo.ah == 0) {
- if ((size = readHuffSym(dcHuffTable)) == 9999) {
- return gFalse;
- }
- if (size > 0) {
- if ((amp = readAmp(size)) == 9999) {
- return gFalse;
- }
- } else {
- amp = 0;
- }
- data[0] += (*prevDC += amp) << scanInfo.al;
- } else {
- if ((bit = readBit()) == 9999) {
- return gFalse;
- }
- data[0] += bit << scanInfo.al;
- }
- ++i;
- }
- if (scanInfo.lastCoeff == 0) {
- return gTrue;
- }
-
- // check for an EOB run
- if (eobRun > 0) {
- while (i <= scanInfo.lastCoeff) {
- j = dctZigZag[i++];
- if (data[j] != 0) {
- if ((bit = readBit()) == EOF) {
- return gFalse;
- }
- if (bit) {
- data[j] += 1 << scanInfo.al;
- }
- }
- }
- --eobRun;
- return gTrue;
- }
-
- // read the AC coefficients
- while (i <= scanInfo.lastCoeff) {
- if ((c = readHuffSym(acHuffTable)) == 9999) {
- return gFalse;
- }
-
- // ZRL
- if (c == 0xf0) {
- k = 0;
- while (k < 16) {
- j = dctZigZag[i++];
- if (data[j] == 0) {
- ++k;
- } else {
- if ((bit = readBit()) == EOF) {
- return gFalse;
- }
- if (bit) {
- data[j] += 1 << scanInfo.al;
- }
- }
- }
-
- // EOB run
- } else if ((c & 0x0f) == 0x00) {
- j = c >> 4;
- eobRun = 0;
- for (k = 0; k < j; ++k) {
- if ((bit = readBit()) == EOF) {
- return gFalse;
- }
- eobRun = (eobRun << 1) | bit;
- }
- eobRun += 1 << j;
- while (i <= scanInfo.lastCoeff) {
- j = dctZigZag[i++];
- if (data[j] != 0) {
- if ((bit = readBit()) == EOF) {
- return gFalse;
- }
- if (bit) {
- data[j] += 1 << scanInfo.al;
- }
- }
- }
- --eobRun;
- break;
-
- // zero run and one AC coefficient
- } else {
- run = (c >> 4) & 0x0f;
- size = c & 0x0f;
- if ((amp = readAmp(size)) == 9999) {
- return gFalse;
- }
- k = 0;
- do {
- j = dctZigZag[i++];
- while (data[j] != 0) {
- if ((bit = readBit()) == EOF) {
- return gFalse;
- }
- if (bit) {
- data[j] += 1 << scanInfo.al;
- }
- j = dctZigZag[i++];
- }
- ++k;
- } while (k <= run);
- data[j] = amp << scanInfo.al;
- }
- }
-
- return gTrue;
-}
-
-// Decode a progressive JPEG image.
-void DCTStream::decodeImage() {
- int dataIn[64];
- Guchar dataOut[64];
- Guchar *quantTable;
- int pY, pCb, pCr, pR, pG, pB;
- int x1, y1, x2, y2, x3, y3, x4, y4, x5, y5, cc, i;
- int h, v, horiz, vert, hSub, vSub;
- int *p0, *p1, *p2;
-
- for (y1 = 0; y1 < bufHeight; y1 += mcuHeight) {
- for (x1 = 0; x1 < bufWidth; x1 += mcuWidth) {
- for (cc = 0; cc < numComps; ++cc) {
- quantTable = quantTables[compInfo[cc].quantTable];
- h = compInfo[cc].hSample;
- v = compInfo[cc].vSample;
- horiz = mcuWidth / h;
- vert = mcuHeight / v;
- hSub = horiz / 8;
- vSub = vert / 8;
- for (y2 = 0; y2 < mcuHeight; y2 += vert) {
- for (x2 = 0; x2 < mcuWidth; x2 += horiz) {
-
- // pull out the coded data unit
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
- for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
- dataIn[i] = p1[0];
- dataIn[i+1] = p1[1];
- dataIn[i+2] = p1[2];
- dataIn[i+3] = p1[3];
- dataIn[i+4] = p1[4];
- dataIn[i+5] = p1[5];
- dataIn[i+6] = p1[6];
- dataIn[i+7] = p1[7];
- p1 += bufWidth * vSub;
- }
-
- // transform
- transformDataUnit(quantTable, dataIn, dataOut);
-
- // store back into frameBuf, doing replication for
- // subsampled components
- p1 = &frameBuf[cc][(y1+y2) * bufWidth + (x1+x2)];
- if (hSub == 1 && vSub == 1) {
- for (y3 = 0, i = 0; y3 < 8; ++y3, i += 8) {
- p1[0] = dataOut[i] & 0xff;
- p1[1] = dataOut[i+1] & 0xff;
- p1[2] = dataOut[i+2] & 0xff;
- p1[3] = dataOut[i+3] & 0xff;
- p1[4] = dataOut[i+4] & 0xff;
- p1[5] = dataOut[i+5] & 0xff;
- p1[6] = dataOut[i+6] & 0xff;
- p1[7] = dataOut[i+7] & 0xff;
- p1 += bufWidth;
- }
- } else if (hSub == 2 && vSub == 2) {
- p2 = p1 + bufWidth;
- for (y3 = 0, i = 0; y3 < 16; y3 += 2, i += 8) {
- p1[0] = p1[1] = p2[0] = p2[1] = dataOut[i] & 0xff;
- p1[2] = p1[3] = p2[2] = p2[3] = dataOut[i+1] & 0xff;
- p1[4] = p1[5] = p2[4] = p2[5] = dataOut[i+2] & 0xff;
- p1[6] = p1[7] = p2[6] = p2[7] = dataOut[i+3] & 0xff;
- p1[8] = p1[9] = p2[8] = p2[9] = dataOut[i+4] & 0xff;
- p1[10] = p1[11] = p2[10] = p2[11] = dataOut[i+5] & 0xff;
- p1[12] = p1[13] = p2[12] = p2[13] = dataOut[i+6] & 0xff;
- p1[14] = p1[15] = p2[14] = p2[15] = dataOut[i+7] & 0xff;
- p1 += bufWidth * 2;
- p2 += bufWidth * 2;
- }
- } else {
- i = 0;
- for (y3 = 0, y4 = 0; y3 < 8; ++y3, y4 += vSub) {
- for (x3 = 0, x4 = 0; x3 < 8; ++x3, x4 += hSub) {
- p2 = p1 + x4;
- for (y5 = 0; y5 < vSub; ++y5) {
- for (x5 = 0; x5 < hSub; ++x5) {
- p2[x5] = dataOut[i] & 0xff;
- }
- p2 += bufWidth;
- }
- ++i;
- }
- p1 += bufWidth * vSub;
- }
- }
- }
- }
- }
-
- // color space conversion
- if (colorXform) {
- // convert YCbCr to RGB
- if (numComps == 3) {
- for (y2 = 0; y2 < mcuHeight; ++y2) {
- p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
- p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
- p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
- for (x2 = 0; x2 < mcuWidth; ++x2) {
- pY = *p0;
- pCb = *p1 - 128;
- pCr = *p2 - 128;
- pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
- *p0++ = dctClip[dctClipOffset + pR];
- pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +
- 32768) >> 16;
- *p1++ = dctClip[dctClipOffset + pG];
- pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
- *p2++ = dctClip[dctClipOffset + pB];
- }
- }
- // convert YCbCrK to CMYK (K is passed through unchanged)
- } else if (numComps == 4) {
- for (y2 = 0; y2 < mcuHeight; ++y2) {
- p0 = &frameBuf[0][(y1+y2) * bufWidth + x1];
- p1 = &frameBuf[1][(y1+y2) * bufWidth + x1];
- p2 = &frameBuf[2][(y1+y2) * bufWidth + x1];
- for (x2 = 0; x2 < mcuWidth; ++x2) {
- pY = *p0;
- pCb = *p1 - 128;
- pCr = *p2 - 128;
- pR = ((pY << 16) + dctCrToR * pCr + 32768) >> 16;
- *p0++ = 255 - dctClip[dctClipOffset + pR];
- pG = ((pY << 16) + dctCbToG * pCb + dctCrToG * pCr +
- 32768) >> 16;
- *p1++ = 255 - dctClip[dctClipOffset + pG];
- pB = ((pY << 16) + dctCbToB * pCb + 32768) >> 16;
- *p2++ = 255 - dctClip[dctClipOffset + pB];
- }
- }
- }
- }
- }
- }
-}
-
-// Transform one data unit -- this performs the dequantization and
-// IDCT steps. This IDCT algorithm is taken from:
-// Christoph Loeffler, Adriaan Ligtenberg, George S. Moschytz,
-// "Practical Fast 1-D DCT Algorithms with 11 Multiplications",
-// IEEE Intl. Conf. on Acoustics, Speech & Signal Processing, 1989,
-// 988-991.
-// The stage numbers mentioned in the comments refer to Figure 1 in this
-// paper.
-void DCTStream::transformDataUnit(Guchar *quantTable,
- int dataIn[64], Guchar dataOut[64]) {
- int v0, v1, v2, v3, v4, v5, v6, v7, t;
- int *p;
- int i;
-
- // dequant
- for (i = 0; i < 64; ++i) {
- dataIn[i] *= quantTable[i];
- }
-
- // inverse DCT on rows
- for (i = 0; i < 64; i += 8) {
- p = dataIn + i;
-
- // check for all-zero AC coefficients
- if (p[1] == 0 && p[2] == 0 && p[3] == 0 &&
- p[4] == 0 && p[5] == 0 && p[6] == 0 && p[7] == 0) {
- t = (dctSqrt2 * p[0] + 512) >> 10;
- p[0] = t;
- p[1] = t;
- p[2] = t;
- p[3] = t;
- p[4] = t;
- p[5] = t;
- p[6] = t;
- p[7] = t;
- continue;
- }
-
- // stage 4
- v0 = (dctSqrt2 * p[0] + 128) >> 8;
- v1 = (dctSqrt2 * p[4] + 128) >> 8;
- v2 = p[2];
- v3 = p[6];
- v4 = (dctSqrt1d2 * (p[1] - p[7]) + 128) >> 8;
- v7 = (dctSqrt1d2 * (p[1] + p[7]) + 128) >> 8;
- v5 = p[3] << 4;
- v6 = p[5] << 4;
-
- // stage 3
- t = (v0 - v1+ 1) >> 1;
- v0 = (v0 + v1 + 1) >> 1;
- v1 = t;
- t = (v2 * dctSin6 + v3 * dctCos6 + 128) >> 8;
- v2 = (v2 * dctCos6 - v3 * dctSin6 + 128) >> 8;
- v3 = t;
- t = (v4 - v6 + 1) >> 1;
- v4 = (v4 + v6 + 1) >> 1;
- v6 = t;
- t = (v7 + v5 + 1) >> 1;
- v5 = (v7 - v5 + 1) >> 1;
- v7 = t;
-
- // stage 2
- t = (v0 - v3 + 1) >> 1;
- v0 = (v0 + v3 + 1) >> 1;
- v3 = t;
- t = (v1 - v2 + 1) >> 1;
- v1 = (v1 + v2 + 1) >> 1;
- v2 = t;
- t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
- v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
- v7 = t;
- t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
- v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
- v6 = t;
-
- // stage 1
- p[0] = v0 + v7;
- p[7] = v0 - v7;
- p[1] = v1 + v6;
- p[6] = v1 - v6;
- p[2] = v2 + v5;
- p[5] = v2 - v5;
- p[3] = v3 + v4;
- p[4] = v3 - v4;
- }
-
- // inverse DCT on columns
- for (i = 0; i < 8; ++i) {
- p = dataIn + i;
-
- // check for all-zero AC coefficients
- if (p[1*8] == 0 && p[2*8] == 0 && p[3*8] == 0 &&
- p[4*8] == 0 && p[5*8] == 0 && p[6*8] == 0 && p[7*8] == 0) {
- t = (dctSqrt2 * dataIn[i+0] + 8192) >> 14;
- p[0*8] = t;
- p[1*8] = t;
- p[2*8] = t;
- p[3*8] = t;
- p[4*8] = t;
- p[5*8] = t;
- p[6*8] = t;
- p[7*8] = t;
- continue;
- }
-
- // stage 4
- v0 = (dctSqrt2 * p[0*8] + 2048) >> 12;
- v1 = (dctSqrt2 * p[4*8] + 2048) >> 12;
- v2 = p[2*8];
- v3 = p[6*8];
- v4 = (dctSqrt1d2 * (p[1*8] - p[7*8]) + 2048) >> 12;
- v7 = (dctSqrt1d2 * (p[1*8] + p[7*8]) + 2048) >> 12;
- v5 = p[3*8];
- v6 = p[5*8];
-
- // stage 3
- t = (v0 - v1 + 1) >> 1;
- v0 = (v0 + v1 + 1) >> 1;
- v1 = t;
- t = (v2 * dctSin6 + v3 * dctCos6 + 2048) >> 12;
- v2 = (v2 * dctCos6 - v3 * dctSin6 + 2048) >> 12;
- v3 = t;
- t = (v4 - v6 + 1) >> 1;
- v4 = (v4 + v6 + 1) >> 1;
- v6 = t;
- t = (v7 + v5 + 1) >> 1;
- v5 = (v7 - v5 + 1) >> 1;
- v7 = t;
-
- // stage 2
- t = (v0 - v3 + 1) >> 1;
- v0 = (v0 + v3 + 1) >> 1;
- v3 = t;
- t = (v1 - v2 + 1) >> 1;
- v1 = (v1 + v2 + 1) >> 1;
- v2 = t;
- t = (v4 * dctSin3 + v7 * dctCos3 + 2048) >> 12;
- v4 = (v4 * dctCos3 - v7 * dctSin3 + 2048) >> 12;
- v7 = t;
- t = (v5 * dctSin1 + v6 * dctCos1 + 2048) >> 12;
- v5 = (v5 * dctCos1 - v6 * dctSin1 + 2048) >> 12;
- v6 = t;
-
- // stage 1
- p[0*8] = v0 + v7;
- p[7*8] = v0 - v7;
- p[1*8] = v1 + v6;
- p[6*8] = v1 - v6;
- p[2*8] = v2 + v5;
- p[5*8] = v2 - v5;
- p[3*8] = v3 + v4;
- p[4*8] = v3 - v4;
- }
-
- // convert to 8-bit integers
- for (i = 0; i < 64; ++i) {
- dataOut[i] = dctClip[dctClipOffset + 128 + ((dataIn[i] + 8) >> 4)];
- }
-}
-
-int DCTStream::readHuffSym(DCTHuffTable *table) {
- Gushort code;
- int bit;
- int codeBits;
-
- code = 0;
- codeBits = 0;
- do {
- // add a bit to the code
- if ((bit = readBit()) == EOF)
- return 9999;
- code = (code << 1) + bit;
- ++codeBits;
-
- // look up code
- if (code - table->firstCode[codeBits] < table->numCodes[codeBits]) {
- code -= table->firstCode[codeBits];
- return table->sym[table->firstSym[codeBits] + code];
- }
- } while (codeBits < 16);
-
- error(getPos(), "Bad Huffman code in DCT stream");
- return 9999;
-}
-
-int DCTStream::readAmp(int size) {
- int amp, bit;
- int bits;
-
- amp = 0;
- for (bits = 0; bits < size; ++bits) {
- if ((bit = readBit()) == EOF)
- return 9999;
- amp = (amp << 1) + bit;
- }
- if (amp < (1 << (size - 1)))
- amp -= (1 << size) - 1;
- return amp;
-}
-
-int DCTStream::readBit() {
- int bit;
- int c, c2;
-
- if (inputBits == 0) {
- if ((c = str->getChar()) == EOF)
- return EOF;
- if (c == 0xff) {
- do {
- c2 = str->getChar();
- } while (c2 == 0xff);
- if (c2 != 0x00) {
- error(getPos(), "Bad DCT data: missing 00 after ff");
- return EOF;
- }
- }
- inputBuf = c;
- inputBits = 8;
- }
- bit = (inputBuf >> (inputBits - 1)) & 1;
- --inputBits;
- return bit;
-}
-
-GBool DCTStream::readHeader() {
- GBool doScan;
- int n;
- int c = 0;
- int i;
-
- // read headers
- doScan = gFalse;
- while (!doScan) {
- c = readMarker();
- switch (c) {
- case 0xc0: // SOF0
- if (!readBaselineSOF()) {
- return gFalse;
- }
- break;
- case 0xc2: // SOF2
- if (!readProgressiveSOF()) {
- return gFalse;
- }
- break;
- case 0xc4: // DHT
- if (!readHuffmanTables()) {
- return gFalse;
- }
- break;
- case 0xd8: // SOI
- break;
- case 0xd9: // EOI
- return gFalse;
- case 0xda: // SOS
- if (!readScanInfo()) {
- return gFalse;
- }
- doScan = gTrue;
- break;
- case 0xdb: // DQT
- if (!readQuantTables()) {
- return gFalse;
- }
- break;
- case 0xdd: // DRI
- if (!readRestartInterval()) {
- return gFalse;
- }
- break;
- case 0xe0: // APP0
- if (!readJFIFMarker()) {
- return gFalse;
- }
- break;
- case 0xee: // APP14
- if (!readAdobeMarker()) {
- return gFalse;
- }
- break;
- case EOF:
- error(getPos(), "Bad DCT header");
- return gFalse;
- default:
- // skip APPn / COM / etc.
- if (c >= 0xe0) {
- n = read16() - 2;
- for (i = 0; i < n; ++i) {
- str->getChar();
- }
- } else {
- error(getPos(), "Unknown DCT marker <%02x>", c);
- return gFalse;
- }
- break;
- }
- }
-
- return gTrue;
-}
-
-GBool DCTStream::readBaselineSOF() {
- int length;
- int prec;
- int i;
- int c;
-
- length = read16();
- prec = str->getChar();
- height = read16();
- width = read16();
- numComps = str->getChar();
- if (prec != 8) {
- error(getPos(), "Bad DCT precision %d", prec);
- return gFalse;
- }
- for (i = 0; i < numComps; ++i) {
- compInfo[i].id = str->getChar();
- c = str->getChar();
- compInfo[i].hSample = (c >> 4) & 0x0f;
- compInfo[i].vSample = c & 0x0f;
- compInfo[i].quantTable = str->getChar();
- }
- progressive = gFalse;
- return gTrue;
-}
-
-GBool DCTStream::readProgressiveSOF() {
- int length;
- int prec;
- int i;
- int c;
-
- length = read16();
- prec = str->getChar();
- height = read16();
- width = read16();
- numComps = str->getChar();
- if (prec != 8) {
- error(getPos(), "Bad DCT precision %d", prec);
- return gFalse;
- }
- for (i = 0; i < numComps; ++i) {
- compInfo[i].id = str->getChar();
- c = str->getChar();
- compInfo[i].hSample = (c >> 4) & 0x0f;
- compInfo[i].vSample = c & 0x0f;
- compInfo[i].quantTable = str->getChar();
- }
- progressive = gTrue;
- return gTrue;
-}
-
-GBool DCTStream::readScanInfo() {
- int length;
- int id, c;
- int i, j;
-
- length = read16() - 2;
- scanInfo.numComps = str->getChar();
- --length;
- if (length != 2 * scanInfo.numComps + 3) {
- error(getPos(), "Bad DCT scan info block");
- return gFalse;
- }
- interleaved = scanInfo.numComps == numComps;
- for (j = 0; j < numComps; ++j) {
- scanInfo.comp[j] = gFalse;
- }
- for (i = 0; i < scanInfo.numComps; ++i) {
- id = str->getChar();
- // some (broken) DCT streams reuse ID numbers, but at least they
- // keep the components in order, so we check compInfo[i] first to
- // work around the problem
- if (id == compInfo[i].id) {
- j = i;
- } else {
- for (j = 0; j < numComps; ++j) {
- if (id == compInfo[j].id) {
- break;
- }
- }
- if (j == numComps) {
- error(getPos(), "Bad DCT component ID in scan info block");
- return gFalse;
- }
- }
- scanInfo.comp[j] = gTrue;
- c = str->getChar();
- scanInfo.dcHuffTable[j] = (c >> 4) & 0x0f;
- scanInfo.acHuffTable[j] = c & 0x0f;
- }
- scanInfo.firstCoeff = str->getChar();
- scanInfo.lastCoeff = str->getChar();
- c = str->getChar();
- scanInfo.ah = (c >> 4) & 0x0f;
- scanInfo.al = c & 0x0f;
- return gTrue;
-}
-
-GBool DCTStream::readQuantTables() {
- int length;
- int i;
- int index;
-
- length = read16() - 2;
- while (length > 0) {
- index = str->getChar();
- if ((index & 0xf0) || index >= 4) {
- error(getPos(), "Bad DCT quantization table");
- return gFalse;
- }
- if (index == numQuantTables)
- numQuantTables = index + 1;
- for (i = 0; i < 64; ++i)
- quantTables[index][dctZigZag[i]] = str->getChar();
- length -= 65;
- }
- return gTrue;
-}
-
-GBool DCTStream::readHuffmanTables() {
- DCTHuffTable *tbl;
- int length;
- int index;
- Gushort code;
- Guchar sym;
- int i;
- int c;
-
- length = read16() - 2;
- while (length > 0) {
- index = str->getChar();
- --length;
- if ((index & 0x0f) >= 4) {
- error(getPos(), "Bad DCT Huffman table");
- return gFalse;
- }
- if (index & 0x10) {
- index &= 0x0f;
- if (index >= numACHuffTables)
- numACHuffTables = index+1;
- tbl = &acHuffTables[index];
- } else {
- if (index >= numDCHuffTables)
- numDCHuffTables = index+1;
- tbl = &dcHuffTables[index];
- }
- sym = 0;
- code = 0;
- for (i = 1; i <= 16; ++i) {
- c = str->getChar();
- tbl->firstSym[i] = sym;
- tbl->firstCode[i] = code;
- tbl->numCodes[i] = c;
- sym += c;
- code = (code + c) << 1;
- }
- length -= 16;
- for (i = 0; i < sym; ++i)
- tbl->sym[i] = str->getChar();
- length -= sym;
- }
- return gTrue;
-}
-
-GBool DCTStream::readRestartInterval() {
- int length;
-
- length = read16();
- if (length != 4) {
- error(getPos(), "Bad DCT restart interval");
- return gFalse;
- }
- restartInterval = read16();
- return gTrue;
-}
-
-GBool DCTStream::readJFIFMarker() {
- int length, i;
- char buf[5];
- int c;
-
- length = read16();
- length -= 2;
- if (length >= 5) {
- for (i = 0; i < 5; ++i) {
- if ((c = str->getChar()) == EOF) {
- error(getPos(), "Bad DCT APP0 marker");
- return gFalse;
- }
- buf[i] = c;
- }
- length -= 5;
- if (!memcmp(buf, "JFIF\0", 5)) {
- gotJFIFMarker = gTrue;
- }
- }
- while (length > 0) {
- if (str->getChar() == EOF) {
- error(getPos(), "Bad DCT APP0 marker");
- return gFalse;
- }
- --length;
- }
- return gTrue;
-}
-
-GBool DCTStream::readAdobeMarker() {
- int length, i;
- char buf[12];
- int c;
-
- length = read16();
- if (length < 14) {
- goto err;
- }
- for (i = 0; i < 12; ++i) {
- if ((c = str->getChar()) == EOF) {
- goto err;
- }
- buf[i] = c;
- }
- if (strncmp(buf, "Adobe", 5)) {
- goto err;
- }
- colorXform = buf[11];
- gotAdobeMarker = gTrue;
- for (i = 14; i < length; ++i) {
- if (str->getChar() == EOF) {
- goto err;
- }
- }
- return gTrue;
-
- err:
- error(getPos(), "Bad DCT Adobe APP14 marker");
- return gFalse;
-}
-
-GBool DCTStream::readTrailer() {
- int c;
-
- c = readMarker();
- if (c != 0xd9) { // EOI
- error(getPos(), "Bad DCT trailer");
- return gFalse;
- }
- return gTrue;
-}
-
-int DCTStream::readMarker() {
- int c;
-
- do {
- do {
- c = str->getChar();
- } while (c != 0xff);
- do {
- c = str->getChar();
- } while (c == 0xff);
- } while (c == 0x00);
- return c;
-}
-
-int DCTStream::read16() {
- int c1, c2;
-
- if ((c1 = str->getChar()) == EOF)
- return EOF;
- if ((c2 = str->getChar()) == EOF)
- return EOF;
- return (c1 << 8) + c2;
-}
-
-GString *DCTStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 2) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("<< >> /DCTDecode filter\n");
- return s;
-}
-
-GBool DCTStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-//------------------------------------------------------------------------
-// FlateStream
-//------------------------------------------------------------------------
-
-int FlateStream::codeLenCodeMap[flateMaxCodeLenCodes] = {
- 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15
-};
-
-FlateDecode FlateStream::lengthDecode[flateMaxLitCodes-257] = {
- {0, 3},
- {0, 4},
- {0, 5},
- {0, 6},
- {0, 7},
- {0, 8},
- {0, 9},
- {0, 10},
- {1, 11},
- {1, 13},
- {1, 15},
- {1, 17},
- {2, 19},
- {2, 23},
- {2, 27},
- {2, 31},
- {3, 35},
- {3, 43},
- {3, 51},
- {3, 59},
- {4, 67},
- {4, 83},
- {4, 99},
- {4, 115},
- {5, 131},
- {5, 163},
- {5, 195},
- {5, 227},
- {0, 258}
-};
-
-FlateDecode FlateStream::distDecode[flateMaxDistCodes] = {
- { 0, 1},
- { 0, 2},
- { 0, 3},
- { 0, 4},
- { 1, 5},
- { 1, 7},
- { 2, 9},
- { 2, 13},
- { 3, 17},
- { 3, 25},
- { 4, 33},
- { 4, 49},
- { 5, 65},
- { 5, 97},
- { 6, 129},
- { 6, 193},
- { 7, 257},
- { 7, 385},
- { 8, 513},
- { 8, 769},
- { 9, 1025},
- { 9, 1537},
- {10, 2049},
- {10, 3073},
- {11, 4097},
- {11, 6145},
- {12, 8193},
- {12, 12289},
- {13, 16385},
- {13, 24577}
-};
-
-FlateStream::FlateStream(Stream *strA, int predictor, int columns,
- int colors, int bits):
- FilterStream(strA) {
- if (predictor != 1) {
- pred = new StreamPredictor(this, predictor, columns, colors, bits);
- } else {
- pred = NULL;
- }
- litCodeTab.codes = NULL;
- distCodeTab.codes = NULL;
-}
-
-FlateStream::~FlateStream() {
- gfree(litCodeTab.codes);
- gfree(distCodeTab.codes);
- if (pred) {
- delete pred;
- }
- delete str;
-}
-
-void FlateStream::reset() {
- int cmf, flg;
-
- index = 0;
- remain = 0;
- codeBuf = 0;
- codeSize = 0;
- compressedBlock = gFalse;
- endOfBlock = gTrue;
- eof = gTrue;
-
- str->reset();
-
- // read header
- //~ need to look at window size?
- endOfBlock = eof = gTrue;
- cmf = str->getChar();
- flg = str->getChar();
- if (cmf == EOF || flg == EOF)
- return;
- if ((cmf & 0x0f) != 0x08) {
- error(getPos(), "Unknown compression method in flate stream");
- return;
- }
- if ((((cmf << 8) + flg) % 31) != 0) {
- error(getPos(), "Bad FCHECK in flate stream");
- return;
- }
- if (flg & 0x20) {
- error(getPos(), "FDICT bit set in flate stream");
- return;
- }
-
- eof = gFalse;
-}
-
-int FlateStream::getChar() {
- int c;
-
- if (pred) {
- return pred->getChar();
- }
- while (remain == 0) {
- if (endOfBlock && eof)
- return EOF;
- readSome();
- }
- c = buf[index];
- index = (index + 1) & flateMask;
- --remain;
- return c;
-}
-
-int FlateStream::lookChar() {
- int c;
-
- if (pred) {
- return pred->lookChar();
- }
- while (remain == 0) {
- if (endOfBlock && eof)
- return EOF;
- readSome();
- }
- c = buf[index];
- return c;
-}
-
-int FlateStream::getRawChar() {
- int c;
-
- while (remain == 0) {
- if (endOfBlock && eof)
- return EOF;
- readSome();
- }
- c = buf[index];
- index = (index + 1) & flateMask;
- --remain;
- return c;
-}
-
-GString *FlateStream::getPSFilter(int psLevel, char *indent) {
- GString *s;
-
- if (psLevel < 3 || pred) {
- return NULL;
- }
- if (!(s = str->getPSFilter(psLevel, indent))) {
- return NULL;
- }
- s->append(indent)->append("<< >> /FlateDecode filter\n");
- return s;
-}
-
-GBool FlateStream::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-void FlateStream::readSome() {
- int code1, code2;
- int len, dist;
- int i, j, k;
- int c;
-
- if (endOfBlock) {
- if (!startBlock())
- return;
- }
-
- if (compressedBlock) {
- if ((code1 = getHuffmanCodeWord(&litCodeTab)) == EOF)
- goto err;
- if (code1 < 256) {
- buf[index] = code1;
- remain = 1;
- } else if (code1 == 256) {
- endOfBlock = gTrue;
- remain = 0;
- } else {
- code1 -= 257;
- code2 = lengthDecode[code1].bits;
- if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF)
- goto err;
- len = lengthDecode[code1].first + code2;
- if ((code1 = getHuffmanCodeWord(&distCodeTab)) == EOF)
- goto err;
- code2 = distDecode[code1].bits;
- if (code2 > 0 && (code2 = getCodeWord(code2)) == EOF)
- goto err;
- dist = distDecode[code1].first + code2;
- i = index;
- j = (index - dist) & flateMask;
- for (k = 0; k < len; ++k) {
- buf[i] = buf[j];
- i = (i + 1) & flateMask;
- j = (j + 1) & flateMask;
- }
- remain = len;
- }
-
- } else {
- len = (blockLen < flateWindow) ? blockLen : flateWindow;
- for (i = 0, j = index; i < len; ++i, j = (j + 1) & flateMask) {
- if ((c = str->getChar()) == EOF) {
- endOfBlock = eof = gTrue;
- break;
- }
- buf[j] = c & 0xff;
- }
- remain = i;
- blockLen -= len;
- if (blockLen == 0)
- endOfBlock = gTrue;
- }
-
- return;
-
-err:
- error(getPos(), "Unexpected end of file in flate stream");
- endOfBlock = eof = gTrue;
- remain = 0;
-}
-
-GBool FlateStream::startBlock() {
- int blockHdr;
- int c;
- int check;
-
- // free the code tables from the previous block
- gfree(litCodeTab.codes);
- litCodeTab.codes = NULL;
- gfree(distCodeTab.codes);
- distCodeTab.codes = NULL;
-
- // read block header
- blockHdr = getCodeWord(3);
- if (blockHdr & 1)
- eof = gTrue;
- blockHdr >>= 1;
-
- // uncompressed block
- if (blockHdr == 0) {
- compressedBlock = gFalse;
- if ((c = str->getChar()) == EOF)
- goto err;
- blockLen = c & 0xff;
- if ((c = str->getChar()) == EOF)
- goto err;
- blockLen |= (c & 0xff) << 8;
- if ((c = str->getChar()) == EOF)
- goto err;
- check = c & 0xff;
- if ((c = str->getChar()) == EOF)
- goto err;
- check |= (c & 0xff) << 8;
- if (check != (~blockLen & 0xffff))
- error(getPos(), "Bad uncompressed block length in flate stream");
- codeBuf = 0;
- codeSize = 0;
-
- // compressed block with fixed codes
- } else if (blockHdr == 1) {
- compressedBlock = gTrue;
- loadFixedCodes();
-
- // compressed block with dynamic codes
- } else if (blockHdr == 2) {
- compressedBlock = gTrue;
- if (!readDynamicCodes()) {
- goto err;
- }
-
- // unknown block type
- } else {
- goto err;
- }
-
- endOfBlock = gFalse;
- return gTrue;
-
-err:
- error(getPos(), "Bad block header in flate stream");
- endOfBlock = eof = gTrue;
- return gFalse;
-}
-
-void FlateStream::loadFixedCodes() {
- int i;
-
- // build the literal code table
- for (i = 0; i <= 143; ++i) {
- codeLengths[i] = 8;
- }
- for (i = 144; i <= 255; ++i) {
- codeLengths[i] = 9;
- }
- for (i = 256; i <= 279; ++i) {
- codeLengths[i] = 7;
- }
- for (i = 280; i <= 287; ++i) {
- codeLengths[i] = 8;
- }
- compHuffmanCodes(codeLengths, flateMaxLitCodes, &litCodeTab);
-
- // build the distance code table
- for (i = 0; i < flateMaxDistCodes; ++i) {
- codeLengths[i] = 5;
- }
- compHuffmanCodes(codeLengths, flateMaxDistCodes, &distCodeTab);
-}
-
-GBool FlateStream::readDynamicCodes() {
- int numCodeLenCodes;
- int numLitCodes;
- int numDistCodes;
- int codeLenCodeLengths[flateMaxCodeLenCodes];
- FlateHuffmanTab codeLenCodeTab;
- int len, repeat, code;
- int i;
-
- codeLenCodeTab.codes = NULL;
-
- // read lengths
- if ((numLitCodes = getCodeWord(5)) == EOF) {
- goto err;
- }
- numLitCodes += 257;
- if ((numDistCodes = getCodeWord(5)) == EOF) {
- goto err;
- }
- numDistCodes += 1;
- if ((numCodeLenCodes = getCodeWord(4)) == EOF) {
- goto err;
- }
- numCodeLenCodes += 4;
- if (numLitCodes > flateMaxLitCodes ||
- numDistCodes > flateMaxDistCodes ||
- numCodeLenCodes > flateMaxCodeLenCodes) {
- goto err;
- }
-
- // build the code length code table
- for (i = 0; i < flateMaxCodeLenCodes; ++i) {
- codeLenCodeLengths[i] = 0;
- }
- for (i = 0; i < numCodeLenCodes; ++i) {
- if ((codeLenCodeLengths[codeLenCodeMap[i]] = getCodeWord(3)) == -1) {
- goto err;
- }
- }
- compHuffmanCodes(codeLenCodeLengths, flateMaxCodeLenCodes, &codeLenCodeTab);
-
- // build the literal and distance code tables
- len = 0;
- repeat = 0;
- i = 0;
- while (i < numLitCodes + numDistCodes) {
- if ((code = getHuffmanCodeWord(&codeLenCodeTab)) == EOF) {
- goto err;
- }
- if (code == 16) {
- if ((repeat = getCodeWord(2)) == EOF) {
- goto err;
- }
- repeat += 3;
- if (i + repeat > numLitCodes + numDistCodes) {
- goto err;
- }
- for (; repeat > 0; --repeat) {
- codeLengths[i++] = len;
- }
- } else if (code == 17) {
- if ((repeat = getCodeWord(3)) == EOF) {
- goto err;
- }
- repeat += 3;
- if (i + repeat > numLitCodes + numDistCodes) {
- goto err;
- }
- len = 0;
- for (; repeat > 0; --repeat) {
- codeLengths[i++] = 0;
- }
- } else if (code == 18) {
- if ((repeat = getCodeWord(7)) == EOF) {
- goto err;
- }
- repeat += 11;
- if (i + repeat > numLitCodes + numDistCodes) {
- goto err;
- }
- len = 0;
- for (; repeat > 0; --repeat) {
- codeLengths[i++] = 0;
- }
- } else {
- codeLengths[i++] = len = code;
- }
- }
- compHuffmanCodes(codeLengths, numLitCodes, &litCodeTab);
- compHuffmanCodes(codeLengths + numLitCodes, numDistCodes, &distCodeTab);
-
- gfree(codeLenCodeTab.codes);
- return gTrue;
-
-err:
- error(getPos(), "Bad dynamic code table in flate stream");
- gfree(codeLenCodeTab.codes);
- return gFalse;
-}
-
-// Convert an array <lengths> of <n> lengths, in value order, into a
-// Huffman code lookup table.
-void FlateStream::compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab) {
- int tabSize, len, code, code2, skip, val, i, t;
-
- // find max code length
- tab->maxLen = 0;
- for (val = 0; val < n; ++val) {
- if (lengths[val] > tab->maxLen) {
- tab->maxLen = lengths[val];
- }
- }
-
- // allocate the table
- tabSize = 1 << tab->maxLen;
- tab->codes = (FlateCode *)gmalloc(tabSize * sizeof(FlateCode));
-
- // clear the table
- for (i = 0; i < tabSize; ++i) {
- tab->codes[i].len = 0;
- tab->codes[i].val = 0;
- }
-
- // build the table
- for (len = 1, code = 0, skip = 2;
- len <= tab->maxLen;
- ++len, code <<= 1, skip <<= 1) {
- for (val = 0; val < n; ++val) {
- if (lengths[val] == len) {
-
- // bit-reverse the code
- code2 = 0;
- t = code;
- for (i = 0; i < len; ++i) {
- code2 = (code2 << 1) | (t & 1);
- t >>= 1;
- }
-
- // fill in the table entries
- for (i = code2; i < tabSize; i += skip) {
- tab->codes[i].len = (Gushort)len;
- tab->codes[i].val = (Gushort)val;
- }
-
- ++code;
- }
- }
- }
-}
-
-int FlateStream::getHuffmanCodeWord(FlateHuffmanTab *tab) {
- FlateCode *code;
- int c;
-
- while (codeSize < tab->maxLen) {
- if ((c = str->getChar()) == EOF) {
- break;
- }
- codeBuf |= (c & 0xff) << codeSize;
- codeSize += 8;
- }
- code = &tab->codes[codeBuf & ((1 << tab->maxLen) - 1)];
- if (codeSize == 0 || codeSize < code->len || code->len == 0) {
- return EOF;
- }
- codeBuf >>= code->len;
- codeSize -= code->len;
- return (int)code->val;
-}
-
-int FlateStream::getCodeWord(int bits) {
- int c;
-
- while (codeSize < bits) {
- if ((c = str->getChar()) == EOF)
- return EOF;
- codeBuf |= (c & 0xff) << codeSize;
- codeSize += 8;
- }
- c = codeBuf & ((1 << bits) - 1);
- codeBuf >>= bits;
- codeSize -= bits;
- return c;
-}
-
-//------------------------------------------------------------------------
-// EOFStream
-//------------------------------------------------------------------------
-
-EOFStream::EOFStream(Stream *strA):
- FilterStream(strA) {
-}
-
-EOFStream::~EOFStream() {
- delete str;
-}
-
-//------------------------------------------------------------------------
-// FixedLengthEncoder
-//------------------------------------------------------------------------
-
-FixedLengthEncoder::FixedLengthEncoder(Stream *strA, int lengthA):
- FilterStream(strA) {
- length = lengthA;
- count = 0;
-}
-
-FixedLengthEncoder::~FixedLengthEncoder() {
- if (str->isEncoder())
- delete str;
-}
-
-void FixedLengthEncoder::reset() {
- str->reset();
- count = 0;
-}
-
-int FixedLengthEncoder::getChar() {
- if (length >= 0 && count >= length)
- return EOF;
- ++count;
- return str->getChar();
-}
-
-int FixedLengthEncoder::lookChar() {
- if (length >= 0 && count >= length)
- return EOF;
- return str->getChar();
-}
-
-GBool FixedLengthEncoder::isBinary(GBool last) {
- return str->isBinary(gTrue);
-}
-
-//------------------------------------------------------------------------
-// ASCIIHexEncoder
-//------------------------------------------------------------------------
-
-ASCIIHexEncoder::ASCIIHexEncoder(Stream *strA):
- FilterStream(strA) {
- bufPtr = bufEnd = buf;
- lineLen = 0;
- eof = gFalse;
-}
-
-ASCIIHexEncoder::~ASCIIHexEncoder() {
- if (str->isEncoder()) {
- delete str;
- }
-}
-
-void ASCIIHexEncoder::reset() {
- str->reset();
- bufPtr = bufEnd = buf;
- lineLen = 0;
- eof = gFalse;
-}
-
-GBool ASCIIHexEncoder::fillBuf() {
- static char *hex = "0123456789abcdef";
- int c;
-
- if (eof) {
- return gFalse;
- }
- bufPtr = bufEnd = buf;
- if ((c = str->getChar()) == EOF) {
- *bufEnd++ = '>';
- eof = gTrue;
- } else {
- if (lineLen >= 64) {
- *bufEnd++ = '\n';
- lineLen = 0;
- }
- *bufEnd++ = hex[(c >> 4) & 0x0f];
- *bufEnd++ = hex[c & 0x0f];
- lineLen += 2;
- }
- return gTrue;
-}
-
-//------------------------------------------------------------------------
-// ASCII85Encoder
-//------------------------------------------------------------------------
-
-ASCII85Encoder::ASCII85Encoder(Stream *strA):
- FilterStream(strA) {
- bufPtr = bufEnd = buf;
- lineLen = 0;
- eof = gFalse;
-}
-
-ASCII85Encoder::~ASCII85Encoder() {
- if (str->isEncoder())
- delete str;
-}
-
-void ASCII85Encoder::reset() {
- str->reset();
- bufPtr = bufEnd = buf;
- lineLen = 0;
- eof = gFalse;
-}
-
-GBool ASCII85Encoder::fillBuf() {
- Gulong t;
- char buf1[5];
- int c;
- int n, i;
-
- if (eof)
- return gFalse;
- t = 0;
- for (n = 0; n < 4; ++n) {
- if ((c = str->getChar()) == EOF)
- break;
- t = (t << 8) + c;
- }
- bufPtr = bufEnd = buf;
- if (n > 0) {
- if (n == 4 && t == 0) {
- *bufEnd++ = 'z';
- if (++lineLen == 65) {
- *bufEnd++ = '\n';
- lineLen = 0;
- }
- } else {
- if (n < 4)
- t <<= 8 * (4 - n);
- for (i = 4; i >= 0; --i) {
- buf1[i] = (char)(t % 85 + 0x21);
- t /= 85;
- }
- for (i = 0; i <= n; ++i) {
- *bufEnd++ = buf1[i];
- if (++lineLen == 65) {
- *bufEnd++ = '\n';
- lineLen = 0;
- }
- }
- }
- }
- if (n < 4) {
- *bufEnd++ = '~';
- *bufEnd++ = '>';
- eof = gTrue;
- }
- return bufPtr < bufEnd;
-}
-
-//------------------------------------------------------------------------
-// RunLengthEncoder
-//------------------------------------------------------------------------
-
-RunLengthEncoder::RunLengthEncoder(Stream *strA):
- FilterStream(strA) {
- bufPtr = bufEnd = nextEnd = buf;
- eof = gFalse;
-}
-
-RunLengthEncoder::~RunLengthEncoder() {
- if (str->isEncoder())
- delete str;
-}
-
-void RunLengthEncoder::reset() {
- str->reset();
- bufPtr = bufEnd = nextEnd = buf;
- eof = gFalse;
-}
-
-//
-// When fillBuf finishes, buf[] looks like this:
-// +-----+--------------+-----------------+--
-// + tag | ... data ... | next 0, 1, or 2 |
-// +-----+--------------+-----------------+--
-// ^ ^ ^
-// bufPtr bufEnd nextEnd
-//
-GBool RunLengthEncoder::fillBuf() {
- int c, c1, c2;
- int n;
-
- // already hit EOF?
- if (eof)
- return gFalse;
-
- // grab two bytes
- if (nextEnd < bufEnd + 1) {
- if ((c1 = str->getChar()) == EOF) {
- eof = gTrue;
- return gFalse;
- }
- } else {
- c1 = bufEnd[0] & 0xff;
- }
- if (nextEnd < bufEnd + 2) {
- if ((c2 = str->getChar()) == EOF) {
- eof = gTrue;
- buf[0] = 0;
- buf[1] = c1;
- bufPtr = buf;
- bufEnd = &buf[2];
- return gTrue;
- }
- } else {
- c2 = bufEnd[1] & 0xff;
- }
-
- // check for repeat
- c = 0; // make gcc happy
- if (c1 == c2) {
- n = 2;
- while (n < 128 && (c = str->getChar()) == c1)
- ++n;
- buf[0] = (char)(257 - n);
- buf[1] = c1;
- bufEnd = &buf[2];
- if (c == EOF) {
- eof = gTrue;
- } else if (n < 128) {
- buf[2] = c;
- nextEnd = &buf[3];
- } else {
- nextEnd = bufEnd;
- }
-
- // get up to 128 chars
- } else {
- buf[1] = c1;
- buf[2] = c2;
- n = 2;
- while (n < 128) {
- if ((c = str->getChar()) == EOF) {
- eof = gTrue;
- break;
- }
- ++n;
- buf[n] = c;
- if (buf[n] == buf[n-1])
- break;
- }
- if (buf[n] == buf[n-1]) {
- buf[0] = (char)(n-2-1);
- bufEnd = &buf[n-1];
- nextEnd = &buf[n+1];
- } else {
- buf[0] = (char)(n-1);
- bufEnd = nextEnd = &buf[n+1];
- }
- }
- bufPtr = buf;
- return gTrue;
-}
diff --git a/pdf/xpdf/Stream.h b/pdf/xpdf/Stream.h
deleted file mode 100644
index 0b70afa..0000000
--- a/pdf/xpdf/Stream.h
+++ /dev/null
@@ -1,843 +0,0 @@
-//========================================================================
-//
-// Stream.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef STREAM_H
-#define STREAM_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include "gtypes.h"
-#include "Object.h"
-
-#ifndef NO_DECRYPTION
-class Decrypt;
-#endif
-class BaseStream;
-
-//------------------------------------------------------------------------
-
-enum StreamKind {
- strFile,
- strASCIIHex,
- strASCII85,
- strLZW,
- strRunLength,
- strCCITTFax,
- strDCT,
- strFlate,
- strJBIG2,
- strJPX,
- strWeird // internal-use stream types
-};
-
-//------------------------------------------------------------------------
-// Stream (base class)
-//------------------------------------------------------------------------
-
-class Stream {
-public:
-
- // Constructor.
- Stream();
-
- // Destructor.
- virtual ~Stream();
-
- // Reference counting.
- int incRef() { return ++ref; }
- int decRef() { return --ref; }
-
- // Get kind of stream.
- virtual StreamKind getKind() = 0;
-
- // Reset stream to beginning.
- virtual void reset() = 0;
-
- // Close down the stream.
- virtual void close();
-
- // Get next char from stream.
- virtual int getChar() = 0;
-
- // Peek at next char in stream.
- virtual int lookChar() = 0;
-
- // Get next char from stream without using the predictor.
- // This is only used by StreamPredictor.
- virtual int getRawChar();
-
- // Get next line from stream.
- virtual char *getLine(char *buf, int size);
-
- // Get current position in file.
- virtual int getPos() = 0;
-
- // Go to a position in the stream. If <dir> is negative, the
- // position is from the end of the file; otherwise the position is
- // from the start of the file.
- virtual void setPos(Guint pos, int dir = 0) = 0;
-
- // Get PostScript command for the filter(s).
- virtual GString *getPSFilter(int psLevel, char *indent);
-
- // Does this stream type potentially contain non-printable chars?
- virtual GBool isBinary(GBool last = gTrue) = 0;
-
- // Get the BaseStream of this stream.
- virtual BaseStream *getBaseStream() = 0;
-
- // Get the dictionary associated with this stream.
- virtual Dict *getDict() = 0;
-
- // Is this an encoding filter?
- virtual GBool isEncoder() { return gFalse; }
-
- // Add filters to this stream according to the parameters in <dict>.
- // Returns the new stream.
- Stream *addFilters(Object *dict);
-
- // Tell this stream to ignore any length limitation -- this only
- // applies to BaseStream subclasses, and is used as a hack to work
- // around broken PDF files with incorrect stream lengths.
- virtual void ignoreLength() {}
-
-private:
-
- Stream *makeFilter(char *name, Stream *str, Object *params);
-
- int ref; // reference count
-};
-
-//------------------------------------------------------------------------
-// BaseStream
-//
-// This is the base class for all streams that read directly from a file.
-//------------------------------------------------------------------------
-
-class BaseStream: public Stream {
-public:
-
- BaseStream(Object *dictA);
- virtual ~BaseStream();
- virtual Stream *makeSubStream(Guint start, GBool limited,
- Guint length, Object *dict) = 0;
- virtual void setPos(Guint pos, int dir = 0) = 0;
- virtual GBool isBinary(GBool last = gTrue) { return last; }
- virtual BaseStream *getBaseStream() { return this; }
- virtual Dict *getDict() { return dict.getDict(); }
-
- // Get/set position of first byte of stream within the file.
- virtual Guint getStart() = 0;
- virtual void moveStart(int delta) = 0;
-
-#ifndef NO_DECRYPTION
- // Set decryption for this stream.
- virtual void doDecryption(Guchar *fileKey, int keyLength,
- int objNum, int objGen);
-#endif
-
-#ifndef NO_DECRYPTION
-protected:
-
- Decrypt *decrypt;
-#endif
-
-private:
-
- Object dict;
-};
-
-//------------------------------------------------------------------------
-// FilterStream
-//
-// This is the base class for all streams that filter another stream.
-//------------------------------------------------------------------------
-
-class FilterStream: public Stream {
-public:
-
- FilterStream(Stream *strA);
- virtual ~FilterStream();
- virtual void close();
- virtual int getPos() { return str->getPos(); }
- virtual void setPos(Guint pos, int dir = 0);
- virtual BaseStream *getBaseStream() { return str->getBaseStream(); }
- virtual Dict *getDict() { return str->getDict(); }
- virtual void ignoreLength() { str->ignoreLength(); }
-
-protected:
-
- Stream *str;
-};
-
-//------------------------------------------------------------------------
-// ImageStream
-//------------------------------------------------------------------------
-
-class ImageStream {
-public:
-
- // Create an image stream object for an image with the specified
- // parameters. Note that these are the actual image parameters,
- // which may be different from the predictor parameters.
- ImageStream(Stream *strA, int widthA, int nCompsA, int nBitsA);
-
- ~ImageStream();
-
- // Reset the stream.
- void reset();
-
- // Gets the next pixel from the stream. <pix> should be able to hold
- // at least nComps elements. Returns false at end of file.
- GBool getPixel(Guchar *pix);
-
- // Returns a pointer to the next line of pixels. Returns NULL at
- // end of file.
- Guchar *getLine();
-
- // Skip an entire line from the image.
- void skipLine();
-
-private:
-
- Stream *str; // base stream
- int width; // pixels per line
- int nComps; // components per pixel
- int nBits; // bits per component
- int nVals; // components per line
- Guchar *imgLine; // line buffer
- int imgIdx; // current index in imgLine
-};
-
-//------------------------------------------------------------------------
-// StreamPredictor
-//------------------------------------------------------------------------
-
-class StreamPredictor {
-public:
-
- // Create a predictor object. Note that the parameters are for the
- // predictor, and may not match the actual image parameters.
- StreamPredictor(Stream *strA, int predictorA,
- int widthA, int nCompsA, int nBitsA);
-
- ~StreamPredictor();
-
- int lookChar();
- int getChar();
-
-private:
-
- GBool getNextLine();
-
- Stream *str; // base stream
- int predictor; // predictor
- int width; // pixels per line
- int nComps; // components per pixel
- int nBits; // bits per component
- int nVals; // components per line
- int pixBytes; // bytes per pixel
- int rowBytes; // bytes per line
- Guchar *predLine; // line buffer
- int predIdx; // current index in predLine
-};
-
-//------------------------------------------------------------------------
-// FileStream
-//------------------------------------------------------------------------
-
-#define fileStreamBufSize 256
-
-class FileStream: public BaseStream {
-public:
-
- FileStream(FILE *fA, Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA);
- virtual ~FileStream();
- virtual Stream *makeSubStream(Guint startA, GBool limitedA,
- Guint lengthA, Object *dictA);
- virtual StreamKind getKind() { return strFile; }
- virtual void reset();
- virtual void close();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual int getPos() { return bufPos + (bufPtr - buf); }
- virtual void setPos(Guint pos, int dir = 0);
- virtual void ignoreLength() { limited = gFalse; }
- virtual Guint getStart() { return start; }
- virtual void moveStart(int delta);
-
-private:
-
- GBool fillBuf();
-
- FILE *f;
- Guint start;
- GBool limited;
- Guint length;
- char buf[fileStreamBufSize];
- char *bufPtr;
- char *bufEnd;
- Guint bufPos;
- int savePos;
- GBool saved;
-};
-
-//------------------------------------------------------------------------
-// MemStream
-//------------------------------------------------------------------------
-
-class MemStream: public BaseStream {
-public:
-
- MemStream(char *bufA, Guint startA, Guint lengthA, Object *dictA);
- virtual ~MemStream();
- virtual Stream *makeSubStream(Guint start, GBool limited,
- Guint lengthA, Object *dictA);
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual void close();
- virtual int getChar()
- { return (bufPtr < bufEnd) ? (*bufPtr++ & 0xff) : EOF; }
- virtual int lookChar()
- { return (bufPtr < bufEnd) ? (*bufPtr & 0xff) : EOF; }
- virtual int getPos() { return (int)(bufPtr - buf); }
- virtual void setPos(Guint pos, int dir = 0);
- virtual Guint getStart() { return start; }
- virtual void moveStart(int delta);
-#ifndef NO_DECRYPTION
- virtual void doDecryption(Guchar *fileKey, int keyLength,
- int objNum, int objGen);
-#endif
-
-private:
-
- char *buf;
- Guint start;
- Guint length;
- char *bufEnd;
- char *bufPtr;
- GBool needFree;
-};
-
-//------------------------------------------------------------------------
-// EmbedStream
-//
-// This is a special stream type used for embedded streams (inline
-// images). It reads directly from the base stream -- after the
-// EmbedStream is deleted, reads from the base stream will proceed where
-// the BaseStream left off. Note that this is very different behavior
-// that creating a new FileStream (using makeSubStream).
-//------------------------------------------------------------------------
-
-class EmbedStream: public BaseStream {
-public:
-
- EmbedStream(Stream *strA, Object *dictA, GBool limitedA, Guint lengthA);
- virtual ~EmbedStream();
- virtual Stream *makeSubStream(Guint start, GBool limitedA,
- Guint lengthA, Object *dictA);
- virtual StreamKind getKind() { return str->getKind(); }
- virtual void reset() {}
- virtual int getChar();
- virtual int lookChar();
- virtual int getPos() { return str->getPos(); }
- virtual void setPos(Guint pos, int dir = 0);
- virtual Guint getStart();
- virtual void moveStart(int delta);
-
-private:
-
- Stream *str;
- GBool limited;
- Guint length;
-};
-
-//------------------------------------------------------------------------
-// ASCIIHexStream
-//------------------------------------------------------------------------
-
-class ASCIIHexStream: public FilterStream {
-public:
-
- ASCIIHexStream(Stream *strA);
- virtual ~ASCIIHexStream();
- virtual StreamKind getKind() { return strASCIIHex; }
- virtual void reset();
- virtual int getChar()
- { int c = lookChar(); buf = EOF; return c; }
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- int buf;
- GBool eof;
-};
-
-//------------------------------------------------------------------------
-// ASCII85Stream
-//------------------------------------------------------------------------
-
-class ASCII85Stream: public FilterStream {
-public:
-
- ASCII85Stream(Stream *strA);
- virtual ~ASCII85Stream();
- virtual StreamKind getKind() { return strASCII85; }
- virtual void reset();
- virtual int getChar()
- { int ch = lookChar(); ++index; return ch; }
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- int c[5];
- int b[4];
- int index, n;
- GBool eof;
-};
-
-//------------------------------------------------------------------------
-// LZWStream
-//------------------------------------------------------------------------
-
-class LZWStream: public FilterStream {
-public:
-
- LZWStream(Stream *strA, int predictor, int columns, int colors,
- int bits, int earlyA);
- virtual ~LZWStream();
- virtual StreamKind getKind() { return strLZW; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual int getRawChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- StreamPredictor *pred; // predictor
- int early; // early parameter
- GBool eof; // true if at eof
- int inputBuf; // input buffer
- int inputBits; // number of bits in input buffer
- struct { // decoding table
- int length;
- int head;
- Guchar tail;
- } table[4097];
- int nextCode; // next code to be used
- int nextBits; // number of bits in next code word
- int prevCode; // previous code used in stream
- int newChar; // next char to be added to table
- Guchar seqBuf[4097]; // buffer for current sequence
- int seqLength; // length of current sequence
- int seqIndex; // index into current sequence
- GBool first; // first code after a table clear
-
- GBool processNextCode();
- void clearTable();
- int getCode();
-};
-
-//------------------------------------------------------------------------
-// RunLengthStream
-//------------------------------------------------------------------------
-
-class RunLengthStream: public FilterStream {
-public:
-
- RunLengthStream(Stream *strA);
- virtual ~RunLengthStream();
- virtual StreamKind getKind() { return strRunLength; }
- virtual void reset();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- char buf[128]; // buffer
- char *bufPtr; // next char to read
- char *bufEnd; // end of buffer
- GBool eof;
-
- GBool fillBuf();
-};
-
-//------------------------------------------------------------------------
-// CCITTFaxStream
-//------------------------------------------------------------------------
-
-struct CCITTCodeTable;
-
-class CCITTFaxStream: public FilterStream {
-public:
-
- CCITTFaxStream(Stream *strA, int encodingA, GBool endOfLineA,
- GBool byteAlignA, int columnsA, int rowsA,
- GBool endOfBlockA, GBool blackA);
- virtual ~CCITTFaxStream();
- virtual StreamKind getKind() { return strCCITTFax; }
- virtual void reset();
- virtual int getChar()
- { int c = lookChar(); buf = EOF; return c; }
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- int encoding; // 'K' parameter
- GBool endOfLine; // 'EndOfLine' parameter
- GBool byteAlign; // 'EncodedByteAlign' parameter
- int columns; // 'Columns' parameter
- int rows; // 'Rows' parameter
- GBool endOfBlock; // 'EndOfBlock' parameter
- GBool black; // 'BlackIs1' parameter
- GBool eof; // true if at eof
- GBool nextLine2D; // true if next line uses 2D encoding
- int row; // current row
- int inputBuf; // input buffer
- int inputBits; // number of bits in input buffer
- short *refLine; // reference line changing elements
- int b1; // index into refLine
- short *codingLine; // coding line changing elements
- int a0; // index into codingLine
- int outputBits; // remaining ouput bits
- int buf; // character buffer
-
- short getTwoDimCode();
- short getWhiteCode();
- short getBlackCode();
- short lookBits(int n);
- void eatBits(int n) { inputBits -= n; }
-};
-
-//------------------------------------------------------------------------
-// DCTStream
-//------------------------------------------------------------------------
-
-// DCT component info
-struct DCTCompInfo {
- int id; // component ID
- int hSample, vSample; // horiz/vert sampling resolutions
- int quantTable; // quantization table number
- int prevDC; // DC coefficient accumulator
-};
-
-struct DCTScanInfo {
- GBool comp[4]; // comp[i] is set if component i is
- // included in this scan
- int numComps; // number of components in the scan
- int dcHuffTable[4]; // DC Huffman table numbers
- int acHuffTable[4]; // AC Huffman table numbers
- int firstCoeff, lastCoeff; // first and last DCT coefficient
- int ah, al; // successive approximation parameters
-};
-
-// DCT Huffman decoding table
-struct DCTHuffTable {
- Guchar firstSym[17]; // first symbol for this bit length
- Gushort firstCode[17]; // first code for this bit length
- Gushort numCodes[17]; // number of codes of this bit length
- Guchar sym[256]; // symbols
-};
-
-class DCTStream: public FilterStream {
-public:
-
- DCTStream(Stream *strA);
- virtual ~DCTStream();
- virtual StreamKind getKind() { return strDCT; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
- Stream *getRawStream() { return str; }
-
-private:
-
- GBool progressive; // set if in progressive mode
- GBool interleaved; // set if in interleaved mode
- int width, height; // image size
- int mcuWidth, mcuHeight; // size of min coding unit, in data units
- int bufWidth, bufHeight; // frameBuf size
- DCTCompInfo compInfo[4]; // info for each component
- DCTScanInfo scanInfo; // info for the current scan
- int numComps; // number of components in image
- int colorXform; // need YCbCr-to-RGB transform?
- GBool gotJFIFMarker; // set if APP0 JFIF marker was present
- GBool gotAdobeMarker; // set if APP14 Adobe marker was present
- int restartInterval; // restart interval, in MCUs
- Guchar quantTables[4][64]; // quantization tables
- int numQuantTables; // number of quantization tables
- DCTHuffTable dcHuffTables[4]; // DC Huffman tables
- DCTHuffTable acHuffTables[4]; // AC Huffman tables
- int numDCHuffTables; // number of DC Huffman tables
- int numACHuffTables; // number of AC Huffman tables
- Guchar *rowBuf[4][32]; // buffer for one MCU (non-progressive mode)
- int *frameBuf[4]; // buffer for frame (progressive mode)
- int comp, x, y, dy; // current position within image/MCU
- int restartCtr; // MCUs left until restart
- int restartMarker; // next restart marker
- int eobRun; // number of EOBs left in the current run
- int inputBuf; // input buffer for variable length codes
- int inputBits; // number of valid bits in input buffer
-
- void restart();
- GBool readMCURow();
- void readScan();
- GBool readDataUnit(DCTHuffTable *dcHuffTable,
- DCTHuffTable *acHuffTable,
- int *prevDC, int data[64]);
- GBool readProgressiveDataUnit(DCTHuffTable *dcHuffTable,
- DCTHuffTable *acHuffTable,
- int *prevDC, int data[64]);
- void decodeImage();
- void transformDataUnit(Guchar *quantTable,
- int dataIn[64], Guchar dataOut[64]);
- int readHuffSym(DCTHuffTable *table);
- int readAmp(int size);
- int readBit();
- GBool readHeader();
- GBool readBaselineSOF();
- GBool readProgressiveSOF();
- GBool readScanInfo();
- GBool readQuantTables();
- GBool readHuffmanTables();
- GBool readRestartInterval();
- GBool readJFIFMarker();
- GBool readAdobeMarker();
- GBool readTrailer();
- int readMarker();
- int read16();
-};
-
-//------------------------------------------------------------------------
-// FlateStream
-//------------------------------------------------------------------------
-
-#define flateWindow 32768 // buffer size
-#define flateMask (flateWindow-1)
-#define flateMaxHuffman 15 // max Huffman code length
-#define flateMaxCodeLenCodes 19 // max # code length codes
-#define flateMaxLitCodes 288 // max # literal codes
-#define flateMaxDistCodes 30 // max # distance codes
-
-// Huffman code table entry
-struct FlateCode {
- Gushort len; // code length, in bits
- Gushort val; // value represented by this code
-};
-
-struct FlateHuffmanTab {
- FlateCode *codes;
- int maxLen;
-};
-
-// Decoding info for length and distance code words
-struct FlateDecode {
- int bits; // # extra bits
- int first; // first length/distance
-};
-
-class FlateStream: public FilterStream {
-public:
-
- FlateStream(Stream *strA, int predictor, int columns,
- int colors, int bits);
- virtual ~FlateStream();
- virtual StreamKind getKind() { return strFlate; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual int getRawChar();
- virtual GString *getPSFilter(int psLevel, char *indent);
- virtual GBool isBinary(GBool last = gTrue);
-
-private:
-
- StreamPredictor *pred; // predictor
- Guchar buf[flateWindow]; // output data buffer
- int index; // current index into output buffer
- int remain; // number valid bytes in output buffer
- int codeBuf; // input buffer
- int codeSize; // number of bits in input buffer
- int // literal and distance code lengths
- codeLengths[flateMaxLitCodes + flateMaxDistCodes];
- FlateHuffmanTab litCodeTab; // literal code table
- FlateHuffmanTab distCodeTab; // distance code table
- GBool compressedBlock; // set if reading a compressed block
- int blockLen; // remaining length of uncompressed block
- GBool endOfBlock; // set when end of block is reached
- GBool eof; // set when end of stream is reached
-
- static int // code length code reordering
- codeLenCodeMap[flateMaxCodeLenCodes];
- static FlateDecode // length decoding info
- lengthDecode[flateMaxLitCodes-257];
- static FlateDecode // distance decoding info
- distDecode[flateMaxDistCodes];
-
- void readSome();
- GBool startBlock();
- void loadFixedCodes();
- GBool readDynamicCodes();
- void compHuffmanCodes(int *lengths, int n, FlateHuffmanTab *tab);
- int getHuffmanCodeWord(FlateHuffmanTab *tab);
- int getCodeWord(int bits);
-};
-
-//------------------------------------------------------------------------
-// EOFStream
-//------------------------------------------------------------------------
-
-class EOFStream: public FilterStream {
-public:
-
- EOFStream(Stream *strA);
- virtual ~EOFStream();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset() {}
- virtual int getChar() { return EOF; }
- virtual int lookChar() { return EOF; }
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
-};
-
-//------------------------------------------------------------------------
-// FixedLengthEncoder
-//------------------------------------------------------------------------
-
-class FixedLengthEncoder: public FilterStream {
-public:
-
- FixedLengthEncoder(Stream *strA, int lengthA);
- ~FixedLengthEncoder();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual int getChar();
- virtual int lookChar();
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue);
- virtual GBool isEncoder() { return gTrue; }
-
-private:
-
- int length;
- int count;
-};
-
-//------------------------------------------------------------------------
-// ASCIIHexEncoder
-//------------------------------------------------------------------------
-
-class ASCIIHexEncoder: public FilterStream {
-public:
-
- ASCIIHexEncoder(Stream *strA);
- virtual ~ASCIIHexEncoder();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
- virtual GBool isEncoder() { return gTrue; }
-
-private:
-
- char buf[4];
- char *bufPtr;
- char *bufEnd;
- int lineLen;
- GBool eof;
-
- GBool fillBuf();
-};
-
-//------------------------------------------------------------------------
-// ASCII85Encoder
-//------------------------------------------------------------------------
-
-class ASCII85Encoder: public FilterStream {
-public:
-
- ASCII85Encoder(Stream *strA);
- virtual ~ASCII85Encoder();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue) { return gFalse; }
- virtual GBool isEncoder() { return gTrue; }
-
-private:
-
- char buf[8];
- char *bufPtr;
- char *bufEnd;
- int lineLen;
- GBool eof;
-
- GBool fillBuf();
-};
-
-//------------------------------------------------------------------------
-// RunLengthEncoder
-//------------------------------------------------------------------------
-
-class RunLengthEncoder: public FilterStream {
-public:
-
- RunLengthEncoder(Stream *strA);
- virtual ~RunLengthEncoder();
- virtual StreamKind getKind() { return strWeird; }
- virtual void reset();
- virtual int getChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr++ & 0xff); }
- virtual int lookChar()
- { return (bufPtr >= bufEnd && !fillBuf()) ? EOF : (*bufPtr & 0xff); }
- virtual GString *getPSFilter(int psLevel, char *indent) { return NULL; }
- virtual GBool isBinary(GBool last = gTrue) { return gTrue; }
- virtual GBool isEncoder() { return gTrue; }
-
-private:
-
- char buf[131];
- char *bufPtr;
- char *bufEnd;
- char *nextEnd;
- GBool eof;
-
- GBool fillBuf();
-};
-
-#endif
diff --git a/pdf/xpdf/TextOutputDev.cc b/pdf/xpdf/TextOutputDev.cc
deleted file mode 100644
index a492e7f..0000000
--- a/pdf/xpdf/TextOutputDev.cc
+++ /dev/null
@@ -1,3529 +0,0 @@
-//========================================================================
-//
-// TextOutputDev.cc
-//
-// Copyright 1997-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <math.h>
-#include <ctype.h>
-#ifdef WIN32
-#include <fcntl.h> // for O_BINARY
-#include <io.h> // for setmode
-#endif
-#include "gmem.h"
-#include "GString.h"
-#include "GList.h"
-#include "xpdfconfig.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "UnicodeMap.h"
-#include "UnicodeTypeTable.h"
-#include "GfxState.h"
-#include "TextOutputDev.h"
-
-#ifdef MACOS
-// needed for setting type/creator of MacOS files
-#include "ICSupport.h"
-#endif
-
-//------------------------------------------------------------------------
-// parameters
-//------------------------------------------------------------------------
-
-// Each bucket in a text pool includes baselines within a range of
-// this many points.
-#define textPoolStep 4
-
-// Inter-character space width which will cause addChar to start a new
-// word.
-#define minWordBreakSpace 0.1
-
-// Negative inter-character space width, i.e., overlap, which will
-// cause addChar to start a new word.
-#define minDupBreakOverlap 0.2
-
-// Max distance between baselines of two lines within a block, as a
-// fraction of the font size.
-#define maxLineSpacingDelta 1.5
-
-// Max difference in primary font sizes on two lines in the same
-// block. Delta1 is used when examining new lines above and below the
-// current block; delta2 is used when examining text that overlaps the
-// current block; delta3 is used when examining text to the left and
-// right of the current block.
-#define maxBlockFontSizeDelta1 0.05
-#define maxBlockFontSizeDelta2 0.6
-#define maxBlockFontSizeDelta3 0.2
-
-// Max difference in font sizes inside a word.
-#define maxWordFontSizeDelta 0.05
-
-// Maximum distance between baselines of two words on the same line,
-// e.g., distance between subscript or superscript and the primary
-// baseline, as a fraction of the font size.
-#define maxIntraLineDelta 0.5
-
-// Minimum inter-word spacing, as a fraction of the font size. (Only
-// used for raw ordering.)
-#define minWordSpacing 0.15
-
-// Maximum inter-word spacing, as a fraction of the font size.
-#define maxWordSpacing 1.5
-
-// Maximum horizontal spacing which will allow a word to be pulled
-// into a block.
-#define minColSpacing1 0.3
-
-// Minimum spacing between columns, as a fraction of the font size.
-#define minColSpacing2 1.0
-
-// Maximum vertical spacing between blocks within a flow, as a
-// multiple of the font size.
-#define maxBlockSpacing 2.5
-
-// Minimum spacing between characters within a word, as a fraction of
-// the font size.
-#define minCharSpacing -0.2
-
-// Maximum spacing between characters within a word, as a fraction of
-// the font size, when there is no obvious extra-wide character
-// spacing.
-#define maxCharSpacing 0.03
-
-// When extra-wide character spacing is detected, the inter-character
-// space threshold is set to the minimum inter-character space
-// multiplied by this constant.
-#define maxWideCharSpacingMul 1.3
-
-// Max difference in primary,secondary coordinates (as a fraction of
-// the font size) allowed for duplicated text (fake boldface, drop
-// shadows) which is to be discarded.
-#define dupMaxPriDelta 0.1
-#define dupMaxSecDelta 0.2
-
-//------------------------------------------------------------------------
-// TextFontInfo
-//------------------------------------------------------------------------
-
-TextFontInfo::TextFontInfo(GfxState *state) {
- gfxFont = state->getFont();
-#if TEXTOUT_WORD_LIST
- fontName = (gfxFont && gfxFont->getOrigName())
- ? gfxFont->getOrigName()->copy()
- : (GString *)NULL;
-#endif
-}
-
-TextFontInfo::~TextFontInfo() {
-#if TEXTOUT_WORD_LIST
- if (fontName) {
- delete fontName;
- }
-#endif
-}
-
-GBool TextFontInfo::matches(GfxState *state) {
- return state->getFont() == gfxFont;
-}
-
-//------------------------------------------------------------------------
-// TextWord
-//------------------------------------------------------------------------
-
-TextWord::TextWord(GfxState *state, int rotA, double x0, double y0,
- int charPosA, TextFontInfo *fontA, double fontSizeA) {
- GfxFont *gfxFont;
- double x, y, ascent, descent;
-
- rot = rotA;
- charPos = charPosA;
- charLen = 0;
- font = fontA;
- fontSize = fontSizeA;
- state->transform(x0, y0, &x, &y);
- if ((gfxFont = font->gfxFont)) {
- ascent = gfxFont->getAscent() * fontSize;
- descent = gfxFont->getDescent() * fontSize;
- } else {
- // this means that the PDF file draws text without a current font,
- // which should never happen
- ascent = 0.95 * fontSize;
- descent = -0.35 * fontSize;
- }
- switch (rot) {
- case 0:
- yMin = y - ascent;
- yMax = y - descent;
- 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;
- }
- base = y;
- break;
- case 1:
- xMin = x + descent;
- xMax = x + ascent;
- if (xMin == xMax) {
- // 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
- xMin = x;
- xMax = x + 1;
- }
- base = x;
- break;
- case 2:
- yMin = y + descent;
- yMax = y + ascent;
- 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;
- }
- base = y;
- break;
- case 3:
- xMin = x - ascent;
- xMax = x - descent;
- if (xMin == xMax) {
- // 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
- xMin = x;
- xMax = x + 1;
- }
- base = x;
- break;
- }
- text = NULL;
- edge = NULL;
- len = size = 0;
- spaceAfter = gFalse;
- next = NULL;
-
-#if TEXTOUT_WORD_LIST
- GfxRGB rgb;
-
- if ((state->getRender() & 3) == 1) {
- state->getStrokeRGB(&rgb);
- } else {
- state->getFillRGB(&rgb);
- }
- colorR = rgb.r;
- colorG = rgb.g;
- colorB = rgb.b;
-#endif
-}
-
-TextWord::~TextWord() {
- gfree(text);
- gfree(edge);
-}
-
-void TextWord::addChar(GfxState *state, double x, double y,
- double dx, double dy, Unicode u) {
- if (len == size) {
- size += 16;
- text = (Unicode *)grealloc(text, size * sizeof(Unicode));
- edge = (double *)grealloc(edge, (size + 1) * sizeof(double));
- }
- text[len] = u;
- switch (rot) {
- case 0:
- if (len == 0) {
- xMin = x;
- }
- edge[len] = x;
- xMax = edge[len+1] = x + dx;
- break;
- case 1:
- if (len == 0) {
- yMin = y;
- }
- edge[len] = y;
- yMax = edge[len+1] = y + dy;
- break;
- case 2:
- if (len == 0) {
- xMax = x;
- }
- edge[len] = x;
- xMin = edge[len+1] = x + dx;
- break;
- case 3:
- if (len == 0) {
- yMax = y;
- }
- edge[len] = y;
- yMin = edge[len+1] = y + dy;
- break;
- }
- ++len;
-}
-
-void TextWord::merge(TextWord *word) {
- int i;
-
- if (word->xMin < xMin) {
- xMin = word->xMin;
- }
- if (word->yMin < yMin) {
- yMin = word->yMin;
- }
- if (word->xMax > xMax) {
- xMax = word->xMax;
- }
- if (word->yMax > yMax) {
- yMax = word->yMax;
- }
- if (len + word->len > size) {
- size = len + word->len;
- text = (Unicode *)grealloc(text, size * sizeof(Unicode));
- edge = (double *)grealloc(edge, (size + 1) * sizeof(double));
- }
- for (i = 0; i < word->len; ++i) {
- text[len + i] = word->text[i];
- edge[len + i] = word->edge[i];
- }
- edge[len + word->len] = word->edge[word->len];
- len += word->len;
- charLen += word->charLen;
-}
-
-inline int TextWord::primaryCmp(TextWord *word) {
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (rot) {
- case 0:
- cmp = xMin - word->xMin;
- break;
- case 1:
- cmp = yMin - word->yMin;
- break;
- case 2:
- cmp = word->xMax - xMax;
- break;
- case 3:
- cmp = word->yMax - yMax;
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-double TextWord::primaryDelta(TextWord *word) {
- double delta;
-
- delta = 0; // make gcc happy
- switch (rot) {
- case 0:
- delta = word->xMin - xMax;
- break;
- case 1:
- delta = word->yMin - yMax;
- break;
- case 2:
- delta = xMin - word->xMax;
- break;
- case 3:
- delta = yMin - word->yMax;
- break;
- }
- return delta;
-}
-
-int TextWord::cmpYX(const void *p1, const void *p2) {
- TextWord *word1 = *(TextWord **)p1;
- TextWord *word2 = *(TextWord **)p2;
- double cmp;
-
- cmp = word1->yMin - word2->yMin;
- if (cmp == 0) {
- cmp = word1->xMin - word2->xMin;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-#if TEXTOUT_WORD_LIST
-
-GString *TextWord::getText() {
- GString *s;
- UnicodeMap *uMap;
- char buf[8];
- int n, i;
-
- s = new GString();
- if (!(uMap = globalParams->getTextEncoding())) {
- return s;
- }
- for (i = 0; i < len; ++i) {
- n = uMap->mapUnicode(text[i], buf, sizeof(buf));
- s->append(buf, n);
- }
- uMap->decRefCnt();
- return s;
-}
-
-#endif // TEXTOUT_WORD_LIST
-
-//------------------------------------------------------------------------
-// TextPool
-//------------------------------------------------------------------------
-
-TextPool::TextPool() {
- minBaseIdx = 0;
- maxBaseIdx = -1;
- pool = NULL;
- cursor = NULL;
- cursorBaseIdx = -1;
-}
-
-TextPool::~TextPool() {
- int baseIdx;
- TextWord *word, *word2;
-
- for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
- for (word = pool[baseIdx - minBaseIdx]; word; word = word2) {
- word2 = word->next;
- delete word;
- }
- }
- gfree(pool);
-}
-
-int TextPool::getBaseIdx(double base) {
- int baseIdx;
-
- baseIdx = (int)(base / textPoolStep);
- if (baseIdx < minBaseIdx) {
- return minBaseIdx;
- }
- if (baseIdx > maxBaseIdx) {
- return maxBaseIdx;
- }
- return baseIdx;
-}
-
-void TextPool::addWord(TextWord *word) {
- TextWord **newPool;
- int wordBaseIdx, newMinBaseIdx, newMaxBaseIdx, baseIdx;
- TextWord *w0, *w1;
-
- // expand the array if needed
- wordBaseIdx = (int)(word->base / textPoolStep);
- if (minBaseIdx > maxBaseIdx) {
- minBaseIdx = wordBaseIdx - 128;
- maxBaseIdx = wordBaseIdx + 128;
- pool = (TextWord **)gmalloc((maxBaseIdx - minBaseIdx + 1) *
- sizeof(TextWord *));
- for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
- pool[baseIdx - minBaseIdx] = NULL;
- }
- } else if (wordBaseIdx < minBaseIdx) {
- newMinBaseIdx = wordBaseIdx - 128;
- newPool = (TextWord **)gmalloc((maxBaseIdx - newMinBaseIdx + 1) *
- sizeof(TextWord *));
- for (baseIdx = newMinBaseIdx; baseIdx < minBaseIdx; ++baseIdx) {
- newPool[baseIdx - newMinBaseIdx] = NULL;
- }
- memcpy(&newPool[minBaseIdx - newMinBaseIdx], pool,
- (maxBaseIdx - minBaseIdx + 1) * sizeof(TextWord *));
- gfree(pool);
- pool = newPool;
- minBaseIdx = newMinBaseIdx;
- } else if (wordBaseIdx > maxBaseIdx) {
- newMaxBaseIdx = wordBaseIdx + 128;
- pool = (TextWord **)grealloc(pool, (newMaxBaseIdx - minBaseIdx + 1) *
- sizeof(TextWord *));
- for (baseIdx = maxBaseIdx + 1; baseIdx <= newMaxBaseIdx; ++baseIdx) {
- pool[baseIdx - minBaseIdx] = NULL;
- }
- maxBaseIdx = newMaxBaseIdx;
- }
-
- // insert the new word
- if (cursor && wordBaseIdx == cursorBaseIdx &&
- word->primaryCmp(cursor) > 0) {
- w0 = cursor;
- w1 = cursor->next;
- } else {
- w0 = NULL;
- w1 = pool[wordBaseIdx - minBaseIdx];
- }
- for (; w1 && word->primaryCmp(w1) > 0; w0 = w1, w1 = w1->next) ;
- word->next = w1;
- if (w0) {
- w0->next = word;
- } else {
- pool[wordBaseIdx - minBaseIdx] = word;
- }
- cursor = word;
- cursorBaseIdx = wordBaseIdx;
-}
-
-//------------------------------------------------------------------------
-// TextLine
-//------------------------------------------------------------------------
-
-TextLine::TextLine(TextBlock *blkA, int rotA, double baseA) {
- blk = blkA;
- rot = rotA;
- xMin = yMin = 0;
- xMax = yMax = -1;
- base = baseA;
- words = lastWord = NULL;
- text = NULL;
- edge = NULL;
- col = NULL;
- len = 0;
- convertedLen = 0;
- hyphenated = gFalse;
- next = NULL;
-}
-
-TextLine::~TextLine() {
- TextWord *word;
-
- while (words) {
- word = words;
- words = words->next;
- delete word;
- }
- gfree(text);
- gfree(edge);
- gfree(col);
-}
-
-void TextLine::addWord(TextWord *word) {
- if (lastWord) {
- lastWord->next = word;
- } else {
- words = word;
- }
- lastWord = word;
-
- if (xMin > xMax) {
- xMin = word->xMin;
- xMax = word->xMax;
- yMin = word->yMin;
- yMax = word->yMax;
- } else {
- if (word->xMin < xMin) {
- xMin = word->xMin;
- }
- if (word->xMax > xMax) {
- xMax = word->xMax;
- }
- if (word->yMin < yMin) {
- yMin = word->yMin;
- }
- if (word->yMax > yMax) {
- yMax = word->yMax;
- }
- }
-}
-
-double TextLine::primaryDelta(TextLine *line) {
- double delta;
-
- delta = 0; // make gcc happy
- switch (rot) {
- case 0:
- delta = line->xMin - xMax;
- break;
- case 1:
- delta = line->yMin - yMax;
- break;
- case 2:
- delta = xMin - line->xMax;
- break;
- case 3:
- delta = yMin - line->yMax;
- break;
- }
- return delta;
-}
-
-int TextLine::primaryCmp(TextLine *line) {
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (rot) {
- case 0:
- cmp = xMin - line->xMin;
- break;
- case 1:
- cmp = yMin - line->yMin;
- break;
- case 2:
- cmp = line->xMax - xMax;
- break;
- case 3:
- cmp = line->yMax - yMax;
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextLine::secondaryCmp(TextLine *line) {
- double cmp;
-
- cmp = (rot == 0 || rot == 3) ? base - line->base : line->base - base;
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextLine::cmpYX(TextLine *line) {
- int cmp;
-
- if ((cmp = secondaryCmp(line))) {
- return cmp;
- }
- return primaryCmp(line);
-}
-
-int TextLine::cmpXY(const void *p1, const void *p2) {
- TextLine *line1 = *(TextLine **)p1;
- TextLine *line2 = *(TextLine **)p2;
- int cmp;
-
- if ((cmp = line1->primaryCmp(line2))) {
- return cmp;
- }
- return line1->secondaryCmp(line2);
-}
-
-void TextLine::coalesce(UnicodeMap *uMap) {
- TextWord *word0, *word1;
- double space, delta, minSpace;
- GBool isUnicode;
- char buf[8];
- int i, j;
-
- if (words->next) {
-
- // compute the inter-word space threshold
- if (words->len > 1 || words->next->len > 1) {
- minSpace = 0;
- } else {
- minSpace = words->primaryDelta(words->next);
- for (word0 = words->next, word1 = word0->next;
- word1 && minSpace > 0;
- word0 = word1, word1 = word0->next) {
- if (word1->len > 1) {
- minSpace = 0;
- }
- delta = word0->primaryDelta(word1);
- if (delta < minSpace) {
- minSpace = delta;
- }
- }
- }
- if (minSpace <= 0) {
- space = maxCharSpacing * words->fontSize;
- } else {
- space = maxWideCharSpacingMul * minSpace;
- }
-
- // merge words
- word0 = words;
- word1 = words->next;
- while (word1) {
- if (word0->primaryDelta(word1) >= space) {
- word0->spaceAfter = gTrue;
- word0 = word1;
- word1 = word1->next;
- } else if (word0->font == word1->font &&
- fabs(word0->fontSize - word1->fontSize) <
- maxWordFontSizeDelta * words->fontSize &&
- word1->charPos == word0->charPos + word0->charLen) {
- word0->merge(word1);
- word0->next = word1->next;
- delete word1;
- word1 = word0->next;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
-
- // build the line text
- isUnicode = uMap ? uMap->isUnicode() : gFalse;
- len = 0;
- for (word1 = words; word1; word1 = word1->next) {
- len += word1->len;
- if (word1->spaceAfter) {
- ++len;
- }
- }
- text = (Unicode *)gmalloc(len * sizeof(Unicode));
- edge = (double *)gmalloc((len + 1) * sizeof(double));
- i = 0;
- for (word1 = words; word1; word1 = word1->next) {
- for (j = 0; j < word1->len; ++j) {
- text[i] = word1->text[j];
- edge[i] = word1->edge[j];
- ++i;
- }
- edge[i] = word1->edge[word1->len];
- if (word1->spaceAfter) {
- text[i] = (Unicode)0x0020;
- ++i;
- }
- }
-
- // compute convertedLen and set up the col array
- col = (int *)gmalloc((len + 1) * sizeof(int));
- convertedLen = 0;
- for (i = 0; i < len; ++i) {
- col[i] = convertedLen;
- if (isUnicode) {
- ++convertedLen;
- } else if (uMap) {
- convertedLen += uMap->mapUnicode(text[i], buf, sizeof(buf));
- }
- }
- col[len] = convertedLen;
-
- // check for hyphen at end of line
- //~ need to check for other chars used as hyphens
- hyphenated = text[len - 1] == (Unicode)'-';
-}
-
-//------------------------------------------------------------------------
-// TextLineFrag
-//------------------------------------------------------------------------
-
-class TextLineFrag {
-public:
-
- TextLine *line; // the line object
- int start, len; // offset and length of this fragment
- // (in Unicode chars)
- double xMin, xMax; // bounding box coordinates
- double yMin, yMax;
- double base; // baseline virtual coordinate
- int col; // first column
-
- void init(TextLine *lineA, int startA, int lenA);
- void computeCoords(GBool oneRot);
-
- static int cmpYXPrimaryRot(const void *p1, const void *p2);
- static int cmpYXLineRot(const void *p1, const void *p2);
- static int cmpXYLineRot(const void *p1, const void *p2);
-};
-
-void TextLineFrag::init(TextLine *lineA, int startA, int lenA) {
- line = lineA;
- start = startA;
- len = lenA;
- col = line->col[start];
-}
-
-void TextLineFrag::computeCoords(GBool oneRot) {
- TextBlock *blk;
- double d0, d1, d2, d3, d4;
-
- if (oneRot) {
-
- switch (line->rot) {
- case 0:
- xMin = line->edge[start];
- xMax = line->edge[start + len];
- yMin = line->yMin;
- yMax = line->yMax;
- break;
- case 1:
- xMin = line->xMin;
- xMax = line->xMax;
- yMin = line->edge[start];
- yMax = line->edge[start + len];
- break;
- case 2:
- xMin = line->edge[start + len];
- xMax = line->edge[start];
- yMin = line->yMin;
- yMax = line->yMax;
- break;
- case 3:
- xMin = line->xMin;
- xMax = line->xMax;
- yMin = line->edge[start + len];
- yMax = line->edge[start];
- break;
- }
- base = line->base;
-
- } else {
-
- if (line->rot == 0 && line->blk->page->primaryRot == 0) {
-
- xMin = line->edge[start];
- xMax = line->edge[start + len];
- yMin = line->yMin;
- yMax = line->yMax;
- base = line->base;
-
- } else {
-
- blk = line->blk;
- d0 = line->edge[start];
- d1 = line->edge[start + len];
- d2 = d3 = d4 = 0; // make gcc happy
-
- switch (line->rot) {
- case 0:
- d2 = line->yMin;
- d3 = line->yMax;
- d4 = line->base;
- d0 = (d0 - blk->xMin) / (blk->xMax - blk->xMin);
- d1 = (d1 - blk->xMin) / (blk->xMax - blk->xMin);
- d2 = (d2 - blk->yMin) / (blk->yMax - blk->yMin);
- d3 = (d3 - blk->yMin) / (blk->yMax - blk->yMin);
- d4 = (d4 - blk->yMin) / (blk->yMax - blk->yMin);
- break;
- case 1:
- d2 = line->xMax;
- d3 = line->xMin;
- d4 = line->base;
- d0 = (d0 - blk->yMin) / (blk->yMax - blk->yMin);
- d1 = (d1 - blk->yMin) / (blk->yMax - blk->yMin);
- d2 = (blk->xMax - d2) / (blk->xMax - blk->xMin);
- d3 = (blk->xMax - d3) / (blk->xMax - blk->xMin);
- d4 = (blk->xMax - d4) / (blk->xMax - blk->xMin);
- break;
- case 2:
- d2 = line->yMax;
- d3 = line->yMin;
- d4 = line->base;
- d0 = (blk->xMax - d0) / (blk->xMax - blk->xMin);
- d1 = (blk->xMax - d1) / (blk->xMax - blk->xMin);
- d2 = (blk->yMax - d2) / (blk->yMax - blk->yMin);
- d3 = (blk->yMax - d3) / (blk->yMax - blk->yMin);
- d4 = (blk->yMax - d4) / (blk->yMax - blk->yMin);
- break;
- case 3:
- d2 = line->xMin;
- d3 = line->xMax;
- d4 = line->base;
- d0 = (blk->yMax - d0) / (blk->yMax - blk->yMin);
- d1 = (blk->yMax - d1) / (blk->yMax - blk->yMin);
- d2 = (d2 - blk->xMin) / (blk->xMax - blk->xMin);
- d3 = (d3 - blk->xMin) / (blk->xMax - blk->xMin);
- d4 = (d4 - blk->xMin) / (blk->xMax - blk->xMin);
- break;
- }
-
- switch (line->blk->page->primaryRot) {
- case 0:
- xMin = blk->xMin + d0 * (blk->xMax - blk->xMin);
- xMax = blk->xMin + d1 * (blk->xMax - blk->xMin);
- yMin = blk->yMin + d2 * (blk->yMax - blk->yMin);
- yMax = blk->yMin + d3 * (blk->yMax - blk->yMin);
- base = blk->yMin + base * (blk->yMax - blk->yMin);
- break;
- case 1:
- xMin = blk->xMax - d3 * (blk->xMax - blk->xMin);
- xMax = blk->xMax - d2 * (blk->xMax - blk->xMin);
- yMin = blk->yMin + d0 * (blk->yMax - blk->yMin);
- yMax = blk->yMin + d1 * (blk->yMax - blk->yMin);
- base = blk->xMax - d4 * (blk->xMax - blk->xMin);
- break;
- case 2:
- xMin = blk->xMax - d1 * (blk->xMax - blk->xMin);
- xMax = blk->xMax - d0 * (blk->xMax - blk->xMin);
- yMin = blk->yMax - d3 * (blk->yMax - blk->yMin);
- yMax = blk->yMax - d2 * (blk->yMax - blk->yMin);
- base = blk->yMax - d4 * (blk->yMax - blk->yMin);
- break;
- case 3:
- xMin = blk->xMin + d2 * (blk->xMax - blk->xMin);
- xMax = blk->xMin + d3 * (blk->xMax - blk->xMin);
- yMin = blk->yMax - d1 * (blk->yMax - blk->yMin);
- yMax = blk->yMax - d0 * (blk->yMax - blk->yMin);
- base = blk->xMin + d4 * (blk->xMax - blk->xMin);
- break;
- }
-
- }
- }
-}
-
-int TextLineFrag::cmpYXPrimaryRot(const void *p1, const void *p2) {
- TextLineFrag *frag1 = (TextLineFrag *)p1;
- TextLineFrag *frag2 = (TextLineFrag *)p2;
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (frag1->line->blk->page->primaryRot) {
- case 0:
- if ((cmp = frag1->yMin - frag2->yMin) == 0) {
- cmp = frag1->xMin - frag2->xMin;
- }
- break;
- case 1:
- if ((cmp = frag2->xMax - frag1->xMax) == 0) {
- cmp = frag1->yMin - frag2->yMin;
- }
- break;
- case 2:
- if ((cmp = frag2->yMin - frag1->yMin) == 0) {
- cmp = frag2->xMax - frag1->xMax;
- }
- break;
- case 3:
- if ((cmp = frag1->xMax - frag2->xMax) == 0) {
- cmp = frag2->yMax - frag1->yMax;
- }
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextLineFrag::cmpYXLineRot(const void *p1, const void *p2) {
- TextLineFrag *frag1 = (TextLineFrag *)p1;
- TextLineFrag *frag2 = (TextLineFrag *)p2;
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (frag1->line->rot) {
- case 0:
- if ((cmp = frag1->yMin - frag2->yMin) == 0) {
- cmp = frag1->xMin - frag2->xMin;
- }
- break;
- case 1:
- if ((cmp = frag2->xMax - frag1->xMax) == 0) {
- cmp = frag1->yMin - frag2->yMin;
- }
- break;
- case 2:
- if ((cmp = frag2->yMin - frag1->yMin) == 0) {
- cmp = frag2->xMax - frag1->xMax;
- }
- break;
- case 3:
- if ((cmp = frag1->xMax - frag2->xMax) == 0) {
- cmp = frag2->yMax - frag1->yMax;
- }
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextLineFrag::cmpXYLineRot(const void *p1, const void *p2) {
- TextLineFrag *frag1 = (TextLineFrag *)p1;
- TextLineFrag *frag2 = (TextLineFrag *)p2;
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (frag1->line->rot) {
- case 0:
- if ((cmp = frag1->xMin - frag2->xMin) == 0) {
- cmp = frag1->yMin - frag2->yMin;
- }
- break;
- case 1:
- if ((cmp = frag1->yMin - frag2->yMin) == 0) {
- cmp = frag2->xMax - frag1->xMax;
- }
- break;
- case 2:
- if ((cmp = frag2->xMax - frag1->xMax) == 0) {
- cmp = frag2->yMin - frag1->yMin;
- }
- break;
- case 3:
- if ((cmp = frag2->yMax - frag1->yMax) == 0) {
- cmp = frag1->xMax - frag2->xMax;
- }
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-//------------------------------------------------------------------------
-// TextBlock
-//------------------------------------------------------------------------
-
-TextBlock::TextBlock(TextPage *pageA, int rotA) {
- page = pageA;
- rot = rotA;
- xMin = yMin = 0;
- xMax = yMax = -1;
- priMin = 0;
- priMax = page->pageWidth;
- pool = new TextPool();
- lines = NULL;
- curLine = NULL;
- next = NULL;
- stackNext = NULL;
-}
-
-TextBlock::~TextBlock() {
- TextLine *line;
-
- delete pool;
- while (lines) {
- line = lines;
- lines = lines->next;
- delete line;
- }
-}
-
-void TextBlock::addWord(TextWord *word) {
- pool->addWord(word);
- if (xMin > xMax) {
- xMin = word->xMin;
- xMax = word->xMax;
- yMin = word->yMin;
- yMax = word->yMax;
- } else {
- if (word->xMin < xMin) {
- xMin = word->xMin;
- }
- if (word->xMax > xMax) {
- xMax = word->xMax;
- }
- if (word->yMin < yMin) {
- yMin = word->yMin;
- }
- if (word->yMax > yMax) {
- yMax = word->yMax;
- }
- }
-}
-
-void TextBlock::coalesce(UnicodeMap *uMap) {
- TextWord *word0, *word1, *word2, *bestWord0, *bestWord1, *lastWord;
- TextLine *line, *line0, *line1;
- int poolMinBaseIdx, startBaseIdx, minBaseIdx, maxBaseIdx;
- int baseIdx, bestWordBaseIdx, idx0, idx1;
- double minBase, maxBase;
- double fontSize, delta, priDelta, secDelta;
- TextLine **lineArray;
- GBool found;
- int col1, col2;
- int i, j, k;
-
- // discard duplicated text (fake boldface, drop shadows)
- for (idx0 = pool->minBaseIdx; idx0 <= pool->maxBaseIdx; ++idx0) {
- word0 = pool->getPool(idx0);
- while (word0) {
- priDelta = dupMaxPriDelta * word0->fontSize;
- secDelta = dupMaxSecDelta * word0->fontSize;
- if (rot == 0 || rot == 3) {
- maxBaseIdx = pool->getBaseIdx(word0->base + secDelta);
- } else {
- maxBaseIdx = pool->getBaseIdx(word0->base - secDelta);
- }
- found = gFalse;
- word1 = word2 = NULL; // make gcc happy
- for (idx1 = idx0; idx1 <= maxBaseIdx; ++idx1) {
- if (idx1 == idx0) {
- word1 = word0;
- word2 = word0->next;
- } else {
- word1 = NULL;
- word2 = pool->getPool(idx1);
- }
- for (; word2; word1 = word2, word2 = word2->next) {
- if (word2->len == word0->len &&
- !memcmp(word2->text, word0->text,
- word0->len * sizeof(Unicode))) {
- switch (rot) {
- case 0:
- case 2:
- found = fabs(word0->xMin - word2->xMin) < priDelta &&
- fabs(word0->xMax - word2->xMax) < priDelta &&
- fabs(word0->yMin - word2->yMin) < secDelta &&
- fabs(word0->yMax - word2->yMax) < secDelta;
- break;
- case 1:
- case 3:
- found = fabs(word0->xMin - word2->xMin) < secDelta &&
- fabs(word0->xMax - word2->xMax) < secDelta &&
- fabs(word0->yMin - word2->yMin) < priDelta &&
- fabs(word0->yMax - word2->yMax) < priDelta;
- break;
- }
- }
- if (found) {
- break;
- }
- }
- if (found) {
- break;
- }
- }
- if (found) {
- if (word1) {
- word1->next = word2->next;
- } else {
- pool->setPool(idx1, word2->next);
- }
- delete word2;
- } else {
- word0 = word0->next;
- }
- }
- }
-
- // build the lines
- curLine = NULL;
- poolMinBaseIdx = pool->minBaseIdx;
- charCount = 0;
- nLines = 0;
- while (1) {
-
- // find the first non-empty line in the pool
- for (;
- poolMinBaseIdx <= pool->maxBaseIdx && !pool->getPool(poolMinBaseIdx);
- ++poolMinBaseIdx) ;
- if (poolMinBaseIdx > pool->maxBaseIdx) {
- break;
- }
-
- // look for the left-most word in the first four lines of the
- // pool -- this avoids starting with a superscript word
- startBaseIdx = poolMinBaseIdx;
- for (baseIdx = poolMinBaseIdx + 1;
- baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx;
- ++baseIdx) {
- if (!pool->getPool(baseIdx)) {
- continue;
- }
- if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx))
- < 0) {
- startBaseIdx = baseIdx;
- }
- }
-
- // create a new line
- word0 = pool->getPool(startBaseIdx);
- pool->setPool(startBaseIdx, word0->next);
- word0->next = NULL;
- line = new TextLine(this, word0->rot, word0->base);
- line->addWord(word0);
- lastWord = word0;
-
- // compute the search range
- fontSize = word0->fontSize;
- minBase = word0->base - maxIntraLineDelta * fontSize;
- maxBase = word0->base + maxIntraLineDelta * fontSize;
- minBaseIdx = pool->getBaseIdx(minBase);
- maxBaseIdx = pool->getBaseIdx(maxBase);
-
- // find the rest of the words in this line
- while (1) {
-
- // find the left-most word whose baseline is in the range for
- // this line
- bestWordBaseIdx = 0;
- bestWord0 = bestWord1 = NULL;
- for (baseIdx = minBaseIdx; baseIdx <= maxBaseIdx; ++baseIdx) {
- for (word0 = NULL, word1 = pool->getPool(baseIdx);
- word1;
- word0 = word1, word1 = word1->next) {
- if (word1->base >= minBase &&
- word1->base <= maxBase &&
- (delta = lastWord->primaryDelta(word1)) >=
- minCharSpacing * fontSize) {
- if (delta < maxWordSpacing * fontSize &&
- (!bestWord1 || word1->primaryCmp(bestWord1) < 0)) {
- bestWordBaseIdx = baseIdx;
- bestWord0 = word0;
- bestWord1 = word1;
- }
- break;
- }
- }
- }
- if (!bestWord1) {
- break;
- }
-
- // remove it from the pool, and add it to the line
- if (bestWord0) {
- bestWord0->next = bestWord1->next;
- } else {
- pool->setPool(bestWordBaseIdx, bestWord1->next);
- }
- bestWord1->next = NULL;
- line->addWord(bestWord1);
- lastWord = bestWord1;
- }
-
- // add the line
- if (curLine && line->cmpYX(curLine) > 0) {
- line0 = curLine;
- line1 = curLine->next;
- } else {
- line0 = NULL;
- line1 = lines;
- }
- for (;
- line1 && line->cmpYX(line1) > 0;
- line0 = line1, line1 = line1->next) ;
- if (line0) {
- line0->next = line;
- } else {
- lines = line;
- }
- line->next = line1;
- curLine = line;
- line->coalesce(uMap);
- charCount += line->len;
- ++nLines;
- }
-
- // sort lines into xy order for column assignment
- lineArray = (TextLine **)gmalloc(nLines * sizeof(TextLine *));
- for (line = lines, i = 0; line; line = line->next, ++i) {
- lineArray[i] = line;
- }
- qsort(lineArray, nLines, sizeof(TextLine *), &TextLine::cmpXY);
-
- // column assignment
- nColumns = 0;
- for (i = 0; i < nLines; ++i) {
- line0 = lineArray[i];
- col1 = 0;
- for (j = 0; j < i; ++j) {
- line1 = lineArray[j];
- if (line1->primaryDelta(line0) >= 0) {
- col2 = line1->col[line1->len] + 1;
- } else {
- k = 0; // make gcc happy
- switch (rot) {
- case 0:
- for (k = 0;
- k < line1->len &&
- line0->xMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);
- ++k) ;
- break;
- case 1:
- for (k = 0;
- k < line1->len &&
- line0->yMin >= 0.5 * (line1->edge[k] + line1->edge[k+1]);
- ++k) ;
- break;
- case 2:
- for (k = 0;
- k < line1->len &&
- line0->xMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);
- ++k) ;
- break;
- case 3:
- for (k = 0;
- k < line1->len &&
- line0->yMax <= 0.5 * (line1->edge[k] + line1->edge[k+1]);
- ++k) ;
- break;
- }
- col2 = line1->col[k];
- }
- if (col2 > col1) {
- col1 = col2;
- }
- }
- for (k = 0; k <= line0->len; ++k) {
- line0->col[k] += col1;
- }
- if (line0->col[line0->len] > nColumns) {
- nColumns = line0->col[line0->len];
- }
- }
- gfree(lineArray);
-}
-
-void TextBlock::updatePriMinMax(TextBlock *blk) {
- double newPriMin, newPriMax;
- GBool gotPriMin, gotPriMax;
-
- gotPriMin = gotPriMax = gFalse;
- newPriMin = newPriMax = 0; // make gcc happy
- switch (page->primaryRot) {
- case 0:
- case 2:
- if (blk->yMin < yMax && blk->yMax > yMin) {
- if (blk->xMin < xMin) {
- newPriMin = blk->xMax;
- gotPriMin = gTrue;
- }
- if (blk->xMax > xMax) {
- newPriMax = blk->xMin;
- gotPriMax = gTrue;
- }
- }
- break;
- case 1:
- case 3:
- if (blk->xMin < xMax && blk->xMax > xMin) {
- if (blk->yMin < yMin) {
- newPriMin = blk->yMax;
- gotPriMin = gTrue;
- }
- if (blk->yMax > yMax) {
- newPriMax = blk->yMin;
- gotPriMax = gTrue;
- }
- }
- break;
- }
- if (gotPriMin) {
- if (newPriMin > xMin) {
- newPriMin = xMin;
- }
- if (newPriMin > priMin) {
- priMin = newPriMin;
- }
- }
- if (gotPriMax) {
- if (newPriMax < xMax) {
- newPriMax = xMax;
- }
- if (newPriMax < priMax) {
- priMax = newPriMax;
- }
- }
-}
-
-int TextBlock::cmpXYPrimaryRot(const void *p1, const void *p2) {
- TextBlock *blk1 = *(TextBlock **)p1;
- TextBlock *blk2 = *(TextBlock **)p2;
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (blk1->page->primaryRot) {
- case 0:
- if ((cmp = blk1->xMin - blk2->xMin) == 0) {
- cmp = blk1->yMin - blk2->yMin;
- }
- break;
- case 1:
- if ((cmp = blk1->yMin - blk2->yMin) == 0) {
- cmp = blk2->xMax - blk1->xMax;
- }
- break;
- case 2:
- if ((cmp = blk2->xMax - blk1->xMax) == 0) {
- cmp = blk2->yMin - blk1->yMin;
- }
- break;
- case 3:
- if ((cmp = blk2->yMax - blk1->yMax) == 0) {
- cmp = blk1->xMax - blk2->xMax;
- }
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextBlock::cmpYXPrimaryRot(const void *p1, const void *p2) {
- TextBlock *blk1 = *(TextBlock **)p1;
- TextBlock *blk2 = *(TextBlock **)p2;
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (blk1->page->primaryRot) {
- case 0:
- if ((cmp = blk1->yMin - blk2->yMin) == 0) {
- cmp = blk1->xMin - blk2->xMin;
- }
- break;
- case 1:
- if ((cmp = blk2->xMax - blk1->xMax) == 0) {
- cmp = blk1->yMin - blk2->yMin;
- }
- break;
- case 2:
- if ((cmp = blk2->yMin - blk1->yMin) == 0) {
- cmp = blk2->xMax - blk1->xMax;
- }
- break;
- case 3:
- if ((cmp = blk1->xMax - blk2->xMax) == 0) {
- cmp = blk2->yMax - blk1->yMax;
- }
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-int TextBlock::primaryCmp(TextBlock *blk) {
- double cmp;
-
- cmp = 0; // make gcc happy
- switch (rot) {
- case 0:
- cmp = xMin - blk->xMin;
- break;
- case 1:
- cmp = yMin - blk->yMin;
- break;
- case 2:
- cmp = blk->xMax - xMax;
- break;
- case 3:
- cmp = blk->yMax - yMax;
- break;
- }
- return cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
-}
-
-double TextBlock::secondaryDelta(TextBlock *blk) {
- double delta;
-
- delta = 0; // make gcc happy
- switch (rot) {
- case 0:
- delta = blk->yMin - yMax;
- break;
- case 1:
- delta = xMin - blk->xMax;
- break;
- case 2:
- delta = yMin - blk->yMax;
- break;
- case 3:
- delta = blk->xMin - xMax;
- break;
- }
- return delta;
-}
-
-GBool TextBlock::isBelow(TextBlock *blk) {
- GBool below;
-
- below = gFalse; // make gcc happy
- switch (page->primaryRot) {
- case 0:
- below = xMin >= blk->priMin && xMax <= blk->priMax &&
- yMin > blk->yMin;
- break;
- case 1:
- below = yMin >= blk->priMin && yMax <= blk->priMax &&
- xMax < blk->xMax;
- break;
- case 2:
- below = xMin >= blk->priMin && xMax <= blk->priMax &&
- yMax < blk->yMax;
- break;
- case 3:
- below = yMin >= blk->priMin && yMax <= blk->priMax &&
- xMin > blk->xMin;
- break;
- }
-
- return below;
-}
-
-//------------------------------------------------------------------------
-// TextFlow
-//------------------------------------------------------------------------
-
-TextFlow::TextFlow(TextPage *pageA, TextBlock *blk) {
- page = pageA;
- xMin = blk->xMin;
- xMax = blk->xMax;
- yMin = blk->yMin;
- yMax = blk->yMax;
- priMin = blk->priMin;
- priMax = blk->priMax;
- blocks = lastBlk = blk;
- next = NULL;
-}
-
-TextFlow::~TextFlow() {
- TextBlock *blk;
-
- while (blocks) {
- blk = blocks;
- blocks = blocks->next;
- delete blk;
- }
-}
-
-void TextFlow::addBlock(TextBlock *blk) {
- if (lastBlk) {
- lastBlk->next = blk;
- } else {
- blocks = blk;
- }
- lastBlk = blk;
- if (blk->xMin < xMin) {
- xMin = blk->xMin;
- }
- if (blk->xMax > xMax) {
- xMax = blk->xMax;
- }
- if (blk->yMin < yMin) {
- yMin = blk->yMin;
- }
- if (blk->yMax > yMax) {
- yMax = blk->yMax;
- }
-}
-
-GBool TextFlow::blockFits(TextBlock *blk, TextBlock *prevBlk) {
- GBool fits;
-
- // lower blocks must use smaller fonts
- if (blk->lines->words->fontSize > lastBlk->lines->words->fontSize) {
- return gFalse;
- }
-
- fits = gFalse; // make gcc happy
- switch (page->primaryRot) {
- case 0:
- fits = blk->xMin >= priMin && blk->xMax <= priMax;
- break;
- case 1:
- fits = blk->yMin >= priMin && blk->yMax <= priMax;
- break;
- case 2:
- fits = blk->xMin >= priMin && blk->xMax <= priMax;
- break;
- case 3:
- fits = blk->yMin >= priMin && blk->yMax <= priMax;
- break;
- }
- return fits;
-}
-
-#if TEXTOUT_WORD_LIST
-
-//------------------------------------------------------------------------
-// TextWordList
-//------------------------------------------------------------------------
-
-TextWordList::TextWordList(TextPage *text, GBool physLayout) {
- TextFlow *flow;
- TextBlock *blk;
- TextLine *line;
- TextWord *word;
- TextWord **wordArray;
- int nWords, i;
-
- words = new GList();
-
- if (text->rawOrder) {
- for (word = text->rawWords; word; word = word->next) {
- words->append(word);
- }
-
- } else if (physLayout) {
- // this is inefficient, but it's also the least useful of these
- // three cases
- nWords = 0;
- for (flow = text->flows; flow; flow = flow->next) {
- for (blk = flow->blocks; blk; blk = blk->next) {
- for (line = blk->lines; line; line = line->next) {
- for (word = line->words; word; word = word->next) {
- ++nWords;
- }
- }
- }
- }
- wordArray = (TextWord **)gmalloc(nWords * sizeof(TextWord *));
- i = 0;
- for (flow = text->flows; flow; flow = flow->next) {
- for (blk = flow->blocks; blk; blk = blk->next) {
- for (line = blk->lines; line; line = line->next) {
- for (word = line->words; word; word = word->next) {
- wordArray[i++] = word;
- }
- }
- }
- }
- qsort(wordArray, nWords, sizeof(TextWord *), &TextWord::cmpYX);
- for (i = 0; i < nWords; ++i) {
- words->append(wordArray[i]);
- }
- gfree(wordArray);
-
- } else {
- for (flow = text->flows; flow; flow = flow->next) {
- for (blk = flow->blocks; blk; blk = blk->next) {
- for (line = blk->lines; line; line = line->next) {
- for (word = line->words; word; word = word->next) {
- words->append(word);
- }
- }
- }
- }
- }
-}
-
-TextWordList::~TextWordList() {
- delete words;
-}
-
-int TextWordList::getLength() {
- return words->getLength();
-}
-
-TextWord *TextWordList::get(int idx) {
- if (idx < 0 || idx >= words->getLength()) {
- return NULL;
- }
- return (TextWord *)words->get(idx);
-}
-
-#endif // TEXTOUT_WORD_LIST
-
-//------------------------------------------------------------------------
-// TextPage
-//------------------------------------------------------------------------
-
-TextPage::TextPage(GBool rawOrderA) {
- int rot;
-
- rawOrder = rawOrderA;
- curWord = NULL;
- charPos = 0;
- curFont = NULL;
- curFontSize = 0;
- nest = 0;
- nTinyChars = 0;
- lastCharOverlap = gFalse;
- if (!rawOrder) {
- for (rot = 0; rot < 4; ++rot) {
- pools[rot] = new TextPool();
- }
- }
- flows = NULL;
- blocks = NULL;
- rawWords = NULL;
- rawLastWord = NULL;
- fonts = new GList();
- lastFindXMin = lastFindYMin = 0;
- haveLastFind = gFalse;
-}
-
-TextPage::~TextPage() {
- int rot;
-
- clear();
- if (!rawOrder) {
- for (rot = 0; rot < 4; ++rot) {
- delete pools[rot];
- }
- }
- delete fonts;
-}
-
-void TextPage::startPage(GfxState *state) {
- clear();
- if (state) {
- pageWidth = state->getPageWidth();
- pageHeight = state->getPageHeight();
- } else {
- pageWidth = pageHeight = 0;
- }
-}
-
-void TextPage::endPage() {
- if (curWord) {
- endWord();
- }
-}
-
-void TextPage::clear() {
- int rot;
- TextFlow *flow;
- TextWord *word;
-
- if (curWord) {
- delete curWord;
- curWord = NULL;
- }
- if (rawOrder) {
- while (rawWords) {
- word = rawWords;
- rawWords = rawWords->next;
- delete word;
- }
- } else {
- for (rot = 0; rot < 4; ++rot) {
- delete pools[rot];
- }
- while (flows) {
- flow = flows;
- flows = flows->next;
- delete flow;
- }
- gfree(blocks);
- }
- deleteGList(fonts, TextFontInfo);
-
- curWord = NULL;
- charPos = 0;
- curFont = NULL;
- curFontSize = 0;
- nest = 0;
- nTinyChars = 0;
- if (!rawOrder) {
- for (rot = 0; rot < 4; ++rot) {
- pools[rot] = new TextPool();
- }
- }
- flows = NULL;
- blocks = NULL;
- rawWords = NULL;
- rawLastWord = NULL;
- fonts = new GList();
-}
-
-void TextPage::updateFont(GfxState *state) {
- GfxFont *gfxFont;
- double *fm;
- char *name;
- int code, mCode, letterCode, anyCode;
- double w;
- int i;
-
- // get the font info object
- curFont = NULL;
- for (i = 0; i < fonts->getLength(); ++i) {
- curFont = (TextFontInfo *)fonts->get(i);
- if (curFont->matches(state)) {
- break;
- }
- curFont = NULL;
- }
- if (!curFont) {
- curFont = new TextFontInfo(state);
- fonts->append(curFont);
- }
-
- // adjust the font size
- gfxFont = state->getFont();
- curFontSize = state->getTransformedFontSize();
- if (gfxFont && gfxFont->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').
- mCode = letterCode = anyCode = -1;
- for (code = 0; code < 256; ++code) {
- name = ((Gfx8BitFont *)gfxFont)->getCharName(code);
- if (name && name[0] == 'm' && name[1] == '\0') {
- mCode = code;
- }
- if (letterCode < 0 && name && name[1] == '\0' &&
- ((name[0] >= 'A' && name[0] <= 'Z') ||
- (name[0] >= 'a' && name[0] <= 'z'))) {
- letterCode = code;
- }
- if (anyCode < 0 && name &&
- ((Gfx8BitFont *)gfxFont)->getWidth(code) > 0) {
- anyCode = code;
- }
- }
- if (mCode >= 0 &&
- (w = ((Gfx8BitFont *)gfxFont)->getWidth(mCode)) > 0) {
- // 0.6 is a generic average 'm' width -- yes, this is a hack
- curFontSize *= w / 0.6;
- } else if (letterCode >= 0 &&
- (w = ((Gfx8BitFont *)gfxFont)->getWidth(letterCode)) > 0) {
- // even more of a hack: 0.5 is a generic letter width
- curFontSize *= w / 0.5;
- } else if (anyCode >= 0 &&
- (w = ((Gfx8BitFont *)gfxFont)->getWidth(anyCode)) > 0) {
- // better than nothing: 0.5 is a generic character width
- curFontSize *= w / 0.5;
- }
- fm = gfxFont->getFontMatrix();
- if (fm[0] != 0) {
- curFontSize *= fabs(fm[3] / fm[0]);
- }
- }
-}
-
-void TextPage::beginWord(GfxState *state, double x0, double y0) {
- double *txtm, *ctm, *fontm;
- double m[4], m2[4];
- int rot;
-
- // This check is needed because Type 3 characters can contain
- // text-drawing operations (when TextPage is being used via
- // {X,Win}SplashOutputDev rather than TextOutputDev).
- if (curWord) {
- ++nest;
- return;
- }
-
- // compute the rotation
- txtm = state->getTextMat();
- ctm = state->getCTM();
- m[0] = txtm[0] * ctm[0] + txtm[1] * ctm[2];
- m[1] = txtm[0] * ctm[1] + txtm[1] * ctm[3];
- m[2] = txtm[2] * ctm[0] + txtm[3] * ctm[2];
- m[3] = txtm[2] * ctm[1] + txtm[3] * ctm[3];
- if (state->getFont()->getType() == fontType3) {
- fontm = state->getFont()->getFontMatrix();
- m2[0] = fontm[0] * m[0] + fontm[1] * m[2];
- m2[1] = fontm[0] * m[1] + fontm[1] * m[3];
- m2[2] = fontm[2] * m[0] + fontm[3] * m[2];
- m2[3] = fontm[2] * m[1] + fontm[3] * m[3];
- m[0] = m2[0];
- m[1] = m2[1];
- m[2] = m2[2];
- m[3] = m2[3];
- }
- if (fabs(m[0] * m[3]) > fabs(m[1] * m[2])) {
- rot = (m[3] < 0) ? 0 : 2;
- } else {
- rot = (m[2] > 0) ? 1 : 3;
- }
-
- curWord = new TextWord(state, rot, x0, y0, charPos, curFont, curFontSize);
-}
-
-void TextPage::addChar(GfxState *state, double x, double y,
- double dx, double dy,
- CharCode c, Unicode *u, int uLen) {
- double x1, y1, w1, h1, dx2, dy2, base, sp;
- int i;
-
- // if the previous char was a space, addChar will have called
- // endWord, so we need to start a new word
- if (!curWord) {
- beginWord(state, x, y);
- }
-
- // throw away chars that aren't inside the page bounds
- state->transform(x, y, &x1, &y1);
- if (x1 < 0 || x1 > pageWidth ||
- y1 < 0 || y1 > pageHeight) {
- return;
- }
-
- // subtract char and word spacing from the dx,dy values
- sp = state->getCharSpace();
- if (c == (CharCode)0x20) {
- sp += state->getWordSpace();
- }
- state->textTransformDelta(sp * state->getHorizScaling(), 0, &dx2, &dy2);
- dx -= dx2;
- dy -= dy2;
- state->transformDelta(dx, dy, &w1, &h1);
-
- // check the tiny chars limit
- if (!globalParams->getTextKeepTinyChars() &&
- fabs(w1) < 3 && fabs(h1) < 3) {
- if (++nTinyChars > 50000) {
- return;
- }
- }
-
- // break words at space character
- if (uLen == 1 && u[0] == (Unicode)0x20) {
- ++curWord->charLen;
- ++charPos;
- endWord();
- return;
- }
-
- // start a new word if:
- // (1) this character's baseline doesn't match the current word's
- // baseline, or
- // (2) there is space between the end of the current word and this
- // character, or
- // (3) this character overlaps the previous one (duplicated text), or
- // (4) the previous character was an overlap (we want each duplicated
- // characters to be in a word by itself)
- base = sp = 0; // make gcc happy
- if (curWord->len > 0) {
- switch (curWord->rot) {
- case 0:
- base = y1;
- sp = x1 - curWord->xMax;
- break;
- case 1:
- base = x1;
- sp = y1 - curWord->yMax;
- break;
- case 2:
- base = y1;
- sp = curWord->xMin - x1;
- break;
- case 3:
- base = x1;
- sp = curWord->yMin - y1;
- break;
- }
- if (fabs(base - curWord->base) > 0.5 ||
- sp > minWordBreakSpace * curWord->fontSize ||
- sp < -minDupBreakOverlap * curWord->fontSize ||
- lastCharOverlap) {
- lastCharOverlap = gTrue;
- endWord();
- beginWord(state, x, y);
- } else {
- lastCharOverlap = gFalse;
- }
- } else {
- lastCharOverlap = gFalse;
- }
-
- // page rotation and/or transform matrices can cause text to be
- // drawn in reverse order -- in this case, swap the begin/end
- // coordinates and break text into individual chars
- if ((curWord->rot == 0 && w1 < 0) ||
- (curWord->rot == 1 && h1 < 0) ||
- (curWord->rot == 2 && w1 > 0) ||
- (curWord->rot == 3 && h1 > 0)) {
- endWord();
- beginWord(state, x + dx, y + dy);
- x1 += w1;
- y1 += h1;
- w1 = -w1;
- h1 = -h1;
- }
-
- // add the characters to the current word
- if (uLen != 0) {
- w1 /= uLen;
- h1 /= uLen;
- }
- for (i = 0; i < uLen; ++i) {
- curWord->addChar(state, x1 + i*w1, y1 + i*h1, w1, h1, u[i]);
- }
- ++curWord->charLen;
- ++charPos;
-}
-
-void TextPage::endWord() {
- // This check is needed because Type 3 characters can contain
- // text-drawing operations (when TextPage is being used via
- // {X,Win}SplashOutputDev rather than TextOutputDev).
- if (nest > 0) {
- --nest;
- return;
- }
-
- if (curWord) {
- addWord(curWord);
- curWord = NULL;
- }
-}
-
-void TextPage::addWord(TextWord *word) {
- // throw away zero-length words -- they don't have valid xMin/xMax
- // values, and they're useless anyway
- if (word->len == 0) {
- delete word;
- return;
- }
-
- if (rawOrder) {
- if (rawLastWord) {
- rawLastWord->next = word;
- } else {
- rawWords = word;
- }
- rawLastWord = word;
- } else {
- pools[word->rot]->addWord(word);
- }
-}
-
-void TextPage::coalesce(GBool physLayout) {
- UnicodeMap *uMap;
- TextPool *pool;
- TextWord *word0, *word1, *word2;
- TextLine *line;
- TextBlock *blkList, *blkStack, *blk, *lastBlk, *blk0, *blk1;
- TextBlock **blkArray;
- TextFlow *flow, *lastFlow;
- int rot, poolMinBaseIdx, baseIdx, startBaseIdx;
- double minBase, maxBase, newMinBase, newMaxBase;
- double fontSize, colSpace1, colSpace2, lineSpace, intraLineSpace, blkSpace;
- GBool found;
- int count[4];
- int lrCount;
- int firstBlkIdx, nBlocksLeft;
- int col1, col2;
- int i, j, n;
-
- if (rawOrder) {
- primaryRot = 0;
- primaryLR = gTrue;
- return;
- }
-
- uMap = globalParams->getTextEncoding();
- blkList = NULL;
- lastBlk = NULL;
- nBlocks = 0;
- primaryRot = -1;
-
-#if 0 // for debugging
- printf("*** initial words ***\n");
- for (rot = 0; rot < 4; ++rot) {
- pool = pools[rot];
- for (baseIdx = pool->minBaseIdx; baseIdx <= pool->maxBaseIdx; ++baseIdx) {
- for (word0 = pool->getPool(baseIdx); word0; word0 = word0->next) {
- printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f '",
- word0->xMin, word0->xMax, word0->yMin, word0->yMax,
- word0->base, word0->fontSize);
- for (i = 0; i < word0->len; ++i) {
- fputc(word0->text[i] & 0xff, stdout);
- }
- printf("'\n");
- }
- }
- }
- printf("\n");
-#endif
-
- //----- assemble the blocks
-
- //~ add an outer loop for writing mode (vertical text)
-
- // build blocks for each rotation value
- for (rot = 0; rot < 4; ++rot) {
- pool = pools[rot];
- poolMinBaseIdx = pool->minBaseIdx;
- count[rot] = 0;
-
- // add blocks until no more words are left
- while (1) {
-
- // find the first non-empty line in the pool
- for (;
- poolMinBaseIdx <= pool->maxBaseIdx &&
- !pool->getPool(poolMinBaseIdx);
- ++poolMinBaseIdx) ;
- if (poolMinBaseIdx > pool->maxBaseIdx) {
- break;
- }
-
- // look for the left-most word in the first four lines of the
- // pool -- this avoids starting with a superscript word
- startBaseIdx = poolMinBaseIdx;
- for (baseIdx = poolMinBaseIdx + 1;
- baseIdx < poolMinBaseIdx + 4 && baseIdx <= pool->maxBaseIdx;
- ++baseIdx) {
- if (!pool->getPool(baseIdx)) {
- continue;
- }
- if (pool->getPool(baseIdx)->primaryCmp(pool->getPool(startBaseIdx))
- < 0) {
- startBaseIdx = baseIdx;
- }
- }
-
- // create a new block
- word0 = pool->getPool(startBaseIdx);
- pool->setPool(startBaseIdx, word0->next);
- word0->next = NULL;
- blk = new TextBlock(this, rot);
- blk->addWord(word0);
-
- fontSize = word0->fontSize;
- minBase = maxBase = word0->base;
- colSpace1 = minColSpacing1 * fontSize;
- colSpace2 = minColSpacing2 * fontSize;
- lineSpace = maxLineSpacingDelta * fontSize;
- intraLineSpace = maxIntraLineDelta * fontSize;
-
- // add words to the block
- do {
- found = gFalse;
-
- // look for words on the line above the current top edge of
- // the block
- newMinBase = minBase;
- for (baseIdx = pool->getBaseIdx(minBase);
- baseIdx >= pool->getBaseIdx(minBase - lineSpace);
- --baseIdx) {
- word0 = NULL;
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base < minBase &&
- word1->base >= minBase - lineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin)
- : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta1 * fontSize) {
- word2 = word1;
- if (word0) {
- word0->next = word1->next;
- } else {
- pool->setPool(baseIdx, word1->next);
- }
- word1 = word1->next;
- word2->next = NULL;
- blk->addWord(word2);
- found = gTrue;
- newMinBase = word2->base;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
- minBase = newMinBase;
-
- // look for words on the line below the current bottom edge of
- // the block
- newMaxBase = maxBase;
- for (baseIdx = pool->getBaseIdx(maxBase);
- baseIdx <= pool->getBaseIdx(maxBase + lineSpace);
- ++baseIdx) {
- word0 = NULL;
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base > maxBase &&
- word1->base <= maxBase + lineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMin < blk->xMax && word1->xMax > blk->xMin)
- : (word1->yMin < blk->yMax && word1->yMax > blk->yMin)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta1 * fontSize) {
- word2 = word1;
- if (word0) {
- word0->next = word1->next;
- } else {
- pool->setPool(baseIdx, word1->next);
- }
- word1 = word1->next;
- word2->next = NULL;
- blk->addWord(word2);
- found = gTrue;
- newMaxBase = word2->base;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
- maxBase = newMaxBase;
-
- // look for words that are on lines already in the block, and
- // that overlap the block horizontally
- for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
- baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
- ++baseIdx) {
- word0 = NULL;
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base >= minBase - intraLineSpace &&
- word1->base <= maxBase + intraLineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMin < blk->xMax + colSpace1 &&
- word1->xMax > blk->xMin - colSpace1)
- : (word1->yMin < blk->yMax + colSpace1 &&
- word1->yMax > blk->yMin - colSpace1)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta2 * fontSize) {
- word2 = word1;
- if (word0) {
- word0->next = word1->next;
- } else {
- pool->setPool(baseIdx, word1->next);
- }
- word1 = word1->next;
- word2->next = NULL;
- blk->addWord(word2);
- found = gTrue;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
-
- // only check for outlying words (the next two chunks of code)
- // if we didn't find anything else
- if (found) {
- continue;
- }
-
- // scan down the left side of the block, looking for words
- // that are near (but not overlapping) the block; if there are
- // three or fewer, add them to the block
- n = 0;
- for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
- baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
- ++baseIdx) {
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base >= minBase - intraLineSpace &&
- word1->base <= maxBase + intraLineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMax <= blk->xMin &&
- word1->xMax > blk->xMin - colSpace2)
- : (word1->yMax <= blk->yMin &&
- word1->yMax > blk->yMin - colSpace2)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta3 * fontSize) {
- ++n;
- break;
- }
- word1 = word1->next;
- }
- }
- if (n > 0 && n <= 3) {
- for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
- baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
- ++baseIdx) {
- word0 = NULL;
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base >= minBase - intraLineSpace &&
- word1->base <= maxBase + intraLineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMax <= blk->xMin &&
- word1->xMax > blk->xMin - colSpace2)
- : (word1->yMax <= blk->yMin &&
- word1->yMax > blk->yMin - colSpace2)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta3 * fontSize) {
- word2 = word1;
- if (word0) {
- word0->next = word1->next;
- } else {
- pool->setPool(baseIdx, word1->next);
- }
- word1 = word1->next;
- word2->next = NULL;
- blk->addWord(word2);
- if (word2->base < minBase) {
- minBase = word2->base;
- } else if (word2->base > maxBase) {
- maxBase = word2->base;
- }
- found = gTrue;
- break;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
- }
-
- // scan down the right side of the block, looking for words
- // that are near (but not overlapping) the block; if there are
- // three or fewer, add them to the block
- n = 0;
- for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
- baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
- ++baseIdx) {
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base >= minBase - intraLineSpace &&
- word1->base <= maxBase + intraLineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMin >= blk->xMax &&
- word1->xMin < blk->xMax + colSpace2)
- : (word1->yMin >= blk->yMax &&
- word1->yMin < blk->yMax + colSpace2)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta3 * fontSize) {
- ++n;
- break;
- }
- word1 = word1->next;
- }
- }
- if (n > 0 && n <= 3) {
- for (baseIdx = pool->getBaseIdx(minBase - intraLineSpace);
- baseIdx <= pool->getBaseIdx(maxBase + intraLineSpace);
- ++baseIdx) {
- word0 = NULL;
- word1 = pool->getPool(baseIdx);
- while (word1) {
- if (word1->base >= minBase - intraLineSpace &&
- word1->base <= maxBase + intraLineSpace &&
- ((rot == 0 || rot == 2)
- ? (word1->xMin >= blk->xMax &&
- word1->xMin < blk->xMax + colSpace2)
- : (word1->yMin >= blk->yMax &&
- word1->yMin < blk->yMax + colSpace2)) &&
- fabs(word1->fontSize - fontSize) <
- maxBlockFontSizeDelta3 * fontSize) {
- word2 = word1;
- if (word0) {
- word0->next = word1->next;
- } else {
- pool->setPool(baseIdx, word1->next);
- }
- word1 = word1->next;
- word2->next = NULL;
- blk->addWord(word2);
- if (word2->base < minBase) {
- minBase = word2->base;
- } else if (word2->base > maxBase) {
- maxBase = word2->base;
- }
- found = gTrue;
- break;
- } else {
- word0 = word1;
- word1 = word1->next;
- }
- }
- }
- }
-
- } while (found);
-
- //~ need to compute the primary writing mode (horiz/vert) in
- //~ addition to primary rotation
-
- // coalesce the block, and add it to the list
- blk->coalesce(uMap);
- if (lastBlk) {
- lastBlk->next = blk;
- } else {
- blkList = blk;
- }
- lastBlk = blk;
- count[rot] += blk->charCount;
- if (primaryRot < 0 || count[rot] > count[primaryRot]) {
- primaryRot = rot;
- }
- ++nBlocks;
- }
- }
-
-#if 0 // for debugging
- printf("*** rotation ***\n");
- for (rot = 0; rot < 4; ++rot) {
- printf(" %d: %6d\n", rot, count[rot]);
- }
- printf(" primary rot = %d\n", primaryRot);
- printf("\n");
-#endif
-
-#if 0 // for debugging
- printf("*** blocks ***\n");
- for (blk = blkList; blk; blk = blk->next) {
- printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f\n",
- blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax);
- for (line = blk->lines; line; line = line->next) {
- printf(" line: x=%.2f..%.2f y=%.2f..%.2f base=%.2f\n",
- line->xMin, line->xMax, line->yMin, line->yMax, line->base);
- for (word0 = line->words; word0; word0 = word0->next) {
- printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
- word0->xMin, word0->xMax, word0->yMin, word0->yMax,
- word0->base, word0->fontSize, word0->spaceAfter);
- for (i = 0; i < word0->len; ++i) {
- fputc(word0->text[i] & 0xff, stdout);
- }
- printf("'\n");
- }
- }
- }
- printf("\n");
-#endif
-
- // determine the primary direction
- lrCount = 0;
- for (blk = blkList; blk; blk = blk->next) {
- for (line = blk->lines; line; line = line->next) {
- for (word0 = line->words; word0; word0 = word0->next) {
- for (i = 0; i < word0->len; ++i) {
- if (unicodeTypeL(word0->text[i])) {
- ++lrCount;
- } else if (unicodeTypeR(word0->text[i])) {
- --lrCount;
- }
- }
- }
- }
- }
- primaryLR = lrCount >= 0;
-
-#if 0 // for debugging
- printf("*** direction ***\n");
- printf("lrCount = %d\n", lrCount);
- printf("primaryLR = %d\n", primaryLR);
-#endif
-
- //----- column assignment
-
- // sort blocks into xy order for column assignment
- blocks = (TextBlock **)gmalloc(nBlocks * sizeof(TextBlock *));
- for (blk = blkList, i = 0; blk; blk = blk->next, ++i) {
- blocks[i] = blk;
- }
- qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpXYPrimaryRot);
-
- // column assignment
- for (i = 0; i < nBlocks; ++i) {
- blk0 = blocks[i];
- col1 = 0;
- for (j = 0; j < i; ++j) {
- blk1 = blocks[j];
- col2 = 0; // make gcc happy
- switch (primaryRot) {
- case 0:
- if (blk0->xMin > blk1->xMax) {
- col2 = blk1->col + blk1->nColumns + 3;
- } else {
- col2 = blk1->col + (int)(((blk0->xMin - blk1->xMin) /
- (blk1->xMax - blk1->xMin)) *
- blk1->nColumns);
- }
- break;
- case 1:
- if (blk0->yMin > blk1->yMax) {
- col2 = blk1->col + blk1->nColumns + 3;
- } else {
- col2 = blk1->col + (int)(((blk0->yMin - blk1->yMin) /
- (blk1->yMax - blk1->yMin)) *
- blk1->nColumns);
- }
- break;
- case 2:
- if (blk0->xMax < blk1->xMin) {
- col2 = blk1->col + blk1->nColumns + 3;
- } else {
- col2 = blk1->col + (int)(((blk0->xMax - blk1->xMax) /
- (blk1->xMin - blk1->xMax)) *
- blk1->nColumns);
- }
- break;
- case 3:
- if (blk0->yMax < blk1->yMin) {
- col2 = blk1->col + blk1->nColumns + 3;
- } else {
- col2 = blk1->col + (int)(((blk0->yMax - blk1->yMax) /
- (blk1->yMin - blk1->yMax)) *
- blk1->nColumns);
- }
- break;
- }
- if (col2 > col1) {
- col1 = col2;
- }
- }
- blk0->col = col1;
- for (line = blk0->lines; line; line = line->next) {
- for (j = 0; j <= line->len; ++j) {
- line->col[j] += col1;
- }
- }
- }
-
-#if 0 // for debugging
- printf("*** blocks, after column assignment ***\n");
- for (blk = blkList; blk; blk = blk->next) {
- printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f col=%d nCols=%d\n",
- blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax, blk->col,
- blk->nColumns);
- for (line = blk->lines; line; line = line->next) {
- printf(" line:\n");
- for (word0 = line->words; word0; word0 = word0->next) {
- printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
- word0->xMin, word0->xMax, word0->yMin, word0->yMax,
- word0->base, word0->fontSize, word0->spaceAfter);
- for (i = 0; i < word0->len; ++i) {
- fputc(word0->text[i] & 0xff, stdout);
- }
- printf("'\n");
- }
- }
- }
- printf("\n");
-#endif
-
- //----- reading order sort
-
- // sort blocks into yx order (in preparation for reading order sort)
- qsort(blocks, nBlocks, sizeof(TextBlock *), &TextBlock::cmpYXPrimaryRot);
-
- // compute space on left and right sides of each block
- for (i = 0; i < nBlocks; ++i) {
- blk0 = blocks[i];
- for (j = 0; j < nBlocks; ++j) {
- blk1 = blocks[j];
- if (blk1 != blk0) {
- blk0->updatePriMinMax(blk1);
- }
- }
- }
-
-#if 0 // for debugging
- printf("*** blocks, after yx sort ***\n");
- for (i = 0; i < nBlocks; ++i) {
- blk = blocks[i];
- printf("block: rot=%d x=%.2f..%.2f y=%.2f..%.2f space=%.2f..%.2f\n",
- blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax,
- blk->priMin, blk->priMax);
- for (line = blk->lines; line; line = line->next) {
- printf(" line:\n");
- for (word0 = line->words; word0; word0 = word0->next) {
- printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
- word0->xMin, word0->xMax, word0->yMin, word0->yMax,
- word0->base, word0->fontSize, word0->spaceAfter);
- for (j = 0; j < word0->len; ++j) {
- fputc(word0->text[j] & 0xff, stdout);
- }
- printf("'\n");
- }
- }
- }
- printf("\n");
-#endif
-
- // build the flows
- //~ this needs to be adjusted for writing mode (vertical text)
- //~ this also needs to account for right-to-left column ordering
- blkArray = (TextBlock **)gmalloc(nBlocks * sizeof(TextBlock *));
- memcpy(blkArray, blocks, nBlocks * sizeof(TextBlock *));
- flows = lastFlow = NULL;
- firstBlkIdx = 0;
- nBlocksLeft = nBlocks;
- while (nBlocksLeft > 0) {
-
- // find the upper-left-most block
- for (; !blkArray[firstBlkIdx]; ++firstBlkIdx) ;
- i = firstBlkIdx;
- blk = blkArray[i];
- for (j = firstBlkIdx + 1; j < nBlocks; ++j) {
- blk1 = blkArray[j];
- if (blk1) {
- if (blk && blk->secondaryDelta(blk1) > 0) {
- break;
- }
- if (blk1->primaryCmp(blk) < 0) {
- i = j;
- blk = blk1;
- }
- }
- }
- blkArray[i] = NULL;
- --nBlocksLeft;
- blk->next = NULL;
-
- // create a new flow, starting with the upper-left-most block
- flow = new TextFlow(this, blk);
- if (lastFlow) {
- lastFlow->next = flow;
- } else {
- flows = flow;
- }
- lastFlow = flow;
- fontSize = blk->lines->words->fontSize;
-
- // push the upper-left-most block on the stack
- blk->stackNext = NULL;
- blkStack = blk;
-
- // find the other blocks in this flow
- while (blkStack) {
-
- // find the upper-left-most block under (but within
- // maxBlockSpacing of) the top block on the stack
- blkSpace = maxBlockSpacing * blkStack->lines->words->fontSize;
- blk = NULL;
- i = -1;
- for (j = firstBlkIdx; j < nBlocks; ++j) {
- blk1 = blkArray[j];
- if (blk1) {
- if (blkStack->secondaryDelta(blk1) > blkSpace) {
- break;
- }
- if (blk && blk->secondaryDelta(blk1) > 0) {
- break;
- }
- if (blk1->isBelow(blkStack) &&
- (!blk || blk1->primaryCmp(blk) < 0)) {
- i = j;
- blk = blk1;
- }
- }
- }
-
- // if a suitable block was found, add it to the flow and push it
- // onto the stack
- if (blk && flow->blockFits(blk, blkStack)) {
- blkArray[i] = NULL;
- --nBlocksLeft;
- blk->next = NULL;
- flow->addBlock(blk);
- fontSize = blk->lines->words->fontSize;
- blk->stackNext = blkStack;
- blkStack = blk;
-
- // otherwise (if there is no block under the top block or the
- // block is not suitable), pop the stack
- } else {
- blkStack = blkStack->stackNext;
- }
- }
- }
- gfree(blkArray);
-
-#if 0 // for debugging
- printf("*** flows ***\n");
- for (flow = flows; flow; flow = flow->next) {
- printf("flow: x=%.2f..%.2f y=%.2f..%.2f pri:%.2f..%.2f\n",
- flow->xMin, flow->xMax, flow->yMin, flow->yMax,
- flow->priMin, flow->priMax);
- for (blk = flow->blocks; blk; blk = blk->next) {
- printf(" block: rot=%d x=%.2f..%.2f y=%.2f..%.2f pri=%.2f..%.2f\n",
- blk->rot, blk->xMin, blk->xMax, blk->yMin, blk->yMax,
- blk->priMin, blk->priMax);
- for (line = blk->lines; line; line = line->next) {
- printf(" line:\n");
- for (word0 = line->words; word0; word0 = word0->next) {
- printf(" word: x=%.2f..%.2f y=%.2f..%.2f base=%.2f fontSize=%.2f space=%d: '",
- word0->xMin, word0->xMax, word0->yMin, word0->yMax,
- word0->base, word0->fontSize, word0->spaceAfter);
- for (i = 0; i < word0->len; ++i) {
- fputc(word0->text[i] & 0xff, stdout);
- }
- printf("'\n");
- }
- }
- }
- }
- printf("\n");
-#endif
-
- if (uMap) {
- uMap->decRefCnt();
- }
-}
-
-GBool TextPage::findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- double *xMin, double *yMin,
- double *xMax, double *yMax) {
- TextBlock *blk;
- TextLine *line;
- Unicode *p;
- Unicode u1, u2;
- int m, i, j, k;
- double xStart, yStart, xStop, yStop;
- double xMin0, yMin0, xMax0, yMax0;
- double xMin1, yMin1, xMax1, yMax1;
- GBool found;
-
- //~ needs to handle right-to-left text
-
- if (rawOrder) {
- return gFalse;
- }
-
- xStart = yStart = xStop = yStop = 0;
- if (startAtLast && haveLastFind) {
- xStart = lastFindXMin;
- yStart = lastFindYMin;
- } else if (!startAtTop) {
- xStart = *xMin;
- yStart = *yMin;
- }
- if (stopAtLast && haveLastFind) {
- xStop = lastFindXMin;
- yStop = lastFindYMin;
- } else if (!stopAtBottom) {
- xStop = *xMax;
- yStop = *yMax;
- }
-
- found = gFalse;
- xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy
- xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy
-
- for (i = 0; i < nBlocks; ++i) {
- blk = blocks[i];
-
- // check: is the block above the top limit?
- if (!startAtTop && blk->yMax < yStart) {
- continue;
- }
-
- // check: is the block below the bottom limit?
- if (!stopAtBottom && blk->yMin > yStop) {
- break;
- }
-
- for (line = blk->lines; line; line = line->next) {
-
- // check: is the line above the top limit?
- if (!startAtTop && line->yMin < yStart) {
- continue;
- }
-
- // check: is the line below the bottom limit?
- if (!stopAtBottom && line->yMin > yStop) {
- continue;
- }
-
- // search each position in this line
- m = line->len;
- for (j = 0, p = line->text; j <= m - len; ++j, ++p) {
-
- // compare the strings
- for (k = 0; k < len; ++k) {
-#if 1 //~ this lowercases Latin A-Z only -- this will eventually be
- //~ extended to handle other character sets
- if (p[k] >= 0x41 && p[k] <= 0x5a) {
- u1 = p[k] + 0x20;
- } else {
- u1 = p[k];
- }
- if (s[k] >= 0x41 && s[k] <= 0x5a) {
- u2 = s[k] + 0x20;
- } else {
- u2 = s[k];
- }
-#endif
- if (u1 != u2) {
- break;
- }
- }
-
- // found it
- if (k == len) {
- switch (line->rot) {
- case 0:
- xMin1 = line->edge[j];
- xMax1 = line->edge[j + len];
- yMin1 = line->yMin;
- yMax1 = line->yMax;
- break;
- case 1:
- xMin1 = line->xMin;
- xMax1 = line->xMax;
- yMin1 = line->edge[j];
- yMax1 = line->edge[j + len];
- break;
- case 2:
- xMin1 = line->edge[j + len];
- xMax1 = line->edge[j];
- yMin1 = line->yMin;
- yMax1 = line->yMax;
- break;
- case 3:
- xMin1 = line->xMin;
- xMax1 = line->xMax;
- yMin1 = line->edge[j + len];
- yMax1 = line->edge[j];
- break;
- }
- if ((startAtTop ||
- yMin1 > yStart || (yMin1 == yStart && xMin1 > xStart)) &&
- (stopAtBottom ||
- yMin1 < yStop || (yMin1 == yStop && xMin1 < yStop))) {
- if (!found || yMin1 < yMin0 || (yMin1 == yMin0 && xMin1 < xMin0)) {
- xMin0 = xMin1;
- xMax0 = xMax1;
- yMin0 = yMin1;
- yMax0 = yMax1;
- found = gTrue;
- }
- }
- }
- }
- }
- }
-
- if (found) {
- *xMin = xMin0;
- *xMax = xMax0;
- *yMin = yMin0;
- *yMax = yMax0;
- lastFindXMin = xMin0;
- lastFindYMin = yMin0;
- haveLastFind = gTrue;
- return gTrue;
- }
-
- return gFalse;
-}
-
-GString *TextPage::getText(double xMin, double yMin,
- double xMax, double yMax) {
- GString *s;
- UnicodeMap *uMap;
- GBool isUnicode;
- TextBlock *blk;
- TextLine *line;
- TextLineFrag *frags;
- int nFrags, fragsSize;
- TextLineFrag *frag;
- char space[8], eol[16];
- int spaceLen, eolLen;
- int lastRot;
- double x, y;
- int col, idx0, idx1, i, j;
- GBool multiLine, oneRot;
-
- s = new GString();
-
- if (rawOrder) {
- return s;
- }
-
- // get the output encoding
- if (!(uMap = globalParams->getTextEncoding())) {
- return s;
- }
- isUnicode = uMap->isUnicode();
- spaceLen = uMap->mapUnicode(0x20, space, sizeof(space));
- eolLen = 0; // make gcc happy
- switch (globalParams->getTextEOL()) {
- case eolUnix:
- eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
- break;
- case eolDOS:
- eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
- eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen);
- break;
- case eolMac:
- eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
- break;
- }
-
- //~ writing mode (horiz/vert)
-
- // collect the line fragments that are in the rectangle
- fragsSize = 256;
- frags = (TextLineFrag *)gmalloc(fragsSize * sizeof(TextLineFrag));
- nFrags = 0;
- lastRot = -1;
- oneRot = gTrue;
- for (i = 0; i < nBlocks; ++i) {
- blk = blocks[i];
- if (xMin < blk->xMax && blk->xMin < xMax &&
- yMin < blk->yMax && blk->yMin < yMax) {
- for (line = blk->lines; line; line = line->next) {
- if (xMin < line->xMax && line->xMin < xMax &&
- yMin < line->yMax && line->yMin < yMax) {
- idx0 = idx1 = -1;
- switch (line->rot) {
- case 0:
- y = 0.5 * (line->yMin + line->yMax);
- if (yMin < y && y < yMax) {
- j = 0;
- while (j < line->len) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) {
- idx0 = j;
- break;
- }
- ++j;
- }
- j = line->len - 1;
- while (j >= 0) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) {
- idx1 = j;
- break;
- }
- --j;
- }
- }
- break;
- case 1:
- x = 0.5 * (line->xMin + line->xMax);
- if (xMin < x && x < xMax) {
- j = 0;
- while (j < line->len) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) {
- idx0 = j;
- break;
- }
- ++j;
- }
- j = line->len - 1;
- while (j >= 0) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) {
- idx1 = j;
- break;
- }
- --j;
- }
- }
- break;
- case 2:
- y = 0.5 * (line->yMin + line->yMax);
- if (yMin < y && y < yMax) {
- j = 0;
- while (j < line->len) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) < xMax) {
- idx0 = j;
- break;
- }
- ++j;
- }
- j = line->len - 1;
- while (j >= 0) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) > xMin) {
- idx1 = j;
- break;
- }
- --j;
- }
- }
- break;
- case 3:
- x = 0.5 * (line->xMin + line->xMax);
- if (xMin < x && x < xMax) {
- j = 0;
- while (j < line->len) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) < yMax) {
- idx0 = j;
- break;
- }
- ++j;
- }
- j = line->len - 1;
- while (j >= 0) {
- if (0.5 * (line->edge[j] + line->edge[j+1]) > yMin) {
- idx1 = j;
- break;
- }
- --j;
- }
- }
- break;
- }
- if (idx0 >= 0 && idx1 >= 0) {
- if (nFrags == fragsSize) {
- fragsSize *= 2;
- frags = (TextLineFrag *)
- grealloc(frags, fragsSize * sizeof(TextLineFrag));
- }
- frags[nFrags].init(line, idx0, idx1 - idx0 + 1);
- ++nFrags;
- if (lastRot >= 0 && line->rot != lastRot) {
- oneRot = gFalse;
- }
- lastRot = line->rot;
- }
- }
- }
- }
- }
-
- // sort the fragments and generate the string
- if (nFrags > 0) {
-
- for (i = 0; i < nFrags; ++i) {
- frags[i].computeCoords(oneRot);
- }
- assignColumns(frags, nFrags, oneRot);
-
- // if all lines in the region have the same rotation, use it;
- // otherwise, use the page's primary rotation
- if (oneRot) {
- qsort(frags, nFrags, sizeof(TextLineFrag),
- &TextLineFrag::cmpYXLineRot);
- } else {
- qsort(frags, nFrags, sizeof(TextLineFrag),
- &TextLineFrag::cmpYXPrimaryRot);
- }
-
- col = 0;
- multiLine = gFalse;
- for (i = 0; i < nFrags; ++i) {
- frag = &frags[i];
-
- // insert a return
- if (frag->col < col ||
- (i > 0 && fabs(frag->base - frags[i-1].base) >
- maxIntraLineDelta * frags[i-1].line->words->fontSize)) {
- s->append(eol, eolLen);
- col = 0;
- multiLine = gTrue;
- }
-
- // column alignment
- for (; col < frag->col; ++col) {
- s->append(space, spaceLen);
- }
-
- // get the fragment text
- col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s);
- }
-
- if (multiLine) {
- s->append(eol, eolLen);
- }
- }
-
- gfree(frags);
- uMap->decRefCnt();
-
- return s;
-}
-
-GBool TextPage::findCharRange(int pos, int length,
- double *xMin, double *yMin,
- double *xMax, double *yMax) {
- TextBlock *blk;
- TextLine *line;
- TextWord *word;
- double xMin0, xMax0, yMin0, yMax0;
- double xMin1, xMax1, yMin1, yMax1;
- GBool first;
- int i, j0, j1;
-
- if (rawOrder) {
- return gFalse;
- }
-
- //~ this doesn't correctly handle:
- //~ - ranges split across multiple lines (the highlighted region
- //~ is the bounding box of all the parts of the range)
- //~ - cases where characters don't convert one-to-one into Unicode
- first = gTrue;
- xMin0 = xMax0 = yMin0 = yMax0 = 0; // make gcc happy
- xMin1 = xMax1 = yMin1 = yMax1 = 0; // make gcc happy
- for (i = 0; i < nBlocks; ++i) {
- blk = blocks[i];
- for (line = blk->lines; line; line = line->next) {
- for (word = line->words; word; word = word->next) {
- if (pos < word->charPos + word->charLen &&
- word->charPos < pos + length) {
- j0 = pos - word->charPos;
- if (j0 < 0) {
- j0 = 0;
- }
- j1 = pos + length - 1 - word->charPos;
- if (j1 >= word->len) {
- j1 = word->len - 1;
- }
- switch (line->rot) {
- case 0:
- xMin1 = word->edge[j0];
- xMax1 = word->edge[j1 + 1];
- yMin1 = word->yMin;
- yMax1 = word->yMax;
- break;
- case 1:
- xMin1 = word->xMin;
- xMax1 = word->xMax;
- yMin1 = word->edge[j0];
- yMax1 = word->edge[j1 + 1];
- break;
- case 2:
- xMin1 = word->edge[j1 + 1];
- xMax1 = word->edge[j0];
- yMin1 = word->yMin;
- yMax1 = word->yMax;
- break;
- case 3:
- xMin1 = word->xMin;
- xMax1 = word->xMax;
- yMin1 = word->edge[j1 + 1];
- yMax1 = word->edge[j0];
- break;
- }
- if (first || xMin1 < xMin0) {
- xMin0 = xMin1;
- }
- if (first || xMax1 > xMax0) {
- xMax0 = xMax1;
- }
- if (first || yMin1 < yMin0) {
- yMin0 = yMin1;
- }
- if (first || yMax1 > yMax0) {
- yMax0 = yMax1;
- }
- first = gFalse;
- }
- }
- }
- }
- if (!first) {
- *xMin = xMin0;
- *xMax = xMax0;
- *yMin = yMin0;
- *yMax = yMax0;
- return gTrue;
- }
- return gFalse;
-}
-
-void TextPage::dump(void *outputStream, TextOutputFunc outputFunc,
- GBool physLayout) {
- UnicodeMap *uMap;
- TextFlow *flow;
- TextBlock *blk;
- TextLine *line;
- TextLineFrag *frags;
- TextWord *word;
- int nFrags, fragsSize;
- TextLineFrag *frag;
- char space[8], eol[16], eop[8];
- int spaceLen, eolLen, eopLen;
- GBool pageBreaks;
- GString *s;
- int col, i, d, n;
-
- // get the output encoding
- if (!(uMap = globalParams->getTextEncoding())) {
- return;
- }
- spaceLen = uMap->mapUnicode(0x20, space, sizeof(space));
- eolLen = 0; // make gcc happy
- switch (globalParams->getTextEOL()) {
- case eolUnix:
- eolLen = uMap->mapUnicode(0x0a, eol, sizeof(eol));
- break;
- case eolDOS:
- eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
- eolLen += uMap->mapUnicode(0x0a, eol + eolLen, sizeof(eol) - eolLen);
- break;
- case eolMac:
- eolLen = uMap->mapUnicode(0x0d, eol, sizeof(eol));
- break;
- }
- eopLen = uMap->mapUnicode(0x0c, eop, sizeof(eop));
- pageBreaks = globalParams->getTextPageBreaks();
-
- //~ writing mode (horiz/vert)
-
- // output the page in raw (content stream) order
- if (rawOrder) {
-
- for (word = rawWords; word; word = word->next) {
- s = new GString();
- dumpFragment(word->text, word->len, uMap, s);
- (*outputFunc)(outputStream, s->getCString(), s->getLength());
- delete s;
- if (word->next &&
- fabs(word->next->base - word->base) <
- maxIntraLineDelta * word->fontSize) {
- if (word->next->xMin > word->xMax + minWordSpacing * word->fontSize) {
- (*outputFunc)(outputStream, space, spaceLen);
- }
- } else {
- (*outputFunc)(outputStream, eol, eolLen);
- }
- }
-
- // output the page, maintaining the original physical layout
- } else if (physLayout) {
-
- // collect the line fragments for the page and sort them
- fragsSize = 256;
- frags = (TextLineFrag *)gmalloc(fragsSize * sizeof(TextLineFrag));
- nFrags = 0;
- for (i = 0; i < nBlocks; ++i) {
- blk = blocks[i];
- for (line = blk->lines; line; line = line->next) {
- if (nFrags == fragsSize) {
- fragsSize *= 2;
- frags = (TextLineFrag *)grealloc(frags,
- fragsSize * sizeof(TextLineFrag));
- }
- frags[nFrags].init(line, 0, line->len);
- frags[nFrags].computeCoords(gTrue);
- ++nFrags;
- }
- }
- qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpYXPrimaryRot);
-
- // generate output
- col = 0;
- for (i = 0; i < nFrags; ++i) {
- frag = &frags[i];
-
- // column alignment
- for (; col < frag->col; ++col) {
- (*outputFunc)(outputStream, space, spaceLen);
- }
-
- // print the line
- s = new GString();
- col += dumpFragment(frag->line->text + frag->start, frag->len, uMap, s);
- (*outputFunc)(outputStream, s->getCString(), s->getLength());
- delete s;
-
- // print one or more returns if necessary
- if (i == nFrags - 1 ||
- frags[i+1].col < col ||
- fabs(frags[i+1].base - frag->base) >
- maxIntraLineDelta * frag->line->words->fontSize) {
- if (i < nFrags - 1) {
- d = (int)((frags[i+1].base - frag->base) /
- frag->line->words->fontSize);
- if (d < 1) {
- d = 1;
- } else if (d > 5) {
- d = 5;
- }
- } else {
- d = 1;
- }
- for (; d > 0; --d) {
- (*outputFunc)(outputStream, eol, eolLen);
- }
- col = 0;
- }
- }
-
- gfree(frags);
-
- // output the page, "undoing" the layout
- } else {
- for (flow = flows; flow; flow = flow->next) {
- for (blk = flow->blocks; blk; blk = blk->next) {
- for (line = blk->lines; line; line = line->next) {
- n = line->len;
- if (line->hyphenated && (line->next || blk->next)) {
- --n;
- }
- s = new GString();
- dumpFragment(line->text, n, uMap, s);
- (*outputFunc)(outputStream, s->getCString(), s->getLength());
- delete s;
- if (!line->hyphenated) {
- if (line->next) {
- (*outputFunc)(outputStream, space, spaceLen);
- } else if (blk->next) {
- //~ this is a bit of a kludge - we should really do a more
- //~ intelligent determination of paragraphs
- if (blk->next->lines->words->fontSize ==
- blk->lines->words->fontSize) {
- (*outputFunc)(outputStream, space, spaceLen);
- } else {
- (*outputFunc)(outputStream, eol, eolLen);
- }
- }
- }
- }
- }
- (*outputFunc)(outputStream, eol, eolLen);
- (*outputFunc)(outputStream, eol, eolLen);
- }
- }
-
- // end of page
- if (pageBreaks) {
- (*outputFunc)(outputStream, eop, eopLen);
- (*outputFunc)(outputStream, eol, eolLen);
- }
-
- uMap->decRefCnt();
-}
-
-void TextPage::assignColumns(TextLineFrag *frags, int nFrags, GBool oneRot) {
- TextLineFrag *frag0, *frag1;
- int rot, col1, col2, i, j, k;
-
- // all text in the region has the same rotation -- recompute the
- // column numbers based only on the text in the region
- if (oneRot) {
- qsort(frags, nFrags, sizeof(TextLineFrag), &TextLineFrag::cmpXYLineRot);
- rot = frags[0].line->rot;
- for (i = 0; i < nFrags; ++i) {
- frag0 = &frags[i];
- col1 = 0;
- for (j = 0; j < i; ++j) {
- frag1 = &frags[j];
- col2 = 0; // make gcc happy
- switch (rot) {
- case 0:
- if (frag0->xMin >= frag1->xMax) {
- col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
- frag1->line->col[frag1->start]) + 1;
- } else {
- for (k = frag1->start;
- k < frag1->start + frag1->len &&
- frag0->xMin >= 0.5 * (frag1->line->edge[k] +
- frag1->line->edge[k+1]);
- ++k) ;
- col2 = frag1->col +
- frag1->line->col[k] - frag1->line->col[frag1->start];
- }
- break;
- case 1:
- if (frag0->yMin >= frag1->yMax) {
- col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
- frag1->line->col[frag1->start]) + 1;
- } else {
- for (k = frag1->start;
- k < frag1->start + frag1->len &&
- frag0->yMin >= 0.5 * (frag1->line->edge[k] +
- frag1->line->edge[k+1]);
- ++k) ;
- col2 = frag1->col +
- frag1->line->col[k] - frag1->line->col[frag1->start];
- }
- break;
- case 2:
- if (frag0->xMax <= frag1->xMin) {
- col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
- frag1->line->col[frag1->start]) + 1;
- } else {
- for (k = frag1->start;
- k < frag1->start + frag1->len &&
- frag0->xMax <= 0.5 * (frag1->line->edge[k] +
- frag1->line->edge[k+1]);
- ++k) ;
- col2 = frag1->col +
- frag1->line->col[k] - frag1->line->col[frag1->start];
- }
- break;
- case 3:
- if (frag0->yMax <= frag1->yMin) {
- col2 = frag1->col + (frag1->line->col[frag1->start + frag1->len] -
- frag1->line->col[frag1->start]) + 1;
- } else {
- for (k = frag1->start;
- k < frag1->start + frag1->len &&
- frag0->yMax <= 0.5 * (frag1->line->edge[k] +
- frag1->line->edge[k+1]);
- ++k) ;
- col2 = frag1->col +
- frag1->line->col[k] - frag1->line->col[frag1->start];
- }
- break;
- }
- if (col2 > col1) {
- col1 = col2;
- }
- }
- frag0->col = col1;
- }
-
- // the region includes text at different rotations -- use the
- // globally assigned column numbers, offset by the minimum column
- // number (i.e., shift everything over to column 0)
- } else {
- col1 = frags[0].col;
- for (i = 1; i < nFrags; ++i) {
- if (frags[i].col < col1) {
- col1 = frags[i].col;
- }
- }
- for (i = 0; i < nFrags; ++i) {
- frags[i].col -= col1;
- }
- }
-}
-
-int TextPage::dumpFragment(Unicode *text, int len, UnicodeMap *uMap,
- GString *s) {
- char lre[8], rle[8], popdf[8], buf[8];
- int lreLen, rleLen, popdfLen, n;
- int nCols, i, j, k;
-
- nCols = 0;
-
- if (uMap->isUnicode()) {
-
- lreLen = uMap->mapUnicode(0x202a, lre, sizeof(lre));
- rleLen = uMap->mapUnicode(0x202b, rle, sizeof(rle));
- popdfLen = uMap->mapUnicode(0x202c, popdf, sizeof(popdf));
-
- if (primaryLR) {
-
- i = 0;
- while (i < len) {
- // output a left-to-right section
- for (j = i; j < len && !unicodeTypeR(text[j]); ++j) ;
- for (k = i; k < j; ++k) {
- n = uMap->mapUnicode(text[k], buf, sizeof(buf));
- s->append(buf, n);
- ++nCols;
- }
- i = j;
- // output a right-to-left section
- for (j = i; j < len && !unicodeTypeL(text[j]); ++j) ;
- if (j > i) {
- s->append(rle, rleLen);
- for (k = j - 1; k >= i; --k) {
- n = uMap->mapUnicode(text[k], buf, sizeof(buf));
- s->append(buf, n);
- ++nCols;
- }
- s->append(popdf, popdfLen);
- i = j;
- }
- }
-
- } else {
-
- s->append(rle, rleLen);
- i = len - 1;
- while (i >= 0) {
- // output a right-to-left section
- for (j = i; j >= 0 && !unicodeTypeL(text[j]); --j) ;
- for (k = i; k > j; --k) {
- n = uMap->mapUnicode(text[k], buf, sizeof(buf));
- s->append(buf, n);
- ++nCols;
- }
- i = j;
- // output a left-to-right section
- for (j = i; j >= 0 && !unicodeTypeR(text[j]); --j) ;
- if (j < i) {
- s->append(lre, lreLen);
- for (k = j + 1; k <= i; ++k) {
- n = uMap->mapUnicode(text[k], buf, sizeof(buf));
- s->append(buf, n);
- ++nCols;
- }
- s->append(popdf, popdfLen);
- i = j;
- }
- }
- s->append(popdf, popdfLen);
-
- }
-
- } else {
- for (i = 0; i < len; ++i) {
- n = uMap->mapUnicode(text[i], buf, sizeof(buf));
- s->append(buf, n);
- nCols += n;
- }
- }
-
- return nCols;
-}
-
-#if TEXTOUT_WORD_LIST
-TextWordList *TextPage::makeWordList(GBool physLayout) {
- return new TextWordList(this, physLayout);
-}
-#endif
-
-//------------------------------------------------------------------------
-// TextOutputDev
-//------------------------------------------------------------------------
-
-static void outputToFile(void *stream, char *text, int len) {
- fwrite(text, 1, len, (FILE *)stream);
-}
-
-TextOutputDev::TextOutputDev(char *fileName, GBool physLayoutA,
- GBool rawOrderA, GBool append) {
- text = NULL;
- physLayout = physLayoutA;
- rawOrder = rawOrderA;
- ok = gTrue;
-
- // open file
- needClose = gFalse;
- if (fileName) {
- if (!strcmp(fileName, "-")) {
- outputStream = stdout;
-#ifdef WIN32
- // keep DOS from munging the end-of-line characters
- setmode(fileno(stdout), O_BINARY);
-#endif
- } else if ((outputStream = fopen(fileName, append ? "ab" : "wb"))) {
- needClose = gTrue;
- } else {
- error(-1, "Couldn't open text file '%s'", fileName);
- ok = gFalse;
- return;
- }
- outputFunc = &outputToFile;
- } else {
- outputStream = NULL;
- }
-
- // set up text object
- text = new TextPage(rawOrderA);
-}
-
-TextOutputDev::TextOutputDev(TextOutputFunc func, void *stream,
- GBool physLayoutA, GBool rawOrderA) {
- outputFunc = func;
- outputStream = stream;
- needClose = gFalse;
- physLayout = physLayoutA;
- rawOrder = rawOrderA;
- text = new TextPage(rawOrderA);
- ok = gTrue;
-}
-
-TextOutputDev::~TextOutputDev() {
- if (needClose) {
-#ifdef MACOS
- ICS_MapRefNumAndAssign((short)((FILE *)outputStream)->handle);
-#endif
- fclose((FILE *)outputStream);
- }
- if (text) {
- delete text;
- }
-}
-
-void TextOutputDev::startPage(int pageNum, GfxState *state) {
- text->startPage(state);
-}
-
-void TextOutputDev::endPage() {
- text->endPage();
- text->coalesce(physLayout);
- if (outputStream) {
- text->dump(outputStream, outputFunc, physLayout);
- }
-}
-
-void TextOutputDev::updateFont(GfxState *state) {
- text->updateFont(state);
-}
-
-void TextOutputDev::beginString(GfxState *state, GString *s) {
-}
-
-void TextOutputDev::endString(GfxState *state) {
-}
-
-void TextOutputDev::drawChar(GfxState *state, double x, double y,
- double dx, double dy,
- double originX, double originY,
- CharCode c, Unicode *u, int uLen) {
- text->addChar(state, x, y, dx, dy, c, u, uLen);
-}
-
-GBool TextOutputDev::findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- double *xMin, double *yMin,
- double *xMax, double *yMax) {
- return text->findText(s, len, startAtTop, stopAtBottom,
- startAtLast, stopAtLast, xMin, yMin, xMax, yMax);
-}
-
-GString *TextOutputDev::getText(double xMin, double yMin,
- double xMax, double yMax) {
- return text->getText(xMin, yMin, xMax, yMax);
-}
-
-GBool TextOutputDev::findCharRange(int pos, int length,
- double *xMin, double *yMin,
- double *xMax, double *yMax) {
- return text->findCharRange(pos, length, xMin, yMin, xMax, yMax);
-}
-
-#if TEXTOUT_WORD_LIST
-TextWordList *TextOutputDev::makeWordList() {
- return text->makeWordList(physLayout);
-}
-#endif
diff --git a/pdf/xpdf/TextOutputDev.h b/pdf/xpdf/TextOutputDev.h
deleted file mode 100644
index 2c62237..0000000
--- a/pdf/xpdf/TextOutputDev.h
+++ /dev/null
@@ -1,570 +0,0 @@
-//========================================================================
-//
-// TextOutputDev.h
-//
-// Copyright 1997-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef TEXTOUTPUTDEV_H
-#define TEXTOUTPUTDEV_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <stdio.h>
-#include "gtypes.h"
-#include "GfxFont.h"
-#include "OutputDev.h"
-
-class GString;
-class GList;
-class GfxFont;
-class GfxState;
-class UnicodeMap;
-
-//------------------------------------------------------------------------
-
-typedef void (*TextOutputFunc)(void *stream, char *text, int len);
-
-//------------------------------------------------------------------------
-// TextFontInfo
-//------------------------------------------------------------------------
-
-class TextFontInfo {
-public:
-
- TextFontInfo(GfxState *state);
- ~TextFontInfo();
-
- GBool matches(GfxState *state);
-
-private:
-
- GfxFont *gfxFont;
-#if TEXTOUT_WORD_LIST
- GString *fontName;
-#endif
-
- friend class TextWord;
- friend class TextPage;
-};
-
-//------------------------------------------------------------------------
-// TextWord
-//------------------------------------------------------------------------
-
-class TextWord {
-public:
-
- // Constructor.
- TextWord(GfxState *state, int rotA, double x0, double y0,
- int charPosA, TextFontInfo *fontA, double fontSize);
-
- // Destructor.
- ~TextWord();
-
- // Add a character to the word.
- void addChar(GfxState *state, double x, double y,
- double dx, double dy, Unicode u);
-
- // Merge <word> onto the end of <this>.
- void merge(TextWord *word);
-
- // Compares <this> to <word>, returning -1 (<), 0 (=), or +1 (>),
- // based on a primary-axis comparison, e.g., x ordering if rot=0.
- int primaryCmp(TextWord *word);
-
- // Return the distance along the primary axis between <this> and
- // <word>.
- double primaryDelta(TextWord *word);
-
- static int cmpYX(const void *p1, const void *p2);
-
-#if TEXTOUT_WORD_LIST
- int getLength() { return len; }
- Unicode getChar(int idx) { return text[idx]; }
- GString *getText();
- GString *getFontName() { return font->fontName; }
- void getColor(double *r, double *g, double *b)
- { *r = colorR; *g = colorG; *b = colorB; }
- void getBBox(double *xMinA, double *yMinA, double *xMaxA, double *yMaxA)
- { *xMinA = xMin; *yMinA = yMin; *xMaxA = xMax; *yMaxA = yMax; }
- int getCharPos() { return charPos; }
- int getCharLen() { return charLen; }
-#endif
-
-private:
-
- int rot; // rotation, multiple of 90 degrees
- // (0, 1, 2, or 3)
- double xMin, xMax; // bounding box x coordinates
- double yMin, yMax; // bounding box y coordinates
- double base; // baseline x or y coordinate
- Unicode *text; // the text
- double *edge; // "near" edge x or y coord of each char
- // (plus one extra entry for the last char)
- int len; // length of text and edge arrays
- int size; // size of text and edge arrays
- int charPos; // character position (within content stream)
- int charLen; // number of content stream characters in
- // this word
- TextFontInfo *font; // font information
- double fontSize; // font size
- GBool spaceAfter; // set if there is a space between this
- // word and the next word on the line
- TextWord *next; // next word in line
-
-#if TEXTOUT_WORD_LIST
- double colorR, // word color
- colorG,
- colorB;
-#endif
-
- friend class TextPool;
- friend class TextLine;
- friend class TextBlock;
- friend class TextFlow;
- friend class TextWordList;
- friend class TextPage;
-};
-
-//------------------------------------------------------------------------
-// TextPool
-//------------------------------------------------------------------------
-
-class TextPool {
-public:
-
- TextPool();
- ~TextPool();
-
- TextWord *getPool(int baseIdx) { return pool[baseIdx - minBaseIdx]; }
- void setPool(int baseIdx, TextWord *p) { pool[baseIdx - minBaseIdx] = p; }
-
- int getBaseIdx(double base);
-
- void addWord(TextWord *word);
-
-private:
-
- int minBaseIdx; // min baseline bucket index
- int maxBaseIdx; // max baseline bucket index
- TextWord **pool; // array of linked lists, one for each
- // baseline value (multiple of 4 pts)
- TextWord *cursor; // pointer to last-accessed word
- int cursorBaseIdx; // baseline bucket index of last-accessed word
-
- friend class TextBlock;
- friend class TextPage;
-};
-
-//------------------------------------------------------------------------
-// TextLine
-//------------------------------------------------------------------------
-
-class TextLine {
-public:
-
- TextLine(TextBlock *blkA, int rotA, double baseA);
- ~TextLine();
-
- void addWord(TextWord *word);
-
- // Return the distance along the primary axis between <this> and
- // <line>.
- double primaryDelta(TextLine *line);
-
- // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
- // based on a primary-axis comparison, e.g., x ordering if rot=0.
- int primaryCmp(TextLine *line);
-
- // Compares <this> to <line>, returning -1 (<), 0 (=), or +1 (>),
- // based on a secondary-axis comparison of the baselines, e.g., y
- // ordering if rot=0.
- int secondaryCmp(TextLine *line);
-
- int cmpYX(TextLine *line);
-
- static int cmpXY(const void *p1, const void *p2);
-
- void coalesce(UnicodeMap *uMap);
-
-private:
-
- TextBlock *blk; // parent block
- int rot; // text rotation
- double xMin, xMax; // bounding box x coordinates
- double yMin, yMax; // bounding box y coordinates
- double base; // baseline x or y coordinate
- TextWord *words; // words in this line
- TextWord *lastWord; // last word in this line
- Unicode *text; // Unicode text of the line, including
- // spaces between words
- double *edge; // "near" edge x or y coord of each char
- // (plus one extra entry for the last char)
- int *col; // starting column number of each Unicode char
- int len; // number of Unicode chars
- int convertedLen; // total number of converted characters
- GBool hyphenated; // set if last char is a hyphen
- TextLine *next; // next line in block
-
- friend class TextLineFrag;
- friend class TextBlock;
- friend class TextFlow;
- friend class TextWordList;
- friend class TextPage;
-};
-
-//------------------------------------------------------------------------
-// TextBlock
-//------------------------------------------------------------------------
-
-class TextBlock {
-public:
-
- TextBlock(TextPage *pageA, int rotA);
- ~TextBlock();
-
- void addWord(TextWord *word);
-
- void coalesce(UnicodeMap *uMap);
-
- // Update this block's priMin and priMax values, looking at <blk>.
- void updatePriMinMax(TextBlock *blk);
-
- static int cmpXYPrimaryRot(const void *p1, const void *p2);
-
- static int cmpYXPrimaryRot(const void *p1, const void *p2);
-
- int primaryCmp(TextBlock *blk);
-
- double secondaryDelta(TextBlock *blk);
-
- // Returns true if <this> is below <blk>, relative to the page's
- // primary rotation.
- GBool isBelow(TextBlock *blk);
-
-private:
-
- TextPage *page; // the parent page
- int rot; // text rotation
- double xMin, xMax; // bounding box x coordinates
- double yMin, yMax; // bounding box y coordinates
- double priMin, priMax; // whitespace bounding box along primary axis
-
- TextPool *pool; // pool of words (used only until lines
- // are built)
- TextLine *lines; // linked list of lines
- TextLine *curLine; // most recently added line
- int nLines; // number of lines
- int charCount; // number of characters in the block
- int col; // starting column
- int nColumns; // number of columns in the block
-
- TextBlock *next;
- TextBlock *stackNext;
-
- friend class TextLine;
- friend class TextLineFrag;
- friend class TextFlow;
- friend class TextWordList;
- friend class TextPage;
-};
-
-//------------------------------------------------------------------------
-// TextFlow
-//------------------------------------------------------------------------
-
-class TextFlow {
-public:
-
- TextFlow(TextPage *pageA, TextBlock *blk);
- ~TextFlow();
-
- // Add a block to the end of this flow.
- void addBlock(TextBlock *blk);
-
- // Returns true if <blk> fits below <prevBlk> in the flow, i.e., (1)
- // it uses a font no larger than the last block added to the flow,
- // and (2) it fits within the flow's [priMin, priMax] along the
- // primary axis.
- GBool blockFits(TextBlock *blk, TextBlock *prevBlk);
-
-private:
-
- TextPage *page; // the parent page
- double xMin, xMax; // bounding box x coordinates
- double yMin, yMax; // bounding box y coordinates
- double priMin, priMax; // whitespace bounding box along primary axis
- TextBlock *blocks; // blocks in flow
- TextBlock *lastBlk; // last block in this flow
- TextFlow *next;
-
- friend class TextWordList;
- friend class TextPage;
-};
-
-#if TEXTOUT_WORD_LIST
-
-//------------------------------------------------------------------------
-// TextWordList
-//------------------------------------------------------------------------
-
-class TextWordList {
-public:
-
- // Build a flat word list, in content stream order (if
- // text->rawOrder is true), physical layout order (if <physLayout>
- // is true and text->rawOrder is false), or reading order (if both
- // flags are false).
- TextWordList(TextPage *text, GBool physLayout);
-
- ~TextWordList();
-
- // Return the number of words on the list.
- int getLength();
-
- // Return the <idx>th word from the list.
- TextWord *get(int idx);
-
-private:
-
- GList *words;
-};
-
-#endif // TEXTOUT_WORD_LIST
-
-//------------------------------------------------------------------------
-// TextPage
-//------------------------------------------------------------------------
-
-class TextPage {
-public:
-
- // Constructor.
- TextPage(GBool rawOrderA);
-
- // Destructor.
- ~TextPage();
-
- // Start a new page.
- void startPage(GfxState *state);
-
- // End the current page.
- void endPage();
-
- // Update the current font.
- void updateFont(GfxState *state);
-
- // Begin a new word.
- void beginWord(GfxState *state, double x0, double y0);
-
- // Add a character to the current word.
- void addChar(GfxState *state, double x, double y,
- double dx, double dy,
- CharCode c, Unicode *u, int uLen);
-
- // End the current word, sorting it into the list of words.
- void endWord();
-
- // Add a word, sorting it into the list of words.
- void addWord(TextWord *word);
-
- // Coalesce strings that look like parts of the same line.
- void coalesce(GBool physLayout);
-
- // Find a string. If <startAtTop> is true, starts looking at the
- // top of the page; else if <startAtLast> is true, starts looking
- // immediately after the last find result; else starts looking at
- // <xMin>,<yMin>. If <stopAtBottom> is true, stops looking at the
- // bottom of the page; else if <stopAtLast> is true, stops looking
- // just before the last find result; else stops looking at
- // <xMax>,<yMax>.
- GBool findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- double *xMin, double *yMin,
- double *xMax, double *yMax);
-
- // Get the text which is inside the specified rectangle.
- GString *getText(double xMin, double yMin,
- double xMax, double yMax);
-
- // Find a string by character position and length. If found, sets
- // the text bounding rectangle and returns true; otherwise returns
- // false.
- GBool findCharRange(int pos, int length,
- double *xMin, double *yMin,
- double *xMax, double *yMax);
-
- // Dump contents of page to a file.
- void dump(void *outputStream, TextOutputFunc outputFunc,
- GBool physLayout);
-
-#if TEXTOUT_WORD_LIST
- // Build a flat word list, in content stream order (if
- // this->rawOrder is true), physical layout order (if <physLayout>
- // is true and this->rawOrder is false), or reading order (if both
- // flags are false).
- TextWordList *makeWordList(GBool physLayout);
-#endif
-
-private:
-
- void clear();
- void assignColumns(TextLineFrag *frags, int nFrags, int rot);
- int dumpFragment(Unicode *text, int len, UnicodeMap *uMap, GString *s);
-
- GBool rawOrder; // keep text in content stream order
-
- double pageWidth, pageHeight; // width and height of current page
- TextWord *curWord; // currently active string
- int charPos; // next character position (within content
- // stream)
- TextFontInfo *curFont; // current font
- double curFontSize; // current font size
- int nest; // current nesting level (for Type 3 fonts)
- int nTinyChars; // number of "tiny" chars seen so far
- GBool lastCharOverlap; // set if the last added char overlapped the
- // previous char
-
- TextPool *pools[4]; // a "pool" of TextWords for each rotation
- TextFlow *flows; // linked list of flows
- TextBlock **blocks; // array of blocks, in yx order
- int nBlocks; // number of blocks
- int primaryRot; // primary rotation
- GBool primaryLR; // primary direction (true means L-to-R,
- // false means R-to-L)
- TextWord *rawWords; // list of words, in raw order (only if
- // rawOrder is set)
- TextWord *rawLastWord; // last word on rawWords list
-
- GList *fonts; // all font info objects used on this
- // page [TextFontInfo]
-
- double lastFindXMin, // coordinates of the last "find" result
- lastFindYMin;
- GBool haveLastFind;
-
- friend class TextLine;
- friend class TextLineFrag;
- friend class TextBlock;
- friend class TextFlow;
- friend class TextWordList;
-};
-
-//------------------------------------------------------------------------
-// TextOutputDev
-//------------------------------------------------------------------------
-
-class TextOutputDev: 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
- // <physLayoutA> is true, the original physical layout of the text
- // is maintained. If <rawOrder> is true, the text is kept in
- // content stream order.
- TextOutputDev(char *fileName, GBool physLayoutA,
- GBool rawOrderA, GBool append);
-
- // Create a TextOutputDev which will write to a generic stream. If
- // <physLayoutA> is true, the original physical layout of the text
- // is maintained. If <rawOrder> is true, the text is kept in
- // content stream order.
- TextOutputDev(TextOutputFunc func, void *stream,
- GBool physLayoutA, GBool rawOrderA);
-
- // Destructor.
- virtual ~TextOutputDev();
-
- // 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, GString *s);
- virtual void endString(GfxState *state);
- virtual void drawChar(GfxState *state, double x, double y,
- double dx, double dy,
- double originX, double originY,
- CharCode c, Unicode *u, int uLen);
-
- //----- special access
-
- // Find a string. If <startAtTop> is true, starts looking at the
- // top of the page; else if <startAtLast> is true, starts looking
- // immediately after the last find result; else starts looking at
- // <xMin>,<yMin>. If <stopAtBottom> is true, stops looking at the
- // bottom of the page; else if <stopAtLast> is true, stops looking
- // just before the last find result; else stops looking at
- // <xMax>,<yMax>.
- GBool findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- double *xMin, double *yMin,
- double *xMax, double *yMax);
-
- // Get the text which is inside the specified rectangle.
- GString *getText(double xMin, double yMin,
- double xMax, double yMax);
-
- // Find a string by character position and length. If found, sets
- // the text bounding rectangle and returns true; otherwise returns
- // false.
- GBool findCharRange(int pos, int length,
- double *xMin, double *yMin,
- double *xMax, double *yMax);
-
-#if TEXTOUT_WORD_LIST
- // Build a flat word list, in content stream order (if
- // this->rawOrder is true), physical layout order (if
- // this->physLayout is true and this->rawOrder is false), or reading
- // order (if both flags are false).
- TextWordList *makeWordList();
-#endif
-
-private:
-
- TextOutputFunc outputFunc; // output function
- void *outputStream; // output stream
- GBool needClose; // need to close the output file?
- // (only if outputStream is a FILE*)
- TextPage *text; // text for the current page
- GBool physLayout; // maintain original physical layout when
- // dumping text
- GBool rawOrder; // keep text in content stream order
- GBool ok; // set up ok?
-};
-
-#endif
diff --git a/pdf/xpdf/UTF8.h b/pdf/xpdf/UTF8.h
deleted file mode 100644
index 8536dbf..0000000
--- a/pdf/xpdf/UTF8.h
+++ /dev/null
@@ -1,56 +0,0 @@
-//========================================================================
-//
-// UTF8.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-static int mapUTF8(Unicode u, char *buf, int bufSize) {
- if (u <= 0x0000007f) {
- if (bufSize < 1) {
- return 0;
- }
- buf[0] = (char)u;
- return 1;
- } else if (u <= 0x000007ff) {
- if (bufSize < 2) {
- return 0;
- }
- buf[0] = (char)(0xc0 + (u >> 6));
- buf[1] = (char)(0x80 + (u & 0x3f));
- return 2;
- } else if (u <= 0x0000ffff) {
- if (bufSize < 3) {
- return 0;
- }
- buf[0] = (char)(0xe0 + (u >> 12));
- buf[1] = (char)(0x80 + ((u >> 6) & 0x3f));
- buf[2] = (char)(0x80 + (u & 0x3f));
- return 3;
- } else if (u <= 0x0010ffff) {
- if (bufSize < 4) {
- return 0;
- }
- buf[0] = (char)(0xf0 + (u >> 18));
- buf[1] = (char)(0x80 + ((u >> 12) & 0x3f));
- buf[2] = (char)(0x80 + ((u >> 6) & 0x3f));
- buf[3] = (char)(0x80 + (u & 0x3f));
- return 4;
- } else {
- return 0;
- }
-}
-
-static int mapUCS2(Unicode u, char *buf, int bufSize) {
- if (u <= 0xffff) {
- if (bufSize < 2) {
- return 0;
- }
- buf[0] = (char)((u >> 8) & 0xff);
- buf[1] = (char)(u & 0xff);
- return 2;
- } else {
- return 0;
- }
-}
diff --git a/pdf/xpdf/UnicodeMap.cc b/pdf/xpdf/UnicodeMap.cc
deleted file mode 100644
index 300d802..0000000
--- a/pdf/xpdf/UnicodeMap.cc
+++ /dev/null
@@ -1,293 +0,0 @@
-//========================================================================
-//
-// UnicodeMap.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdio.h>
-#include <string.h>
-#include "gmem.h"
-#include "gfile.h"
-#include "GString.h"
-#include "GList.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "UnicodeMap.h"
-
-//------------------------------------------------------------------------
-
-#define maxExtCode 16
-
-struct UnicodeMapExt {
- Unicode u; // Unicode char
- char code[maxExtCode];
- Guint nBytes;
-};
-
-//------------------------------------------------------------------------
-
-UnicodeMap *UnicodeMap::parse(GString *encodingNameA) {
- FILE *f;
- UnicodeMap *map;
- UnicodeMapRange *range;
- UnicodeMapExt *eMap;
- int size, eMapsSize;
- char buf[256];
- int line, nBytes, i, x;
- char *tok1, *tok2, *tok3;
-
- if (!(f = globalParams->getUnicodeMapFile(encodingNameA))) {
- error(-1, "Couldn't find unicodeMap file for the '%s' encoding",
- encodingNameA->getCString());
- return NULL;
- }
-
- map = new UnicodeMap(encodingNameA->copy());
-
- size = 8;
- map->ranges = (UnicodeMapRange *)gmalloc(size * sizeof(UnicodeMapRange));
- eMapsSize = 0;
-
- line = 1;
- while (getLine(buf, sizeof(buf), f)) {
- if ((tok1 = strtok(buf, " \t\r\n")) &&
- (tok2 = strtok(NULL, " \t\r\n"))) {
- if (!(tok3 = strtok(NULL, " \t\r\n"))) {
- tok3 = tok2;
- tok2 = tok1;
- }
- nBytes = strlen(tok3) / 2;
- if (nBytes <= 4) {
- if (map->len == size) {
- size *= 2;
- map->ranges = (UnicodeMapRange *)
- grealloc(map->ranges, size * sizeof(UnicodeMapRange));
- }
- range = &map->ranges[map->len];
- sscanf(tok1, "%x", &range->start);
- sscanf(tok2, "%x", &range->end);
- sscanf(tok3, "%x", &range->code);
- range->nBytes = nBytes;
- ++map->len;
- } else if (tok2 == tok1) {
- if (map->eMapsLen == eMapsSize) {
- eMapsSize += 16;
- map->eMaps = (UnicodeMapExt *)
- grealloc(map->eMaps, eMapsSize * sizeof(UnicodeMapExt));
- }
- eMap = &map->eMaps[map->eMapsLen];
- sscanf(tok1, "%x", &eMap->u);
- for (i = 0; i < nBytes; ++i) {
- sscanf(tok3 + i*2, "%2x", &x);
- eMap->code[i] = (char)x;
- }
- eMap->nBytes = nBytes;
- ++map->eMapsLen;
- } else {
- error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding",
- line, encodingNameA->getCString());
- }
- } else {
- error(-1, "Bad line (%d) in unicodeMap file for the '%s' encoding",
- line, encodingNameA->getCString());
- }
- ++line;
- }
-
- fclose(f);
-
- return map;
-}
-
-UnicodeMap::UnicodeMap(GString *encodingNameA) {
- encodingName = encodingNameA;
- unicodeOut = gFalse;
- kind = unicodeMapUser;
- ranges = NULL;
- len = 0;
- eMaps = NULL;
- eMapsLen = 0;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA,
- UnicodeMapRange *rangesA, int lenA) {
- encodingName = new GString(encodingNameA);
- unicodeOut = unicodeOutA;
- kind = unicodeMapResident;
- ranges = rangesA;
- len = lenA;
- eMaps = NULL;
- eMapsLen = 0;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-UnicodeMap::UnicodeMap(char *encodingNameA, GBool unicodeOutA,
- UnicodeMapFunc funcA) {
- encodingName = new GString(encodingNameA);
- unicodeOut = unicodeOutA;
- kind = unicodeMapFunc;
- func = funcA;
- eMaps = NULL;
- eMapsLen = 0;
- refCnt = 1;
-#if MULTITHREADED
- gInitMutex(&mutex);
-#endif
-}
-
-UnicodeMap::~UnicodeMap() {
- delete encodingName;
- if (kind == unicodeMapUser && ranges) {
- gfree(ranges);
- }
- if (eMaps) {
- gfree(eMaps);
- }
-#if MULTITHREADED
- gDestroyMutex(&mutex);
-#endif
-}
-
-void UnicodeMap::incRefCnt() {
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- ++refCnt;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
-}
-
-void UnicodeMap::decRefCnt() {
- GBool done;
-
-#if MULTITHREADED
- gLockMutex(&mutex);
-#endif
- done = --refCnt == 0;
-#if MULTITHREADED
- gUnlockMutex(&mutex);
-#endif
- if (done) {
- delete this;
- }
-}
-
-GBool UnicodeMap::match(GString *encodingNameA) {
- return !encodingName->cmp(encodingNameA);
-}
-
-int UnicodeMap::mapUnicode(Unicode u, char *buf, int bufSize) {
- int a, b, m, n, i, j;
- Guint code;
-
- if (kind == unicodeMapFunc) {
- return (*func)(u, buf, bufSize);
- }
-
- a = 0;
- b = len;
- if (u >= ranges[a].start) {
- // invariant: ranges[a].start <= u < ranges[b].start
- while (b - a > 1) {
- m = (a + b) / 2;
- if (u >= ranges[m].start) {
- a = m;
- } else if (u < ranges[m].start) {
- b = m;
- }
- }
- if (u <= ranges[a].end) {
- n = ranges[a].nBytes;
- if (n > bufSize) {
- return 0;
- }
- code = ranges[a].code + (u - ranges[a].start);
- for (i = n - 1; i >= 0; --i) {
- buf[i] = (char)(code & 0xff);
- code >>= 8;
- }
- return n;
- }
- }
-
- for (i = 0; i < eMapsLen; ++i) {
- if (eMaps[i].u == u) {
- n = eMaps[i].nBytes;
- for (j = 0; j < n; ++j) {
- buf[j] = eMaps[i].code[j];
- }
- return n;
- }
- }
-
- return 0;
-}
-
-//------------------------------------------------------------------------
-
-UnicodeMapCache::UnicodeMapCache() {
- int i;
-
- for (i = 0; i < unicodeMapCacheSize; ++i) {
- cache[i] = NULL;
- }
-}
-
-UnicodeMapCache::~UnicodeMapCache() {
- int i;
-
- for (i = 0; i < unicodeMapCacheSize; ++i) {
- if (cache[i]) {
- cache[i]->decRefCnt();
- }
- }
-}
-
-UnicodeMap *UnicodeMapCache::getUnicodeMap(GString *encodingName) {
- UnicodeMap *map;
- int i, j;
-
- if (cache[0] && cache[0]->match(encodingName)) {
- cache[0]->incRefCnt();
- return cache[0];
- }
- for (i = 1; i < unicodeMapCacheSize; ++i) {
- if (cache[i] && cache[i]->match(encodingName)) {
- map = cache[i];
- for (j = i; j >= 1; --j) {
- cache[j] = cache[j - 1];
- }
- cache[0] = map;
- map->incRefCnt();
- return map;
- }
- }
- if ((map = UnicodeMap::parse(encodingName))) {
- if (cache[unicodeMapCacheSize - 1]) {
- cache[unicodeMapCacheSize - 1]->decRefCnt();
- }
- for (j = unicodeMapCacheSize - 1; j >= 1; --j) {
- cache[j] = cache[j - 1];
- }
- cache[0] = map;
- map->incRefCnt();
- return map;
- }
- return NULL;
-}
diff --git a/pdf/xpdf/UnicodeMap.h b/pdf/xpdf/UnicodeMap.h
deleted file mode 100644
index 6fd4ed2..0000000
--- a/pdf/xpdf/UnicodeMap.h
+++ /dev/null
@@ -1,123 +0,0 @@
-//========================================================================
-//
-// UnicodeMap.h
-//
-// Mapping from Unicode to an encoding.
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef UNICODEMAP_H
-#define UNICODEMAP_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "CharTypes.h"
-
-#if MULTITHREADED
-#include "GMutex.h"
-#endif
-
-class GString;
-
-//------------------------------------------------------------------------
-
-enum UnicodeMapKind {
- unicodeMapUser, // read from a file
- unicodeMapResident, // static list of ranges
- unicodeMapFunc // function pointer
-};
-
-typedef int (*UnicodeMapFunc)(Unicode u, char *buf, int bufSize);
-
-struct UnicodeMapRange {
- Unicode start, end; // range of Unicode chars
- Guint code, nBytes; // first output code
-};
-
-struct UnicodeMapExt;
-
-//------------------------------------------------------------------------
-
-class UnicodeMap {
-public:
-
- // Create the UnicodeMap specified by <encodingName>. Sets the
- // initial reference count to 1. Returns NULL on failure.
- static UnicodeMap *parse(GString *encodingNameA);
-
- // Create a resident UnicodeMap.
- UnicodeMap(char *encodingNameA, GBool unicodeOutA,
- UnicodeMapRange *rangesA, int lenA);
-
- // Create a resident UnicodeMap that uses a function instead of a
- // list of ranges.
- UnicodeMap(char *encodingNameA, GBool unicodeOutA,
- UnicodeMapFunc funcA);
-
- ~UnicodeMap();
-
- void incRefCnt();
- void decRefCnt();
-
- GString *getEncodingName() { return encodingName; }
-
- GBool isUnicode() { return unicodeOut; }
-
- // Return true if this UnicodeMap matches the specified
- // <encodingNameA>.
- GBool match(GString *encodingNameA);
-
- // Map Unicode to the target encoding. Fills in <buf> with the
- // output and returns the number of bytes used. Output will be
- // truncated at <bufSize> bytes. No string terminator is written.
- // Returns 0 if no mapping is found.
- int mapUnicode(Unicode u, char *buf, int bufSize);
-
-private:
-
- UnicodeMap(GString *encodingNameA);
-
- GString *encodingName;
- UnicodeMapKind kind;
- GBool unicodeOut;
- union {
- UnicodeMapRange *ranges; // (user, resident)
- UnicodeMapFunc func; // (func)
- };
- int len; // (user, resident)
- UnicodeMapExt *eMaps; // (user)
- int eMapsLen; // (user)
- int refCnt;
-#ifdef MULTITHREADED
- GMutex mutex;
-#endif
-};
-
-//------------------------------------------------------------------------
-
-#define unicodeMapCacheSize 4
-
-class UnicodeMapCache {
-public:
-
- UnicodeMapCache();
- ~UnicodeMapCache();
-
- // Get the UnicodeMap for <encodingName>. Increments its reference
- // count; there will be one reference for the cache plus one for the
- // caller of this function. Returns NULL on failure.
- UnicodeMap *getUnicodeMap(GString *encodingName);
-
-private:
-
- UnicodeMap *cache[unicodeMapCacheSize];
-};
-
-#endif
diff --git a/pdf/xpdf/UnicodeMapTables.h b/pdf/xpdf/UnicodeMapTables.h
deleted file mode 100644
index 9c51034..0000000
--- a/pdf/xpdf/UnicodeMapTables.h
+++ /dev/null
@@ -1,361 +0,0 @@
-//========================================================================
-//
-// UnicodeMapTables.h
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-static UnicodeMapRange latin1UnicodeMapRanges[] = {
- { 0x000a, 0x000a, 0x0a, 1 },
- { 0x000c, 0x000d, 0x0c, 1 },
- { 0x0020, 0x007e, 0x20, 1 },
- { 0x00a0, 0x00a0, 0x20, 1 },
- { 0x00a1, 0x00ac, 0xa1, 1 },
- { 0x00ae, 0x00ff, 0xae, 1 },
- { 0x010c, 0x010c, 0x43, 1 },
- { 0x010d, 0x010d, 0x63, 1 },
- { 0x0131, 0x0131, 0x69, 1 },
- { 0x0141, 0x0141, 0x4c, 1 },
- { 0x0142, 0x0142, 0x6c, 1 },
- { 0x0152, 0x0152, 0x4f45, 2 },
- { 0x0153, 0x0153, 0x6f65, 2 },
- { 0x0160, 0x0160, 0x53, 1 },
- { 0x0161, 0x0161, 0x73, 1 },
- { 0x0178, 0x0178, 0x59, 1 },
- { 0x017d, 0x017d, 0x5a, 1 },
- { 0x017e, 0x017e, 0x7a, 1 },
- { 0x02c6, 0x02c6, 0x5e, 1 },
- { 0x02da, 0x02da, 0xb0, 1 },
- { 0x02dc, 0x02dc, 0x7e, 1 },
- { 0x2013, 0x2013, 0xad, 1 },
- { 0x2014, 0x2014, 0x2d2d, 2 },
- { 0x2018, 0x2018, 0x60, 1 },
- { 0x2019, 0x2019, 0x27, 1 },
- { 0x201a, 0x201a, 0x2c, 1 },
- { 0x201c, 0x201c, 0x22, 1 },
- { 0x201d, 0x201d, 0x22, 1 },
- { 0x201e, 0x201e, 0x2c2c, 2 },
- { 0x2022, 0x2022, 0xb7, 1 },
- { 0x2026, 0x2026, 0x2e2e2e, 3 },
- { 0x2039, 0x2039, 0x3c, 1 },
- { 0x203a, 0x203a, 0x3e, 1 },
- { 0x2044, 0x2044, 0x2f, 1 },
- { 0x2122, 0x2122, 0x544d, 2 },
- { 0x2212, 0x2212, 0x2d, 1 },
- { 0xf6f9, 0xf6f9, 0x4c, 1 },
- { 0xf6fa, 0xf6fa, 0x4f45, 2 },
- { 0xf6fc, 0xf6fc, 0xb0, 1 },
- { 0xf6fd, 0xf6fd, 0x53, 1 },
- { 0xf6fe, 0xf6fe, 0x7e, 1 },
- { 0xf6ff, 0xf6ff, 0x5a, 1 },
- { 0xf721, 0xf721, 0x21, 1 },
- { 0xf724, 0xf724, 0x24, 1 },
- { 0xf726, 0xf726, 0x26, 1 },
- { 0xf730, 0xf739, 0x30, 1 },
- { 0xf73f, 0xf73f, 0x3f, 1 },
- { 0xf761, 0xf77a, 0x41, 1 },
- { 0xf7a1, 0xf7a2, 0xa1, 1 },
- { 0xf7bf, 0xf7bf, 0xbf, 1 },
- { 0xf7e0, 0xf7f6, 0xc0, 1 },
- { 0xf7f8, 0xf7fe, 0xd8, 1 },
- { 0xf7ff, 0xf7ff, 0x59, 1 },
- { 0xfb00, 0xfb00, 0x6666, 2 },
- { 0xfb01, 0xfb01, 0x6669, 2 },
- { 0xfb02, 0xfb02, 0x666c, 2 },
- { 0xfb03, 0xfb03, 0x666669, 3 },
- { 0xfb04, 0xfb04, 0x66666c, 3 }
-};
-#define latin1UnicodeMapLen (sizeof(latin1UnicodeMapRanges) / sizeof(UnicodeMapRange))
-
-static UnicodeMapRange ascii7UnicodeMapRanges[] = {
- { 0x000a, 0x000a, 0x0a, 1 },
- { 0x000c, 0x000d, 0x0c, 1 },
- { 0x0020, 0x005f, 0x20, 1 },
- { 0x0061, 0x007e, 0x61, 1 },
- { 0x00a6, 0x00a6, 0x7c, 1 },
- { 0x00a9, 0x00a9, 0x286329, 3 },
- { 0x00ae, 0x00ae, 0x285229, 3 },
- { 0x00b7, 0x00b7, 0x2a, 1 },
- { 0x00bc, 0x00bc, 0x312f34, 3 },
- { 0x00bd, 0x00bd, 0x312f32, 3 },
- { 0x00be, 0x00be, 0x332f34, 3 },
- { 0x00c0, 0x00c0, 0x41, 1 },
- { 0x00c1, 0x00c1, 0x41, 1 },
- { 0x00c2, 0x00c2, 0x41, 1 },
- { 0x00c3, 0x00c3, 0x41, 1 },
- { 0x00c4, 0x00c4, 0x41, 1 },
- { 0x00c5, 0x00c5, 0x41, 1 },
- { 0x00c6, 0x00c6, 0x4145, 2 },
- { 0x00c7, 0x00c7, 0x43, 1 },
- { 0x00c8, 0x00c8, 0x45, 1 },
- { 0x00c9, 0x00c9, 0x45, 1 },
- { 0x00ca, 0x00ca, 0x45, 1 },
- { 0x00cb, 0x00cb, 0x45, 1 },
- { 0x00cc, 0x00cc, 0x49, 1 },
- { 0x00cd, 0x00cd, 0x49, 1 },
- { 0x00ce, 0x00ce, 0x49, 1 },
- { 0x00cf, 0x00cf, 0x49, 1 },
- { 0x00d1, 0x00d2, 0x4e, 1 },
- { 0x00d3, 0x00d3, 0x4f, 1 },
- { 0x00d4, 0x00d4, 0x4f, 1 },
- { 0x00d5, 0x00d5, 0x4f, 1 },
- { 0x00d6, 0x00d6, 0x4f, 1 },
- { 0x00d7, 0x00d7, 0x78, 1 },
- { 0x00d8, 0x00d8, 0x4f, 1 },
- { 0x00d9, 0x00d9, 0x55, 1 },
- { 0x00da, 0x00da, 0x55, 1 },
- { 0x00db, 0x00db, 0x55, 1 },
- { 0x00dc, 0x00dc, 0x55, 1 },
- { 0x00dd, 0x00dd, 0x59, 1 },
- { 0x00e0, 0x00e0, 0x61, 1 },
- { 0x00e1, 0x00e1, 0x61, 1 },
- { 0x00e2, 0x00e2, 0x61, 1 },
- { 0x00e3, 0x00e3, 0x61, 1 },
- { 0x00e4, 0x00e4, 0x61, 1 },
- { 0x00e5, 0x00e5, 0x61, 1 },
- { 0x00e6, 0x00e6, 0x6165, 2 },
- { 0x00e7, 0x00e7, 0x63, 1 },
- { 0x00e8, 0x00e8, 0x65, 1 },
- { 0x00e9, 0x00e9, 0x65, 1 },
- { 0x00ea, 0x00ea, 0x65, 1 },
- { 0x00eb, 0x00eb, 0x65, 1 },
- { 0x00ec, 0x00ec, 0x69, 1 },
- { 0x00ed, 0x00ed, 0x69, 1 },
- { 0x00ee, 0x00ee, 0x69, 1 },
- { 0x00ef, 0x00ef, 0x69, 1 },
- { 0x00f1, 0x00f2, 0x6e, 1 },
- { 0x00f3, 0x00f3, 0x6f, 1 },
- { 0x00f4, 0x00f4, 0x6f, 1 },
- { 0x00f5, 0x00f5, 0x6f, 1 },
- { 0x00f6, 0x00f6, 0x6f, 1 },
- { 0x00f7, 0x00f7, 0x2f, 1 },
- { 0x00f8, 0x00f8, 0x6f, 1 },
- { 0x00f9, 0x00f9, 0x75, 1 },
- { 0x00fa, 0x00fa, 0x75, 1 },
- { 0x00fb, 0x00fb, 0x75, 1 },
- { 0x00fc, 0x00fc, 0x75, 1 },
- { 0x00fd, 0x00fd, 0x79, 1 },
- { 0x00ff, 0x00ff, 0x79, 1 },
- { 0x0131, 0x0131, 0x69, 1 },
- { 0x0141, 0x0141, 0x4c, 1 },
- { 0x0152, 0x0152, 0x4f45, 2 },
- { 0x0153, 0x0153, 0x6f65, 2 },
- { 0x0160, 0x0160, 0x53, 1 },
- { 0x0178, 0x0178, 0x59, 1 },
- { 0x017d, 0x017d, 0x5a, 1 },
- { 0x2013, 0x2013, 0x2d, 1 },
- { 0x2014, 0x2014, 0x2d2d, 2 },
- { 0x2018, 0x2018, 0x60, 1 },
- { 0x2019, 0x2019, 0x27, 1 },
- { 0x201c, 0x201c, 0x22, 1 },
- { 0x201d, 0x201d, 0x22, 1 },
- { 0x2022, 0x2022, 0x2a, 1 },
- { 0x2026, 0x2026, 0x2e2e2e, 3 },
- { 0x2122, 0x2122, 0x544d, 2 },
- { 0x2212, 0x2212, 0x2d, 1 },
- { 0xf6f9, 0xf6f9, 0x4c, 1 },
- { 0xf6fa, 0xf6fa, 0x4f45, 2 },
- { 0xf6fd, 0xf6fd, 0x53, 1 },
- { 0xf6fe, 0xf6fe, 0x7e, 1 },
- { 0xf6ff, 0xf6ff, 0x5a, 1 },
- { 0xf721, 0xf721, 0x21, 1 },
- { 0xf724, 0xf724, 0x24, 1 },
- { 0xf726, 0xf726, 0x26, 1 },
- { 0xf730, 0xf739, 0x30, 1 },
- { 0xf73f, 0xf73f, 0x3f, 1 },
- { 0xf761, 0xf77a, 0x41, 1 },
- { 0xf7e0, 0xf7e0, 0x41, 1 },
- { 0xf7e1, 0xf7e1, 0x41, 1 },
- { 0xf7e2, 0xf7e2, 0x41, 1 },
- { 0xf7e3, 0xf7e3, 0x41, 1 },
- { 0xf7e4, 0xf7e4, 0x41, 1 },
- { 0xf7e5, 0xf7e5, 0x41, 1 },
- { 0xf7e6, 0xf7e6, 0x4145, 2 },
- { 0xf7e7, 0xf7e7, 0x43, 1 },
- { 0xf7e8, 0xf7e8, 0x45, 1 },
- { 0xf7e9, 0xf7e9, 0x45, 1 },
- { 0xf7ea, 0xf7ea, 0x45, 1 },
- { 0xf7eb, 0xf7eb, 0x45, 1 },
- { 0xf7ec, 0xf7ec, 0x49, 1 },
- { 0xf7ed, 0xf7ed, 0x49, 1 },
- { 0xf7ee, 0xf7ee, 0x49, 1 },
- { 0xf7ef, 0xf7ef, 0x49, 1 },
- { 0xf7f1, 0xf7f2, 0x4e, 1 },
- { 0xf7f3, 0xf7f3, 0x4f, 1 },
- { 0xf7f4, 0xf7f4, 0x4f, 1 },
- { 0xf7f5, 0xf7f5, 0x4f, 1 },
- { 0xf7f6, 0xf7f6, 0x4f, 1 },
- { 0xf7f8, 0xf7f8, 0x4f, 1 },
- { 0xf7f9, 0xf7f9, 0x55, 1 },
- { 0xf7fa, 0xf7fa, 0x55, 1 },
- { 0xf7fb, 0xf7fb, 0x55, 1 },
- { 0xf7fc, 0xf7fc, 0x55, 1 },
- { 0xf7fd, 0xf7fd, 0x59, 1 },
- { 0xf7ff, 0xf7ff, 0x59, 1 },
- { 0xfb00, 0xfb00, 0x6666, 2 },
- { 0xfb01, 0xfb01, 0x6669, 2 },
- { 0xfb02, 0xfb02, 0x666c, 2 },
- { 0xfb03, 0xfb03, 0x666669, 3 },
- { 0xfb04, 0xfb04, 0x66666c, 3 }
-};
-#define ascii7UnicodeMapLen (sizeof(ascii7UnicodeMapRanges) / sizeof(UnicodeMapRange))
-
-static UnicodeMapRange symbolUnicodeMapRanges[] = {
- { 0x0020, 0x0021, 0x20, 1 },
- { 0x0023, 0x0023, 0x23, 1 },
- { 0x0025, 0x0026, 0x25, 1 },
- { 0x0028, 0x0029, 0x28, 1 },
- { 0x002b, 0x002c, 0x2b, 1 },
- { 0x002e, 0x003f, 0x2e, 1 },
- { 0x005b, 0x005b, 0x5b, 1 },
- { 0x005d, 0x005d, 0x5d, 1 },
- { 0x005f, 0x005f, 0x5f, 1 },
- { 0x007b, 0x007d, 0x7b, 1 },
- { 0x00ac, 0x00ac, 0xd8, 1 },
- { 0x00b0, 0x00b1, 0xb0, 1 },
- { 0x00b5, 0x00b5, 0x6d, 1 },
- { 0x00d7, 0x00d7, 0xb4, 1 },
- { 0x00f7, 0x00f7, 0xb8, 1 },
- { 0x0192, 0x0192, 0xa6, 1 },
- { 0x0391, 0x0392, 0x41, 1 },
- { 0x0393, 0x0393, 0x47, 1 },
- { 0x0395, 0x0395, 0x45, 1 },
- { 0x0396, 0x0396, 0x5a, 1 },
- { 0x0397, 0x0397, 0x48, 1 },
- { 0x0398, 0x0398, 0x51, 1 },
- { 0x0399, 0x0399, 0x49, 1 },
- { 0x039a, 0x039d, 0x4b, 1 },
- { 0x039e, 0x039e, 0x58, 1 },
- { 0x039f, 0x03a0, 0x4f, 1 },
- { 0x03a1, 0x03a1, 0x52, 1 },
- { 0x03a3, 0x03a5, 0x53, 1 },
- { 0x03a6, 0x03a6, 0x46, 1 },
- { 0x03a7, 0x03a7, 0x43, 1 },
- { 0x03a8, 0x03a8, 0x59, 1 },
- { 0x03b1, 0x03b2, 0x61, 1 },
- { 0x03b3, 0x03b3, 0x67, 1 },
- { 0x03b4, 0x03b5, 0x64, 1 },
- { 0x03b6, 0x03b6, 0x7a, 1 },
- { 0x03b7, 0x03b7, 0x68, 1 },
- { 0x03b8, 0x03b8, 0x71, 1 },
- { 0x03b9, 0x03b9, 0x69, 1 },
- { 0x03ba, 0x03bb, 0x6b, 1 },
- { 0x03bd, 0x03bd, 0x6e, 1 },
- { 0x03be, 0x03be, 0x78, 1 },
- { 0x03bf, 0x03c0, 0x6f, 1 },
- { 0x03c1, 0x03c1, 0x72, 1 },
- { 0x03c2, 0x03c2, 0x56, 1 },
- { 0x03c3, 0x03c5, 0x73, 1 },
- { 0x03c6, 0x03c6, 0x66, 1 },
- { 0x03c7, 0x03c7, 0x63, 1 },
- { 0x03c8, 0x03c8, 0x79, 1 },
- { 0x03c9, 0x03c9, 0x77, 1 },
- { 0x03d1, 0x03d1, 0x4a, 1 },
- { 0x03d2, 0x03d2, 0xa1, 1 },
- { 0x03d5, 0x03d5, 0x6a, 1 },
- { 0x03d6, 0x03d6, 0x76, 1 },
- { 0x2022, 0x2022, 0xb7, 1 },
- { 0x2026, 0x2026, 0xbc, 1 },
- { 0x2032, 0x2032, 0xa2, 1 },
- { 0x2033, 0x2033, 0xb2, 1 },
- { 0x2044, 0x2044, 0xa4, 1 },
- { 0x2111, 0x2111, 0xc1, 1 },
- { 0x2118, 0x2118, 0xc3, 1 },
- { 0x211c, 0x211c, 0xc2, 1 },
- { 0x2126, 0x2126, 0x57, 1 },
- { 0x2135, 0x2135, 0xc0, 1 },
- { 0x2190, 0x2193, 0xac, 1 },
- { 0x2194, 0x2194, 0xab, 1 },
- { 0x21b5, 0x21b5, 0xbf, 1 },
- { 0x21d0, 0x21d3, 0xdc, 1 },
- { 0x21d4, 0x21d4, 0xdb, 1 },
- { 0x2200, 0x2200, 0x22, 1 },
- { 0x2202, 0x2202, 0xb6, 1 },
- { 0x2203, 0x2203, 0x24, 1 },
- { 0x2205, 0x2205, 0xc6, 1 },
- { 0x2206, 0x2206, 0x44, 1 },
- { 0x2207, 0x2207, 0xd1, 1 },
- { 0x2208, 0x2209, 0xce, 1 },
- { 0x220b, 0x220b, 0x27, 1 },
- { 0x220f, 0x220f, 0xd5, 1 },
- { 0x2211, 0x2211, 0xe5, 1 },
- { 0x2212, 0x2212, 0x2d, 1 },
- { 0x2217, 0x2217, 0x2a, 1 },
- { 0x221a, 0x221a, 0xd6, 1 },
- { 0x221d, 0x221d, 0xb5, 1 },
- { 0x221e, 0x221e, 0xa5, 1 },
- { 0x2220, 0x2220, 0xd0, 1 },
- { 0x2227, 0x2228, 0xd9, 1 },
- { 0x2229, 0x222a, 0xc7, 1 },
- { 0x222b, 0x222b, 0xf2, 1 },
- { 0x2234, 0x2234, 0x5c, 1 },
- { 0x223c, 0x223c, 0x7e, 1 },
- { 0x2245, 0x2245, 0x40, 1 },
- { 0x2248, 0x2248, 0xbb, 1 },
- { 0x2260, 0x2261, 0xb9, 1 },
- { 0x2264, 0x2264, 0xa3, 1 },
- { 0x2265, 0x2265, 0xb3, 1 },
- { 0x2282, 0x2282, 0xcc, 1 },
- { 0x2283, 0x2283, 0xc9, 1 },
- { 0x2284, 0x2284, 0xcb, 1 },
- { 0x2286, 0x2286, 0xcd, 1 },
- { 0x2287, 0x2287, 0xca, 1 },
- { 0x2295, 0x2295, 0xc5, 1 },
- { 0x2297, 0x2297, 0xc4, 1 },
- { 0x22a5, 0x22a5, 0x5e, 1 },
- { 0x22c5, 0x22c5, 0xd7, 1 },
- { 0x2320, 0x2320, 0xf3, 1 },
- { 0x2321, 0x2321, 0xf5, 1 },
- { 0x2329, 0x2329, 0xe1, 1 },
- { 0x232a, 0x232a, 0xf1, 1 },
- { 0x25ca, 0x25ca, 0xe0, 1 },
- { 0x2660, 0x2660, 0xaa, 1 },
- { 0x2663, 0x2663, 0xa7, 1 },
- { 0x2665, 0x2665, 0xa9, 1 },
- { 0x2666, 0x2666, 0xa8, 1 },
- { 0xf6d9, 0xf6d9, 0xd3, 1 },
- { 0xf6da, 0xf6da, 0xd2, 1 },
- { 0xf6db, 0xf6db, 0xd4, 1 },
- { 0xf8e5, 0xf8e5, 0x60, 1 },
- { 0xf8e6, 0xf8e7, 0xbd, 1 },
- { 0xf8e8, 0xf8ea, 0xe2, 1 },
- { 0xf8eb, 0xf8f4, 0xe6, 1 },
- { 0xf8f5, 0xf8f5, 0xf4, 1 },
- { 0xf8f6, 0xf8fe, 0xf6, 1 }
-};
-#define symbolUnicodeMapLen (sizeof(symbolUnicodeMapRanges) / sizeof(UnicodeMapRange))
-
-static UnicodeMapRange zapfDingbatsUnicodeMapRanges[] = {
- { 0x0020, 0x0020, 0x20, 1 },
- { 0x2192, 0x2192, 0xd5, 1 },
- { 0x2194, 0x2195, 0xd6, 1 },
- { 0x2460, 0x2469, 0xac, 1 },
- { 0x25a0, 0x25a0, 0x6e, 1 },
- { 0x25b2, 0x25b2, 0x73, 1 },
- { 0x25bc, 0x25bc, 0x74, 1 },
- { 0x25c6, 0x25c6, 0x75, 1 },
- { 0x25cf, 0x25cf, 0x6c, 1 },
- { 0x25d7, 0x25d7, 0x77, 1 },
- { 0x2605, 0x2605, 0x48, 1 },
- { 0x260e, 0x260e, 0x25, 1 },
- { 0x261b, 0x261b, 0x2a, 1 },
- { 0x261e, 0x261e, 0x2b, 1 },
- { 0x2660, 0x2660, 0xab, 1 },
- { 0x2663, 0x2663, 0xa8, 1 },
- { 0x2665, 0x2665, 0xaa, 1 },
- { 0x2666, 0x2666, 0xa9, 1 },
- { 0x2701, 0x2704, 0x21, 1 },
- { 0x2706, 0x2709, 0x26, 1 },
- { 0x270c, 0x2727, 0x2c, 1 },
- { 0x2729, 0x274b, 0x49, 1 },
- { 0x274d, 0x274d, 0x6d, 1 },
- { 0x274f, 0x2752, 0x6f, 1 },
- { 0x2756, 0x2756, 0x76, 1 },
- { 0x2758, 0x275e, 0x78, 1 },
- { 0x2761, 0x2767, 0xa1, 1 },
- { 0x2776, 0x2794, 0xb6, 1 },
- { 0x2798, 0x27af, 0xd8, 1 },
- { 0x27b1, 0x27be, 0xf1, 1 }
-};
-#define zapfDingbatsUnicodeMapLen (sizeof(zapfDingbatsUnicodeMapRanges) / sizeof(UnicodeMapRange))
diff --git a/pdf/xpdf/UnicodeTypeTable.cc b/pdf/xpdf/UnicodeTypeTable.cc
deleted file mode 100644
index 578baa7..0000000
--- a/pdf/xpdf/UnicodeTypeTable.cc
+++ /dev/null
@@ -1,299 +0,0 @@
-//========================================================================
-//
-// UnicodeMapTables.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <stdlib.h>
-#include "CharTypes.h"
-#include "UnicodeTypeTable.h"
-
-struct UnicodeMapTableEntry {
- char *vector;
- char type;
-};
-
-static UnicodeMapTableEntry table[256] = {
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNLNNNNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLL", 'X' },
- { NULL, 'L' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLNNNNNNNNNNNNNNLLNNNNNNNNNNNNNNLLLLLNNNNNNNNNLNNNNNNNNNNNNNNNNN", 'X' },
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLNNNNNNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNN", 'X' },
- { "NNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNRRNNNNNNNNNNNNNNNNNNNRRRRRR", 'X' },
- { "RRRRRRRRRRRRRRNNRNRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { NULL, 'N' },
- { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLNNNNLLLLLLLLLLLLLNNLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNLLLLLLLLNLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLNNLLLLLLLNNNNN", 'X' },
- { "NNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLNNNNNNNNLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNN", 'X' },
- { "NNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLNLNNNLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLNNLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLLLLLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNNNNLLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLNNNNNNNNNLLLLLLLLLLNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNLNNNNNLNNLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNLNNNNNNLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNLLLLLLLLNLLNNNNNNNNNNNLLLLLLLNLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { "NNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLNNNLLLLLLLLLLLNNNLLLLLLLLLLLLNNNNLLLLLLLLLLLLLNNNLLLLLLLLLLLLLNNN", 'X' },
- { "NNNNNNNNNNNNNNLRNNNNNNNNNNNNNNNNNNNNNNNNNNLRNLRNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { "NNLNNNNLNNLLLLLLLLLLNLNNNLLLLLNNNNNNLNLNLNLLLLNLLLNLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { NULL, 'N' },
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNN", 'X' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { NULL, 'N' },
- { "NNNNNLLLNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLNNNNNNNLLLLLNNLLLNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNLLLL", 'X' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLL", 'X' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { NULL, 'L' },
- { "LLLLLLLLLLLLLLLLLLLLLLLLRRRRRRNRRRRRRRRRRNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRR", 'X' },
- { NULL, 'R' },
- { "RRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNNN", 'X' },
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRNNN", 'X' },
- { "NNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNLL", 'X' }
-};
-
-static inline char getType(Unicode c) {
- int i;
- char type;
-
- if (c > 0xffff) {
- type = 'X';
- } else {
- i = (c >> 8) & 0xff;
- if ((type = table[i].type) == 'X') {
- type = table[i].vector[c & 0xff];
- }
- }
- return type;
-}
-
-GBool unicodeTypeL(Unicode c) {
- return getType(c) == 'L';
-}
-
-GBool unicodeTypeR(Unicode c) {
- return getType(c) == 'R';
-}
-
diff --git a/pdf/xpdf/UnicodeTypeTable.h b/pdf/xpdf/UnicodeTypeTable.h
deleted file mode 100644
index e06b393..0000000
--- a/pdf/xpdf/UnicodeTypeTable.h
+++ /dev/null
@@ -1,18 +0,0 @@
-//========================================================================
-//
-// UnicodeTypeTable.h
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef UNICODETYPETABLE_H
-#define UNICODETYPETABLE_H
-
-#include "gtypes.h"
-
-extern GBool unicodeTypeL(Unicode c);
-
-extern GBool unicodeTypeR(Unicode c);
-
-#endif
diff --git a/pdf/xpdf/XPDFApp.cc b/pdf/xpdf/XPDFApp.cc
deleted file mode 100644
index ae8d009..0000000
--- a/pdf/xpdf/XPDFApp.cc
+++ /dev/null
@@ -1,410 +0,0 @@
-//========================================================================
-//
-// XPDFApp.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include "GString.h"
-#include "GList.h"
-#include "Error.h"
-#include "XPDFViewer.h"
-#include "XPDFApp.h"
-#include "xpdfconfig.h"
-
-// these macro defns conflict with xpdf's Object class
-#ifdef LESSTIF_VERSION
-#undef XtDisplay
-#undef XtScreen
-#undef XtWindow
-#undef XtParent
-#undef XtIsRealized
-#endif
-
-//------------------------------------------------------------------------
-
-#define remoteCmdSize 512
-
-//------------------------------------------------------------------------
-
-static String fallbackResources[] = {
- "*.zoomComboBox*fontList: -*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
- "*XmTextField.fontList: -*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1",
- "*.fontList: -*-helvetica-medium-r-normal--12-*-*-*-*-*-iso8859-1",
- "*XmTextField.translations: #override\\n"
- " Ctrl<Key>a:beginning-of-line()\\n"
- " Ctrl<Key>b:backward-character()\\n"
- " Ctrl<Key>d:delete-next-character()\\n"
- " Ctrl<Key>e:end-of-line()\\n"
- " Ctrl<Key>f:forward-character()\\n"
- " Ctrl<Key>u:beginning-of-line()delete-to-end-of-line()\\n"
- " Ctrl<Key>k:delete-to-end-of-line()\\n",
- NULL
-};
-
-static XrmOptionDescRec xOpts[] = {
- {"-display", ".display", XrmoptionSepArg, NULL},
- {"-foreground", "*Foreground", XrmoptionSepArg, NULL},
- {"-fg", "*Foreground", XrmoptionSepArg, NULL},
- {"-background", "*Background", XrmoptionSepArg, NULL},
- {"-bg", "*Background", XrmoptionSepArg, NULL},
- {"-geometry", ".geometry", XrmoptionSepArg, NULL},
- {"-g", ".geometry", XrmoptionSepArg, NULL},
- {"-font", "*.fontList", XrmoptionSepArg, NULL},
- {"-fn", "*.fontList", XrmoptionSepArg, NULL},
- {"-title", ".title", XrmoptionSepArg, NULL},
- {"-cmap", ".installCmap", XrmoptionNoArg, (XPointer)"on"},
- {"-rgb", ".rgbCubeSize", XrmoptionSepArg, NULL},
- {"-rv", ".reverseVideo", XrmoptionNoArg, (XPointer)"true"},
- {"-papercolor", ".paperColor", XrmoptionSepArg, NULL},
- {"-z", ".initialZoom", XrmoptionSepArg, NULL}
-};
-
-#define nXOpts (sizeof(xOpts) / sizeof(XrmOptionDescRec))
-
-struct XPDFAppResources {
- String geometry;
- String title;
- Bool installCmap;
- int rgbCubeSize;
- Bool reverseVideo;
- String paperColor;
- String initialZoom;
- Bool viKeys;
-};
-
-static Bool defInstallCmap = False;
-static int defRGBCubeSize = defaultRGBCube;
-static Bool defReverseVideo = False;
-static Bool defViKeys = False;
-
-static XtResource xResources[] = {
- { "geometry", "Geometry", XtRString, sizeof(String), XtOffsetOf(XPDFAppResources, geometry), XtRString, (XtPointer)NULL },
- { "title", "Title", XtRString, sizeof(String), XtOffsetOf(XPDFAppResources, title), XtRString, (XtPointer)NULL },
- { "installCmap", "InstallCmap", XtRBool, sizeof(Bool), XtOffsetOf(XPDFAppResources, installCmap), XtRBool, (XtPointer)&defInstallCmap },
- { "rgbCubeSize", "RgbCubeSize", XtRInt, sizeof(int), XtOffsetOf(XPDFAppResources, rgbCubeSize), XtRInt, (XtPointer)&defRGBCubeSize },
- { "reverseVideo", "ReverseVideo", XtRBool, sizeof(Bool), XtOffsetOf(XPDFAppResources, reverseVideo), XtRBool, (XtPointer)&defReverseVideo },
- { "paperColor", "PaperColor", XtRString, sizeof(String), XtOffsetOf(XPDFAppResources, paperColor), XtRString, (XtPointer)NULL },
- { "initialZoom", "InitialZoom", XtRString, sizeof(String), XtOffsetOf(XPDFAppResources, initialZoom), XtRString, (XtPointer)NULL },
- { "viKeys", "ViKeys", XtRBool, sizeof(Bool), XtOffsetOf(XPDFAppResources, viKeys), XtRBool, (XtPointer)&defViKeys }
-};
-
-#define nXResources (sizeof(xResources) / sizeof(XtResource))
-
-//------------------------------------------------------------------------
-// XPDFApp
-//------------------------------------------------------------------------
-
-#if 0 //~ for debugging
-static int xErrorHandler(Display *display, XErrorEvent *ev) {
- printf("X error:\n");
- printf(" resource ID = %08lx\n", ev->resourceid);
- printf(" serial = %lu\n", ev->serial);
- printf(" error_code = %d\n", ev->error_code);
- printf(" request_code = %d\n", ev->request_code);
- printf(" minor_code = %d\n", ev->minor_code);
- fflush(stdout);
- abort();
-}
-#endif
-
-XPDFApp::XPDFApp(int *argc, char *argv[]) {
- appShell = XtAppInitialize(&appContext, xpdfAppName, xOpts, nXOpts,
- argc, argv, fallbackResources, NULL, 0);
- display = XtDisplay(appShell);
- screenNum = XScreenNumberOfScreen(XtScreen(appShell));
-#if XmVERSION > 1
- XtVaSetValues(XmGetXmDisplay(XtDisplay(appShell)),
- XmNenableButtonTab, True, NULL);
-#endif
-#if XmVERSION > 1
- // Drag-and-drop appears to be buggy -- I'm seeing weird crashes
- // deep in the Motif code when I destroy widgets in the XpdfForms
- // code. Xpdf doesn't use it, so just turn it off.
- XtVaSetValues(XmGetXmDisplay(XtDisplay(appShell)),
- XmNdragInitiatorProtocolStyle, XmDRAG_NONE,
- XmNdragReceiverProtocolStyle, XmDRAG_NONE,
- NULL);
-#endif
-
-#if 0 //~ for debugging
- XSynchronize(display, True);
- XSetErrorHandler(&xErrorHandler);
-#endif
-
- fullScreen = gFalse;
- remoteAtom = None;
- remoteViewer = NULL;
- remoteWin = None;
-
- getResources();
-
- viewers = new GList();
-
-}
-
-void XPDFApp::getResources() {
- XPDFAppResources resources;
- XColor xcol, xcol2;
- Colormap colormap;
-
- XtGetApplicationResources(appShell, &resources, xResources, nXResources,
- NULL, 0);
- geometry = resources.geometry ? new GString(resources.geometry)
- : (GString *)NULL;
- title = resources.title ? new GString(resources.title) : (GString *)NULL;
- installCmap = (GBool)resources.installCmap;
- rgbCubeSize = resources.rgbCubeSize;
- reverseVideo = (GBool)resources.reverseVideo;
- if (reverseVideo) {
- paperRGB = splashMakeRGB8(0x00, 0x00, 0x00);
- paperColor = BlackPixel(display, screenNum);
- } else {
- paperRGB = splashMakeRGB8(0xff, 0xff, 0xff);
- paperColor = WhitePixel(display, screenNum);
- }
- if (resources.paperColor) {
- XtVaGetValues(appShell, XmNcolormap, &colormap, NULL);
- if (XAllocNamedColor(display, colormap, resources.paperColor,
- &xcol, &xcol2)) {
- paperRGB = splashMakeRGB8(xcol.red >> 8,
- xcol.green >> 8,
- xcol.blue >> 8);
- paperColor = xcol.pixel;
- } else {
- error(-1, "Couldn't allocate color '%s'", resources.paperColor);
- }
- }
- initialZoom = resources.initialZoom ? new GString(resources.initialZoom)
- : (GString *)NULL;
- viKeys = (GBool)resources.viKeys;
-}
-
-XPDFApp::~XPDFApp() {
- deleteGList(viewers, XPDFViewer);
- if (geometry) {
- delete geometry;
- }
- if (title) {
- delete title;
- }
- if (initialZoom) {
- delete initialZoom;
- }
-}
-
-XPDFViewer *XPDFApp::open(GString *fileName, int page,
- GString *ownerPassword, GString *userPassword) {
- XPDFViewer *viewer;
-
- viewer = new XPDFViewer(this, fileName, page, NULL,
- ownerPassword, userPassword);
- if (!viewer->isOk()) {
- delete viewer;
- return NULL;
- }
- if (remoteAtom != None) {
- remoteViewer = viewer;
- remoteWin = viewer->getWindow();
- XtAddEventHandler(remoteWin, PropertyChangeMask, False,
- &remoteMsgCbk, this);
- XSetSelectionOwner(display, remoteAtom, XtWindow(remoteWin), CurrentTime);
- }
- viewers->append(viewer);
- return viewer;
-}
-
-XPDFViewer *XPDFApp::openAtDest(GString *fileName, GString *dest,
- GString *ownerPassword,
- GString *userPassword) {
- XPDFViewer *viewer;
-
- viewer = new XPDFViewer(this, fileName, 1, dest,
- ownerPassword, userPassword);
- if (!viewer->isOk()) {
- delete viewer;
- return NULL;
- }
- if (remoteAtom != None) {
- remoteViewer = viewer;
- remoteWin = viewer->getWindow();
- XtAddEventHandler(remoteWin, PropertyChangeMask, False,
- &remoteMsgCbk, this);
- XSetSelectionOwner(display, remoteAtom, XtWindow(remoteWin), CurrentTime);
- }
- viewers->append(viewer);
- return viewer;
-}
-
-void XPDFApp::close(XPDFViewer *viewer, GBool closeLast) {
- int i;
-
- if (viewers->getLength() == 1) {
- if (viewer != (XPDFViewer *)viewers->get(0)) {
- return;
- }
- if (closeLast) {
- quit();
- } else {
- viewer->clear();
- }
- } else {
- for (i = 0; i < viewers->getLength(); ++i) {
- if (((XPDFViewer *)viewers->get(i)) == viewer) {
- viewers->del(i);
- if (remoteAtom != None && remoteViewer == viewer) {
- remoteViewer = (XPDFViewer *)viewers->get(viewers->getLength() - 1);
- remoteWin = remoteViewer->getWindow();
- XSetSelectionOwner(display, remoteAtom, XtWindow(remoteWin),
- CurrentTime);
- }
- delete viewer;
- return;
- }
- }
- }
-}
-
-void XPDFApp::quit() {
- if (remoteAtom != None) {
- XSetSelectionOwner(display, remoteAtom, None, CurrentTime);
- }
- while (viewers->getLength() > 0) {
- delete (XPDFViewer *)viewers->del(0);
- }
-#if HAVE_XTAPPSETEXITFLAG
- XtAppSetExitFlag(appContext);
-#else
- exit(0);
-#endif
-}
-
-void XPDFApp::run() {
- XtAppMainLoop(appContext);
-}
-
-void XPDFApp::setRemoteName(char *remoteName) {
- remoteAtom = XInternAtom(display, remoteName, False);
- remoteXWin = XGetSelectionOwner(display, remoteAtom);
-}
-
-GBool XPDFApp::remoteServerRunning() {
- return remoteXWin != None;
-}
-
-void XPDFApp::remoteOpen(GString *fileName, int page, GBool raise) {
- char cmd[remoteCmdSize];
-
- sprintf(cmd, "%c %d %.200s",
- raise ? 'D' : 'd', page, fileName->getCString());
- XChangeProperty(display, remoteXWin, remoteAtom, remoteAtom, 8,
- PropModeReplace, (Guchar *)cmd, strlen(cmd) + 1);
- XFlush(display);
-}
-
-void XPDFApp::remoteOpenAtDest(GString *fileName, GString *dest, GBool raise) {
- char cmd[remoteCmdSize];
-
- sprintf(cmd, "%c +%.256s %.200s",
- raise ? 'D' : 'd', dest->getCString(), fileName->getCString());
- XChangeProperty(display, remoteXWin, remoteAtom, remoteAtom, 8,
- PropModeReplace, (Guchar *)cmd, strlen(cmd) + 1);
- XFlush(display);
-}
-
-void XPDFApp::remoteReload(GBool raise) {
- XChangeProperty(display, remoteXWin, remoteAtom, remoteAtom, 8,
- PropModeReplace, raise ? (Guchar *)"L" : (Guchar *)"l", 2);
- XFlush(display);
-}
-
-void XPDFApp::remoteRaise() {
- XChangeProperty(display, remoteXWin, remoteAtom, remoteAtom, 8,
- PropModeReplace, (Guchar *)"r", 2);
- XFlush(display);
-}
-
-void XPDFApp::remoteQuit() {
- XChangeProperty(display, remoteXWin, remoteAtom, remoteAtom, 8,
- PropModeReplace, (Guchar *)"q", 2);
- XFlush(display);
-}
-
-void XPDFApp::remoteMsgCbk(Widget widget, XtPointer ptr,
- XEvent *event, Boolean *cont) {
- XPDFApp *app = (XPDFApp *)ptr;
- char *cmd;
- Atom type;
- int format;
- Gulong size, remain;
- char *p, *q;
- GString *fileName;
- int page;
- GString *destName;
-
- if (event->xproperty.atom != app->remoteAtom) {
- *cont = True;
- return;
- }
- *cont = False;
-
- // get command
- if (XGetWindowProperty(app->display, XtWindow(app->remoteWin),
- app->remoteAtom, 0, remoteCmdSize/4,
- True, app->remoteAtom,
- &type, &format, &size, &remain,
- (Guchar **)&cmd) != Success) {
- return;
- }
- if (size == 0) {
- return;
- }
-
- // display file / page
- if (cmd[0] == 'd' || cmd[0] == 'D') {
- p = cmd + 2;
- q = strchr(p, ' ');
- if (!q) {
- return;
- }
- *q++ = '\0';
- page = 1;
- destName = NULL;
- if (*p == '+') {
- destName = new GString(p + 1);
- } else {
- page = atoi(p);
- }
- if (q) {
- fileName = new GString(q);
- app->remoteViewer->open(fileName, page, destName);
- delete fileName;
- }
- if (destName) {
- delete destName;
- }
-
- // reload
- } else if (cmd[0] == 'l' || cmd[0] == 'L') {
- app->remoteViewer->reloadFile();
-
- // quit
- } else if (cmd[0] == 'q') {
- app->quit();
- }
-
- // raise window
- if (cmd[0] == 'D' || cmd[0] == 'L' || cmd[0] == 'r'){
- XMapRaised(app->display, XtWindow(app->remoteWin));
- XFlush(app->display);
- }
-
- XFree((XPointer)cmd);
-}
diff --git a/pdf/xpdf/XPDFApp.h b/pdf/xpdf/XPDFApp.h
deleted file mode 100644
index 4e23955..0000000
--- a/pdf/xpdf/XPDFApp.h
+++ /dev/null
@@ -1,108 +0,0 @@
-//========================================================================
-//
-// XPDFApp.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XPDFAPP_H
-#define XPDFAPP_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#define Object XtObject
-#include <Xm/XmAll.h>
-#undef Object
-#include "gtypes.h"
-#include "SplashTypes.h"
-
-class GString;
-class GList;
-class XPDFViewer;
-
-//------------------------------------------------------------------------
-
-#define xpdfAppName "Xpdf"
-
-//------------------------------------------------------------------------
-// XPDFApp
-//------------------------------------------------------------------------
-
-class XPDFApp {
-public:
-
- XPDFApp(int *argc, char *argv[]);
- ~XPDFApp();
-
- XPDFViewer *open(GString *fileName, int page = 1,
- GString *ownerPassword = NULL,
- GString *userPassword = NULL);
- XPDFViewer *openAtDest(GString *fileName, GString *dest,
- GString *ownerPassword = NULL,
- GString *userPassword = NULL);
- void close(XPDFViewer *viewer, GBool closeLast);
- void quit();
-
- void run();
-
- //----- remote server
- void setRemoteName(char *remoteName);
- GBool remoteServerRunning();
- void remoteOpen(GString *fileName, int page, GBool raise);
- void remoteOpenAtDest(GString *fileName, GString *dest, GBool raise);
- void remoteReload(GBool raise);
- void remoteRaise();
- void remoteQuit();
-
- //----- resource/option values
- GString *getGeometry() { return geometry; }
- GString *getTitle() { return title; }
- GBool getInstallCmap() { return installCmap; }
- int getRGBCubeSize() { return rgbCubeSize; }
- GBool getReverseVideo() { return reverseVideo; }
- SplashRGB8 getPaperRGB() { return paperRGB; }
- Gulong getPaperColor() { return paperColor; }
- GString *getInitialZoom() { return initialZoom; }
- GBool getViKeys() { return viKeys; }
- void setFullScreen(GBool fullScreenA) { fullScreen = fullScreenA; }
- GBool getFullScreen() { return fullScreen; }
-
- XtAppContext getAppContext() { return appContext; }
- Widget getAppShell() { return appShell; }
-
-private:
-
- void getResources();
- static void remoteMsgCbk(Widget widget, XtPointer ptr,
- XEvent *event, Boolean *cont);
-
- Display *display;
- int screenNum;
- XtAppContext appContext;
- Widget appShell;
- GList *viewers; // [XPDFViewer]
-
- Atom remoteAtom;
- Window remoteXWin;
- XPDFViewer *remoteViewer;
- Widget remoteWin;
-
- //----- resource/option values
- GString *geometry;
- GString *title;
- GBool installCmap;
- int rgbCubeSize;
- GBool reverseVideo;
- SplashRGB8 paperRGB;
- Gulong paperColor;
- GString *initialZoom;
- GBool viKeys;
- GBool fullScreen;
-};
-
-#endif
diff --git a/pdf/xpdf/XPDFCore.cc b/pdf/xpdf/XPDFCore.cc
deleted file mode 100644
index 3b9c21e..0000000
--- a/pdf/xpdf/XPDFCore.cc
+++ /dev/null
@@ -1,1996 +0,0 @@
-//========================================================================
-//
-// XPDFCore.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <X11/keysym.h>
-#include <X11/cursorfont.h>
-#include <string.h>
-#include "gmem.h"
-#include "GString.h"
-#include "GList.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "PDFDoc.h"
-#include "ErrorCodes.h"
-#include "GfxState.h"
-#include "PSOutputDev.h"
-#include "TextOutputDev.h"
-#include "SplashPattern.h"
-#include "XSplashOutputDev.h"
-#include "XPDFCore.h"
-
-// these macro defns conflict with xpdf's Object class
-#ifdef LESSTIF_VERSION
-#undef XtDisplay
-#undef XtScreen
-#undef XtWindow
-#undef XtParent
-#undef XtIsRealized
-#endif
-
-// hack around old X includes which are missing these symbols
-#ifndef XK_Page_Up
-#define XK_Page_Up 0xFF55
-#endif
-#ifndef XK_Page_Down
-#define XK_Page_Down 0xFF56
-#endif
-#ifndef XK_KP_Home
-#define XK_KP_Home 0xFF95
-#endif
-#ifndef XK_KP_Left
-#define XK_KP_Left 0xFF96
-#endif
-#ifndef XK_KP_Up
-#define XK_KP_Up 0xFF97
-#endif
-#ifndef XK_KP_Right
-#define XK_KP_Right 0xFF98
-#endif
-#ifndef XK_KP_Down
-#define XK_KP_Down 0xFF99
-#endif
-#ifndef XK_KP_Prior
-#define XK_KP_Prior 0xFF9A
-#endif
-#ifndef XK_KP_Page_Up
-#define XK_KP_Page_Up 0xFF9A
-#endif
-#ifndef XK_KP_Next
-#define XK_KP_Next 0xFF9B
-#endif
-#ifndef XK_KP_Page_Down
-#define XK_KP_Page_Down 0xFF9B
-#endif
-#ifndef XK_KP_End
-#define XK_KP_End 0xFF9C
-#endif
-#ifndef XK_KP_Begin
-#define XK_KP_Begin 0xFF9D
-#endif
-#ifndef XK_KP_Insert
-#define XK_KP_Insert 0xFF9E
-#endif
-#ifndef XK_KP_Delete
-#define XK_KP_Delete 0xFF9F
-#endif
-
-//------------------------------------------------------------------------
-
-#define highlightNone 0
-#define highlightNormal 1
-#define highlightSelected 2
-
-//------------------------------------------------------------------------
-
-GString *XPDFCore::currentSelection = NULL;
-XPDFCore *XPDFCore::currentSelectionOwner = NULL;
-Atom XPDFCore::targetsAtom;
-
-//------------------------------------------------------------------------
-// XPDFCore
-//------------------------------------------------------------------------
-
-XPDFCore::XPDFCore(Widget shellA, Widget parentWidgetA,
- SplashRGB8 paperColorA, GBool fullScreenA,
- GBool reverseVideo, GBool installCmap, int rgbCubeSize) {
- GString *initialZoom;
- SplashColor paperColor2;
- int i;
-
- shell = shellA;
- parentWidget = parentWidgetA;
- display = XtDisplay(parentWidget);
- screenNum = XScreenNumberOfScreen(XtScreen(parentWidget));
- targetsAtom = XInternAtom(display, "TARGETS", False);
-
- paperColor = paperColorA;
- fullScreen = fullScreenA;
-
- // for some reason, querying XmNvisual doesn't work (even if done
- // after the window is mapped)
- visual = DefaultVisual(display, screenNum);
- XtVaGetValues(shell, XmNcolormap, &colormap, NULL);
-
- scrolledWin = NULL;
- hScrollBar = NULL;
- vScrollBar = NULL;
- drawAreaFrame = NULL;
- drawArea = NULL;
- out = NULL;
-
- doc = NULL;
- page = 0;
- rotate = 0;
-
- // get the initial zoom value
- initialZoom = globalParams->getInitialZoom();
- if (!initialZoom->cmp("page")) {
- zoom = zoomPage;
- } else if (!initialZoom->cmp("width")) {
- zoom = zoomWidth;
- } else {
- zoom = atoi(initialZoom->getCString());
- if (zoom <= 0) {
- zoom = defZoom;
- }
- }
- delete initialZoom;
-
- scrollX = 0;
- scrollY = 0;
- linkAction = NULL;
- selectXMin = selectXMax = 0;
- selectYMin = selectYMax = 0;
- dragging = gFalse;
- lastDragLeft = lastDragTop = gTrue;
-
- panning = gFalse;
-
-
- updateCbk = NULL;
- actionCbk = NULL;
- keyPressCbk = NULL;
- mouseCbk = NULL;
- reqPasswordCbk = NULL;
-
- // no history yet
- historyCur = xpdfHistorySize - 1;
- historyBLen = historyFLen = 0;
- for (i = 0; i < xpdfHistorySize; ++i) {
- history[i].fileName = NULL;
- }
-
- // optional features default to on
- hyperlinksEnabled = gTrue;
- selectEnabled = gTrue;
-
- // do X-specific initialization and create the widgets
- initWindow();
-
- // create the OutputDev
- paperColor2.rgb8 = paperColor;
- out = new XSplashOutputDev(display, screenNum, visual, colormap,
- reverseVideo, paperColor2,
- installCmap, rgbCubeSize, gTrue,
- &outputDevRedrawCbk, this);
- out->startDoc(NULL);
-}
-
-XPDFCore::~XPDFCore() {
- int i;
-
- if (out) {
- delete out;
- }
- if (doc) {
- delete doc;
- }
- if (currentSelectionOwner == this && currentSelection) {
- delete currentSelection;
- currentSelection = NULL;
- currentSelectionOwner = NULL;
- }
- for (i = 0; i < xpdfHistorySize; ++i) {
- if (history[i].fileName) {
- delete history[i].fileName;
- }
- }
- if (drawAreaGC) {
- XFreeGC(display, drawAreaGC);
- }
- if (scrolledWin) {
- XtDestroyWidget(scrolledWin);
- }
- if (busyCursor) {
- XFreeCursor(display, busyCursor);
- }
- if (linkCursor) {
- XFreeCursor(display, linkCursor);
- }
- if (selectCursor) {
- XFreeCursor(display, selectCursor);
- }
-}
-
-//------------------------------------------------------------------------
-// loadFile / displayPage / displayDest
-//------------------------------------------------------------------------
-
-int XPDFCore::loadFile(GString *fileName, GString *ownerPassword,
- GString *userPassword) {
- PDFDoc *newDoc;
- GString *password;
- GBool again;
- int err;
-
- // busy cursor
- setCursor(busyCursor);
-
- // open the PDF file
- newDoc = new PDFDoc(fileName->copy(), ownerPassword, userPassword);
- if (!newDoc->isOk()) {
- err = newDoc->getErrorCode();
- delete newDoc;
- if (err != errEncrypted || !reqPasswordCbk) {
- setCursor(None);
- return err;
- }
-
- // try requesting a password
- again = ownerPassword != NULL || userPassword != NULL;
- while (1) {
- if (!(password = (*reqPasswordCbk)(reqPasswordCbkData, again))) {
- setCursor(None);
- return errEncrypted;
- }
- newDoc = new PDFDoc(fileName->copy(), password, password);
- if (newDoc->isOk()) {
- break;
- }
- err = newDoc->getErrorCode();
- delete newDoc;
- if (err != errEncrypted) {
- setCursor(None);
- return err;
- }
- again = gTrue;
- }
- }
-
- // replace old document
- if (doc) {
- delete doc;
- }
- doc = newDoc;
- if (out) {
- out->startDoc(doc->getXRef());
- }
-
- // nothing displayed yet
- page = -99;
-
- // save the modification time
- modTime = getModTime(doc->getFileName()->getCString());
-
- // update the parent window
- if (updateCbk) {
- (*updateCbk)(updateCbkData, doc->getFileName(), -1,
- doc->getNumPages(), NULL);
- }
-
- // back to regular cursor
- setCursor(None);
-
- return errNone;
-}
-
-int XPDFCore::loadFile(BaseStream *stream, GString *ownerPassword,
- GString *userPassword) {
- PDFDoc *newDoc;
- GString *password;
- GBool again;
- int err;
-
- // busy cursor
- setCursor(busyCursor);
-
- // open the PDF file
- newDoc = new PDFDoc(stream, ownerPassword, userPassword);
- if (!newDoc->isOk()) {
- err = newDoc->getErrorCode();
- delete newDoc;
- if (err != errEncrypted || !reqPasswordCbk) {
- setCursor(None);
- return err;
- }
-
- // try requesting a password
- again = ownerPassword != NULL || userPassword != NULL;
- while (1) {
- if (!(password = (*reqPasswordCbk)(reqPasswordCbkData, again))) {
- setCursor(None);
- return errEncrypted;
- }
- newDoc = new PDFDoc(stream, password, password);
- if (newDoc->isOk()) {
- break;
- }
- err = newDoc->getErrorCode();
- delete newDoc;
- if (err != errEncrypted) {
- setCursor(None);
- return err;
- }
- again = gTrue;
- }
- }
-
- // replace old document
- if (doc) {
- delete doc;
- }
- doc = newDoc;
- if (out) {
- out->startDoc(doc->getXRef());
- }
-
- // nothing displayed yet
- page = -99;
-
- // save the modification time
- modTime = getModTime(doc->getFileName()->getCString());
-
- // update the parent window
- if (updateCbk) {
- (*updateCbk)(updateCbkData, doc->getFileName(), -1,
- doc->getNumPages(), NULL);
- }
-
- // back to regular cursor
- setCursor(None);
-
- return errNone;
-}
-
-void XPDFCore::resizeToPage(int pg) {
- Dimension width, height;
- double width1, height1;
- Dimension topW, topH, topBorder, daW, daH;
- Dimension displayW, displayH;
-
- displayW = DisplayWidth(display, screenNum);
- displayH = DisplayHeight(display, screenNum);
- if (fullScreen) {
- width = displayW;
- height = displayH;
- } else {
- if (pg < 0 || pg > doc->getNumPages()) {
- width1 = 612;
- height1 = 792;
- } else if (doc->getPageRotate(pg) == 90 ||
- doc->getPageRotate(pg) == 270) {
- width1 = doc->getPageHeight(pg);
- height1 = doc->getPageWidth(pg);
- } else {
- width1 = doc->getPageWidth(pg);
- height1 = doc->getPageHeight(pg);
- }
- if (zoom == zoomPage || zoom == zoomWidth) {
- width = (Dimension)(width1 * 0.01 * defZoom + 0.5);
- height = (Dimension)(height1 * 0.01 * defZoom + 0.5);
- } else {
- width = (Dimension)(width1 * 0.01 * zoom + 0.5);
- height = (Dimension)(height1 * 0.01 * zoom + 0.5);
- }
- if (width > displayW - 100) {
- width = displayW - 100;
- }
- if (height > displayH - 150) {
- height = displayH - 150;
- }
- }
-
- if (XtIsRealized(shell)) {
- XtVaGetValues(shell, XmNwidth, &topW, XmNheight, &topH,
- XmNborderWidth, &topBorder, NULL);
- XtVaGetValues(drawArea, XmNwidth, &daW, XmNheight, &daH, NULL);
- XtVaSetValues(shell, XmNwidth, width + (topW - daW),
- XmNheight, height + (topH - daH), NULL);
- } else {
- XtVaSetValues(drawArea, XmNwidth, width, XmNheight, height, NULL);
- }
-}
-
-void XPDFCore::clear() {
- if (!doc) {
- return;
- }
-
- // no document
- delete doc;
- doc = NULL;
- out->clear();
-
- // no page displayed
- page = -99;
-
- // redraw
- scrollX = scrollY = 0;
- updateScrollBars();
- redrawRectangle(scrollX, scrollY, drawAreaWidth, drawAreaHeight);
-}
-
-void XPDFCore::displayPage(int pageA, double zoomA, int rotateA,
- GBool scrollToTop, GBool addToHist) {
- double hDPI, vDPI;
- int rot;
- XPDFHistory *h;
- GBool newZoom;
- time_t newModTime;
- int oldScrollX, oldScrollY;
-
- // update the zoom and rotate values
- newZoom = zoomA != zoom;
- zoom = zoomA;
- rotate = rotateA;
-
- // check for document and valid page number
- if (!doc || pageA <= 0 || pageA > doc->getNumPages()) {
- return;
- }
-
- // busy cursor
- setCursor(busyCursor);
-
-
- // check for changes to the file
- newModTime = getModTime(doc->getFileName()->getCString());
- if (newModTime != modTime) {
- if (loadFile(doc->getFileName()) == errNone) {
- if (pageA > doc->getNumPages()) {
- pageA = doc->getNumPages();
- }
- }
- modTime = newModTime;
- }
-
- // new page number
- page = pageA;
-
- // scroll to top
- if (scrollToTop) {
- scrollY = 0;
- }
-
- // if zoom level changed, scroll to the top-left corner
- if (newZoom) {
- scrollX = scrollY = 0;
- }
-
- // initialize mouse-related stuff
- linkAction = NULL;
- selectXMin = selectXMax = 0;
- selectYMin = selectYMax = 0;
- dragging = gFalse;
- lastDragLeft = lastDragTop = gTrue;
-
- // draw the page
- rot = rotate + doc->getPageRotate(page);
- if (rot >= 360) {
- rot -= 360;
- } else if (rotate < 0) {
- rot += 360;
- }
- if (zoom == zoomPage) {
- if (rot == 90 || rot == 270) {
- hDPI = (drawAreaWidth / doc->getPageHeight(page)) * 72;
- vDPI = (drawAreaHeight / doc->getPageWidth(page)) * 72;
- } else {
- hDPI = (drawAreaWidth / doc->getPageWidth(page)) * 72;
- vDPI = (drawAreaHeight / doc->getPageHeight(page)) * 72;
- }
- dpi = (hDPI < vDPI) ? hDPI : vDPI;
- } else if (zoom == zoomWidth) {
- if (rot == 90 || rot == 270) {
- dpi = (drawAreaWidth / doc->getPageHeight(page)) * 72;
- } else {
- dpi = (drawAreaWidth / doc->getPageWidth(page)) * 72;
- }
- } else {
- dpi = 0.01 * zoom * 72;
- }
- doc->displayPage(out, page, dpi, dpi, rotate, gTrue, gTrue);
- oldScrollX = scrollX;
- oldScrollY = scrollY;
- updateScrollBars();
- if (scrollX != oldScrollX || scrollY != oldScrollY) {
- redrawRectangle(scrollX, scrollY, drawAreaWidth, drawAreaHeight);
- }
-
-
- // add to history
- if (addToHist) {
- if (++historyCur == xpdfHistorySize) {
- historyCur = 0;
- }
- h = &history[historyCur];
- if (h->fileName) {
- delete h->fileName;
- }
- if (doc->getFileName()) {
- h->fileName = doc->getFileName()->copy();
- } else {
- h->fileName = NULL;
- }
- h->page = page;
- if (historyBLen < xpdfHistorySize) {
- ++historyBLen;
- }
- historyFLen = 0;
- }
-
- // update the parent window
- if (updateCbk) {
- (*updateCbk)(updateCbkData, NULL, page, -1, "");
- }
-
- // back to regular cursor
- setCursor(None);
-}
-
-void XPDFCore::displayDest(LinkDest *dest, double zoomA, int rotateA,
- GBool addToHist) {
- Ref pageRef;
- int pg;
- int dx, dy;
-
- if (dest->isPageRef()) {
- pageRef = dest->getPageRef();
- pg = doc->findPage(pageRef.num, pageRef.gen);
- } else {
- pg = dest->getPageNum();
- }
- if (pg <= 0 || pg > doc->getNumPages()) {
- pg = 1;
- }
- if (pg != page) {
- displayPage(pg, zoomA, rotateA, gTrue, addToHist);
- }
-
- if (fullScreen) {
- return;
- }
- switch (dest->getKind()) {
- case destXYZ:
- out->cvtUserToDev(dest->getLeft(), dest->getTop(), &dx, &dy);
- if (dest->getChangeLeft() || dest->getChangeTop()) {
- scrollTo(dest->getChangeLeft() ? dx : scrollX,
- dest->getChangeTop() ? dy : scrollY);
- }
- //~ what is the zoom parameter?
- break;
- case destFit:
- case destFitB:
- //~ do fit
- scrollTo(0, 0);
- break;
- case destFitH:
- case destFitBH:
- //~ do fit
- out->cvtUserToDev(0, dest->getTop(), &dx, &dy);
- scrollTo(0, dy);
- break;
- case destFitV:
- case destFitBV:
- //~ do fit
- out->cvtUserToDev(dest->getLeft(), 0, &dx, &dy);
- scrollTo(dx, 0);
- break;
- case destFitR:
- //~ do fit
- out->cvtUserToDev(dest->getLeft(), dest->getTop(), &dx, &dy);
- scrollTo(dx, dy);
- break;
- }
-}
-
-//------------------------------------------------------------------------
-// page/position changes
-//------------------------------------------------------------------------
-
-void XPDFCore::gotoNextPage(int inc, GBool top) {
- int pg;
-
- if (!doc || doc->getNumPages() == 0) {
- return;
- }
- if (page < doc->getNumPages()) {
- if ((pg = page + inc) > doc->getNumPages()) {
- pg = doc->getNumPages();
- }
- displayPage(pg, zoom, rotate, top, gTrue);
- } else {
- XBell(display, 0);
- }
-}
-
-void XPDFCore::gotoPrevPage(int dec, GBool top, GBool bottom) {
- int pg;
-
- if (!doc || doc->getNumPages() == 0) {
- return;
- }
- if (page > 1) {
- if (!fullScreen && bottom) {
- scrollY = out->getBitmapHeight() - drawAreaHeight;
- if (scrollY < 0) {
- scrollY = 0;
- }
- // displayPage will call updateScrollBars()
- }
- if ((pg = page - dec) < 1) {
- pg = 1;
- }
- displayPage(pg, zoom, rotate, top, gTrue);
- } else {
- XBell(display, 0);
- }
-}
-
-void XPDFCore::goForward() {
- if (historyFLen == 0) {
- XBell(display, 0);
- return;
- }
- if (++historyCur == xpdfHistorySize) {
- historyCur = 0;
- }
- --historyFLen;
- ++historyBLen;
- if (!doc || history[historyCur].fileName->cmp(doc->getFileName()) != 0) {
- if (loadFile(history[historyCur].fileName) != errNone) {
- XBell(display, 0);
- return;
- }
- }
- displayPage(history[historyCur].page, zoom, rotate, gFalse, gFalse);
-}
-
-void XPDFCore::goBackward() {
- if (historyBLen <= 1) {
- XBell(display, 0);
- return;
- }
- if (--historyCur < 0) {
- historyCur = xpdfHistorySize - 1;
- }
- --historyBLen;
- ++historyFLen;
- if (!doc || history[historyCur].fileName->cmp(doc->getFileName()) != 0) {
- if (loadFile(history[historyCur].fileName) != errNone) {
- XBell(display, 0);
- return;
- }
- }
- displayPage(history[historyCur].page, zoom, rotate, gFalse, gFalse);
-}
-
-void XPDFCore::scrollLeft(int nCols) {
- scrollTo(scrollX - nCols * 16, scrollY);
-}
-
-void XPDFCore::scrollRight(int nCols) {
- scrollTo(scrollX + nCols * 16, scrollY);
-}
-
-void XPDFCore::scrollUp(int nLines) {
- scrollTo(scrollX, scrollY - nLines * 16);
-}
-
-void XPDFCore::scrollDown(int nLines) {
- scrollTo(scrollX, scrollY + nLines * 16);
-}
-
-void XPDFCore::scrollPageUp() {
- if (scrollY == 0) {
- gotoPrevPage(1, gFalse, gTrue);
- } else {
- scrollTo(scrollX, scrollY - drawAreaHeight);
- }
-}
-
-void XPDFCore::scrollPageDown() {
- if (scrollY >= out->getBitmapHeight() - drawAreaHeight) {
- gotoNextPage(1, gTrue);
- } else {
- scrollTo(scrollX, scrollY + drawAreaHeight);
- }
-}
-
-void XPDFCore::scrollTo(int x, int y) {
- GBool needRedraw;
- int maxPos, pos;
-
- needRedraw = gFalse;
-
- maxPos = out ? out->getBitmapWidth() : 1;
- if (maxPos < drawAreaWidth) {
- maxPos = drawAreaWidth;
- }
- if (x < 0) {
- pos = 0;
- } else if (x > maxPos - drawAreaWidth) {
- pos = maxPos - drawAreaWidth;
- } else {
- pos = x;
- }
- if (scrollX != pos) {
- scrollX = pos;
- XmScrollBarSetValues(hScrollBar, scrollX, drawAreaWidth, 16,
- drawAreaWidth, False);
- needRedraw = gTrue;
- }
-
- maxPos = out ? out->getBitmapHeight() : 1;
- if (maxPos < drawAreaHeight) {
- maxPos = drawAreaHeight;
- }
- if (y < 0) {
- pos = 0;
- } else if (y > maxPos - drawAreaHeight) {
- pos = maxPos - drawAreaHeight;
- } else {
- pos = y;
- }
- if (scrollY != pos) {
- scrollY = pos;
- XmScrollBarSetValues(vScrollBar, scrollY, drawAreaHeight, 16,
- drawAreaHeight, False);
- needRedraw = gTrue;
- }
-
- if (needRedraw) {
- redrawRectangle(scrollX, scrollY, drawAreaWidth, drawAreaHeight);
- }
-}
-
-//------------------------------------------------------------------------
-// selection
-//------------------------------------------------------------------------
-
-void XPDFCore::setSelection(int newXMin, int newYMin,
- int newXMax, int newYMax) {
- int x, y;
- GBool needRedraw, needScroll;
- GBool moveLeft, moveRight, moveTop, moveBottom;
- SplashColor xorColor;
-
-
- // erase old selection on off-screen bitmap
- needRedraw = gFalse;
- if (selectXMin < selectXMax && selectYMin < selectYMax) {
- xorColor.rgb8 = splashMakeRGB8(0xff, 0xff, 0xff);
- out->xorRectangle(selectXMin, selectYMin, selectXMax, selectYMax,
- new SplashSolidColor(xorColor));
- needRedraw = gTrue;
- }
-
- // draw new selection on off-screen bitmap
- if (newXMin < newXMax && newYMin < newYMax) {
- xorColor.rgb8 = splashMakeRGB8(0xff, 0xff, 0xff);
- out->xorRectangle(newXMin, newYMin, newXMax, newYMax,
- new SplashSolidColor(xorColor));
- needRedraw = gTrue;
- }
-
- // check which edges moved
- moveLeft = newXMin != selectXMin;
- moveTop = newYMin != selectYMin;
- moveRight = newXMax != selectXMax;
- moveBottom = newYMax != selectYMax;
-
- // redraw currently visible part of bitmap
- if (needRedraw) {
- if (moveLeft) {
- redrawRectangle((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMin > selectXMin) ? newXMin : selectXMin,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- if (moveRight) {
- redrawRectangle((newXMax < selectXMax) ? newXMax : selectXMax,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- if (moveTop) {
- redrawRectangle((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMin < selectYMin) ? newYMin : selectYMin,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMin > selectYMin) ? newYMin : selectYMin);
- }
- if (moveBottom) {
- redrawRectangle((newXMin < selectXMin) ? newXMin : selectXMin,
- (newYMax < selectYMax) ? newYMax : selectYMax,
- (newXMax > selectXMax) ? newXMax : selectXMax,
- (newYMax > selectYMax) ? newYMax : selectYMax);
- }
- }
-
- // switch to new selection coords
- selectXMin = newXMin;
- selectXMax = newXMax;
- selectYMin = newYMin;
- selectYMax = newYMax;
-
- // scroll if necessary
- if (fullScreen) {
- return;
- }
- needScroll = gFalse;
- x = scrollX;
- y = scrollY;
- if (moveLeft && selectXMin < x) {
- x = selectXMin;
- needScroll = gTrue;
- } else if (moveRight && selectXMax >= x + drawAreaWidth) {
- x = selectXMax - drawAreaWidth;
- needScroll = gTrue;
- } else if (moveLeft && selectXMin >= x + drawAreaWidth) {
- x = selectXMin - drawAreaWidth;
- needScroll = gTrue;
- } else if (moveRight && selectXMax < x) {
- x = selectXMax;
- needScroll = gTrue;
- }
- if (moveTop && selectYMin < y) {
- y = selectYMin;
- needScroll = gTrue;
- } else if (moveBottom && selectYMax >= y + drawAreaHeight) {
- y = selectYMax - drawAreaHeight;
- needScroll = gTrue;
- } else if (moveTop && selectYMin >= y + drawAreaHeight) {
- y = selectYMin - drawAreaHeight;
- needScroll = gTrue;
- } else if (moveBottom && selectYMax < y) {
- y = selectYMax;
- needScroll = gTrue;
- }
- if (needScroll) {
- scrollTo(x, y);
- }
-}
-
-void XPDFCore::moveSelection(int mx, int my) {
- int xMin, yMin, xMax, yMax;
-
- // clip mouse coords
- if (mx < 0) {
- mx = 0;
- } else if (mx >= out->getBitmapWidth()) {
- mx = out->getBitmapWidth() - 1;
- }
- if (my < 0) {
- my = 0;
- } else if (my >= out->getBitmapHeight()) {
- my = out->getBitmapHeight() - 1;
- }
-
- // move appropriate edges of selection
- if (lastDragLeft) {
- if (mx < selectXMax) {
- xMin = mx;
- xMax = selectXMax;
- } else {
- xMin = selectXMax;
- xMax = mx;
- lastDragLeft = gFalse;
- }
- } else {
- if (mx > selectXMin) {
- xMin = selectXMin;
- xMax = mx;
- } else {
- xMin = mx;
- xMax = selectXMin;
- lastDragLeft = gTrue;
- }
- }
- if (lastDragTop) {
- if (my < selectYMax) {
- yMin = my;
- yMax = selectYMax;
- } else {
- yMin = selectYMax;
- yMax = my;
- lastDragTop = gFalse;
- }
- } else {
- if (my > selectYMin) {
- yMin = selectYMin;
- yMax = my;
- } else {
- yMin = my;
- yMax = selectYMin;
- lastDragTop = gTrue;
- }
- }
-
- // redraw the selection
- setSelection(xMin, yMin, xMax, yMax);
-}
-
-// X's copy-and-paste mechanism is brain damaged. Xt doesn't help
-// any, but doesn't make it too much worse, either. Motif, on the
-// other hand, adds significant complexity to the mess. So here we
-// blow off the Motif junk and stick to plain old Xt. The next two
-// functions (copySelection and convertSelectionCbk) implement the
-// magic needed to deal with Xt's mechanism. Note that this requires
-// global variables (currentSelection and currentSelectionOwner).
-
-void XPDFCore::copySelection() {
- if (!doc->okToCopy()) {
- return;
- }
- if (currentSelection) {
- delete currentSelection;
- }
- //~ for multithreading: need a mutex here
- currentSelection = out->getText(selectXMin, selectYMin,
- selectXMax, selectYMax);
- currentSelectionOwner = this;
- XtOwnSelection(drawArea, XA_PRIMARY, XtLastTimestampProcessed(display),
- &convertSelectionCbk, NULL, NULL);
-}
-
-Boolean XPDFCore::convertSelectionCbk(Widget widget, Atom *selection,
- Atom *target, Atom *type,
- XtPointer *value, unsigned long *length,
- int *format) {
- Atom *array;
-
- // send back a list of supported conversion targets
- if (*target == targetsAtom) {
- if (!(array = (Atom *)XtMalloc(sizeof(Atom)))) {
- return False;
- }
- array[0] = XA_STRING;
- *value = (XtPointer)array;
- *type = XA_ATOM;
- *format = 32;
- *length = 1;
- return True;
-
- // send the selected text
- } else if (*target == XA_STRING) {
- //~ for multithreading: need a mutex here
- *value = XtNewString(currentSelection->getCString());
- *length = currentSelection->getLength();
- *type = XA_STRING;
- *format = 8; // 8-bit elements
- return True;
- }
-
- return False;
-}
-
-GBool XPDFCore::getSelection(int *xMin, int *yMin, int *xMax, int *yMax) {
- if (selectXMin >= selectXMax || selectYMin >= selectYMax) {
- return gFalse;
- }
- *xMin = selectXMin;
- *yMin = selectYMin;
- *xMax = selectXMax;
- *yMax = selectYMax;
- return gTrue;
-}
-
-GString *XPDFCore::extractText(int xMin, int yMin, int xMax, int yMax) {
- if (!doc->okToCopy()) {
- return NULL;
- }
- return out->getText(xMin, yMin, xMax, yMax);
-}
-
-GString *XPDFCore::extractText(int pageNum,
- int xMin, int yMin, int xMax, int yMax) {
- TextOutputDev *textOut;
- GString *s;
-
- if (!doc->okToCopy()) {
- return NULL;
- }
- textOut = new TextOutputDev(NULL, gTrue, gFalse, gFalse);
- if (!textOut->isOk()) {
- delete textOut;
- return NULL;
- }
- doc->displayPage(textOut, pageNum, dpi, dpi, rotate, gTrue, gFalse);
- s = textOut->getText(xMin, yMin, xMax, yMax);
- delete textOut;
- return s;
-}
-
-//------------------------------------------------------------------------
-// hyperlinks
-//------------------------------------------------------------------------
-
-GBool XPDFCore::doLink(int mx, int my) {
- double x, y;
- LinkAction *action;
-
- // look for a link
- out->cvtDevToUser(mx, my, &x, &y);
- if ((action = doc->findLink(x, y))) {
- doAction(action);
- return gTrue;
- }
- return gFalse;
-}
-
-void XPDFCore::doAction(LinkAction *action) {
- LinkActionKind kind;
- LinkDest *dest;
- GString *namedDest;
- char *s;
- GString *fileName, *fileName2;
- GString *cmd;
- GString *actionName;
- Object movieAnnot, obj1, obj2;
- GString *msg;
- int i;
-
- switch (kind = action->getKind()) {
-
- // GoTo / GoToR action
- case actionGoTo:
- case actionGoToR:
- if (kind == actionGoTo) {
- dest = NULL;
- namedDest = NULL;
- if ((dest = ((LinkGoTo *)action)->getDest())) {
- dest = dest->copy();
- } else if ((namedDest = ((LinkGoTo *)action)->getNamedDest())) {
- namedDest = namedDest->copy();
- }
- } else {
- dest = NULL;
- namedDest = NULL;
- if ((dest = ((LinkGoToR *)action)->getDest())) {
- dest = dest->copy();
- } else if ((namedDest = ((LinkGoToR *)action)->getNamedDest())) {
- namedDest = namedDest->copy();
- }
- s = ((LinkGoToR *)action)->getFileName()->getCString();
- //~ translate path name for VMS (deal with '/')
- if (isAbsolutePath(s)) {
- fileName = new GString(s);
- } else {
- fileName = appendToPath(grabPath(doc->getFileName()->getCString()), s);
- }
- if (loadFile(fileName) != errNone) {
- if (dest) {
- delete dest;
- }
- if (namedDest) {
- delete namedDest;
- }
- delete fileName;
- return;
- }
- delete fileName;
- }
- if (namedDest) {
- dest = doc->findDest(namedDest);
- delete namedDest;
- }
- if (dest) {
- displayDest(dest, zoom, rotate, gTrue);
- delete dest;
- } else {
- if (kind == actionGoToR) {
- displayPage(1, zoom, 0, gFalse, gTrue);
- }
- }
- break;
-
- // Launch action
- case actionLaunch:
- fileName = ((LinkLaunch *)action)->getFileName();
- s = fileName->getCString();
- if (!strcmp(s + fileName->getLength() - 4, ".pdf") ||
- !strcmp(s + fileName->getLength() - 4, ".PDF")) {
- //~ translate path name for VMS (deal with '/')
- if (isAbsolutePath(s)) {
- fileName = fileName->copy();
- } else {
- fileName = appendToPath(grabPath(doc->getFileName()->getCString()), s);
- }
- if (loadFile(fileName) != errNone) {
- delete fileName;
- return;
- }
- delete fileName;
- displayPage(1, zoom, rotate, gFalse, gTrue);
- } else {
- fileName = fileName->copy();
- if (((LinkLaunch *)action)->getParams()) {
- fileName->append(' ');
- fileName->append(((LinkLaunch *)action)->getParams());
- }
-#ifdef VMS
- fileName->insert(0, "spawn/nowait ");
-#elif defined(__EMX__)
- fileName->insert(0, "start /min /n ");
-#else
- fileName->append(" &");
-#endif
- msg = new GString("About to execute the command:\n");
- msg->append(fileName);
- if (doQuestionDialog("Launching external application", msg)) {
- system(fileName->getCString());
- }
- delete fileName;
- delete msg;
- }
- break;
-
- // URI action
- case actionURI:
- if (!(cmd = globalParams->getURLCommand())) {
- error(-1, "No urlCommand defined in config file");
- break;
- }
- runCommand(cmd, ((LinkURI *)action)->getURI());
- break;
-
- // Named action
- case actionNamed:
- actionName = ((LinkNamed *)action)->getName();
- if (!actionName->cmp("NextPage")) {
- gotoNextPage(1, gTrue);
- } else if (!actionName->cmp("PrevPage")) {
- gotoPrevPage(1, gTrue, gFalse);
- } else if (!actionName->cmp("FirstPage")) {
- if (page != 1) {
- displayPage(1, zoom, rotate, gTrue, gTrue);
- }
- } else if (!actionName->cmp("LastPage")) {
- if (page != doc->getNumPages()) {
- displayPage(doc->getNumPages(), zoom, rotate, gTrue, gTrue);
- }
- } else if (!actionName->cmp("GoBack")) {
- goBackward();
- } else if (!actionName->cmp("GoForward")) {
- goForward();
- } else if (!actionName->cmp("Quit")) {
- if (actionCbk) {
- (*actionCbk)(actionCbkData, "Quit");
- }
- } else {
- error(-1, "Unknown named action: '%s'", actionName->getCString());
- }
- break;
-
- // Movie action
- case actionMovie:
- if (!(cmd = globalParams->getMovieCommand())) {
- error(-1, "No movieCommand defined in config file");
- break;
- }
- if (((LinkMovie *)action)->hasAnnotRef()) {
- doc->getXRef()->fetch(((LinkMovie *)action)->getAnnotRef()->num,
- ((LinkMovie *)action)->getAnnotRef()->gen,
- &movieAnnot);
- } else {
- doc->getCatalog()->getPage(page)->getAnnots(&obj1);
- if (obj1.isArray()) {
- for (i = 0; i < obj1.arrayGetLength(); ++i) {
- if (obj1.arrayGet(i, &movieAnnot)->isDict()) {
- if (movieAnnot.dictLookup("Subtype", &obj2)->isName("Movie")) {
- obj2.free();
- break;
- }
- obj2.free();
- }
- movieAnnot.free();
- }
- obj1.free();
- }
- }
- if (movieAnnot.isDict()) {
- if (movieAnnot.dictLookup("Movie", &obj1)->isDict()) {
- if (obj1.dictLookup("F", &obj2)) {
- if ((fileName = LinkAction::getFileSpecName(&obj2))) {
- if (!isAbsolutePath(fileName->getCString())) {
- fileName2 = appendToPath(
- grabPath(doc->getFileName()->getCString()),
- fileName->getCString());
- delete fileName;
- fileName = fileName2;
- }
- runCommand(cmd, fileName);
- delete fileName;
- }
- obj2.free();
- }
- obj1.free();
- }
- }
- movieAnnot.free();
- break;
-
- // unknown action type
- case actionUnknown:
- error(-1, "Unknown link action type: '%s'",
- ((LinkUnknown *)action)->getAction()->getCString());
- break;
- }
-}
-
-// Run a command, given a <cmdFmt> string with one '%s' in it, and an
-// <arg> string to insert in place of the '%s'.
-void XPDFCore::runCommand(GString *cmdFmt, GString *arg) {
- GString *cmd;
- char *s;
-
- if ((s = strstr(cmdFmt->getCString(), "%s"))) {
- cmd = mungeURL(arg);
- cmd->insert(0, cmdFmt->getCString(),
- s - cmdFmt->getCString());
- cmd->append(s + 2);
- } else {
- cmd = cmdFmt->copy();
- }
-#ifdef VMS
- cmd->insert(0, "spawn/nowait ");
-#elif defined(__EMX__)
- cmd->insert(0, "start /min /n ");
-#else
- cmd->append(" &");
-#endif
- system(cmd->getCString());
- delete cmd;
-}
-
-// Escape any characters in a URL which might cause problems when
-// calling system().
-GString *XPDFCore::mungeURL(GString *url) {
- static char *allowed = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
- "abcdefghijklmnopqrstuvwxyz"
- "0123456789"
- "-_.~/?:@&=+,#%";
- GString *newURL;
- char c;
- char buf[4];
- int i;
-
- newURL = new GString();
- for (i = 0; i < url->getLength(); ++i) {
- c = url->getChar(i);
- if (strchr(allowed, c)) {
- newURL->append(c);
- } else {
- sprintf(buf, "%%%02x", c & 0xff);
- newURL->append(buf);
- }
- }
- return newURL;
-}
-
-
-//------------------------------------------------------------------------
-// find
-//------------------------------------------------------------------------
-
-void XPDFCore::find(char *s, GBool next) {
- Unicode *u;
- TextOutputDev *textOut;
- int xMin, yMin, xMax, yMax;
- double xMin1, yMin1, xMax1, yMax1;
- int pg;
- GBool startAtTop;
- int len, i;
-
- // check for zero-length string
- if (!s[0]) {
- XBell(display, 0);
- return;
- }
-
- // set cursor to watch
- setCursor(busyCursor);
-
- // convert to Unicode
-#if 1 //~ should do something more intelligent here
- len = strlen(s);
- u = (Unicode *)gmalloc(len * sizeof(Unicode));
- for (i = 0; i < len; ++i) {
- u[i] = (Unicode)(s[i] & 0xff);
- }
-#endif
-
- // search current page starting at current selection or top of page
- startAtTop = !next && !(selectXMin < selectXMax && selectYMin < selectYMax);
- xMin = selectXMin + 1;
- yMin = selectYMin + 1;
- xMax = yMax = 0;
- if (out->findText(u, len, startAtTop, gTrue, next, gFalse,
- &xMin, &yMin, &xMax, &yMax)) {
- goto found;
- }
-
- // search following pages
- textOut = new TextOutputDev(NULL, gTrue, gFalse, gFalse);
- if (!textOut->isOk()) {
- delete textOut;
- goto done;
- }
- for (pg = page+1; pg <= doc->getNumPages(); ++pg) {
- doc->displayPage(textOut, pg, 72, 72, 0, gTrue, gFalse);
- if (textOut->findText(u, len, gTrue, gTrue, gFalse, gFalse,
- &xMin1, &yMin1, &xMax1, &yMax1)) {
- goto foundPage;
- }
- }
-
- // search previous pages
- for (pg = 1; pg < page; ++pg) {
- doc->displayPage(textOut, pg, 72, 72, 0, gTrue, gFalse);
- if (textOut->findText(u, len, gTrue, gTrue, gFalse, gFalse,
- &xMin1, &yMin1, &xMax1, &yMax1)) {
- goto foundPage;
- }
- }
- delete textOut;
-
- // search current page ending at current selection
- if (!startAtTop) {
- xMin = yMin = 0;
- xMax = selectXMin;
- yMax = selectYMin;
- if (out->findText(u, len, gTrue, gFalse, gFalse, next,
- &xMin, &yMin, &xMax, &yMax)) {
- goto found;
- }
- }
-
- // not found
- XBell(display, 0);
- goto done;
-
- // found on a different page
- foundPage:
- delete textOut;
- displayPage(pg, zoom, rotate, gTrue, gTrue);
- if (!out->findText(u, len, gTrue, gTrue, gFalse, gFalse,
- &xMin, &yMin, &xMax, &yMax)) {
- // this can happen if coalescing is bad
- goto done;
- }
-
- // found: change the selection
- found:
- setSelection(xMin, yMin, xMax, yMax);
-#ifndef NO_TEXT_SELECT
- copySelection();
-#endif
-
- done:
- gfree(u);
-
- // reset cursors to normal
- setCursor(None);
-}
-
-//------------------------------------------------------------------------
-// misc access
-//------------------------------------------------------------------------
-
-void XPDFCore::setBusyCursor(GBool busy) {
- setCursor(busy ? busyCursor : None);
-}
-
-void XPDFCore::takeFocus() {
- XmProcessTraversal(drawArea, XmTRAVERSE_CURRENT);
-}
-
-//------------------------------------------------------------------------
-// GUI code
-//------------------------------------------------------------------------
-
-void XPDFCore::initWindow() {
- Arg args[20];
- int n;
-
- // create the cursors
- busyCursor = XCreateFontCursor(display, XC_watch);
- linkCursor = XCreateFontCursor(display, XC_hand2);
- selectCursor = XCreateFontCursor(display, XC_cross);
- currentCursor = 0;
-
- // create the scrolled window and scrollbars
- n = 0;
- XtSetArg(args[n], XmNscrollingPolicy, XmAPPLICATION_DEFINED); ++n;
- XtSetArg(args[n], XmNvisualPolicy, XmVARIABLE); ++n;
- scrolledWin = XmCreateScrolledWindow(parentWidget, "scroll", args, n);
- XtManageChild(scrolledWin);
- n = 0;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- XtSetArg(args[n], XmNminimum, 0); ++n;
- XtSetArg(args[n], XmNmaximum, 1); ++n;
- XtSetArg(args[n], XmNsliderSize, 1); ++n;
- XtSetArg(args[n], XmNvalue, 0); ++n;
- XtSetArg(args[n], XmNincrement, 1); ++n;
- XtSetArg(args[n], XmNpageIncrement, 1); ++n;
- hScrollBar = XmCreateScrollBar(scrolledWin, "hScrollBar", args, n);
- XtManageChild(hScrollBar);
- XtAddCallback(hScrollBar, XmNvalueChangedCallback,
- &hScrollChangeCbk, (XtPointer)this);
-#ifndef DISABLE_SMOOTH_SCROLL
- XtAddCallback(hScrollBar, XmNdragCallback,
- &hScrollDragCbk, (XtPointer)this);
-#endif
- n = 0;
- XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n;
- XtSetArg(args[n], XmNminimum, 0); ++n;
- XtSetArg(args[n], XmNmaximum, 1); ++n;
- XtSetArg(args[n], XmNsliderSize, 1); ++n;
- XtSetArg(args[n], XmNvalue, 0); ++n;
- XtSetArg(args[n], XmNincrement, 1); ++n;
- XtSetArg(args[n], XmNpageIncrement, 1); ++n;
- vScrollBar = XmCreateScrollBar(scrolledWin, "vScrollBar", args, n);
- XtManageChild(vScrollBar);
- XtAddCallback(vScrollBar, XmNvalueChangedCallback,
- &vScrollChangeCbk, (XtPointer)this);
-#ifndef DISABLE_SMOOTH_SCROLL
- XtAddCallback(vScrollBar, XmNdragCallback,
- &vScrollDragCbk, (XtPointer)this);
-#endif
-
- // create the drawing area
- n = 0;
- XtSetArg(args[n], XmNshadowType, XmSHADOW_IN); ++n;
- XtSetArg(args[n], XmNmarginWidth, 0); ++n;
- XtSetArg(args[n], XmNmarginHeight, 0); ++n;
- if (fullScreen) {
- XtSetArg(args[n], XmNshadowThickness, 0); ++n;
- }
- drawAreaFrame = XmCreateFrame(scrolledWin, "drawAreaFrame", args, n);
- XtManageChild(drawAreaFrame);
- n = 0;
- XtSetArg(args[n], XmNresizePolicy, XmRESIZE_ANY); ++n;
- XtSetArg(args[n], XmNwidth, 700); ++n;
- XtSetArg(args[n], XmNheight, 500); ++n;
- drawArea = XmCreateDrawingArea(drawAreaFrame, "drawArea", args, n);
- XtManageChild(drawArea);
- XtAddCallback(drawArea, XmNresizeCallback, &resizeCbk, (XtPointer)this);
- XtAddCallback(drawArea, XmNexposeCallback, &redrawCbk, (XtPointer)this);
- XtAddCallback(drawArea, XmNinputCallback, &inputCbk, (XtPointer)this);
- resizeCbk(drawArea, this, NULL);
-
- // set up mouse motion translations
- XtOverrideTranslations(drawArea, XtParseTranslationTable(
- "<Btn1Down>:DrawingAreaInput()\n"
- "<Btn1Up>:DrawingAreaInput()\n"
- "<Btn1Motion>:DrawingAreaInput()\n"
- "<Motion>:DrawingAreaInput()"));
-
- // can't create a GC until the window gets mapped
- drawAreaGC = NULL;
-}
-
-void XPDFCore::hScrollChangeCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;
-
- core->scrollTo(data->value, core->scrollY);
-}
-
-void XPDFCore::hScrollDragCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;
-
- core->scrollTo(data->value, core->scrollY);
-}
-
-void XPDFCore::vScrollChangeCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;
-
- core->scrollTo(core->scrollX, data->value);
-}
-
-void XPDFCore::vScrollDragCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmScrollBarCallbackStruct *data = (XmScrollBarCallbackStruct *)callData;
-
- core->scrollTo(core->scrollX, data->value);
-}
-
-void XPDFCore::resizeCbk(Widget widget, XtPointer ptr, XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- Arg args[2];
- int n;
- Dimension w, h;
- int oldScrollX, oldScrollY;
-
- n = 0;
- XtSetArg(args[n], XmNwidth, &w); ++n;
- XtSetArg(args[n], XmNheight, &h); ++n;
- XtGetValues(core->drawArea, args, n);
- core->drawAreaWidth = (int)w;
- core->drawAreaHeight = (int)h;
- if (core->page >= 0 &&
- (core->zoom == zoomPage || core->zoom == zoomWidth)) {
- core->displayPage(core->page, core->zoom, core->rotate,
- gFalse, gFalse);
- } else {
- oldScrollX = core->scrollX;
- oldScrollY = core->scrollY;
- core->updateScrollBars();
- if (core->scrollX != oldScrollX || core->scrollY != oldScrollY) {
- core->redrawRectangle(core->scrollX, core->scrollY,
- core->drawAreaWidth, core->drawAreaHeight);
- }
- }
-}
-
-void XPDFCore::redrawCbk(Widget widget, XtPointer ptr, XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmDrawingAreaCallbackStruct *data = (XmDrawingAreaCallbackStruct *)callData;
- int x, y, w, h;
-
- if (data->reason == XmCR_EXPOSE) {
- x = core->scrollX + data->event->xexpose.x;
- y = core->scrollY + data->event->xexpose.y;
- w = data->event->xexpose.width;
- h = data->event->xexpose.height;
- } else {
- x = core->scrollX;
- y = core->scrollY;
- w = core->drawAreaWidth;
- h = core->drawAreaHeight;
- }
- core->redrawRectangle(x, y, w, h);
-}
-
-void XPDFCore::outputDevRedrawCbk(void *data) {
- XPDFCore *core = (XPDFCore *)data;
-
- core->redrawRectangle(core->scrollX, core->scrollY,
- core->drawAreaWidth, core->drawAreaHeight);
-}
-
-void XPDFCore::inputCbk(Widget widget, XtPointer ptr, XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
- XmDrawingAreaCallbackStruct *data = (XmDrawingAreaCallbackStruct *)callData;
- LinkAction *action;
- int mx, my;
- double x, y;
- char *s;
- KeySym key;
- char buf[20];
- int n;
-
- switch (data->event->type) {
- case ButtonPress:
- if (data->event->xbutton.button == 1) {
- core->takeFocus();
- if (core->doc && core->doc->getNumPages() > 0) {
- if (core->selectEnabled) {
- mx = core->scrollX + data->event->xbutton.x;
- my = core->scrollY + data->event->xbutton.y;
- core->setSelection(mx, my, mx, my);
- core->setCursor(core->selectCursor);
- core->dragging = gTrue;
- }
- }
- } else if (data->event->xbutton.button == 2) {
- if (!core->fullScreen) {
- core->panning = gTrue;
- core->panMX = data->event->xbutton.x;
- core->panMY = data->event->xbutton.y;
- }
- } else if (data->event->xbutton.button == 4) { // mouse wheel up
- if (core->fullScreen) {
- core->gotoPrevPage(1, gTrue, gFalse);
- } else if (core->scrollY == 0) {
- core->gotoPrevPage(1, gFalse, gTrue);
- } else {
- core->scrollUp(1);
- }
- } else if (data->event->xbutton.button == 5) { // mouse wheel down
- if (core->fullScreen ||
- core->scrollY >=
- core->out->getBitmapHeight() - core->drawAreaHeight) {
- core->gotoNextPage(1, gTrue);
- } else {
- core->scrollDown(1);
- }
- } else if (data->event->xbutton.button == 6) { // second mouse wheel left
- if (!core->fullScreen) {
- core->scrollLeft(1);
- }
- } else if (data->event->xbutton.button == 7) { // second mouse wheel right
- if (!core->fullScreen) {
- core->scrollRight(1);
- }
- } else {
- if (*core->mouseCbk) {
- (*core->mouseCbk)(core->mouseCbkData, data->event);
- }
- }
- break;
- case ButtonRelease:
- if (data->event->xbutton.button == 1) {
- if (core->doc && core->doc->getNumPages() > 0) {
- mx = core->scrollX + data->event->xbutton.x;
- my = core->scrollY + data->event->xbutton.y;
- if (core->dragging) {
- core->dragging = gFalse;
- core->setCursor(None);
- core->moveSelection(mx, my);
-#ifndef NO_TEXT_SELECT
- if (core->selectXMin != core->selectXMax &&
- core->selectYMin != core->selectYMax) {
- if (core->doc->okToCopy()) {
- core->copySelection();
- } else {
- error(-1, "Copying of text from this document is not allowed.");
- }
- }
-#endif
- }
- if (core->hyperlinksEnabled) {
- if (core->selectXMin == core->selectXMax ||
- core->selectYMin == core->selectYMax) {
- core->doLink(mx, my);
- }
- }
- }
- } else if (data->event->xbutton.button == 2) {
- core->panning = gFalse;
- } else {
- if (*core->mouseCbk) {
- (*core->mouseCbk)(core->mouseCbkData, data->event);
- }
- }
- break;
- case MotionNotify:
- if (core->doc && core->doc->getNumPages() > 0) {
- mx = core->scrollX + data->event->xbutton.x;
- my = core->scrollY + data->event->xbutton.y;
- if (core->dragging) {
- core->moveSelection(mx, my);
- } else if (core->hyperlinksEnabled) {
- core->out->cvtDevToUser(mx, my, &x, &y);
- if ((action = core->doc->findLink(x, y))) {
- core->setCursor(core->linkCursor);
- if (action != core->linkAction) {
- core->linkAction = action;
- if (core->updateCbk) {
- s = "";
- switch (action->getKind()) {
- case actionGoTo:
- s = "[internal link]";
- break;
- case actionGoToR:
- s = ((LinkGoToR *)action)->getFileName()->getCString();
- break;
- case actionLaunch:
- s = ((LinkLaunch *)action)->getFileName()->getCString();
- break;
- case actionURI:
- s = ((LinkURI *)action)->getURI()->getCString();
- break;
- case actionNamed:
- s = ((LinkNamed *)action)->getName()->getCString();
- break;
- case actionMovie:
- s = "[movie]";
- break;
- case actionUnknown:
- s = "[unknown link]";
- break;
- }
- (*core->updateCbk)(core->updateCbkData, NULL, -1, -1, s);
- }
- }
- } else {
- core->setCursor(None);
- if (core->linkAction) {
- core->linkAction = NULL;
- if (core->updateCbk) {
- (*core->updateCbk)(core->updateCbkData, NULL, -1, -1, "");
- }
- }
- }
- }
- }
- if (core->panning) {
- core->scrollTo(core->scrollX - (data->event->xbutton.x - core->panMX),
- core->scrollY - (data->event->xbutton.y - core->panMY));
- core->panMX = data->event->xbutton.x;
- core->panMY = data->event->xbutton.y;
- }
- break;
- case KeyPress:
- n = XLookupString(&data->event->xkey, buf, sizeof(buf) - 1,
- &key, NULL);
- core->keyPress(buf, key, data->event->xkey.state);
- break;
- }
-}
-
-void XPDFCore::keyPress(char *s, KeySym key, Guint modifiers) {
- switch (key) {
- case XK_Home:
- case XK_KP_Home:
- if (modifiers & ControlMask) {
- displayPage(1, zoom, rotate, gTrue, gTrue);
- } else if (!fullScreen) {
- scrollTo(0, 0);
- }
- return;
- case XK_End:
- case XK_KP_End:
- if (modifiers & ControlMask) {
- displayPage(doc->getNumPages(), zoom, rotate, gTrue, gTrue);
- } else if (!fullScreen) {
- scrollTo(out->getBitmapWidth() - drawAreaWidth,
- out->getBitmapHeight() - drawAreaHeight);
- }
- return;
- case XK_Page_Up:
- case XK_KP_Page_Up:
- if (fullScreen) {
- gotoPrevPage(1, gTrue, gFalse);
- } else {
- scrollPageUp();
- }
- return;
- case XK_Page_Down:
- case XK_KP_Page_Down:
- if (fullScreen) {
- gotoNextPage(1, gTrue);
- } else {
- scrollPageDown();
- }
- return;
- case XK_Left:
- case XK_KP_Left:
- if (!fullScreen) {
- scrollLeft();
- }
- return;
- case XK_Right:
- case XK_KP_Right:
- if (!fullScreen) {
- scrollRight();
- }
- return;
- case XK_Up:
- case XK_KP_Up:
- if (!fullScreen) {
- scrollUp();
- }
- return;
- case XK_Down:
- case XK_KP_Down:
- if (!fullScreen) {
- scrollDown();
- }
- return;
- }
-
- if (*keyPressCbk) {
- (*keyPressCbk)(keyPressCbkData, s, key, modifiers);
- }
-}
-
-void XPDFCore::redrawRectangle(int x, int y, int w, int h) {
- XGCValues gcValues;
- Window drawAreaWin;
-
- // clip to window
- if (x < scrollX) {
- w -= scrollX - x;
- x = scrollX;
- }
- if (x + w > scrollX + drawAreaWidth) {
- w = scrollX + drawAreaWidth - x;
- }
- if (y < scrollY) {
- h -= scrollY - y;
- y = scrollY;
- }
- if (y + h > scrollY + drawAreaHeight) {
- h = scrollY + drawAreaHeight - y;
- }
-
- // create a GC for the drawing area
- drawAreaWin = XtWindow(drawArea);
- if (!drawAreaGC) {
- gcValues.foreground = paperColor;
- drawAreaGC = XCreateGC(display, drawAreaWin, GCForeground, &gcValues);
- }
-
- // draw white background past the edges of the document
- if (x + w > out->getBitmapWidth()) {
- XFillRectangle(display, drawAreaWin, drawAreaGC,
- out->getBitmapWidth() - scrollX, y - scrollY,
- x + w - out->getBitmapWidth(), h);
- w = out->getBitmapWidth() - x;
- }
- if (y + h > out->getBitmapHeight()) {
- XFillRectangle(display, drawAreaWin, drawAreaGC,
- x - scrollX, out->getBitmapHeight() - scrollY,
- w, y + h - out->getBitmapHeight());
- h = out->getBitmapHeight() - y;
- }
-
- // redraw
- if (w >= 0 && h >= 0) {
- out->redraw(x, y, drawAreaWin, drawAreaGC, x - scrollX, y - scrollY, w, h);
- }
-}
-
-void XPDFCore::updateScrollBars() {
- Arg args[20];
- int n;
- int maxPos;
-
- maxPos = out ? out->getBitmapWidth() : 1;
- if (maxPos < drawAreaWidth) {
- maxPos = drawAreaWidth;
- }
- if (scrollX > maxPos - drawAreaWidth) {
- scrollX = maxPos - drawAreaWidth;
- }
- n = 0;
- XtSetArg(args[n], XmNvalue, scrollX); ++n;
- XtSetArg(args[n], XmNmaximum, maxPos); ++n;
- XtSetArg(args[n], XmNsliderSize, drawAreaWidth); ++n;
- XtSetArg(args[n], XmNincrement, 16); ++n;
- XtSetArg(args[n], XmNpageIncrement, drawAreaWidth); ++n;
- XtSetValues(hScrollBar, args, n);
-
- maxPos = out ? out->getBitmapHeight() : 1;
- if (maxPos < drawAreaHeight) {
- maxPos = drawAreaHeight;
- }
- if (scrollY > maxPos - drawAreaHeight) {
- scrollY = maxPos - drawAreaHeight;
- }
- n = 0;
- XtSetArg(args[n], XmNvalue, scrollY); ++n;
- XtSetArg(args[n], XmNmaximum, maxPos); ++n;
- XtSetArg(args[n], XmNsliderSize, drawAreaHeight); ++n;
- XtSetArg(args[n], XmNincrement, 16); ++n;
- XtSetArg(args[n], XmNpageIncrement, drawAreaHeight); ++n;
- XtSetValues(vScrollBar, args, n);
-}
-
-void XPDFCore::setCursor(Cursor cursor) {
- Window topWin;
-
- if (cursor == currentCursor) {
- return;
- }
- if (!(topWin = XtWindow(shell))) {
- return;
- }
- if (cursor == None) {
- XUndefineCursor(display, topWin);
- } else {
- XDefineCursor(display, topWin, cursor);
- }
- XFlush(display);
- currentCursor = cursor;
-}
-
-GBool XPDFCore::doQuestionDialog(char *title, GString *msg) {
- return doDialog(XmDIALOG_QUESTION, gTrue, title, msg);
-}
-
-void XPDFCore::doInfoDialog(char *title, GString *msg) {
- doDialog(XmDIALOG_INFORMATION, gFalse, title, msg);
-}
-
-void XPDFCore::doErrorDialog(char *title, GString *msg) {
- doDialog(XmDIALOG_ERROR, gFalse, title, msg);
-}
-
-GBool XPDFCore::doDialog(int type, GBool hasCancel,
- char *title, GString *msg) {
- Widget dialog, scroll, text;
- XtAppContext appContext;
- Arg args[20];
- int n;
- XmString s1, s2;
- XEvent event;
-
- n = 0;
- XtSetArg(args[n], XmNdialogType, type); ++n;
- XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
- s1 = XmStringCreateLocalized(title);
- XtSetArg(args[n], XmNdialogTitle, s1); ++n;
- s2 = NULL; // make gcc happy
- if (msg->getLength() <= 80) {
- s2 = XmStringCreateLocalized(msg->getCString());
- XtSetArg(args[n], XmNmessageString, s2); ++n;
- }
- dialog = XmCreateMessageDialog(drawArea, "questionDialog", args, n);
- XmStringFree(s1);
- if (msg->getLength() <= 80) {
- XmStringFree(s2);
- } else {
- n = 0;
- XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n;
- if (drawAreaWidth > 300) {
- XtSetArg(args[n], XmNwidth, drawAreaWidth - 100); ++n;
- }
- scroll = XmCreateScrolledWindow(dialog, "scroll", args, n);
- XtManageChild(scroll);
- n = 0;
- XtSetArg(args[n], XmNeditable, False); ++n;
- XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); ++n;
- XtSetArg(args[n], XmNvalue, msg->getCString()); ++n;
- XtSetArg(args[n], XmNshadowThickness, 0); ++n;
- text = XmCreateText(scroll, "text", args, n);
- XtManageChild(text);
- }
- XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_HELP_BUTTON));
- XtAddCallback(dialog, XmNokCallback,
- &dialogOkCbk, (XtPointer)this);
- if (hasCancel) {
- XtAddCallback(dialog, XmNcancelCallback,
- &dialogCancelCbk, (XtPointer)this);
- } else {
- XtUnmanageChild(XmMessageBoxGetChild(dialog, XmDIALOG_CANCEL_BUTTON));
- }
-
- XtManageChild(dialog);
-
- appContext = XtWidgetToApplicationContext(dialog);
- dialogDone = 0;
- do {
- XtAppNextEvent(appContext, &event);
- XtDispatchEvent(&event);
- } while (!dialogDone);
-
- XtUnmanageChild(dialog);
- XtDestroyWidget(dialog);
-
- return dialogDone > 0;
-}
-
-void XPDFCore::dialogOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
-
- core->dialogDone = 1;
-}
-
-void XPDFCore::dialogCancelCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFCore *core = (XPDFCore *)ptr;
-
- core->dialogDone = -1;
-}
diff --git a/pdf/xpdf/XPDFCore.h b/pdf/xpdf/XPDFCore.h
deleted file mode 100644
index 59fc19c..0000000
--- a/pdf/xpdf/XPDFCore.h
+++ /dev/null
@@ -1,303 +0,0 @@
-//========================================================================
-//
-// XPDFCore.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XPDFCORE_H
-#define XPDFCORE_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#define Object XtObject
-#include <Xm/XmAll.h>
-#undef Object
-#include <aconf.h>
-#include "gtypes.h"
-#include "gfile.h" // for time_t
-#include "SplashTypes.h"
-
-class GString;
-class GList;
-class BaseStream;
-class PDFDoc;
-class LinkAction;
-class LinkDest;
-class XSplashOutputDev;
-
-//------------------------------------------------------------------------
-// zoom factor
-//------------------------------------------------------------------------
-
-#define zoomPage -1
-#define zoomWidth -2
-#define defZoom 125
-
-//------------------------------------------------------------------------
-// XPDFHistory
-//------------------------------------------------------------------------
-
-struct XPDFHistory {
- GString *fileName;
- int page;
-};
-
-#define xpdfHistorySize 50
-
-//------------------------------------------------------------------------
-// XPDFRegion
-//------------------------------------------------------------------------
-
-struct XPDFRegion {
- int page;
- double xMin, yMin, xMax, yMax;
- SplashRGB8 color;
- SplashRGB8 selectColor;
- GBool selectable;
-};
-
-//------------------------------------------------------------------------
-// callbacks
-//------------------------------------------------------------------------
-
-typedef void (*XPDFUpdateCbk)(void *data, GString *fileName,
- int pageNum, int numPages, char *linkLabel);
-
-typedef void (*XPDFActionCbk)(void *data, char *action);
-
-typedef void (*XPDFKeyPressCbk)(void *data, char *s, KeySym key,
- Guint modifiers);
-
-typedef void (*XPDFMouseCbk)(void *data, XEvent *event);
-
-typedef GString *(*XPDFReqPasswordCbk)(void *data, GBool again);
-
-//------------------------------------------------------------------------
-// XPDFCore
-//------------------------------------------------------------------------
-
-class XPDFCore {
-public:
-
- // Create viewer core inside <parentWidgetA>.
- XPDFCore(Widget shellA, Widget parentWidgetA,
- SplashRGB8 paperColorA, GBool fullScreenA,
- GBool reverseVideo, GBool installCmap, int rgbCubeSize);
-
- ~XPDFCore();
-
- //----- loadFile / displayPage / displayDest
-
- // Load a new file. Returns pdfOk or error code.
- int loadFile(GString *fileName, GString *ownerPassword = NULL,
- GString *userPassword = NULL);
-
- // Load a new file, via a Stream instead of a file name. Returns
- // pdfOk or error code.
- int loadFile(BaseStream *stream, GString *ownerPassword = NULL,
- GString *userPassword = NULL);
-
- // Resize the window to fit page <pg> of the current document.
- void resizeToPage(int pg);
-
- // Clear out the current document, if any.
- void clear();
-
- // Display (or redisplay) the specified page. If <scrollToTop> is
- // set, the window is vertically scrolled to the top; otherwise, no
- // scrolling is done. If <addToHist> is set, this page change is
- // added to the history list.
- void displayPage(int pageA, double zoomA, int rotateA,
- GBool scrollToTop, GBool addToHist);
-
- // Display a link destination.
- void displayDest(LinkDest *dest, double zoomA, int rotateA,
- GBool addToHist);
-
- //----- page/position changes
-
- void gotoNextPage(int inc, GBool top);
- void gotoPrevPage(int dec, GBool top, GBool bottom);
- void goForward();
- void goBackward();
- void scrollLeft(int nCols = 1);
- void scrollRight(int nCols = 1);
- void scrollUp(int nLines = 1);
- void scrollDown(int nLines = 1);
- void scrollPageUp();
- void scrollPageDown();
- void scrollTo(int x, int y);
-
- //----- selection
-
- void setSelection(int newXMin, int newYMin, int newXMax, int newYMax);
- void moveSelection(int mx, int my);
- void copySelection();
- GBool getSelection(int *xMin, int *yMin, int *xMax, int *yMax);
- GString *extractText(int xMin, int yMin, int xMax, int yMax);
- GString *extractText(int pageNum, int xMin, int yMin, int xMax, int yMax);
-
- //----- hyperlinks
-
- void doAction(LinkAction *action);
-
-
- //----- find
-
- void find(char *s, GBool next = gFalse);
-
- //----- simple modal dialogs
-
- GBool doQuestionDialog(char *title, GString *msg);
- void doInfoDialog(char *title, GString *msg);
- void doErrorDialog(char *title, GString *msg);
-
- //----- misc access
-
- Widget getWidget() { return scrolledWin; }
- Widget getDrawAreaWidget() { return drawArea; }
- PDFDoc *getDoc() { return doc; }
- XSplashOutputDev *getOutputDev() { return out; }
- int getPageNum() { return page; }
- double getZoom() { return zoom; }
- double getZoomDPI() { return dpi; }
- int getRotate() { return rotate; }
- GBool canGoBack() { return historyBLen > 1; }
- GBool canGoForward() { return historyFLen > 0; }
- int getScrollX() { return scrollX; }
- int getScrollY() { return scrollY; }
- int getDrawAreaWidth() { return drawAreaWidth; }
- int getDrawAreaHeight() { return drawAreaHeight; }
- void setBusyCursor(GBool busy);
- Cursor getBusyCursor() { return busyCursor; }
- void takeFocus();
- void enableHyperlinks(GBool on) { hyperlinksEnabled = on; }
- void enableSelect(GBool on) { selectEnabled = on; }
- void setUpdateCbk(XPDFUpdateCbk cbk, void *data)
- { updateCbk = cbk; updateCbkData = data; }
- void setActionCbk(XPDFActionCbk cbk, void *data)
- { actionCbk = cbk; actionCbkData = data; }
- void setKeyPressCbk(XPDFKeyPressCbk cbk, void *data)
- { keyPressCbk = cbk; keyPressCbkData = data; }
- void setMouseCbk(XPDFMouseCbk cbk, void *data)
- { mouseCbk = cbk; mouseCbkData = data; }
- void setReqPasswordCbk(XPDFReqPasswordCbk cbk, void *data)
- { reqPasswordCbk = cbk; reqPasswordCbkData = data; }
-
-private:
-
- //----- hyperlinks
- GBool doLink(int mx, int my);
- void runCommand(GString *cmdFmt, GString *arg);
- GString *mungeURL(GString *url);
-
- //----- selection
- static Boolean convertSelectionCbk(Widget widget, Atom *selection,
- Atom *target, Atom *type,
- XtPointer *value, unsigned long *length,
- int *format);
-
-
- //----- GUI code
- void initWindow();
- static void hScrollChangeCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void hScrollDragCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void vScrollChangeCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void vScrollDragCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void resizeCbk(Widget widget, XtPointer ptr, XtPointer callData);
- static void redrawCbk(Widget widget, XtPointer ptr, XtPointer callData);
- static void outputDevRedrawCbk(void *data);
- static void inputCbk(Widget widget, XtPointer ptr, XtPointer callData);
- void keyPress(char *s, KeySym key, Guint modifiers);
- void redrawRectangle(int x, int y, int w, int h);
- void updateScrollBars();
- void setCursor(Cursor cursor);
- GBool doDialog(int type, GBool hasCancel,
- char *title, GString *msg);
- static void dialogOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void dialogCancelCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-
- SplashRGB8 paperColor;
- GBool fullScreen;
-
- Display *display;
- int screenNum;
- Visual *visual;
- Colormap colormap;
- Widget shell; // top-level shell containing the widget
- Widget parentWidget; // parent widget (not created by XPDFCore)
- Widget scrolledWin;
- Widget hScrollBar;
- Widget vScrollBar;
- Widget drawAreaFrame;
- Widget drawArea;
- Cursor busyCursor, linkCursor, selectCursor;
- Cursor currentCursor;
- GC drawAreaGC; // GC for blitting into drawArea
-
- int drawAreaWidth, drawAreaHeight;
- int scrollX, scrollY; // current upper-left corner
-
- int selectXMin, selectYMin, // coordinates of current selection:
- selectXMax, selectYMax; // (xMin==xMax || yMin==yMax) means there
- // is no selection
- GBool dragging; // set while selection is being dragged
- GBool lastDragLeft; // last dragged selection edge was left/right
- GBool lastDragTop; // last dragged selection edge was top/bottom
- static GString *currentSelection; // selected text
- static XPDFCore *currentSelectionOwner;
- static Atom targetsAtom;
-
- GBool panning;
- int panMX, panMY;
-
- XPDFHistory // page history queue
- history[xpdfHistorySize];
- int historyCur; // currently displayed page
- int historyBLen; // number of valid entries backward from
- // current entry
- int historyFLen; // number of valid entries forward from
- // current entry
-
- PDFDoc *doc; // current PDF file
- int page; // current page number
- double zoom; // current zoom level, in percent of 72 dpi
- double dpi; // current zoom level, in DPI
- int rotate; // current page rotation
- time_t modTime; // last modification time of PDF file
-
- LinkAction *linkAction; // mouse cursor is over this link
-
-
- XPDFUpdateCbk updateCbk;
- void *updateCbkData;
- XPDFActionCbk actionCbk;
- void *actionCbkData;
- XPDFKeyPressCbk keyPressCbk;
- void *keyPressCbkData;
- XPDFMouseCbk mouseCbk;
- void *mouseCbkData;
- XPDFReqPasswordCbk reqPasswordCbk;
- void *reqPasswordCbkData;
-
- GBool hyperlinksEnabled;
- GBool selectEnabled;
-
- XSplashOutputDev *out;
-
- int dialogDone;
-};
-
-#endif
diff --git a/pdf/xpdf/XPDFTree.cc b/pdf/xpdf/XPDFTree.cc
deleted file mode 100644
index 720197f..0000000
--- a/pdf/xpdf/XPDFTree.cc
+++ /dev/null
@@ -1,931 +0,0 @@
-//========================================================================
-//
-// XPDFTree.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <stdlib.h>
-#include "gmem.h"
-#include "XPDFTreeP.h"
-
-//------------------------------------------------------------------------
-
-#define xpdfTreeIndent 16
-
-//------------------------------------------------------------------------
-
-struct _XPDFTreeEntry {
- Widget widget;
- XPDFTreeEntry *children;
- XPDFTreeEntry *next;
-};
-
-//------------------------------------------------------------------------
-
-static void classPartInitialize(WidgetClass widgetClass);
-static void initialize(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void destroy(Widget widget);
-static void destroySubtree(XPDFTreeEntry *e);
-static void resize(Widget widget);
-static void redisplay(Widget widget, XEvent *event, Region region);
-static void redisplaySubtree(XPDFTreeWidget w, XPDFTreeEntry *e,
- XEvent *event, Region region);
-static void drawExpandedIcon(XPDFTreeWidget w, Position x, Position y);
-static void drawCollapsedIcon(XPDFTreeWidget w, Position x, Position y);
-static Boolean setValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget, ArgList args, Cardinal *numArgs);
-static void setValuesAlmost(Widget oldWidget, Widget newWidget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static XtGeometryResult queryGeometry(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static XtGeometryResult geometryManager(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply);
-static void changeManaged(Widget widget);
-static void initConstraint(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void destroyConstraint(Widget widget);
-static void deleteSubtree(Widget widget);
-static Boolean constraintSetValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget,
- ArgList args, Cardinal *numArgs);
-static void insertChildOnList(XPDFTreeEntry *e, XPDFTreeEntry **listHead);
-static void deleteChildFromList(XPDFTreeEntry *e, XPDFTreeEntry **listHead);
-static void createGC(Widget widget);
-static void destroyGC(Widget widget);
-static void layout(Widget widget, Widget instigator);
-static int layoutSubtree(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e, Position x, Position y,
- Boolean visible);
-static void calcSize(Widget widget, Widget instigator,
- Dimension *totalWidth,
- Dimension *totalHeight);
-static void calcSubtreeSize(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e,
- Dimension *width, Dimension *height);
-static Boolean needRelayout(Widget oldWidget, Widget newWidget);
-static void click(Widget widget, XEvent *event,
- String *params, Cardinal *numParams);
-static Boolean findPosition(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e, Boolean *onExpandIcon);
-static Boolean findPositionInSubtree(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e,
- Boolean *onExpandIcon);
-
-//------------------------------------------------------------------------
-
-static XtResource resources[] = {
- { XmNmarginWidth, XmCMarginWidth, XmRHorizontalDimension,
- sizeof(Dimension), XtOffsetOf(XPDFTreeRec, tree.marginWidth),
- XmRImmediate, (XtPointer)0 },
- { XmNmarginHeight, XmCMarginHeight, XmRVerticalDimension,
- sizeof(Dimension), XtOffsetOf(XPDFTreeRec, tree.marginHeight),
- XmRImmediate, (XtPointer)0 },
- { XPDFNselectionCallback, XmCCallback, XmRCallback,
- sizeof(XtCallbackList), XtOffsetOf(XPDFTreeRec, tree.selectCallback),
- XmRImmediate, (XtPointer)NULL }
-};
-
-static XmSyntheticResource synResources[] = {
- { XmNmarginWidth, sizeof(Dimension),
- XtOffsetOf(XPDFTreeRec, tree.marginWidth),
-#if XmVERSION > 1
- XmeFromHorizontalPixels, XmeToHorizontalPixels
-#else
- _XmFromHorizontalPixels, _XmToHorizontalPixels
-#endif
- },
- { XmNmarginHeight, sizeof(Dimension),
- XtOffsetOf(XPDFTreeRec, tree.marginHeight),
-#if XmVERSION > 1
- XmeFromVerticalPixels, XmeToVerticalPixels
-#else
- _XmFromVerticalPixels, _XmToVerticalPixels
-#endif
- }
-};
-
-static XtResource constraints[] = {
- { XPDFNentryParent, XPDFCentryParent, XmRWidget,
- sizeof(Widget), XtOffsetOf(XPDFTreeConstraintRec, tree.entryParent),
- XmRImmediate, (XtPointer)NULL },
- { XPDFNentryExpanded, XPDFCentryExpanded, XmRBoolean,
- sizeof(Boolean), XtOffsetOf(XPDFTreeConstraintRec, tree.entryExpanded),
- XmRImmediate, (XtPointer)False },
- { XPDFNentryPosition, XPDFCentryPosition, XmRInt,
- sizeof(int), XtOffsetOf(XPDFTreeConstraintRec, tree.entryPosition),
- XmRImmediate, (XtPointer)0 }
-};
-
-static char defaultTranslations[] =
- "<Btn1Down>: XPDFTreeClick()";
-
-static XtActionsRec actions[] = {
- { "XPDFTreeClick", click }
-};
-
-externaldef(xpdftreeclassrec) XPDFTreeClassRec xpdfTreeClassRec = {
- { // Core
- (WidgetClass)&xmManagerClassRec, // superclass
- "XPDFTree", // class_name
- sizeof(XPDFTreeRec), // widget_size
- NULL, // class_initialize
- &classPartInitialize, // class_part_initialize
- FALSE, // class_inited
- &initialize, // initialize
- NULL, // initialize_hook
- XtInheritRealize, // realize
- actions, // actions
- XtNumber(actions), // num_actions
- resources, // resources
- XtNumber(resources), // num_resources
- NULLQUARK, // xrm_class
- TRUE, // compress_motion
- XtExposeCompressMaximal, // compress_exposure
- TRUE, // compress_enterleave
- FALSE, // visible_interest
- &destroy, // destroy
- &resize, // resize
- &redisplay, // expose
- &setValues, // set_values
- NULL, // set_values_hook
- &setValuesAlmost, // set_values_almost
- NULL, // get_values_hook
- NULL, // accept_focus
- XtVersion, // version
- NULL, // callback_private
- defaultTranslations, // tm_table
- &queryGeometry, // query_geometry
- NULL, // display_accelerator
- NULL // extension
- },
- { // Composite
- &geometryManager, // geometry_manager
- &changeManaged, // change_managed
- XtInheritInsertChild, // insert_child
- XtInheritDeleteChild, // delete_child
- NULL // extension
- },
- { // Constraint
- constraints, // constraint_resources
- XtNumber(constraints), // constraint_num_resources
- sizeof(XPDFTreeConstraintRec), // constraint_size
- &initConstraint, // constraint_initialize
- &destroyConstraint, // constraint_destroy
- &constraintSetValues, // constraint_set_values
- NULL // extension
- },
- { // XmManager
- XtInheritTranslations, // translations
-#if XmVERSION > 1
- synResources, // syn_resources
- XtNumber(synResources), // num_syn_resources
-#else
- NULL, // syn_resources
- 0, // num_syn_resources
-#endif
- NULL, // syn_constraint_resources
- 0, // num_syn_constraint_res's
- XmInheritParentProcess, // parent_process
- NULL // extension
- },
- { // XPDFTree
- &createGC, // createGC
- &destroyGC, // destroyGC
- &layout, // layout
- &calcSize, // calcSize
- &needRelayout, // needRelayout
- NULL // extension
- }
-};
-
-externaldef(xpdftreewidgetclass) WidgetClass xpdfTreeWidgetClass =
- (WidgetClass)&xpdfTreeClassRec;
-
-//------------------------------------------------------------------------
-
-static void classPartInitialize(WidgetClass widgetCls) {
- XPDFTreeWidgetClass wc = (XPDFTreeWidgetClass)widgetCls;
- XPDFTreeWidgetClass sc = (XPDFTreeWidgetClass)wc->coreClass.superclass;
-
- // method inheritance
- if (wc->treeClass.createGC == XPDFInheritCreateGC) {
- wc->treeClass.createGC = sc->treeClass.createGC;
- }
- if (wc->treeClass.destroyGC == XPDFInheritDestroyGC) {
- wc->treeClass.destroyGC = sc->treeClass.destroyGC;
- }
- if (wc->treeClass.layout == XPDFInheritLayout) {
- wc->treeClass.layout = sc->treeClass.layout;
- }
- if (wc->treeClass.calcSize == XPDFInheritCalcSize) {
- wc->treeClass.calcSize = sc->treeClass.calcSize;
- }
- if (wc->treeClass.needRelayout == XPDFInheritNeedRelayout) {
- wc->treeClass.needRelayout = sc->treeClass.needRelayout;
- }
-}
-
-static void initialize(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(newWidget);
-
- nw->tree.root = NULL;
- nw->tree.redrawY = -1;
- if (cls->treeClass.createGC) {
- (*cls->treeClass.createGC)(newWidget);
- } else {
- createGC(newWidget);
- }
-}
-
-static void destroy(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (w->tree.root) {
- destroySubtree(w->tree.root);
- w->tree.root = NULL;
- }
- if (cls->treeClass.destroyGC) {
- (*cls->treeClass.destroyGC)(widget);
- } else {
- destroyGC(widget);
- }
-}
-
-static void destroySubtree(XPDFTreeEntry *e) {
- if (e->children) {
- destroySubtree(e->children);
- }
- if (e->next) {
- destroySubtree(e->next);
- }
-}
-
-static void resize(Widget widget) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(widget, NULL);
- } else {
- layout(widget, NULL);
- }
-}
-
-static void redisplay(Widget widget, XEvent *event, Region region) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
-
- if (w->tree.redrawY >= 0) {
- XClearArea(XtDisplay((Widget)w), XtWindow((Widget)w),
- 0, w->tree.redrawY, w->core.width, w->core.height, False);
- w->tree.redrawY = -1;
- }
- for (e = w->tree.root; e; e = e->next) {
- redisplaySubtree(w, e, event, region);
- }
-}
-
-static void redisplaySubtree(XPDFTreeWidget w, XPDFTreeEntry *e,
- XEvent *event, Region region) {
- XPDFTreeConstraint c;
- Position x, y, y2;
- XPDFTreeEntry *child;
-
- (*XtClass(e->widget)->core_class.expose)(e->widget, event, region);
- c = XPDFTreeCPart(e->widget);
- x = e->widget->core.x;
- y = e->widget->core.y + e->widget->core.height / 2;
- if (e->children) {
- if (c->entryExpanded) {
- drawExpandedIcon(w, x - 8, y);
- y2 = y; // make gcc happy
- for (child = e->children; child; child = child->next) {
- y2 = child->widget->core.y + child->widget->core.height / 2;
- XDrawLine(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.dottedGC,
- x - 8, y2, x + 6, y2);
- redisplaySubtree(w, child, event, region);
- }
- XDrawLine(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.dottedGC,
- x - 8, y + 2, x - 8, y2);
- } else {
- drawCollapsedIcon(w, x - 8, y);
- }
- }
-}
-
-static void drawExpandedIcon(XPDFTreeWidget w, Position x, Position y) {
- XPoint pts[4];
-
- pts[0].x = x - 4; pts[0].y = y - 2;
- pts[1].x = x + 4; pts[1].y = y - 2;
- pts[2].x = x; pts[2].y = y + 2;
- pts[3].x = x - 4; pts[3].y = y - 2;
- XDrawLines(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.plainGC,
- pts, 4, CoordModeOrigin);
-}
-
-static void drawCollapsedIcon(XPDFTreeWidget w, Position x, Position y) {
- XPoint pts[4];
-
- pts[0].x = x - 2; pts[0].y = y - 4;
- pts[1].x = x - 2; pts[1].y = y + 4;
- pts[2].x = x + 2; pts[2].y = y;
- pts[3].x = x - 2; pts[3].y = y - 4;
- XDrawLines(XtDisplay((Widget)w), XtWindow((Widget)w), w->tree.plainGC,
- pts, 4, CoordModeOrigin);
-}
-
-static Boolean setValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget, ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget ow = (XPDFTreeWidget)oldWidget;
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(nw);
- Boolean relayout, redisp;
-
- // check to see if layout-affecting resources have changed
- if (cls->treeClass.needRelayout) {
- relayout = (*cls->treeClass.needRelayout)((Widget)ow, (Widget)nw);
- } else {
- relayout = needRelayout((Widget)ow, (Widget)nw);
- }
- redisp = False;
- if (relayout) {
-
- // calculate a new ideal size (reset the widget size first so
- // calcSize will compute a new one)
- if (nw->core.width == ow->core.width) {
- nw->core.width = 0;
- }
- if (nw->core.height == ow->core.height) {
- nw->core.height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)nw, NULL,
- &nw->core.width, &nw->core.height);
- } else {
- calcSize((Widget)nw, NULL, &nw->core.width, &nw->core.height);
- }
-
- // if resources have changed but size hasn't, layout manually
- // (because Xt just looks at the size)
- if (nw->core.width == ow->core.width &&
- nw->core.height == ow->core.height) {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)nw, NULL);
- } else {
- layout((Widget)nw, NULL);
- }
- redisp = True;
- }
- }
-
- return redisp;
-}
-
-static void setValuesAlmost(Widget oldWidget, Widget newWidget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(newWidget);
-
- // our parent rejected a geometry request, so accept the compromise
- // and relayout
- if (!reply->request_mode) {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(newWidget, NULL);
- } else {
- layout(newWidget, NULL);
- }
- }
- *request = *reply;
-}
-
-static XtGeometryResult queryGeometry(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- if (!XtIsRealized(widget)) {
- reply->width = XtWidth(widget);
- reply->height = XtHeight(widget);
- } else {
- reply->width = 0;
- reply->height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)(widget, NULL, &reply->width, &reply->height);
- } else {
- calcSize(widget, NULL, &reply->width, &reply->height);
- }
-#if XmVERSION > 1
- return XmeReplyToQueryGeometry(widget, request, reply);
-#else
- if ((request->request_mode & CWWidth) &&
- (request->request_mode & CWHeight) &&
- request->width == reply->width &&
- request->height == reply->height) {
- return XtGeometryYes;
- }
- if (reply->width == XtWidth(widget) &&
- reply->height == XtHeight(widget)) {
- return XtGeometryNo;
- }
- reply->request_mode = CWWidth | CWHeight;
- return XtGeometryAlmost;
-#endif
-}
-
-static XtGeometryResult geometryManager(Widget widget,
- XtWidgetGeometry *request,
- XtWidgetGeometry *reply) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(widget);
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(w);
- Dimension curWidth, curHeight, curBW;
- XtWidgetGeometry parentReq;
- XtGeometryResult result;
-
- // deny any requests for a new position
- if ((request->request_mode & CWX) || (request->request_mode & CWY)) {
- return XtGeometryNo;
- }
-
- // save the current geometry
- curWidth = w->core.width;
- curHeight = w->core.height;
- curBW = w->core.border_width;
-
- // make the requested changes
- if (request->request_mode & CWWidth) {
- w->core.width = request->width;
- }
- if (request->request_mode & CWHeight) {
- w->core.height = request->height;
- }
- if (request->request_mode & CWBorderWidth) {
- w->core.border_width = request->border_width;
- }
-
- // calculate the new ideal size
- parentReq.width = 0;
- parentReq.height = 0;
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)w, widget,
- &parentReq.width, &reply->height);
- } else {
- calcSize((Widget)w, widget, &parentReq.width, &reply->height);
- }
-
- // send geometry request to our parent
- parentReq.request_mode = CWWidth | CWHeight;
- if (request->request_mode & XtCWQueryOnly) {
- parentReq.request_mode |= XtCWQueryOnly;
- }
- result = XtMakeGeometryRequest((Widget)w, &parentReq, NULL);
- if (result == XtGeometryAlmost) {
- result = XtGeometryNo;
- }
-
- if (result == XtGeometryNo || (request->request_mode & XtCWQueryOnly)) {
- // restore the original geometry
- w->core.width = curWidth;
- w->core.height = curHeight;
- w->core.border_width = curBW;
- } else {
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)w, widget);
- } else {
- layout((Widget)w, widget);
- }
- }
-
- return result;
-}
-
-static void changeManaged(Widget widget) {
- Dimension width, height;
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass(widget);
-
- // compute the ideal size
- if (!XtIsRealized(widget)) {
- width = XtWidth(widget);
- height = XtHeight(widget);
- } else {
- width = 0;
- height = 0;
- }
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)(widget, NULL, &width, &height);
- } else {
- calcSize(widget, NULL, &width, &height);
- }
-
- // make resize request to parent -- keep asking until we get a yes
- // or no
- while (XtMakeResizeRequest(widget, width, height, &width, &height)
- == XtGeometryAlmost) ;
-
- // relayout
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)(widget, NULL);
- } else {
- layout(widget, NULL);
- }
-
-#if XmVERSION > 1
- // update keyboard traversal
- XmeNavigChangeManaged(widget);
-#else
- _XmNavigChangeManaged(widget);
-#endif
-}
-
-static void initConstraint(Widget requestWidget, Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(newWidget);
- XPDFTreeConstraint c;
-
- c = XPDFTreeCPart(newWidget);
- c->e = (XPDFTreeEntry *)gmalloc(sizeof(XPDFTreeEntry));
- c->e->widget = newWidget;
- c->e->children = NULL;
- c->e->next = NULL;
- if (c->entryParent) {
- insertChildOnList(c->e, &XPDFTreeCPart(c->entryParent)->e->children);
- } else {
- insertChildOnList(c->e, &w->tree.root);
- }
-}
-
-static void destroyConstraint(Widget widget) {
- deleteSubtree(widget);
-}
-
-static void deleteSubtree(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(widget);
- XPDFTreeConstraint c;
-
- c = XPDFTreeCPart(widget);
- if (!c->e) {
- return;
- }
- while (c->e->children) {
- deleteSubtree(c->e->children->widget);
- }
- if (c->entryParent) {
- deleteChildFromList(c->e, &XPDFTreeCPart(c->entryParent)->e->children);
- } else {
- deleteChildFromList(c->e, &w->tree.root);
- }
- gfree(c->e);
- c->e = NULL;
-}
-
-static Boolean constraintSetValues(Widget oldWidget, Widget requestWidget,
- Widget newWidget,
- ArgList args, Cardinal *numArgs) {
- XPDFTreeWidget w = (XPDFTreeWidget)XtParent(newWidget);
- XPDFTreeWidgetClass cls = (XPDFTreeWidgetClass)XtClass((Widget)w);
- XPDFTreeConstraint oc, nc;
- Boolean relayout;
- Dimension width, height;
-
- if (!XtIsManaged(newWidget)) {
- return False;
- }
- oc = XPDFTreeCPart(oldWidget);
- nc = XPDFTreeCPart(newWidget);
- relayout = False;
- if (nc->entryParent != oc->entryParent ||
- nc->entryPosition != oc->entryPosition) {
- if (oc->entryParent) {
- deleteChildFromList(oc->e, &XPDFTreeCPart(oc->entryParent)->e->children);
- } else {
- deleteChildFromList(oc->e, &w->tree.root);
- }
- if (nc->entryParent) {
- insertChildOnList(nc->e, &XPDFTreeCPart(nc->entryParent)->e->children);
- } else {
- insertChildOnList(nc->e, &w->tree.root);
- }
- relayout = True;
- } else if (nc->entryExpanded != oc->entryExpanded) {
- relayout = True;
- }
-
- if (relayout) {
-
- // calculate a new ideal size (reset the widget size first so
- // calcSize will compute a new one)
- width = 0;
- height = 0;
- if (cls->treeClass.calcSize) {
- (*cls->treeClass.calcSize)((Widget)w, NULL, &width, &height);
- } else {
- calcSize((Widget)w, NULL, &width, &height);
- }
-
- // make resize request to parent -- keep asking until we get a yes
- // or no
- while (XtMakeResizeRequest((Widget)w, width, height, &width, &height)
- == XtGeometryAlmost) ;
-
- // relayout the widget
- if (cls->treeClass.layout) {
- (*cls->treeClass.layout)((Widget)w, NULL);
- } else {
- layout((Widget)w, NULL);
- }
- }
-
- return relayout;
-}
-
-static void insertChildOnList(XPDFTreeEntry *e, XPDFTreeEntry **listHead) {
- int pos;
- XPDFTreeEntry *e2;
-
- pos = XPDFTreeCPart(e->widget)->entryPosition;
- if (!*listHead || pos < XPDFTreeCPart((*listHead)->widget)->entryPosition) {
- e->next = *listHead;
- *listHead = e;
- } else {
- for (e2 = *listHead;
- e2->next && pos >= XPDFTreeCPart(e2->next->widget)->entryPosition;
- e2 = e2->next) ;
- e->next = e2->next;
- e2->next = e;
- }
-}
-
-static void deleteChildFromList(XPDFTreeEntry *e, XPDFTreeEntry **listHead) {
- XPDFTreeEntry **p;
-
- for (p = listHead; *p; p = &(*p)->next) {
- if (*p == e) {
- *p = e->next;
- e->next = NULL;
- return;
- }
- }
-}
-
-static void createGC(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XGCValues gcValues;
-
- gcValues.foreground = w->manager.foreground;
- gcValues.line_width = 0;
- gcValues.line_style = LineSolid;
- w->tree.plainGC = XtGetGC(widget,
- GCForeground | GCLineWidth | GCLineStyle,
- &gcValues);
-
- gcValues.line_style = LineOnOffDash;
- gcValues.dashes = 1;
- gcValues.dash_offset = 0;
- w->tree.dottedGC = XtGetGC(widget,
- GCForeground | GCLineWidth | GCLineStyle |
- GCDashList | GCDashOffset,
- &gcValues);
-}
-
-static void destroyGC(Widget widget) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
-
- XtReleaseGC(widget, w->tree.plainGC);
- XtReleaseGC(widget, w->tree.dottedGC);
-}
-
-static void layout(Widget widget, Widget instigator) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
- Position x, y;
-
- x = w->tree.marginWidth + xpdfTreeIndent;
- y = w->tree.marginHeight;
- for (e = w->tree.root; e; e = e->next) {
- y = layoutSubtree(w, instigator, e, x, y, True);
- }
-}
-
-static int layoutSubtree(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e, Position x, Position y,
- Boolean visible) {
- Widget ew;
- XPDFTreeEntry *child;
- XPDFTreeConstraint c;
-
- ew = e->widget;
- if (!XtIsManaged(ew)) {
- return y;
- }
- c = XPDFTreeCPart(ew);
-
- // place this entry
- if (ew) {
- if (visible) {
- if (ew == instigator) {
- ew->core.x = x;
- ew->core.y = y;
- } else {
-#if XmVERSION > 1
- XmeConfigureObject(ew, x, y, ew->core.width, ew->core.height,
- ew->core.border_width);
-#else
- _XmConfigureObject(ew, x, y, ew->core.width, ew->core.height,
- ew->core.border_width);
-#endif
- }
- y += ew->core.height + 2 * ew->core.border_width;
- }
- }
-
- // place this entry's children
- x += xpdfTreeIndent;
- for (child = e->children; child; child = child->next) {
- y = layoutSubtree(w, instigator, child, x, y,
- visible && (!c || c->entryExpanded));
- }
-
- return y;
-}
-
-static void calcSize(Widget widget, Widget instigator,
- Dimension *totalWidth,
- Dimension *totalHeight) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XPDFTreeEntry *e;
- Dimension w1, h1, w2, h2;
-
- w1 = h1 = 0;
- for (e = w->tree.root; e; e = e->next) {
- calcSubtreeSize(w, instigator, e, &w2, &h2);
- if (w2 > w1) {
- w1 = w2;
- }
- h1 += h2;
- }
- w1 += xpdfTreeIndent + 2 * w->tree.marginWidth;
- h1 += 2 * w->tree.marginHeight;
- if (h1 == 0) {
- h1 = 1;
- }
- if (!*totalWidth) {
- *totalWidth = w1;
- }
- if (!*totalHeight) {
- *totalHeight = h1;
- }
-}
-
-static void calcSubtreeSize(XPDFTreeWidget w, Widget instigator,
- XPDFTreeEntry *e,
- Dimension *width, Dimension *height) {
- Widget ew;
- XPDFTreeEntry *child;
- XPDFTreeConstraint c;
- XtWidgetGeometry geom;
- Dimension w1, h1, w2, h2;
-
- ew = e->widget;
- if (!XtIsManaged(ew)) {
- *width = *height = 0;
- return;
- }
- c = XPDFTreeCPart(ew);
-
- // get size of this entry
- if (ew) {
- if (!XtIsManaged(ew)) {
- *width = *height = 0;
- return;
- }
- if (ew == instigator) {
- w1 = ew->core.width;
- h1 = ew->core.height;
- } else {
- XtQueryGeometry(ew, NULL, &geom);
- w1 = (geom.request_mode & CWWidth) ? geom.width : ew->core.width;
- h1 = (geom.request_mode & CWHeight) ? geom.height : ew->core.height;
- }
- h1 += 2 * ew->core.border_width;
- } else {
- // root of tree
- w1 = 0;
- h1 = 0;
- }
-
- // if this entry is expanded, get size of all of its children
- if (c->entryExpanded) {
- for (child = e->children; child; child = child->next) {
- calcSubtreeSize(w, instigator, child, &w2, &h2);
- w2 += xpdfTreeIndent;
- if (w2 > w1) {
- w1 = w2;
- }
- h1 += h2;
- }
- }
-
- *width = w1;
- *height = h1;
-}
-
-static Boolean needRelayout(Widget oldWidget, Widget newWidget) {
- XPDFTreeWidget ow = (XPDFTreeWidget)oldWidget;
- XPDFTreeWidget nw = (XPDFTreeWidget)newWidget;
-
- if (nw->tree.marginWidth != ow->tree.marginWidth ||
- nw->tree.marginHeight != ow->tree.marginHeight) {
- return True;
- }
- return False;
-}
-
-static void click(Widget widget, XEvent *event,
- String *params, Cardinal *numParams) {
- XPDFTreeWidget w = (XPDFTreeWidget)widget;
- XButtonPressedEvent *bpe;
- XPDFTreeEntry *e;
- Boolean onExpandIcon;
- XPDFTreeConstraint c;
- XPDFTreeSelectCallbackStruct cbs;
-
- if (event->type != ButtonPress) {
- return;
- }
- bpe = (XButtonPressedEvent *)event;
- if (findPosition(w, bpe->x, bpe->y, &e, &onExpandIcon)) {
- if (onExpandIcon) {
- c = XPDFTreeCPart(e->widget);
- w->tree.redrawY = e->widget->core.y;
- XtVaSetValues(e->widget, XPDFNentryExpanded, !c->entryExpanded, NULL);
- } else {
- XmProcessTraversal(e->widget, XmTRAVERSE_CURRENT);
- XtCallActionProc(widget, "ManagerGadgetActivate", event, NULL, 0);
- cbs.reason = XmCR_ACTIVATE;
- cbs.event = event;
- cbs.selectedItem = e->widget;
- XtCallCallbackList(widget, w->tree.selectCallback, &cbs);
- }
- }
-}
-
-static Boolean findPosition(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e, Boolean *onExpandIcon) {
- XPDFTreeEntry *e2;
-
- for (e2 = w->tree.root; e2; e2 = e2->next) {
- *e = e2;
- if (findPositionInSubtree(w, x, y, e, onExpandIcon)) {
- return True;
- }
- }
- return False;
-}
-
-// If (x,y) falls on either an expand/collapse icon or a label gadget,
-// set *<e> and *<onExpandIcon> and return true.
-static Boolean findPositionInSubtree(XPDFTreeWidget w, int x, int y,
- XPDFTreeEntry **e,
- Boolean *onExpandIcon) {
- Widget child;
- XPDFTreeConstraint c;
- XPDFTreeEntry *e2;
- int y1;
-
- child = (*e)->widget;
- y1 = child->core.y + child->core.height / 2;
- if (x >= child->core.x && x < child->core.x + child->core.width &&
- y >= child->core.y && y < child->core.y + child->core.height) {
- *onExpandIcon = False;
- return True;
- } else if (x >= child->core.x - 16 && x < child->core.x - 4 &&
- y >= y1 - 6 && y < y1 + 6 &&
- (*e)->children) {
- *onExpandIcon = True;
- return True;
- }
- c = XPDFTreeCPart(child);
- if (!c || c->entryExpanded) {
- for (e2 = (*e)->children; e2; e2 = e2->next) {
- *e = e2;
- if (findPositionInSubtree(w, x, y, e, onExpandIcon)) {
- return True;
- }
- }
- }
- return False;
-}
-
-Widget XPDFCreateTree(Widget parent, char *name,
- ArgList argList, Cardinal numArgs) {
- return XtCreateWidget(name, xpdfTreeWidgetClass, parent, argList, numArgs);
-}
diff --git a/pdf/xpdf/XPDFTree.h b/pdf/xpdf/XPDFTree.h
deleted file mode 100644
index 432b4ff..0000000
--- a/pdf/xpdf/XPDFTree.h
+++ /dev/null
@@ -1,45 +0,0 @@
-//========================================================================
-//
-// XPDFTree.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XPDFTREE_H
-#define XPDFTREE_H
-
-#include <Xm/Xm.h>
-
-extern "C" {
-
-externalref WidgetClass xpdfTreeWidgetClass;
-
-typedef struct _XPDFTreeClassRec *XPDFTreeWidgetClass;
-typedef struct _XPDFTreeRec *XPDFTreeWidget;
-
-#ifndef XPDFIsTree
-#define XPDFIsTree(w) XtIsSubclass(w, xpdfTreeWidgetClass)
-#endif
-
-#define XPDFNentryParent "entryParent"
-#define XPDFNentryExpanded "entryExpanded"
-#define XPDFNentryPosition "entryPosition"
-#define XPDFNselectionCallback "selectionCallback"
-
-#define XPDFCentryParent "EntryParent"
-#define XPDFCentryExpanded "EntryExpanded"
-#define XPDFCentryPosition "EntryPosition"
-
-typedef struct {
- int reason;
- XEvent *event;
- Widget selectedItem;
-} XPDFTreeSelectCallbackStruct;
-
-extern Widget XPDFCreateTree(Widget parent, char *name,
- ArgList argList, Cardinal argCount);
-
-} // extern "C"
-
-#endif
diff --git a/pdf/xpdf/XPDFTreeP.h b/pdf/xpdf/XPDFTreeP.h
deleted file mode 100644
index 1d786f4..0000000
--- a/pdf/xpdf/XPDFTreeP.h
+++ /dev/null
@@ -1,87 +0,0 @@
-//========================================================================
-//
-// XPDFTreeP.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XPDFTREEP_H
-#define XPDFTREEP_H
-
-#include <Xm/ManagerP.h>
-#include "XPDFTree.h"
-
-extern "C" {
-
-typedef void (*XPDFLayoutProc)(Widget widget, Widget instigator);
-typedef void (*XPDFCalcSizeProc)(Widget widget, Widget instigator,
- Dimension *totalWidth,
- Dimension *totalHeight);
-typedef Boolean (*XPDFNeedRelayoutProc)(Widget oldWidget, Widget newWidget);
-
-#define XPDFInheritCreateGC ((XtWidgetProc)_XtInherit)
-#define XPDFInheritDestroyGC ((XtWidgetProc)_XtInherit)
-#define XPDFInheritLayout ((XPDFLayoutProc)_XtInherit)
-#define XPDFInheritCalcSize ((XPDFCalcSizeProc)_XtInherit)
-#define XPDFInheritNeedRelayout ((XPDFNeedRelayoutProc)_XtInherit)
-
-typedef struct {
- XtWidgetProc createGC;
- XtWidgetProc destroyGC;
- XPDFLayoutProc layout;
- XPDFCalcSizeProc calcSize;
- XPDFNeedRelayoutProc needRelayout;
- XtPointer extension;
-} XPDFTreeClassPart;
-
-typedef struct _XPDFTreeClassRec {
- CoreClassPart coreClass;
- CompositeClassPart compositeClass;
- ConstraintClassPart constraintClass;
- XmManagerClassPart managerClass;
- XPDFTreeClassPart treeClass;
-} XPDFTreeClassRec;
-
-externalref XPDFTreeClassRec xpdfTreeClassRec;
-
-typedef struct _XPDFTreeEntry XPDFTreeEntry;
-
-typedef struct {
- Dimension marginWidth;
- Dimension marginHeight;
- XtCallbackList selectCallback;
- GC plainGC;
- GC dottedGC;
- XPDFTreeEntry *root;
- int redrawY;
-} XPDFTreePart;
-
-typedef struct _XPDFTreeRec {
- CorePart core;
- CompositePart composite;
- ConstraintPart constraint;
- XmManagerPart manager;
- XPDFTreePart tree;
-} XPDFTreeRec;
-
-#define XPDFTreeIndex (XmManagerIndex + 1)
-
-typedef struct _XPDFTreeConstraintPart {
- Widget entryParent;
- Boolean entryExpanded;
- int entryPosition;
- XPDFTreeEntry *e;
-} XPDFTreeConstraintPart, *XPDFTreeConstraint;
-
-typedef struct _XPDFTreeConstraintRec {
- XmManagerConstraintPart manager;
- XPDFTreeConstraintPart tree;
-} XPDFTreeConstraintRec, *XPDFTreeConstraintPtr;
-
-#define XPDFTreeCPart(w) \
- (&((XPDFTreeConstraintPtr)(w)->core.constraints)->tree)
-
-} // extern "C"
-
-#endif
diff --git a/pdf/xpdf/XPDFViewer.cc b/pdf/xpdf/XPDFViewer.cc
deleted file mode 100644
index a638c02..0000000
--- a/pdf/xpdf/XPDFViewer.cc
+++ /dev/null
@@ -1,2523 +0,0 @@
-//========================================================================
-//
-// XPDFViewer.cc
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <string.h>
-#include <ctype.h>
-#include <X11/cursorfont.h>
-#ifdef HAVE_X11_XPM_H
-#include <X11/xpm.h>
-#endif
-#if defined(__sgi) && (XmVERSION <= 1)
-#define Object XtObject
-#include <Sgm/HPanedW.h>
-#undef Object
-#endif
-#include "gmem.h"
-#include "gfile.h"
-#include "GString.h"
-#include "GList.h"
-#include "Error.h"
-#include "GlobalParams.h"
-#include "PDFDoc.h"
-#include "ErrorCodes.h"
-#include "Outline.h"
-#include "UnicodeMap.h"
-#ifndef DISABLE_OUTLINE
-#define Object XtObject
-#include "XPDFTree.h"
-#undef Object
-#endif
-#include "XPDFApp.h"
-#include "XPDFViewer.h"
-#include "PSOutputDev.h"
-#include "xpdfconfig.h"
-
-// these macro defns conflict with xpdf's Object class
-#ifdef LESSTIF_VERSION
-#undef XtDisplay
-#undef XtScreen
-#undef XtWindow
-#undef XtParent
-#undef XtIsRealized
-#endif
-
-#if XmVERSION <= 1
-#define XmSET True
-#define XmUNSET False
-#endif
-
-//------------------------------------------------------------------------
-// GUI includes
-//------------------------------------------------------------------------
-
-#include "xpdfIcon.xpm"
-#include "leftArrow.xbm"
-#include "leftArrowDis.xbm"
-#include "dblLeftArrow.xbm"
-#include "dblLeftArrowDis.xbm"
-#include "rightArrow.xbm"
-#include "rightArrowDis.xbm"
-#include "dblRightArrow.xbm"
-#include "dblRightArrowDis.xbm"
-#include "backArrow.xbm"
-#include "backArrowDis.xbm"
-#include "forwardArrow.xbm"
-#include "forwardArrowDis.xbm"
-#include "find.xbm"
-#include "findDis.xbm"
-#include "print.xbm"
-#include "printDis.xbm"
-#include "about.xbm"
-#include "about-text.h"
-
-//------------------------------------------------------------------------
-
-struct ZoomMenuInfo {
- char *label;
- double zoom;
-};
-
-static ZoomMenuInfo zoomMenuInfo[nZoomMenuItems] = {
- { "400%", 400 },
- { "200%", 200 },
- { "150%", 150 },
- { "125%", 125 },
- { "100%", 100 },
- { "50%", 50 },
- { "25%", 25 },
- { "12.5%", 12.5 },
- { "fit page", zoomPage },
- { "fit width", zoomWidth }
-};
-
-#define maxZoomIdx 0
-#define defZoomIdx 3
-#define minZoomIdx 7
-#define zoomPageIdx 8
-#define zoomWidthIdx 9
-
-//------------------------------------------------------------------------
-
-XPDFViewer::XPDFViewer(XPDFApp *appA, GString *fileName,
- int pageA, GString *destName,
- GString *ownerPassword, GString *userPassword) {
- LinkDest *dest;
- int pg;
- double z;
- GString *dir;
-
- app = appA;
- win = NULL;
- core = NULL;
- password = NULL;
- ok = gFalse;
-#ifndef DISABLE_OUTLINE
- outlineLabels = NULL;
- outlineLabelsLength = outlineLabelsSize = 0;
-#endif
-
- // do Motif-specific initialization and create the window;
- // this also creates the core object
- initWindow();
- initAboutDialog();
- initOpenDialog();
- initFindDialog();
- initSaveAsDialog();
- initPrintDialog();
- initPasswordDialog();
-
- dest = NULL; // make gcc happy
- pg = pageA; // make gcc happy
-
- if (fileName) {
- if (loadFile(fileName, ownerPassword, userPassword)) {
- getPageAndDest(pageA, destName, &pg, &dest);
-#ifndef DISABLE_OUTLINE
- if (!app->getFullScreen() &&
- core->getDoc()->getOutline()->getItems() &&
- core->getDoc()->getOutline()->getItems()->getLength() > 0) {
- XtVaSetValues(outlineScroll, XmNwidth, 175, NULL);
- }
-#endif
- if (pg > 0) {
- core->resizeToPage(pg);
- }
- dir = makePathAbsolute(grabPath(fileName->getCString()));
- setOpenDialogDir(dir->getCString());
- setSaveAsDialogDir(dir->getCString());
- delete dir;
- } else {
- return;
- }
- }
-
- // map the window -- we do this after calling resizeToPage to avoid
- // an annoying on-screen resize
- mapWindow();
-
- // display the first page
- z = app->getFullScreen() ? zoomPage : core->getZoom();
- if (dest) {
- displayDest(dest, z, core->getRotate(), gTrue);
- delete dest;
- } else {
- displayPage(pg, z, core->getRotate(), gTrue, gTrue);
- }
-
- ok = gTrue;
-}
-
-XPDFViewer::~XPDFViewer() {
- delete core;
- XmFontListFree(aboutBigFont);
- XmFontListFree(aboutVersionFont);
- XmFontListFree(aboutFixedFont);
- closeWindow();
-#ifndef DISABLE_OUTLINE
- if (outlineLabels) {
- gfree(outlineLabels);
- }
-#endif
- if (password) {
- delete password;
- }
-}
-
-void XPDFViewer::open(GString *fileName, int pageA, GString *destName) {
- LinkDest *dest;
- int pg;
- double z;
-
- if (!core->getDoc() || fileName->cmp(core->getDoc()->getFileName())) {
- if (!loadFile(fileName, NULL, NULL)) {
- return;
- }
- }
- getPageAndDest(pageA, destName, &pg, &dest);
- z = app->getFullScreen() ? zoomPage : core->getZoom();
- if (dest) {
- displayDest(dest, z, core->getRotate(), gTrue);
- delete dest;
- } else {
- displayPage(pg, z, core->getRotate(), gTrue, gTrue);
- }
-}
-
-void XPDFViewer::clear() {
- char *title;
- XmString s;
-
- core->clear();
-
- // set up title, number-of-pages display
- title = app->getTitle() ? app->getTitle()->getCString()
- : (char *)xpdfAppName;
- XtVaSetValues(win, XmNtitle, title, XmNiconName, title, NULL);
- s = XmStringCreateLocalized("");
- XtVaSetValues(pageNumText, XmNlabelString, s, NULL);
- XmStringFree(s);
- s = XmStringCreateLocalized(" of 0");
- XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL);
- XmStringFree(s);
-
- // disable buttons
- XtVaSetValues(prevTenPageBtn, XmNsensitive, False, NULL);
- XtVaSetValues(prevPageBtn, XmNsensitive, False, NULL);
- XtVaSetValues(nextTenPageBtn, XmNsensitive, False, NULL);
- XtVaSetValues(nextPageBtn, XmNsensitive, False, NULL);
-
- // remove the old outline
-#ifndef DISABLE_OUTLINE
- setupOutline();
-#endif
-}
-
-//------------------------------------------------------------------------
-// load / display
-//------------------------------------------------------------------------
-
-GBool XPDFViewer::loadFile(GString *fileName, GString *ownerPassword,
- GString *userPassword) {
- return core->loadFile(fileName, ownerPassword, userPassword) == errNone;
-}
-
-void XPDFViewer::reloadFile() {
- int pg;
-
- if (!core->getDoc()) {
- return;
- }
- pg = core->getPageNum();
- loadFile(core->getDoc()->getFileName());
- if (pg > core->getDoc()->getNumPages()) {
- pg = core->getDoc()->getNumPages();
- }
- displayPage(pg, core->getZoom(), core->getRotate(), gFalse, gFalse);
-}
-
-void XPDFViewer::displayPage(int pageA, double zoomA, int rotateA,
- GBool scrollToTop, GBool addToHist) {
- core->displayPage(pageA, zoomA, rotateA, scrollToTop, addToHist);
-}
-
-void XPDFViewer::displayDest(LinkDest *dest, double zoomA, int rotateA,
- GBool addToHist) {
- core->displayDest(dest, zoomA, rotateA, addToHist);
-}
-
-void XPDFViewer::getPageAndDest(int pageA, GString *destName,
- int *pageOut, LinkDest **destOut) {
- Ref pageRef;
-
- // find the page number for a named destination
- *pageOut = pageA;
- *destOut = NULL;
- if (destName && (*destOut = core->getDoc()->findDest(destName))) {
- if ((*destOut)->isPageRef()) {
- pageRef = (*destOut)->getPageRef();
- *pageOut = core->getDoc()->findPage(pageRef.num, pageRef.gen);
- } else {
- *pageOut = (*destOut)->getPageNum();
- }
- }
-
- if (*pageOut <= 0) {
- *pageOut = 1;
- }
- if (*pageOut > core->getDoc()->getNumPages()) {
- *pageOut = core->getDoc()->getNumPages();
- }
-}
-
-//------------------------------------------------------------------------
-// password dialog
-//------------------------------------------------------------------------
-
-GString *XPDFViewer::reqPasswordCbk(void *data, GBool again) {
- XPDFViewer *viewer = (XPDFViewer *)data;
-
- viewer->getPassword(again);
- return viewer->password;
-}
-
-//------------------------------------------------------------------------
-// actions
-//------------------------------------------------------------------------
-
-void XPDFViewer::actionCbk(void *data, char *action) {
- XPDFViewer *viewer = (XPDFViewer *)data;
-
- if (!strcmp(action, "Quit")) {
- viewer->app->quit();
- }
-}
-
-//------------------------------------------------------------------------
-// keyboard/mouse input
-//------------------------------------------------------------------------
-
-void XPDFViewer::keyPressCbk(void *data, char *s, KeySym key,
- Guint modifiers) {
- XPDFViewer *viewer = (XPDFViewer *)data;
- int z;
-
- if (s[0]) {
- switch (s[0]) {
- case 'O':
- case 'o':
- viewer->mapOpenDialog(gFalse);
- break;
- case 'R':
- case 'r':
- viewer->reloadFile();
- break;
- case 'F':
- case 'f':
- case '\006': // ctrl-F
- if (viewer->core->getDoc()) {
- XtManageChild(viewer->findDialog);
- }
- break;
- case '\007': // ctrl-G
- if (viewer->core->getDoc()) {
- viewer->doFind(gTrue);
- }
- break;
- case '\020': // ctrl-P
- if (viewer->core->getDoc()) {
- XtManageChild(viewer->printDialog);
- }
- break;
- case 'N':
- case 'n':
- viewer->core->gotoNextPage(1, !(modifiers & Mod5Mask));
- break;
- case 'P':
- case 'p':
- viewer->core->gotoPrevPage(1, !(modifiers & Mod5Mask), gFalse);
- break;
- case ' ':
- if (viewer->app->getFullScreen()) {
- viewer->core->gotoNextPage(1, gTrue);
- } else {
- viewer->core->scrollPageDown();
- }
- break;
- case '\b': // bs
- case '\177': // del
- if (viewer->app->getFullScreen()) {
- viewer->core->gotoPrevPage(1, gTrue, gFalse);
- } else {
- viewer->core->scrollPageUp();
- }
- break;
- case 'v':
- viewer->core->goForward();
- break;
- case 'b':
- viewer->core->goBackward();
- break;
- case 'g':
- if (!viewer->app->getFullScreen()) {
- XmTextFieldSetSelection(
- viewer->pageNumText, 0,
- strlen(XmTextFieldGetString(viewer->pageNumText)),
- XtLastTimestampProcessed(viewer->display));
- XmProcessTraversal(viewer->pageNumText, XmTRAVERSE_CURRENT);
- }
- break;
- case 'h': // vi-style left
- if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) {
- viewer->core->scrollLeft();
- }
- break;
- case 'l': // vi-style right
- if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) {
- viewer->core->scrollRight();
- }
- break;
- case 'k': // vi-style up
- if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) {
- viewer->core->scrollUp();
- }
- break;
- case 'j': // vi-style down
- if (!viewer->app->getFullScreen() && viewer->app->getViKeys()) {
- viewer->core->scrollDown();
- }
- break;
- case '0':
- if (!viewer->app->getFullScreen() &&
- viewer->core->getZoom() != defZoom) {
- viewer->setZoomIdx(defZoomIdx);
- viewer->displayPage(viewer->core->getPageNum(), defZoom,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- break;
- case '+':
- if (!viewer->app->getFullScreen()) {
- z = viewer->getZoomIdx();
- if (z <= minZoomIdx && z > maxZoomIdx) {
- --z;
- viewer->setZoomIdx(z);
- viewer->displayPage(viewer->core->getPageNum(),
- zoomMenuInfo[z].zoom,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- }
- break;
- case '-':
- if (!viewer->app->getFullScreen()) {
- z = viewer->getZoomIdx();
- if (z < minZoomIdx && z >= maxZoomIdx) {
- ++z;
- viewer->setZoomIdx(z);
- viewer->displayPage(viewer->core->getPageNum(),
- zoomMenuInfo[z].zoom,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- }
- break;
- case 'z':
- if (!viewer->app->getFullScreen() &&
- viewer->core->getZoom() != zoomPage) {
- viewer->setZoomIdx(zoomPageIdx);
- viewer->displayPage(viewer->core->getPageNum(), zoomPage,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- break;
- case 'w':
- if (!viewer->app->getFullScreen() &&
- viewer->core->getZoom() != zoomWidth) {
- viewer->setZoomIdx(zoomWidthIdx);
- viewer->displayPage(viewer->core->getPageNum(), zoomWidth,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- break;
- case '\014': // ^L
- viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(),
- viewer->core->getRotate(), gFalse, gFalse);
- break;
- case '\027': // ^W
- viewer->app->close(viewer, gFalse);
- break;
- case '?':
- XtManageChild(viewer->aboutDialog);
- break;
- case 'Q':
- case 'q':
- viewer->app->quit();
- break;
- }
- }
-}
-
-void XPDFViewer::mouseCbk(void *data, XEvent *event) {
- XPDFViewer *viewer = (XPDFViewer *)data;
-
- if (event->type == ButtonPress && event->xbutton.button == 3) {
- XmMenuPosition(viewer->popupMenu, &event->xbutton);
- XtManageChild(viewer->popupMenu);
-
- // this is magic (taken from DDD) - weird things happen if this
- // call isn't made (this is done in two different places, in hopes
- // of squashing this stupid bug)
- XtUngrabButton(viewer->core->getDrawAreaWidget(), AnyButton, AnyModifier);
- }
-}
-
-//------------------------------------------------------------------------
-// GUI code: main window
-//------------------------------------------------------------------------
-
-void XPDFViewer::initWindow() {
- Widget btn, label, lastBtn, zoomWidget;
-#ifndef DISABLE_OUTLINE
- Widget clipWin;
-#endif
- Colormap colormap;
- XColor xcol;
- Arg args[20];
- int n;
- char *title;
- XmString s, s2, emptyString;
- int i;
-
- display = XtDisplay(app->getAppShell());
- screenNum = XScreenNumberOfScreen(XtScreen(app->getAppShell()));
-
- // private colormap
- if (app->getInstallCmap()) {
- XtVaGetValues(app->getAppShell(), XmNcolormap, &colormap, NULL);
- // ensure that BlackPixel and WhitePixel are reserved in the
- // new colormap
- xcol.red = xcol.green = xcol.blue = 0;
- XAllocColor(display, colormap, &xcol);
- xcol.red = xcol.green = xcol.blue = 65535;
- XAllocColor(display, colormap, &xcol);
- colormap = XCopyColormapAndFree(display, colormap);
- }
-
- // top-level window
- n = 0;
- title = app->getTitle() ? app->getTitle()->getCString()
- : (char *)xpdfAppName;
- XtSetArg(args[n], XmNtitle, title); ++n;
- XtSetArg(args[n], XmNiconName, title); ++n;
- XtSetArg(args[n], XmNminWidth, 100); ++n;
- XtSetArg(args[n], XmNminHeight, 100); ++n;
- XtSetArg(args[n], XmNbaseWidth, 0); ++n;
- XtSetArg(args[n], XmNbaseHeight, 0); ++n;
- XtSetArg(args[n], XmNdeleteResponse, XmDO_NOTHING); ++n;
- if (app->getFullScreen()) {
- XtSetArg(args[n], XmNmwmDecorations, 0); ++n;
- XtSetArg(args[n], XmNgeometry, "+0+0"); ++n;
- } else if (app->getGeometry()) {
- XtSetArg(args[n], XmNgeometry, app->getGeometry()->getCString()); ++n;
- }
- win = XtCreatePopupShell("win", topLevelShellWidgetClass,
- app->getAppShell(), args, n);
- if (app->getInstallCmap()) {
- XtVaSetValues(win, XmNcolormap, colormap, NULL);
- }
- XmAddWMProtocolCallback(win, XInternAtom(display, "WM_DELETE_WINDOW", False),
- &closeMsgCbk, this);
-
- // form
- n = 0;
- form = XmCreateForm(win, "form", args, n);
- XtManageChild(form);
-
- // toolbar
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- toolBar = XmCreateForm(form, "toolBar", args, n);
- XtManageChild(toolBar);
-
- // create an empty string -- this is used for buttons that will get
- // pixmaps later
- emptyString = XmStringCreateLocalized("");
-
- // page movement buttons
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- backBtn = XmCreatePushButton(toolBar, "back", args, n);
- XtManageChild(backBtn);
- XtAddCallback(backBtn, XmNactivateCallback,
- &backCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, backBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- prevTenPageBtn = XmCreatePushButton(toolBar, "prevTenPage", args, n);
- XtManageChild(prevTenPageBtn);
- XtAddCallback(prevTenPageBtn, XmNactivateCallback,
- &prevTenPageCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, prevTenPageBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- prevPageBtn = XmCreatePushButton(toolBar, "prevPage", args, n);
- XtManageChild(prevPageBtn);
- XtAddCallback(prevPageBtn, XmNactivateCallback,
- &prevPageCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, prevPageBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- nextPageBtn = XmCreatePushButton(toolBar, "nextPage", args, n);
- XtManageChild(nextPageBtn);
- XtAddCallback(nextPageBtn, XmNactivateCallback,
- &nextPageCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, nextPageBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- nextTenPageBtn = XmCreatePushButton(toolBar, "nextTenPage", args, n);
- XtManageChild(nextTenPageBtn);
- XtAddCallback(nextTenPageBtn, XmNactivateCallback,
- &nextTenPageCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, nextTenPageBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- forwardBtn = XmCreatePushButton(toolBar, "forward", args, n);
- XtManageChild(forwardBtn);
- XtAddCallback(forwardBtn, XmNactivateCallback,
- &forwardCbk, (XtPointer)this);
-
- // page number display
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, forwardBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- s = XmStringCreateLocalized("Page ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- label = XmCreateLabel(toolBar, "pageLabel", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, label); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 3); ++n;
- XtSetArg(args[n], XmNmarginHeight, 3); ++n;
- XtSetArg(args[n], XmNcolumns, 5); ++n;
- pageNumText = XmCreateTextField(toolBar, "pageNum", args, n);
- XtManageChild(pageNumText);
- XtAddCallback(pageNumText, XmNactivateCallback,
- &pageNumCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, pageNumText); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- s = XmStringCreateLocalized(" of 00000");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
- XtSetArg(args[n], XmNrecomputeSize, False); ++n;
- pageCountLabel = XmCreateLabel(toolBar, "pageCountLabel", args, n);
- XmStringFree(s);
- XtManageChild(pageCountLabel);
- s = XmStringCreateLocalized(" of 0");
- XtVaSetValues(pageCountLabel, XmNlabelString, s, NULL);
- XmStringFree(s);
-
- // zoom menu
-#if USE_COMBO_BOX
- XmString st[nZoomMenuItems];
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, pageCountLabel); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 0); ++n;
- XtSetArg(args[n], XmNmarginHeight, 0); ++n;
- XtSetArg(args[n], XmNcomboBoxType, XmDROP_DOWN_COMBO_BOX); ++n;
- XtSetArg(args[n], XmNpositionMode, XmONE_BASED); ++n;
- XtSetArg(args[n], XmNcolumns, 7); ++n;
- for (i = 0; i < nZoomMenuItems; ++i) {
- st[i] = XmStringCreateLocalized(zoomMenuInfo[i].label);
- }
- XtSetArg(args[n], XmNitems, st); ++n;
- XtSetArg(args[n], XmNitemCount, nZoomMenuItems); ++n;
- zoomComboBox = XmCreateComboBox(toolBar, "zoomComboBox", args, n);
- for (i = 0; i < nZoomMenuItems; ++i) {
- XmStringFree(st[i]);
- }
- XtAddCallback(zoomComboBox, XmNselectionCallback,
- &zoomComboBoxCbk, (XtPointer)this);
- XtManageChild(zoomComboBox);
- zoomWidget = zoomComboBox;
-#else
- Widget menuPane;
- char buf[16];
- n = 0;
- menuPane = XmCreatePulldownMenu(toolBar, "zoomMenuPane", args, n);
- for (i = 0; i < nZoomMenuItems; ++i) {
- n = 0;
- s = XmStringCreateLocalized(zoomMenuInfo[i].label);
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNuserData, (XtPointer)i); ++n;
- sprintf(buf, "zoom%d", i);
- btn = XmCreatePushButton(menuPane, buf, args, n);
- XmStringFree(s);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &zoomMenuCbk, (XtPointer)this);
- zoomMenuBtns[i] = btn;
- }
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, pageCountLabel); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 0); ++n;
- XtSetArg(args[n], XmNmarginHeight, 0); ++n;
- XtSetArg(args[n], XmNsubMenuId, menuPane); ++n;
- zoomMenu = XmCreateOptionMenu(toolBar, "zoomMenu", args, n);
- XtManageChild(zoomMenu);
- zoomWidget = zoomMenu;
-#endif
-
- // find/print/about buttons
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, zoomWidget); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- findBtn = XmCreatePushButton(toolBar, "find", args, n);
- XtManageChild(findBtn);
- XtAddCallback(findBtn, XmNactivateCallback,
- &findCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, findBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- printBtn = XmCreatePushButton(toolBar, "print", args, n);
- XtManageChild(printBtn);
- XtAddCallback(printBtn, XmNactivateCallback,
- &printCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, printBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- XtSetArg(args[n], XmNlabelString, emptyString); ++n;
- aboutBtn = XmCreatePushButton(toolBar, "about", args, n);
- XtManageChild(aboutBtn);
- XtAddCallback(aboutBtn, XmNactivateCallback,
- &aboutCbk, (XtPointer)this);
- lastBtn = aboutBtn;
-
- // quit button
- n = 0;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNmarginWidth, 6); ++n;
- s = XmStringCreateLocalized("Quit");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- quitBtn = XmCreatePushButton(toolBar, "quit", args, n);
- XmStringFree(s);
- XtManageChild(quitBtn);
- XtAddCallback(quitBtn, XmNactivateCallback,
- &quitCbk, (XtPointer)this);
-
- // link label
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, lastBtn); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNrightWidget, quitBtn); ++n;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- s = XmStringCreateLocalized("");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNrecomputeSize, True); ++n;
- XtSetArg(args[n], XmNalignment, XmALIGNMENT_BEGINNING); ++n;
- linkLabel = XmCreateLabel(toolBar, "linkLabel", args, n);
- XmStringFree(s);
- XtManageChild(linkLabel);
-
-#ifndef DISABLE_OUTLINE
- if (app->getFullScreen()) {
-#endif
-
- // core
- core = new XPDFCore(win, form, app->getPaperRGB(),
- app->getFullScreen(), app->getReverseVideo(),
- app->getInstallCmap(), app->getRGBCubeSize());
- core->setUpdateCbk(&updateCbk, this);
- core->setActionCbk(&actionCbk, this);
- core->setKeyPressCbk(&keyPressCbk, this);
- core->setMouseCbk(&mouseCbk, this);
- core->setReqPasswordCbk(&reqPasswordCbk, this);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNbottomWidget, toolBar); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetValues(core->getWidget(), args, n);
-
-#ifndef DISABLE_OUTLINE
- } else {
-
- // paned window
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNbottomWidget, toolBar); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
-#if defined(__sgi) && (XmVERSION <= 1)
- panedWin = SgCreateHorzPanedWindow(form, "panedWin", args, n);
-#else
- panedWin = XmCreatePanedWindow(form, "panedWin", args, n);
-#endif
- XtManageChild(panedWin);
-
- // scrolled window for outline container
- n = 0;
- XtSetArg(args[n], XmNpositionIndex, 0); ++n;
- XtSetArg(args[n], XmNallowResize, True); ++n;
- XtSetArg(args[n], XmNpaneMinimum, 1); ++n;
- XtSetArg(args[n], XmNpaneMaximum, 10000); ++n;
-#if !(defined(__sgi) && (XmVERSION <= 1))
- XtSetArg(args[n], XmNwidth, 1); ++n;
-#endif
- XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n;
- outlineScroll = XmCreateScrolledWindow(panedWin, "outlineScroll", args, n);
- XtManageChild(outlineScroll);
- XtVaGetValues(outlineScroll, XmNclipWindow, &clipWin, NULL);
- XtVaSetValues(clipWin, XmNbackground, app->getPaperColor(), NULL);
-
- // outline tree
- n = 0;
- XtSetArg(args[n], XmNbackground, app->getPaperColor()); ++n;
- outlineTree = XPDFCreateTree(outlineScroll, "outlineTree", args, n);
- XtManageChild(outlineTree);
- XtAddCallback(outlineTree, XPDFNselectionCallback, &outlineSelectCbk,
- (XtPointer)this);
-
- // core
- core = new XPDFCore(win, panedWin, app->getPaperRGB(),
- app->getFullScreen(), app->getReverseVideo(),
- app->getInstallCmap(), app->getRGBCubeSize());
- core->setUpdateCbk(&updateCbk, this);
- core->setActionCbk(&actionCbk, this);
- core->setKeyPressCbk(&keyPressCbk, this);
- core->setMouseCbk(&mouseCbk, this);
- core->setReqPasswordCbk(&reqPasswordCbk, this);
- n = 0;
- XtSetArg(args[n], XmNpositionIndex, 1); ++n;
- XtSetArg(args[n], XmNallowResize, True); ++n;
- XtSetArg(args[n], XmNpaneMinimum, 1); ++n;
- XtSetArg(args[n], XmNpaneMaximum, 10000); ++n;
- XtSetValues(core->getWidget(), args, n);
- }
-#endif
-
- // set the zoom menu to match the initial zoom setting
- setZoomVal(core->getZoom());
-
- // set traversal order
- XtVaSetValues(core->getDrawAreaWidget(),
- XmNnavigationType, XmEXCLUSIVE_TAB_GROUP, NULL);
- XtVaSetValues(backBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(prevTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(prevPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(nextPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(nextTenPageBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(forwardBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(pageNumText, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(zoomWidget, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(findBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(printBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(aboutBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
- XtVaSetValues(quitBtn, XmNnavigationType, XmEXCLUSIVE_TAB_GROUP,
- NULL);
-
- // popup menu
- n = 0;
-#if XmVersion < 1002
- // older versions of Motif need this, newer ones choke on it,
- // sometimes not displaying the menu at all, maybe depending on the
- // state of the NumLock key (taken from DDD)
- XtSetArg(args[n], XmNmenuPost, "<Btn3Down>"); ++n;
-#endif
- popupMenu = XmCreatePopupMenu(core->getDrawAreaWidget(), "popupMenu",
- args, n);
- n = 0;
- s = XmStringCreateLocalized("Open...");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- s2 = XmStringCreateLocalized("O");
- XtSetArg(args[n], XmNacceleratorText, s2); ++n;
- btn = XmCreatePushButton(popupMenu, "open", args, n);
- XmStringFree(s);
- XmStringFree(s2);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &openCbk, (XtPointer)this);
- n = 0;
- s = XmStringCreateLocalized("Open in new window...");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- btn = XmCreatePushButton(popupMenu, "openInNewWindow", args, n);
- XmStringFree(s);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &openInNewWindowCbk, (XtPointer)this);
- n = 0;
- s = XmStringCreateLocalized("Reload");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- s2 = XmStringCreateLocalized("R");
- XtSetArg(args[n], XmNacceleratorText, s2); ++n;
- btn = XmCreatePushButton(popupMenu, "reload", args, n);
- XmStringFree(s);
- XmStringFree(s2);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &reloadCbk, (XtPointer)this);
- n = 0;
- s = XmStringCreateLocalized("Save as...");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- btn = XmCreatePushButton(popupMenu, "saveAs", args, n);
- XmStringFree(s);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &saveAsCbk, (XtPointer)this);
- n = 0;
- btn = XmCreateSeparator(popupMenu, "sep1", args, n);
- XtManageChild(btn);
- n = 0;
- s = XmStringCreateLocalized("Rotate counterclockwise");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- btn = XmCreatePushButton(popupMenu, "rotateCCW", args, n);
- XmStringFree(s);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &rotateCCWCbk, (XtPointer)this);
- n = 0;
- s = XmStringCreateLocalized("Rotate clockwise");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- btn = XmCreatePushButton(popupMenu, "rotateCW", args, n);
- XmStringFree(s);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &rotateCWCbk, (XtPointer)this);
- n = 0;
- btn = XmCreateSeparator(popupMenu, "sep2", args, n);
- XtManageChild(btn);
- n = 0;
- s = XmStringCreateLocalized("Close");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- s2 = XmStringCreateLocalized("Ctrl+W");
- XtSetArg(args[n], XmNacceleratorText, s2); ++n;
- btn = XmCreatePushButton(popupMenu, "close", args, n);
- XmStringFree(s);
- XmStringFree(s2);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &closeCbk, (XtPointer)this);
- n = 0;
- s = XmStringCreateLocalized("Quit");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- s2 = XmStringCreateLocalized("Q");
- XtSetArg(args[n], XmNacceleratorText, s2); ++n;
- btn = XmCreatePushButton(popupMenu, "quit", args, n);
- XmStringFree(s);
- XmStringFree(s2);
- XtManageChild(btn);
- XtAddCallback(btn, XmNactivateCallback,
- &quitCbk, (XtPointer)this);
-
- // this is magic (taken from DDD) - weird things happen if this
- // call isn't made
- XtUngrabButton(core->getDrawAreaWidget(), AnyButton, AnyModifier);
-
- XmStringFree(emptyString);
-}
-
-void XPDFViewer::mapWindow() {
-#ifdef HAVE_X11_XPM_H
- Pixmap iconPixmap;
-#endif
- int depth;
- Pixel fg, bg, arm;
-
- // show the window
- XtPopup(win, XtGrabNone);
- core->takeFocus();
-
- // create the icon
-#ifdef HAVE_X11_XPM_H
- if (XpmCreatePixmapFromData(display, XtWindow(win), xpdfIcon,
- &iconPixmap, NULL, NULL) == XpmSuccess) {
- XtVaSetValues(win, XmNiconPixmap, iconPixmap, NULL);
- }
-#endif
-
- // set button bitmaps (must be done after the window is mapped)
- XtVaGetValues(backBtn, XmNdepth, &depth,
- XmNforeground, &fg, XmNbackground, &bg,
- XmNarmColor, &arm, NULL);
- XtVaSetValues(backBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)backArrow_bits,
- backArrow_width,
- backArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)backArrow_bits,
- backArrow_width,
- backArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)backArrowDis_bits,
- backArrowDis_width,
- backArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(prevTenPageBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblLeftArrow_bits,
- dblLeftArrow_width,
- dblLeftArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblLeftArrow_bits,
- dblLeftArrow_width,
- dblLeftArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblLeftArrowDis_bits,
- dblLeftArrowDis_width,
- dblLeftArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(prevPageBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)leftArrow_bits,
- leftArrow_width,
- leftArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)leftArrow_bits,
- leftArrow_width,
- leftArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)leftArrowDis_bits,
- leftArrowDis_width,
- leftArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(nextPageBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)rightArrow_bits,
- rightArrow_width,
- rightArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)rightArrow_bits,
- rightArrow_width,
- rightArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)rightArrowDis_bits,
- rightArrowDis_width,
- rightArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(nextTenPageBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblRightArrow_bits,
- dblRightArrow_width,
- dblRightArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblRightArrow_bits,
- dblRightArrow_width,
- dblRightArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)dblRightArrowDis_bits,
- dblRightArrowDis_width,
- dblRightArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(forwardBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)forwardArrow_bits,
- forwardArrow_width,
- forwardArrow_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)forwardArrow_bits,
- forwardArrow_width,
- forwardArrow_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)forwardArrowDis_bits,
- forwardArrowDis_width,
- forwardArrowDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(findBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)find_bits,
- find_width,
- find_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)find_bits,
- find_width,
- find_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)findDis_bits,
- findDis_width,
- findDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(printBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)print_bits,
- print_width,
- print_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)print_bits,
- print_width,
- print_height,
- fg, arm, depth),
- XmNlabelInsensitivePixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)printDis_bits,
- printDis_width,
- printDis_height,
- fg, bg, depth),
- NULL);
- XtVaSetValues(aboutBtn, XmNlabelType, XmPIXMAP,
- XmNlabelPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)about_bits,
- about_width,
- about_height,
- fg, bg, depth),
- XmNarmPixmap,
- XCreatePixmapFromBitmapData(display, XtWindow(toolBar),
- (char *)about_bits,
- about_width,
- about_height,
- fg, arm, depth),
- NULL);
-}
-
-void XPDFViewer::closeWindow() {
- XtPopdown(win);
- XtDestroyWidget(win);
-}
-
-int XPDFViewer::getZoomIdx() {
-#if USE_COMBO_BOX
- int z;
-
- XtVaGetValues(zoomComboBox, XmNselectedPosition, &z, NULL);
- return z - 1;
-#else
- Widget w;
- int i;
-
- XtVaGetValues(zoomMenu, XmNmenuHistory, &w, NULL);
- for (i = 0; i < nZoomMenuItems; ++i) {
- if (w == zoomMenuBtns[i]) {
- return i;
- }
- }
- // this should never happen
- return 0;
-#endif
-}
-
-void XPDFViewer::setZoomIdx(int idx) {
-#if USE_COMBO_BOX
- XtVaSetValues(zoomComboBox, XmNselectedPosition, idx + 1, NULL);
-#else
- XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[idx], NULL);
-#endif
-}
-
-void XPDFViewer::setZoomVal(double z) {
-#if USE_COMBO_BOX
- char buf[32];
- XmString s;
- int i;
-
- for (i = 0; i < nZoomMenuItems; ++i) {
- if (z == zoomMenuInfo[i].zoom) {
- XtVaSetValues(zoomComboBox, XmNselectedPosition, i + 1, NULL);
- return;
- }
- }
- sprintf(buf, "%d", (int)z);
- s = XmStringCreateLocalized(buf);
- XtVaSetValues(zoomComboBox, XmNselectedItem, s, NULL);
- XmStringFree(s);
-#else
- int i;
-
- for (i = 0; i < nZoomMenuItems; ++i) {
- if (z == zoomMenuInfo[i].zoom) {
- XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[i], NULL);
- return;
- }
- }
- for (i = maxZoomIdx; i < minZoomIdx; ++i) {
- if (z > zoomMenuInfo[i].zoom) {
- break;
- }
- }
- XtVaSetValues(zoomMenu, XmNmenuHistory, zoomMenuBtns[i], NULL);
-#endif
-}
-
-void XPDFViewer::prevPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->gotoPrevPage(1, gTrue, gFalse);
- viewer->core->takeFocus();
-}
-
-void XPDFViewer::prevTenPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->gotoPrevPage(10, gTrue, gFalse);
- viewer->core->takeFocus();
-}
-
-void XPDFViewer::nextPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->gotoNextPage(1, gTrue);
- viewer->core->takeFocus();
-}
-
-void XPDFViewer::nextTenPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->gotoNextPage(10, gTrue);
- viewer->core->takeFocus();
-}
-
-void XPDFViewer::backCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->goBackward();
- viewer->core->takeFocus();
-}
-
-void XPDFViewer::forwardCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->core->goForward();
- viewer->core->takeFocus();
-}
-
-#if USE_COMBO_BOX
-
-void XPDFViewer::zoomComboBoxCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmComboBoxCallbackStruct *data = (XmComboBoxCallbackStruct *)callData;
- double z;
- char *s;
- XmStringContext context;
- XmStringCharSet charSet;
- XmStringDirection dir;
- Boolean sep;
-
- z = viewer->core->getZoom();
- if (data->item_position == 0) {
- XmStringInitContext(&context, data->item_or_text);
- if (XmStringGetNextSegment(context, &s, &charSet, &dir, &sep)) {
- z = atof(s);
- if (z <= 1) {
- z = defZoom;
- }
- XtFree(charSet);
- XtFree(s);
- }
- XmStringFreeContext(context);
- } else {
- z = zoomMenuInfo[data->item_position - 1].zoom;
- }
- // only redraw if this was triggered by an event; otherwise
- // the caller is responsible for doing the redraw
- if (z != viewer->core->getZoom() && data->event) {
- viewer->displayPage(viewer->core->getPageNum(), z,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- viewer->core->takeFocus();
-}
-
-#else // USE_COMBO_BOX
-
-void XPDFViewer::zoomMenuCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmPushButtonCallbackStruct *data = (XmPushButtonCallbackStruct *)callData;
- XtPointer userData;
- double z;
-
- XtVaGetValues(widget, XmNuserData, &userData, NULL);
- z = zoomMenuInfo[(int)userData].zoom;
- // only redraw if this was triggered by an event; otherwise
- // the caller is responsible for doing the redraw
- if (z != viewer->core->getZoom() && data->event) {
- viewer->displayPage(viewer->core->getPageNum(), z,
- viewer->core->getRotate(), gTrue, gFalse);
- }
- viewer->core->takeFocus();
-}
-
-#endif // USE_COMBO_BOX
-
-void XPDFViewer::findCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- if (!viewer->core->getDoc()) {
- return;
- }
- XtManageChild(viewer->findDialog);
-}
-
-void XPDFViewer::printCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- if (!viewer->core->getDoc()) {
- return;
- }
- XtManageChild(viewer->printDialog);
-}
-
-void XPDFViewer::aboutCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- XtManageChild(viewer->aboutDialog);
-}
-
-void XPDFViewer::quitCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->app->quit();
-}
-
-void XPDFViewer::openCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->mapOpenDialog(gFalse);
-}
-
-void XPDFViewer::openInNewWindowCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->mapOpenDialog(gTrue);
-}
-
-void XPDFViewer::reloadCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->reloadFile();
-}
-
-void XPDFViewer::saveAsCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- if (!viewer->core->getDoc()) {
- return;
- }
- viewer->mapSaveAsDialog();
-}
-
-void XPDFViewer::rotateCCWCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- int r;
-
- r = viewer->core->getRotate();
- r = (r == 0) ? 270 : r - 90;
- viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(),
- r, gTrue, gFalse);
-}
-
-void XPDFViewer::rotateCWCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- int r;
-
- r = viewer->core->getRotate();
- r = (r == 270) ? 0 : r + 90;
- viewer->displayPage(viewer->core->getPageNum(), viewer->core->getZoom(),
- r, gTrue, gFalse);
-}
-
-void XPDFViewer::closeCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->app->close(viewer, gFalse);
-}
-
-void XPDFViewer::closeMsgCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->app->close(viewer, gTrue);
-}
-
-void XPDFViewer::pageNumCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- char *s, *p;
- int pg;
- char buf[20];
-
- if (!viewer->core->getDoc()) {
- goto err;
- }
- s = XmTextFieldGetString(viewer->pageNumText);
- for (p = s; *p; ++p) {
- if (!isdigit(*p)) {
- goto err;
- }
- }
- pg = atoi(s);
- if (pg < 1 || pg > viewer->core->getDoc()->getNumPages()) {
- goto err;
- }
- viewer->displayPage(pg, viewer->core->getZoom(),
- viewer->core->getRotate(), gFalse, gTrue);
- viewer->core->takeFocus();
- return;
-
- err:
- XBell(viewer->display, 0);
- sprintf(buf, "%d", viewer->core->getPageNum());
- XmTextFieldSetString(viewer->pageNumText, buf);
-}
-
-void XPDFViewer::updateCbk(void *data, GString *fileName,
- int pageNum, int numPages, char *linkString) {
- XPDFViewer *viewer = (XPDFViewer *)data;
- GString *title;
- char buf[20];
- XmString s;
-
- if (fileName) {
- if (!(title = viewer->app->getTitle())) {
- title = (new GString(xpdfAppName))->append(": ")->append(fileName);
- }
- XtVaSetValues(viewer->win, XmNtitle, title->getCString(),
- XmNiconName, title->getCString(), NULL);
- if (!viewer->app->getTitle()) {
- delete title;
- }
-#ifndef DISABLE_OUTLINE
- if (!viewer->app->getFullScreen()) {
- viewer->setupOutline();
- }
-#endif
- viewer->setupPrintDialog();
- }
-
- if (pageNum >= 0) {
- s = XmStringCreateLocalized("");
- XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL);
- XmStringFree(s);
- sprintf(buf, "%d", pageNum);
- XmTextFieldSetString(viewer->pageNumText, buf);
- XtVaSetValues(viewer->prevTenPageBtn, XmNsensitive,
- pageNum > 1, NULL);
- XtVaSetValues(viewer->prevPageBtn, XmNsensitive,
- pageNum > 1, NULL);
- XtVaSetValues(viewer->nextTenPageBtn, XmNsensitive,
- pageNum < viewer->core->getDoc()->getNumPages(), NULL);
- XtVaSetValues(viewer->nextPageBtn, XmNsensitive,
- pageNum < viewer->core->getDoc()->getNumPages(), NULL);
- XtVaSetValues(viewer->backBtn, XmNsensitive,
- viewer->core->canGoBack(), NULL);
- XtVaSetValues(viewer->forwardBtn, XmNsensitive,
- viewer->core->canGoForward(), NULL);
- }
-
- if (numPages >= 0) {
- sprintf(buf, " of %d", numPages);
- s = XmStringCreateLocalized(buf);
- XtVaSetValues(viewer->pageCountLabel, XmNlabelString, s, NULL);
- XmStringFree(s);
- }
-
- if (linkString) {
- s = XmStringCreateLocalized(linkString);
- XtVaSetValues(viewer->linkLabel, XmNlabelString, s, NULL);
- XmStringFree(s);
- }
-}
-
-
-//------------------------------------------------------------------------
-// GUI code: outline
-//------------------------------------------------------------------------
-
-#ifndef DISABLE_OUTLINE
-
-void XPDFViewer::setupOutline() {
- GList *items;
- UnicodeMap *uMap;
- GString *enc;
- int i;
-
- // unmanage and destroy the old labels
- if (outlineLabels) {
- XtUnmanageChildren(outlineLabels, outlineLabelsLength);
- for (i = 0; i < outlineLabelsLength; ++i) {
- XtDestroyWidget(outlineLabels[i]);
- }
- gfree(outlineLabels);
- outlineLabels = NULL;
- outlineLabelsLength = outlineLabelsSize = 0;
- }
-
- if (core->getDoc()) {
-
- // create the new labels
- items = core->getDoc()->getOutline()->getItems();
- if (items && items->getLength() > 0) {
- enc = new GString("Latin1");
- uMap = globalParams->getUnicodeMap(enc);
- delete enc;
- setupOutlineItems(items, NULL, uMap);
- uMap->decRefCnt();
- }
-
- // manage the new labels
- XtManageChildren(outlineLabels, outlineLabelsLength);
- }
-}
-
-void XPDFViewer::setupOutlineItems(GList *items, Widget parent,
- UnicodeMap *uMap) {
- OutlineItem *item;
- GList *kids;
- Widget label;
- Arg args[20];
- GString *title;
- char buf[8];
- XmString s;
- int i, j, n;
-
- for (i = 0; i < items->getLength(); ++i) {
- item = (OutlineItem *)items->get(i);
- title = new GString();
- for (j = 0; j < item->getTitleLength(); ++j) {
- n = uMap->mapUnicode(item->getTitle()[j], buf, sizeof(buf));
- title->append(buf, n);
- }
- n = 0;
- XtSetArg(args[n], XPDFNentryPosition, i); ++n;
- if (parent) {
- XtSetArg(args[n], XPDFNentryParent, parent); ++n;
- }
- XtSetArg(args[n], XPDFNentryExpanded, item->isOpen()); ++n;
- s = XmStringCreateLocalized(title->getCString());
- delete title;
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNuserData, item); ++n;
- XtSetArg(args[n], XmNmarginWidth, 0); ++n;
- XtSetArg(args[n], XmNmarginHeight, 2); ++n;
- XtSetArg(args[n], XmNshadowThickness, 0); ++n;
- XtSetArg(args[n], XmNforeground,
- app->getReverseVideo() ? WhitePixel(display, screenNum)
- : BlackPixel(display, screenNum)); ++n;
- XtSetArg(args[n], XmNbackground, app->getPaperColor()); ++n;
- label = XmCreateLabelGadget(outlineTree, "label", args, n);
- XmStringFree(s);
- if (outlineLabelsLength == outlineLabelsSize) {
- outlineLabelsSize += 64;
- outlineLabels = (Widget *)grealloc(outlineLabels,
- outlineLabelsSize * sizeof(Widget *));
- }
- outlineLabels[outlineLabelsLength++] = label;
- item->open();
- if ((kids = item->getKids())) {
- setupOutlineItems(kids, label, uMap);
- }
- }
-}
-
-void XPDFViewer::outlineSelectCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XPDFTreeSelectCallbackStruct *data =
- (XPDFTreeSelectCallbackStruct *)callData;
- OutlineItem *item;
-
- XtVaGetValues(data->selectedItem, XmNuserData, &item, NULL);
- if (item) {
- viewer->core->doAction(item->getAction());
- }
- viewer->core->takeFocus();
-}
-
-#endif // !DISABLE_OUTLINE
-
-//------------------------------------------------------------------------
-// GUI code: "about" dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initAboutDialog() {
- Widget scrolledWin, col, label, sep, closeBtn;
- Arg args[20];
- int n, i;
- XmString s;
- char buf[20];
-
- //----- dialog
- n = 0;
- s = XmStringCreateLocalized(xpdfAppName ": About");
- XtSetArg(args[n], XmNdialogTitle, s); ++n;
- XtSetArg(args[n], XmNwidth, 450); ++n;
- XtSetArg(args[n], XmNheight, 300); ++n;
- aboutDialog = XmCreateFormDialog(win, "aboutDialog", args, n);
- XmStringFree(s);
-
- //----- "close" button
- n = 0;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- closeBtn = XmCreatePushButton(aboutDialog, "Close", args, n);
- XtManageChild(closeBtn);
- n = 0;
- XtSetArg(args[n], XmNdefaultButton, closeBtn); ++n;
- XtSetArg(args[n], XmNcancelButton, closeBtn); ++n;
- XtSetValues(aboutDialog, args, n);
-
- //----- scrolled window and RowColumn
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNbottomWidget, closeBtn); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); ++n;
- scrolledWin = XmCreateScrolledWindow(aboutDialog, "scrolledWin", args, n);
- XtManageChild(scrolledWin);
- n = 0;
- XtSetArg(args[n], XmNorientation, XmVERTICAL); ++n;
- XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n;
- col = XmCreateRowColumn(scrolledWin, "col", args, n);
- XtManageChild(col);
-
- //----- fonts
- aboutBigFont =
- createFontList("-*-times-bold-i-normal--20-*-*-*-*-*-iso8859-1");
- aboutVersionFont =
- createFontList("-*-times-medium-r-normal--16-*-*-*-*-*-iso8859-1");
- aboutFixedFont =
- createFontList("-*-courier-medium-r-normal--12-*-*-*-*-*-iso8859-1");
-
- //----- heading
- n = 0;
- s = XmStringCreateLocalized("Xpdf");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutBigFont); ++n;
- label = XmCreateLabel(col, "h0", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- s = XmStringCreateLocalized("Version " xpdfVersion);
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
- label = XmCreateLabel(col, "h1", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- s = XmStringCreateLocalized(xpdfCopyright);
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
- label = XmCreateLabel(col, "h2", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- s = XmStringCreateLocalized(" ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
- label = XmCreateLabel(col, "h3", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- sep = XmCreateSeparator(col, "sep", args, n);
- XtManageChild(sep);
- n = 0;
- s = XmStringCreateLocalized(" ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutVersionFont); ++n;
- label = XmCreateLabel(col, "h4", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
-
- //----- text
- for (i = 0; aboutWinText[i]; ++i) {
- n = 0;
- s = XmStringCreateLocalized(aboutWinText[i]);
- XtSetArg(args[n], XmNlabelString, s); ++n;
- XtSetArg(args[n], XmNfontList, aboutFixedFont); ++n;
- sprintf(buf, "t%d", i);
- label = XmCreateLabel(col, buf, args, n);
- XtManageChild(label);
- XmStringFree(s);
- }
-}
-
-//------------------------------------------------------------------------
-// GUI code: "open" dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initOpenDialog() {
- Arg args[20];
- int n;
- XmString s1, s2, s3;
-
- n = 0;
- s1 = XmStringCreateLocalized("Open");
- XtSetArg(args[n], XmNokLabelString, s1); ++n;
- s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]");
- XtSetArg(args[n], XmNpattern, s2); ++n;
- s3 = XmStringCreateLocalized(xpdfAppName ": Open");
- XtSetArg(args[n], XmNdialogTitle, s3); ++n;
- XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
- XtSetArg(args[n], XmNautoUnmanage, True); ++n;
- openDialog = XmCreateFileSelectionDialog(win, "openDialog", args, n);
- XmStringFree(s1);
- XmStringFree(s2);
- XmStringFree(s3);
- XtUnmanageChild(XmFileSelectionBoxGetChild(openDialog,
- XmDIALOG_HELP_BUTTON));
- XtAddCallback(openDialog, XmNokCallback,
- &openOkCbk, (XtPointer)this);
-}
-
-void XPDFViewer::setOpenDialogDir(char *dir) {
- XmString s;
-
- s = XmStringCreateLocalized(dir);
- XtVaSetValues(openDialog, XmNdirectory, s, NULL);
- XmStringFree(s);
-}
-
-void XPDFViewer::mapOpenDialog(GBool openInNewWindowA) {
- openInNewWindow = openInNewWindowA;
- XmFileSelectionDoSearch(openDialog, NULL);
- XtManageChild(openDialog);
-}
-
-void XPDFViewer::openOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmFileSelectionBoxCallbackStruct *data =
- (XmFileSelectionBoxCallbackStruct *)callData;
- char *fileName;
- XmStringContext context;
- XmStringCharSet charSet;
- XmStringDirection dir;
- Boolean sep;
- GString *fileNameStr;
-
- XmStringInitContext(&context, data->value);
- if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) {
- fileNameStr = new GString(fileName);
- if (viewer->openInNewWindow) {
- viewer->app->open(fileNameStr);
- } else {
- if (viewer->loadFile(fileNameStr)) {
- viewer->displayPage(1, viewer->core->getZoom(),
- viewer->core->getRotate(), gTrue, gTrue);
- }
- }
- delete fileNameStr;
- XtFree(charSet);
- XtFree(fileName);
- }
- XmStringFreeContext(context);
-}
-
-//------------------------------------------------------------------------
-// GUI code: "find" dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initFindDialog() {
- Widget form1, label, okBtn, closeBtn;
- Arg args[20];
- int n;
- XmString s;
-
- //----- dialog
- n = 0;
- s = XmStringCreateLocalized(xpdfAppName ": Find");
- XtSetArg(args[n], XmNdialogTitle, s); ++n;
- XtSetArg(args[n], XmNnavigationType, XmNONE); ++n;
- XtSetArg(args[n], XmNautoUnmanage, False); ++n;
- findDialog = XmCreateFormDialog(win, "findDialog", args, n);
- XmStringFree(s);
-
- //----- "find" and "close" buttons
- n = 0;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
- okBtn = XmCreatePushButton(findDialog, "Find", args, n);
- XtManageChild(okBtn);
- XtAddCallback(okBtn, XmNactivateCallback,
- &findFindCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
- closeBtn = XmCreatePushButton(findDialog, "Close", args, n);
- XtManageChild(closeBtn);
- XtAddCallback(closeBtn, XmNactivateCallback,
- &findCloseCbk, (XtPointer)this);
-
- //----- search string entry
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNbottomWidget, okBtn); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 2); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 2); ++n;
- form1 = XmCreateForm(findDialog, "form", args, n);
- XtManageChild(form1);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- s = XmStringCreateLocalized("Find text: ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- label = XmCreateLabel(form1, "label", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNleftWidget, label); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- findText = XmCreateTextField(form1, "text", args, n);
- XtManageChild(findText);
-#ifdef LESSTIF_VERSION
- XtAddCallback(findText, XmNactivateCallback,
- &findFindCbk, (XtPointer)this);
-#endif
-
- //----- dialog parameters
- n = 0;
- XtSetArg(args[n], XmNdefaultButton, okBtn); ++n;
- XtSetArg(args[n], XmNcancelButton, closeBtn); ++n;
-#if XmVersion > 1001
- XtSetArg(args[n], XmNinitialFocus, findText); ++n;
-#endif
- XtSetValues(findDialog, args, n);
-}
-
-void XPDFViewer::findFindCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->doFind(gFalse);
-}
-
-void XPDFViewer::doFind(GBool next) {
- if (XtWindow(findDialog)) {
- XDefineCursor(display, XtWindow(findDialog), core->getBusyCursor());
- }
- core->find(XmTextFieldGetString(findText), next);
- if (XtWindow(findDialog)) {
- XUndefineCursor(display, XtWindow(findDialog));
- }
-}
-
-void XPDFViewer::findCloseCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- XtUnmanageChild(viewer->findDialog);
-}
-
-//------------------------------------------------------------------------
-// GUI code: "save as" dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initSaveAsDialog() {
- Arg args[20];
- int n;
- XmString s1, s2, s3;
-
- n = 0;
- s1 = XmStringCreateLocalized("Save");
- XtSetArg(args[n], XmNokLabelString, s1); ++n;
- s2 = XmStringCreateLocalized("*.[Pp][Dd][Ff]");
- XtSetArg(args[n], XmNpattern, s2); ++n;
- s3 = XmStringCreateLocalized(xpdfAppName ": Save as");
- XtSetArg(args[n], XmNdialogTitle, s3); ++n;
- XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
- XtSetArg(args[n], XmNautoUnmanage, True); ++n;
- saveAsDialog = XmCreateFileSelectionDialog(win, "saveAsDialog", args, n);
- XmStringFree(s1);
- XmStringFree(s2);
- XmStringFree(s3);
- XtUnmanageChild(XmFileSelectionBoxGetChild(saveAsDialog,
- XmDIALOG_HELP_BUTTON));
- XtAddCallback(saveAsDialog, XmNokCallback,
- &saveAsOkCbk, (XtPointer)this);
-}
-
-void XPDFViewer::setSaveAsDialogDir(char *dir) {
- XmString s;
-
- s = XmStringCreateLocalized(dir);
- XtVaSetValues(saveAsDialog, XmNdirectory, s, NULL);
- XmStringFree(s);
-}
-
-void XPDFViewer::mapSaveAsDialog() {
- XmFileSelectionDoSearch(saveAsDialog, NULL);
- XtManageChild(saveAsDialog);
-}
-
-void XPDFViewer::saveAsOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmFileSelectionBoxCallbackStruct *data =
- (XmFileSelectionBoxCallbackStruct *)callData;
- char *fileName;
- GString *fileNameStr;
- XmStringContext context;
- XmStringCharSet charSet;
- XmStringDirection dir;
- Boolean sep;
-
- XmStringInitContext(&context, data->value);
- if (XmStringGetNextSegment(context, &fileName, &charSet, &dir, &sep)) {
- fileNameStr = new GString(fileName);
- viewer->core->getDoc()->saveAs(fileNameStr);
- delete fileNameStr;
- XtFree(charSet);
- XtFree(fileName);
- }
- XmStringFreeContext(context);
-}
-
-//------------------------------------------------------------------------
-// GUI code: "print" dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initPrintDialog() {
- Widget sep1, sep2, row, label1, label2, okBtn, cancelBtn;
- Arg args[20];
- int n;
- XmString s;
- GString *psFileName;
-
- //----- dialog
- n = 0;
- s = XmStringCreateLocalized(xpdfAppName ": Print");
- XtSetArg(args[n], XmNdialogTitle, s); ++n;
- XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
- printDialog = XmCreateFormDialog(win, "printDialog", args, n);
- XmStringFree(s);
-
- //----- "print with command"
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopOffset, 4); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
- XtSetArg(args[n], XmNset, XmSET); ++n;
- s = XmStringCreateLocalized("Print with command:");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- printWithCmdBtn = XmCreateToggleButton(printDialog, "printWithCmd", args, n);
- XmStringFree(s);
- XtManageChild(printWithCmdBtn);
- XtAddCallback(printWithCmdBtn, XmNvalueChangedCallback,
- &printWithCmdBtnCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, printWithCmdBtn); ++n;
- XtSetArg(args[n], XmNtopOffset, 2); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 16); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNcolumns, 40); ++n;
- printCmdText = XmCreateTextField(printDialog, "printCmd", args, n);
- XtManageChild(printCmdText);
-
- //----- "print with command"
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, printCmdText); ++n;
- XtSetArg(args[n], XmNtopOffset, 4); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNindicatorType, XmONE_OF_MANY); ++n;
- XtSetArg(args[n], XmNset, XmUNSET); ++n;
- s = XmStringCreateLocalized("Print to file:");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- printToFileBtn = XmCreateToggleButton(printDialog, "printToFile", args, n);
- XmStringFree(s);
- XtManageChild(printToFileBtn);
- XtAddCallback(printToFileBtn, XmNvalueChangedCallback,
- &printToFileBtnCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, printToFileBtn); ++n;
- XtSetArg(args[n], XmNtopOffset, 2); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 16); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNcolumns, 40); ++n;
- XtSetArg(args[n], XmNsensitive, False); ++n;
- printFileText = XmCreateTextField(printDialog, "printFile", args, n);
- XtManageChild(printFileText);
-
- //----- separator
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, printFileText); ++n;
- XtSetArg(args[n], XmNtopOffset, 8); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 8); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 8); ++n;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- sep1 = XmCreateSeparator(printDialog, "sep1", args, n);
- XtManageChild(sep1);
-
- //----- page range
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, sep1); ++n;
- XtSetArg(args[n], XmNtopOffset, 8); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n;
- row = XmCreateRowColumn(printDialog, "row", args, n);
- XtManageChild(row);
- n = 0;
- s = XmStringCreateLocalized("Pages:");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- label1 = XmCreateLabel(row, "label1", args, n);
- XmStringFree(s);
- XtManageChild(label1);
- n = 0;
- XtSetArg(args[n], XmNcolumns, 5); ++n;
- printFirstPage = XmCreateTextField(row, "printFirstPage", args, n);
- XtManageChild(printFirstPage);
- n = 0;
- s = XmStringCreateLocalized("to");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- label2 = XmCreateLabel(row, "label2", args, n);
- XmStringFree(s);
- XtManageChild(label2);
- n = 0;
- XtSetArg(args[n], XmNcolumns, 5); ++n;
- printLastPage = XmCreateTextField(row, "printLastPage", args, n);
- XtManageChild(printLastPage);
-
- //----- separator
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, row); ++n;
- XtSetArg(args[n], XmNtopOffset, 8); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 8); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 8); ++n;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- sep2 = XmCreateSeparator(printDialog, "sep2", args, n);
- XtManageChild(sep2);
-
- //----- "print" and "cancel" buttons
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, sep2); ++n;
- XtSetArg(args[n], XmNtopOffset, 8); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- okBtn = XmCreatePushButton(printDialog, "Print", args, n);
- XtManageChild(okBtn);
- XtAddCallback(okBtn, XmNactivateCallback,
- &printPrintCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, sep2); ++n;
- XtSetArg(args[n], XmNtopOffset, 8); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- cancelBtn = XmCreatePushButton(printDialog, "Cancel", args, n);
- XtManageChild(cancelBtn);
- n = 0;
- XtSetArg(args[n], XmNdefaultButton, okBtn); ++n;
- XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n;
- XtSetValues(printDialog, args, n);
-
- //----- initial values
- if ((psFileName = globalParams->getPSFile())) {
- if (psFileName->getChar(0) == '|') {
- XmTextFieldSetString(printCmdText,
- psFileName->getCString() + 1);
- } else {
- XmTextFieldSetString(printFileText, psFileName->getCString());
- }
- delete psFileName;
- }
-}
-
-void XPDFViewer::setupPrintDialog() {
- PDFDoc *doc;
- char buf[20];
- GString *pdfFileName, *psFileName, *psFileName2;
- char *p;
-
- doc = core->getDoc();
- psFileName = globalParams->getPSFile();
- if (!psFileName || psFileName->getChar(0) == '|') {
- pdfFileName = doc->getFileName();
- p = pdfFileName->getCString() + pdfFileName->getLength() - 4;
- if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
- psFileName2 = new GString(pdfFileName->getCString(),
- pdfFileName->getLength() - 4);
- } else {
- psFileName2 = pdfFileName->copy();
- }
- psFileName2->append(".ps");
- XmTextFieldSetString(printFileText, psFileName2->getCString());
- delete psFileName2;
- }
- if (psFileName) {
- delete psFileName;
- }
-
- sprintf(buf, "%d", doc->getNumPages());
- XmTextFieldSetString(printFirstPage, "1");
- XmTextFieldSetString(printLastPage, buf);
-}
-
-void XPDFViewer::printWithCmdBtnCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmToggleButtonCallbackStruct *data =
- (XmToggleButtonCallbackStruct *)callData;
-
- if (data->set != XmSET) {
- XmToggleButtonSetState(viewer->printWithCmdBtn, True, False);
- }
- XmToggleButtonSetState(viewer->printToFileBtn, False, False);
- XtVaSetValues(viewer->printCmdText, XmNsensitive, True, NULL);
- XtVaSetValues(viewer->printFileText, XmNsensitive, False, NULL);
-}
-
-void XPDFViewer::printToFileBtnCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmToggleButtonCallbackStruct *data =
- (XmToggleButtonCallbackStruct *)callData;
-
- if (data->set != XmSET) {
- XmToggleButtonSetState(viewer->printToFileBtn, True, False);
- }
- XmToggleButtonSetState(viewer->printWithCmdBtn, False, False);
- XtVaSetValues(viewer->printFileText, XmNsensitive, True, NULL);
- XtVaSetValues(viewer->printCmdText, XmNsensitive, False, NULL);
-}
-
-void XPDFViewer::printPrintCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- unsigned char withCmd;
- GString *psFileName;
- int firstPage, lastPage;
- PDFDoc *doc;
- PSOutputDev *psOut;
-
- doc = viewer->core->getDoc();
- if (!doc->okToPrint()) {
- error(-1, "Printing this document is not allowed.");
- return;
- }
-
- viewer->core->setBusyCursor(gTrue);
-
- XtVaGetValues(viewer->printWithCmdBtn, XmNset, &withCmd, NULL);
- if (withCmd) {
- psFileName = new GString(XmTextFieldGetString(viewer->printCmdText));
- psFileName->insert(0, '|');
- } else {
- psFileName = new GString(XmTextFieldGetString(viewer->printFileText));
- }
-
- firstPage = atoi(XmTextFieldGetString(viewer->printFirstPage));
- lastPage = atoi(XmTextFieldGetString(viewer->printLastPage));
- if (firstPage < 1) {
- firstPage = 1;
- } else if (firstPage > doc->getNumPages()) {
- firstPage = doc->getNumPages();
- }
- if (lastPage < firstPage) {
- lastPage = firstPage;
- } else if (lastPage > doc->getNumPages()) {
- lastPage = doc->getNumPages();
- }
-
- psOut = new PSOutputDev(psFileName->getCString(), doc->getXRef(),
- doc->getCatalog(), firstPage, lastPage,
- psModePS);
- if (psOut->isOk()) {
- doc->displayPages(psOut, firstPage, lastPage, 72, 72,
- 0, globalParams->getPSCrop(), gFalse);
- }
- delete psOut;
- delete psFileName;
-
- viewer->core->setBusyCursor(gFalse);
-}
-
-//------------------------------------------------------------------------
-// GUI code: password dialog
-//------------------------------------------------------------------------
-
-void XPDFViewer::initPasswordDialog() {
- Widget row, label, okBtn, cancelBtn;
- Arg args[20];
- int n;
- XmString s;
-
- //----- dialog
- n = 0;
- s = XmStringCreateLocalized(xpdfAppName ": Password");
- XtSetArg(args[n], XmNdialogTitle, s); ++n;
- XtSetArg(args[n], XmNdialogStyle, XmDIALOG_PRIMARY_APPLICATION_MODAL); ++n;
- passwordDialog = XmCreateFormDialog(win, "passwordDialog", args, n);
- XmStringFree(s);
-
- //----- message
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNtopOffset, 4); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- s = XmStringCreateLocalized(" ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- passwordMsg = XmCreateLabel(passwordDialog, "msg", args, n);
- XmStringFree(s);
- XtManageChild(passwordMsg);
-
- //----- label and password entry
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, passwordMsg); ++n;
- XtSetArg(args[n], XmNtopOffset, 4); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNorientation, XmHORIZONTAL); ++n;
- XtSetArg(args[n], XmNpacking, XmPACK_TIGHT); ++n;
- row = XmCreateRowColumn(passwordDialog, "row", args, n);
- XtManageChild(row);
- n = 0;
- s = XmStringCreateLocalized("Password: ");
- XtSetArg(args[n], XmNlabelString, s); ++n;
- label = XmCreateLabel(row, "label", args, n);
- XmStringFree(s);
- XtManageChild(label);
- n = 0;
- XtSetArg(args[n], XmNcolumns, 16); ++n;
- passwordText = XmCreateTextField(row, "text", args, n);
- XtManageChild(passwordText);
- XtAddCallback(passwordText, XmNmodifyVerifyCallback,
- &passwordTextVerifyCbk, this);
-
- //----- "Ok" and "Cancel" buttons
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, row); ++n;
- XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNleftOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
- okBtn = XmCreatePushButton(passwordDialog, "Ok", args, n);
- XtManageChild(okBtn);
- XtAddCallback(okBtn, XmNactivateCallback,
- &passwordOkCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); ++n;
- XtSetArg(args[n], XmNtopWidget, row); ++n;
- XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNrightOffset, 4); ++n;
- XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); ++n;
- XtSetArg(args[n], XmNbottomOffset, 4); ++n;
- XtSetArg(args[n], XmNnavigationType, XmEXCLUSIVE_TAB_GROUP); ++n;
- cancelBtn = XmCreatePushButton(passwordDialog, "Cancel", args, n);
- XtManageChild(cancelBtn);
- XtAddCallback(cancelBtn, XmNactivateCallback,
- &passwordCancelCbk, (XtPointer)this);
- n = 0;
- XtSetArg(args[n], XmNdefaultButton, okBtn); ++n;
- XtSetArg(args[n], XmNcancelButton, cancelBtn); ++n;
-#if XmVersion > 1001
- XtSetArg(args[n], XmNinitialFocus, passwordText); ++n;
-#endif
- XtSetValues(passwordDialog, args, n);
-}
-
-void XPDFViewer::passwordTextVerifyCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
- XmTextVerifyCallbackStruct *data =
- (XmTextVerifyCallbackStruct *)callData;
- int i, n;
-
- i = (int)data->startPos;
- n = (int)data->endPos - i;
- if (i > viewer->password->getLength()) {
- i = viewer->password->getLength();
- }
- if (i + n > viewer->password->getLength()) {
- n = viewer->password->getLength() - i;
- }
- viewer->password->del(i, n);
- viewer->password->insert(i, data->text->ptr, data->text->length);
-
- for (i = 0; i < data->text->length; ++i) {
- data->text->ptr[i] = '*';
- }
- data->doit = True;
-}
-
-void XPDFViewer::passwordOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->passwordDone = 1;
-}
-
-void XPDFViewer::passwordCancelCbk(Widget widget, XtPointer ptr,
- XtPointer callData) {
- XPDFViewer *viewer = (XPDFViewer *)ptr;
-
- viewer->passwordDone = -1;
-}
-
-void XPDFViewer::getPassword(GBool again) {
- XmString s;
- XEvent event;
-
- if (password) {
- delete password;
- }
- password = new GString();
-
- XmTextFieldSetString(passwordText, "");
- s = XmStringCreateLocalized(
- again ? (char *)"Incorrect password. Please try again."
- : (char *)"This document requires a password.");
- XtVaSetValues(passwordMsg, XmNlabelString, s, NULL);
- XmStringFree(s);
- XtManageChild(passwordDialog);
- passwordDone = 0;
- do {
- XtAppNextEvent(app->getAppContext(), &event);
- XtDispatchEvent(&event);
- } while (!passwordDone);
-
- if (passwordDone < 0) {
- delete password;
- password = NULL;
- }
-}
-
-//------------------------------------------------------------------------
-// Motif support
-//------------------------------------------------------------------------
-
-XmFontList XPDFViewer::createFontList(char *xlfd) {
- XmFontList fontList;
-
-#if XmVersion <= 1001
-
- XFontStruct *font;
- String params;
- Cardinal nParams;
-
- font = XLoadQueryFont(display, xlfd);
- if (font) {
- fontList = XmFontListCreate(font, XmSTRING_DEFAULT_CHARSET);
- } else {
- params = (String)xlfd;
- nParams = 1;
- XtAppWarningMsg(app->getAppContext(),
- "noSuchFont", "CvtStringToXmFontList",
- "XtToolkitError", "No such font: %s",
- &params, &nParams);
- fontList = NULL;
- }
-
-#else
-
- XmFontListEntry entry;
-
- entry = XmFontListEntryLoad(display, xlfd,
- XmFONT_IS_FONT, XmFONTLIST_DEFAULT_TAG);
- fontList = XmFontListAppendEntry(NULL, entry);
- XmFontListEntryFree(&entry);
-
-#endif
-
- return fontList;
-}
diff --git a/pdf/xpdf/XPDFViewer.h b/pdf/xpdf/XPDFViewer.h
deleted file mode 100644
index b48af27..0000000
--- a/pdf/xpdf/XPDFViewer.h
+++ /dev/null
@@ -1,262 +0,0 @@
-//========================================================================
-//
-// XPDFViewer.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XPDFVIEWER_H
-#define XPDFVIEWER_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#define Object XtObject
-#include <Xm/XmAll.h>
-#undef Object
-#include "gtypes.h"
-#include "XPDFCore.h"
-
-#if (XmVERSION <= 1) && !defined(__sgi)
-#define DISABLE_OUTLINE
-#endif
-
-#if (XmVERSION >= 2 && !defined(LESSTIF_VERSION))
-# define USE_COMBO_BOX 1
-#else
-# undef USE_COMBO_BOX
-#endif
-
-class GString;
-class GList;
-class UnicodeMap;
-class LinkDest;
-class XPDFApp;
-
-//------------------------------------------------------------------------
-
-// NB: this must match the defn of zoomMenuBtnInfo in XPDFViewer.cc
-#define nZoomMenuItems 10
-
-//------------------------------------------------------------------------
-// XPDFViewer
-//------------------------------------------------------------------------
-
-class XPDFViewer {
-public:
-
- XPDFViewer(XPDFApp *appA, GString *fileName,
- int pageA, GString *destName,
- GString *ownerPassword, GString *userPassword);
- GBool isOk() { return ok; }
- ~XPDFViewer();
-
- void open(GString *fileName, int pageA, GString *destName);
- void clear();
- void reloadFile();
-
- Widget getWindow() { return win; }
-
-private:
-
- //----- load / display
- GBool loadFile(GString *fileName, GString *ownerPassword = NULL,
- GString *userPassword = NULL);
- void displayPage(int pageA, double zoomA, int rotateA,
- GBool scrollToTop, GBool addToHist);
- void displayDest(LinkDest *dest, double zoomA, int rotateA,
- GBool addToHist);
- void getPageAndDest(int pageA, GString *destName,
- int *pageOut, LinkDest **destOut);
-
- //----- password dialog
- static GString *reqPasswordCbk(void *data, GBool again);
-
- //----- actions
- static void actionCbk(void *data, char *action);
-
- //----- keyboard/mouse input
- static void keyPressCbk(void *data, char *s, KeySym key,
- Guint modifiers);
- static void mouseCbk(void *data, XEvent *event);
-
- //----- GUI code: main window
- void initWindow();
- void mapWindow();
- void closeWindow();
- int getZoomIdx();
- void setZoomIdx(int idx);
- void setZoomVal(double z);
- static void prevPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void prevTenPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void nextPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void nextTenPageCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void backCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void forwardCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-#if USE_COMBO_BOX
- static void zoomComboBoxCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-#else
- static void zoomMenuCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-#endif
- static void findCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void printCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void aboutCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void quitCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void openCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void openInNewWindowCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void reloadCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void saveAsCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void rotateCCWCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void rotateCWCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void closeCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void closeMsgCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void pageNumCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void updateCbk(void *data, GString *fileName,
- int pageNum, int numPages, char *linkString);
-
- //----- GUI code: outline
-#ifndef DISABLE_OUTLINE
- void setupOutline();
- void setupOutlineItems(GList *items, Widget parent, UnicodeMap *uMap);
- static void outlineSelectCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-#endif
-
- //----- GUI code: "about" dialog
- void initAboutDialog();
-
- //----- GUI code: "open" dialog
- void initOpenDialog();
- void setOpenDialogDir(char *dir);
- void mapOpenDialog(GBool openInNewWindowA);
- static void openOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-
- //----- GUI code: "find" dialog
- void initFindDialog();
- static void findFindCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- void doFind(GBool next);
- static void findCloseCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-
- //----- GUI code: "save as" dialog
- void initSaveAsDialog();
- void setSaveAsDialogDir(char *dir);
- void mapSaveAsDialog();
- static void saveAsOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-
- //----- GUI code: "print" dialog
- void initPrintDialog();
- void setupPrintDialog();
- static void printWithCmdBtnCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void printToFileBtnCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void printPrintCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
-
- //----- GUI code: password dialog
- void initPasswordDialog();
- static void passwordTextVerifyCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void passwordOkCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- static void passwordCancelCbk(Widget widget, XtPointer ptr,
- XtPointer callData);
- void getPassword(GBool again);
-
- //----- Motif support
- XmFontList createFontList(char *xlfd);
-
- XPDFApp *app;
- GBool ok;
-
- Display *display;
- int screenNum;
- Widget win; // top-level window
- Widget form;
- Widget panedWin;
-#ifndef DISABLE_OUTLINE
- Widget outlineScroll;
- Widget outlineTree;
- Widget *outlineLabels;
- int outlineLabelsLength;
- int outlineLabelsSize;
-#endif
- XPDFCore *core;
- Widget toolBar;
- Widget backBtn;
- Widget prevTenPageBtn;
- Widget prevPageBtn;
- Widget nextPageBtn;
- Widget nextTenPageBtn;
- Widget forwardBtn;
- Widget pageNumText;
- Widget pageCountLabel;
-#if USE_COMBO_BOX
- Widget zoomComboBox;
-#else
- Widget zoomMenu;
- Widget zoomMenuBtns[nZoomMenuItems];
-#endif
- Widget findBtn;
- Widget printBtn;
- Widget aboutBtn;
- Widget linkLabel;
- Widget quitBtn;
- Widget popupMenu;
-
- Widget aboutDialog;
- XmFontList aboutBigFont, aboutVersionFont, aboutFixedFont;
-
- Widget openDialog;
- GBool openInNewWindow;
-
- Widget findDialog;
- Widget findText;
-
- Widget saveAsDialog;
-
- Widget printDialog;
- Widget printWithCmdBtn;
- Widget printToFileBtn;
- Widget printCmdText;
- Widget printFileText;
- Widget printFirstPage;
- Widget printLastPage;
-
- Widget passwordDialog;
- Widget passwordMsg;
- Widget passwordText;
- int passwordDone;
- GString *password;
-};
-
-#endif
diff --git a/pdf/xpdf/XRef.cc b/pdf/xpdf/XRef.cc
deleted file mode 100644
index 5be2017..0000000
--- a/pdf/xpdf/XRef.cc
+++ /dev/null
@@ -1,1026 +0,0 @@
-//========================================================================
-//
-// XRef.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <ctype.h>
-#include "gmem.h"
-#include "Object.h"
-#include "Stream.h"
-#include "Lexer.h"
-#include "Parser.h"
-#include "Dict.h"
-#ifndef NO_DECRYPTION
-#include "Decrypt.h"
-#endif
-#include "Error.h"
-#include "ErrorCodes.h"
-#include "XRef.h"
-
-//------------------------------------------------------------------------
-
-#define xrefSearchSize 1024 // read this many bytes at end of file
- // to look for 'startxref'
-
-#ifndef NO_DECRYPTION
-//------------------------------------------------------------------------
-// Permission bits
-//------------------------------------------------------------------------
-
-#define permPrint (1<<2)
-#define permChange (1<<3)
-#define permCopy (1<<4)
-#define permNotes (1<<5)
-#define defPermFlags 0xfffc
-#endif
-
-//------------------------------------------------------------------------
-// ObjectStream
-//------------------------------------------------------------------------
-
-class ObjectStream {
-public:
-
- // Create an object stream, using object number <objStrNum>,
- // generation 0.
- ObjectStream(XRef *xref, int objStrNumA);
-
- ~ObjectStream();
-
- // Return the object number of this object stream.
- int getObjStrNum() { return objStrNum; }
-
- // Get the <objIdx>th object from this stream, which should be
- // object number <objNum>, generation 0.
- Object *getObject(int objIdx, int objNum, Object *obj);
-
-private:
-
- int objStrNum; // object number of the object stream
- int nObjects; // number of objects in the stream
- Object *objs; // the objects (length = nObjects)
- int *objNums; // the object numbers (length = nObjects)
-};
-
-ObjectStream::ObjectStream(XRef *xref, int objStrNumA) {
- Stream *str;
- Parser *parser;
- int *offsets;
- Object objStr, obj1, obj2;
- int first, i;
-
- objStrNum = objStrNumA;
- nObjects = 0;
- objs = NULL;
- objNums = NULL;
-
- if (!xref->fetch(objStrNum, 0, &objStr)->isStream()) {
- goto err1;
- }
-
- if (!objStr.streamGetDict()->lookup("N", &obj1)->isInt()) {
- obj1.free();
- goto err1;
- }
- nObjects = obj1.getInt();
- obj1.free();
- if (nObjects <= 0) {
- goto err1;
- }
-
- if (!objStr.streamGetDict()->lookup("First", &obj1)->isInt()) {
- obj1.free();
- goto err1;
- }
- first = obj1.getInt();
- obj1.free();
- if (first < 0) {
- goto err1;
- }
-
- if (nObjects*(int)sizeof(int)/sizeof(int) != nObjects) {
- error(-1, "Invalid 'nObjects'");
- goto err1;
- }
-
- objs = new Object[nObjects];
- objNums = (int *)gmalloc(nObjects * sizeof(int));
- offsets = (int *)gmalloc(nObjects * sizeof(int));
-
- // parse the header: object numbers and offsets
- objStr.streamReset();
- obj1.initNull();
- str = new EmbedStream(objStr.getStream(), &obj1, gTrue, first);
- parser = new Parser(xref, new Lexer(xref, str));
- for (i = 0; i < nObjects; ++i) {
- parser->getObj(&obj1);
- parser->getObj(&obj2);
- if (!obj1.isInt() || !obj2.isInt()) {
- obj1.free();
- obj2.free();
- delete parser;
- gfree(offsets);
- goto err1;
- }
- objNums[i] = obj1.getInt();
- offsets[i] = obj2.getInt();
- obj1.free();
- obj2.free();
- if (objNums[i] < 0 || offsets[i] < 0 ||
- (i > 0 && offsets[i] < offsets[i-1])) {
- delete parser;
- gfree(offsets);
- goto err1;
- }
- }
- while (str->getChar() != EOF) ;
- delete parser;
-
- // skip to the first object - this shouldn't be necessary because
- // the First key is supposed to be equal to offsets[0], but just in
- // case...
- for (i = first; i < offsets[0]; ++i) {
- objStr.getStream()->getChar();
- }
-
- // parse the objects
- for (i = 0; i < nObjects; ++i) {
- obj1.initNull();
- if (i == nObjects - 1) {
- str = new EmbedStream(objStr.getStream(), &obj1, gFalse, 0);
- } else {
- str = new EmbedStream(objStr.getStream(), &obj1, gTrue,
- offsets[i+1] - offsets[i]);
- }
- parser = new Parser(xref, new Lexer(xref, str));
- parser->getObj(&objs[i]);
- while (str->getChar() != EOF) ;
- delete parser;
- }
-
- gfree(offsets);
-
- err1:
- objStr.free();
- return;
-}
-
-ObjectStream::~ObjectStream() {
- int i;
-
- if (objs) {
- for (i = 0; i < nObjects; ++i) {
- objs[i].free();
- }
- delete[] objs;
- }
- gfree(objNums);
-}
-
-Object *ObjectStream::getObject(int objIdx, int objNum, Object *obj) {
- if (objIdx < 0 || objIdx >= nObjects || objNum != objNums[objIdx]) {
- return obj->initNull();
- }
- return objs[objIdx].copy(obj);
-}
-
-//------------------------------------------------------------------------
-// XRef
-//------------------------------------------------------------------------
-
-XRef::XRef(BaseStream *strA, GString *ownerPassword, GString *userPassword) {
- Guint pos;
- Object obj;
-
- ok = gTrue;
- errCode = errNone;
- size = 0;
- entries = NULL;
- streamEnds = NULL;
- streamEndsLen = 0;
- objStr = NULL;
-
- // read the trailer
- str = strA;
- start = str->getStart();
- pos = getStartXref();
-
- // if there was a problem with the 'startxref' position, try to
- // reconstruct the xref table
- if (pos == 0) {
- if (!(ok = constructXRef())) {
- errCode = errDamaged;
- return;
- }
-
- // read the xref table
- } else {
- while (readXRef(&pos)) ;
-
- // if there was a problem with the xref table,
- // try to reconstruct it
- if (!ok) {
- if (!(ok = constructXRef())) {
- errCode = errDamaged;
- return;
- }
- }
- }
-
- // get the root dictionary (catalog) object
- trailerDict.dictLookupNF("Root", &obj);
- if (obj.isRef()) {
- rootNum = obj.getRefNum();
- rootGen = obj.getRefGen();
- obj.free();
- } else {
- obj.free();
- if (!(ok = constructXRef())) {
- errCode = errDamaged;
- return;
- }
- }
-
- // now set the trailer dictionary's xref pointer so we can fetch
- // indirect objects from it
- trailerDict.getDict()->setXRef(this);
-
- // check for encryption
-#ifndef NO_DECRYPTION
- encrypted = gFalse;
-#endif
- if (checkEncrypted(ownerPassword, userPassword)) {
- ok = gFalse;
- errCode = errEncrypted;
- return;
- }
-}
-
-XRef::~XRef() {
- gfree(entries);
- trailerDict.free();
- if (streamEnds) {
- gfree(streamEnds);
- }
- if (objStr) {
- delete objStr;
- }
-}
-
-// Read the 'startxref' position.
-Guint XRef::getStartXref() {
- char buf[xrefSearchSize+1];
- char *p;
- int c, n, i;
-
- // read last xrefSearchSize bytes
- str->setPos(xrefSearchSize, -1);
- for (n = 0; n < xrefSearchSize; ++n) {
- if ((c = str->getChar()) == EOF) {
- break;
- }
- buf[n] = c;
- }
- buf[n] = '\0';
-
- // find startxref
- for (i = n - 9; i >= 0; --i) {
- if (!strncmp(&buf[i], "startxref", 9)) {
- break;
- }
- }
- if (i < 0) {
- return 0;
- }
- for (p = &buf[i+9]; isspace(*p); ++p) ;
- lastXRefPos = strToUnsigned(p);
-
- return lastXRefPos;
-}
-
-// Read one xref table section. Also reads the associated trailer
-// dictionary, and returns the prev pointer (if any).
-GBool XRef::readXRef(Guint *pos) {
- Parser *parser;
- Object obj;
- GBool more;
-
- // start up a parser, parse one token
- obj.initNull();
- parser = new Parser(NULL,
- new Lexer(NULL,
- str->makeSubStream(start + *pos, gFalse, 0, &obj)));
- parser->getObj(&obj);
-
- // parse an old-style xref table
- if (obj.isCmd("xref")) {
- obj.free();
- more = readXRefTable(parser, pos);
-
- // parse an xref stream
- } else if (obj.isInt()) {
- obj.free();
- if (!parser->getObj(&obj)->isInt()) {
- goto err1;
- }
- obj.free();
- if (!parser->getObj(&obj)->isCmd("obj")) {
- goto err1;
- }
- obj.free();
- if (!parser->getObj(&obj)->isStream()) {
- goto err1;
- }
- more = readXRefStream(obj.getStream(), pos);
- obj.free();
-
- } else {
- goto err1;
- }
-
- delete parser;
- return more;
-
- err1:
- obj.free();
- delete parser;
- ok = gFalse;
- return gFalse;
-}
-
-GBool XRef::readXRefTable(Parser *parser, Guint *pos) {
- XRefEntry entry;
- GBool more;
- Object obj, obj2;
- Guint pos2;
- int first, n, newSize, i;
-
- while (1) {
- parser->getObj(&obj);
- if (obj.isCmd("trailer")) {
- obj.free();
- break;
- }
- if (!obj.isInt()) {
- goto err1;
- }
- first = obj.getInt();
- obj.free();
- if (!parser->getObj(&obj)->isInt()) {
- goto err1;
- }
- n = obj.getInt();
- obj.free();
- if (first < 0 || n < 0 || first + n < 0) {
- goto err1;
- }
- if (first + n > size) {
- for (newSize = size ? 2 * size : 1024;
- first + n > newSize && newSize > 0;
- newSize <<= 1) ;
- if (newSize < 0) {
- goto err1;
- }
- if (newSize*(int)sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) {
- error(-1, "Invalid 'obj' parameters'");
- goto err1;
- }
-
- entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
- for (i = size; i < newSize; ++i) {
- entries[i].offset = 0xffffffff;
- entries[i].type = xrefEntryFree;
- }
- size = newSize;
- }
- for (i = first; i < first + n; ++i) {
- if (!parser->getObj(&obj)->isInt()) {
- goto err1;
- }
- entry.offset = (Guint)obj.getInt();
- obj.free();
- if (!parser->getObj(&obj)->isInt()) {
- goto err1;
- }
- entry.gen = obj.getInt();
- obj.free();
- parser->getObj(&obj);
- if (obj.isCmd("n")) {
- entry.type = xrefEntryUncompressed;
- } else if (obj.isCmd("f")) {
- entry.type = xrefEntryFree;
- } else {
- goto err1;
- }
- obj.free();
- if (entries[i].offset == 0xffffffff) {
- entries[i] = entry;
- // PDF files of patents from the IBM Intellectual Property
- // Network have a bug: the xref table claims to start at 1
- // instead of 0.
- if (i == 1 && first == 1 &&
- entries[1].offset == 0 && entries[1].gen == 65535 &&
- entries[1].type == xrefEntryFree) {
- i = first = 0;
- entries[0] = entries[1];
- entries[1].offset = 0xffffffff;
- }
- }
- }
- }
-
- // read the trailer dictionary
- if (!parser->getObj(&obj)->isDict()) {
- goto err1;
- }
-
- // get the 'Prev' pointer
- obj.getDict()->lookupNF("Prev", &obj2);
- if (obj2.isInt()) {
- *pos = (Guint)obj2.getInt();
- more = gTrue;
- } else if (obj2.isRef()) {
- // certain buggy PDF generators generate "/Prev NNN 0 R" instead
- // of "/Prev NNN"
- *pos = (Guint)obj2.getRefNum();
- more = gTrue;
- } else {
- more = gFalse;
- }
- obj2.free();
-
- // save the first trailer dictionary
- if (trailerDict.isNone()) {
- obj.copy(&trailerDict);
- }
-
- // check for an 'XRefStm' key
- if (obj.getDict()->lookup("XRefStm", &obj2)->isInt()) {
- pos2 = (Guint)obj2.getInt();
- readXRef(&pos2);
- if (!ok) {
- goto err1;
- }
- }
- obj2.free();
-
- obj.free();
- return more;
-
- err1:
- obj.free();
- ok = gFalse;
- return gFalse;
-}
-
-GBool XRef::readXRefStream(Stream *xrefStr, Guint *pos) {
- Dict *dict;
- int w[3];
- GBool more;
- Object obj, obj2, idx;
- int newSize, first, n, i;
-
- dict = xrefStr->getDict();
-
- if (!dict->lookupNF("Size", &obj)->isInt()) {
- goto err1;
- }
- newSize = obj.getInt();
- obj.free();
- if (newSize < 0) {
- goto err1;
- }
- if (newSize > size) {
- if (newSize * (int)sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) {
- error(-1, "Invalid 'size' parameter.");
- return gFalse;
- }
- entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
- for (i = size; i < newSize; ++i) {
- entries[i].offset = 0xffffffff;
- entries[i].type = xrefEntryFree;
- }
- size = newSize;
- }
-
- if (!dict->lookupNF("W", &obj)->isArray() ||
- obj.arrayGetLength() < 3) {
- goto err1;
- }
- for (i = 0; i < 3; ++i) {
- if (!obj.arrayGet(i, &obj2)->isInt()) {
- obj2.free();
- goto err1;
- }
- w[i] = obj2.getInt();
- obj2.free();
- if (w[i] < 0 || w[i] > 4) {
- goto err1;
- }
- }
- obj.free();
-
- xrefStr->reset();
- dict->lookupNF("Index", &idx);
- if (idx.isArray()) {
- for (i = 0; i+1 < idx.arrayGetLength(); i += 2) {
- if (!idx.arrayGet(i, &obj)->isInt()) {
- idx.free();
- goto err1;
- }
- first = obj.getInt();
- obj.free();
- if (!idx.arrayGet(i+1, &obj)->isInt()) {
- idx.free();
- goto err1;
- }
- n = obj.getInt();
- obj.free();
- if (first < 0 || n < 0 ||
- !readXRefStreamSection(xrefStr, w, first, n)) {
- idx.free();
- goto err0;
- }
- }
- } else {
- if (!readXRefStreamSection(xrefStr, w, 0, newSize)) {
- idx.free();
- goto err0;
- }
- }
- idx.free();
-
- dict->lookupNF("Prev", &obj);
- if (obj.isInt()) {
- *pos = (Guint)obj.getInt();
- more = gTrue;
- } else {
- more = gFalse;
- }
- obj.free();
- if (trailerDict.isNone()) {
- trailerDict.initDict(dict);
- }
-
- return more;
-
- err1:
- obj.free();
- err0:
- ok = gFalse;
- return gFalse;
-}
-
-GBool XRef::readXRefStreamSection(Stream *xrefStr, int *w, int first, int n) {
- Guint offset;
- int type, gen, c, newSize, i, j;
-
- if (first + n < 0) {
- return gFalse;
- }
- if (first + n > size) {
- for (newSize = size ? 2 * size : 1024;
- first + n > newSize && newSize > 0;
- newSize <<= 1) ;
- if (newSize < 0) {
- return gFalse;
- }
- if (newSize*(int)sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) {
- error(-1, "Invalid 'size' inside xref table.");
- return gFalse;
- }
- entries = (XRefEntry *)grealloc(entries, newSize * sizeof(XRefEntry));
- for (i = size; i < newSize; ++i) {
- entries[i].offset = 0xffffffff;
- entries[i].type = xrefEntryFree;
- }
- size = newSize;
- }
- for (i = first; i < first + n; ++i) {
- if (w[0] == 0) {
- type = 1;
- } else {
- for (type = 0, j = 0; j < w[0]; ++j) {
- if ((c = xrefStr->getChar()) == EOF) {
- return gFalse;
- }
- type = (type << 8) + c;
- }
- }
- for (offset = 0, j = 0; j < w[1]; ++j) {
- if ((c = xrefStr->getChar()) == EOF) {
- return gFalse;
- }
- offset = (offset << 8) + c;
- }
- for (gen = 0, j = 0; j < w[2]; ++j) {
- if ((c = xrefStr->getChar()) == EOF) {
- return gFalse;
- }
- gen = (gen << 8) + c;
- }
- if (entries[i].offset == 0xffffffff) {
- switch (type) {
- case 0:
- entries[i].offset = offset;
- entries[i].gen = gen;
- entries[i].type = xrefEntryFree;
- break;
- case 1:
- entries[i].offset = offset;
- entries[i].gen = gen;
- entries[i].type = xrefEntryUncompressed;
- break;
- case 2:
- entries[i].offset = offset;
- entries[i].gen = gen;
- entries[i].type = xrefEntryCompressed;
- break;
- default:
- return gFalse;
- }
- }
- }
-
- return gTrue;
-}
-
-// Attempt to construct an xref table for a damaged file.
-GBool XRef::constructXRef() {
- Parser *parser;
- Object newTrailerDict, obj;
- char buf[256];
- Guint pos;
- int num, gen;
- int newSize;
- int streamEndsSize;
- char *p;
- int i;
- GBool gotRoot;
-
- gfree(entries);
- size = 0;
- entries = NULL;
-
- error(0, "PDF file is damaged - attempting to reconstruct xref table...");
- gotRoot = gFalse;
- streamEndsLen = streamEndsSize = 0;
-
- str->reset();
- while (1) {
- pos = str->getPos();
- if (!str->getLine(buf, 256)) {
- break;
- }
- p = buf;
-
- // got trailer dictionary
- if (!strncmp(p, "trailer", 7)) {
- obj.initNull();
- parser = new Parser(NULL,
- new Lexer(NULL,
- str->makeSubStream(start + pos + 7, gFalse, 0, &obj)));
- parser->getObj(&newTrailerDict);
- if (newTrailerDict.isDict()) {
- newTrailerDict.dictLookupNF("Root", &obj);
- if (obj.isRef()) {
- rootNum = obj.getRefNum();
- rootGen = obj.getRefGen();
- if (!trailerDict.isNone()) {
- trailerDict.free();
- }
- newTrailerDict.copy(&trailerDict);
- gotRoot = gTrue;
- }
- obj.free();
- }
- newTrailerDict.free();
- delete parser;
-
- // look for object
- } else if (isdigit(*p)) {
- num = atoi(p);
- if (num > 0) {
- do {
- ++p;
- } while (*p && isdigit(*p));
- if (isspace(*p)) {
- do {
- ++p;
- } while (*p && isspace(*p));
- if (isdigit(*p)) {
- gen = atoi(p);
- do {
- ++p;
- } while (*p && isdigit(*p));
- if (isspace(*p)) {
- do {
- ++p;
- } while (*p && isspace(*p));
- if (!strncmp(p, "obj", 3)) {
- if (num >= size) {
- newSize = (num + 1 + 255) & ~255;
- if (newSize < 0) {
- error(-1, "Bad object number");
- return gFalse;
- }
- if (newSize*(int)sizeof(XRefEntry)/sizeof(XRefEntry) != newSize) {
- error(-1, "Invalid 'obj' parameters.");
- return gFalse;
- }
- entries = (XRefEntry *)
- grealloc(entries, newSize * sizeof(XRefEntry));
- for (i = size; i < newSize; ++i) {
- entries[i].offset = 0xffffffff;
- entries[i].type = xrefEntryFree;
- }
- size = newSize;
- }
- if (entries[num].type == xrefEntryFree ||
- gen >= entries[num].gen) {
- entries[num].offset = pos - start;
- entries[num].gen = gen;
- entries[num].type = xrefEntryUncompressed;
- }
- }
- }
- }
- }
- }
-
- } else if (!strncmp(p, "endstream", 9)) {
- if (streamEndsLen == streamEndsSize) {
- streamEndsSize += 64;
- if (streamEndsSize*(int)sizeof(int)/sizeof(int) != streamEndsSize) {
- error(-1, "Invalid 'endstream' parameter.");
- return gFalse;
- }
- streamEnds = (Guint *)grealloc(streamEnds,
- streamEndsSize * sizeof(int));
- }
- streamEnds[streamEndsLen++] = pos;
- }
- }
-
- if (gotRoot)
- return gTrue;
-
- error(-1, "Couldn't find trailer dictionary");
- return gFalse;
-}
-
-#ifndef NO_DECRYPTION
-GBool XRef::checkEncrypted(GString *ownerPassword, GString *userPassword) {
- Object encrypt, filterObj, versionObj, revisionObj, lengthObj;
- Object ownerKey, userKey, permissions, fileID, fileID1;
- GBool encrypted1;
- GBool ret;
-
- keyLength = 0;
- encVersion = encRevision = 0;
- ret = gFalse;
-
- permFlags = defPermFlags;
- ownerPasswordOk = gFalse;
- trailerDict.dictLookup("Encrypt", &encrypt);
- if ((encrypted1 = encrypt.isDict())) {
- ret = gTrue;
- encrypt.dictLookup("Filter", &filterObj);
- if (filterObj.isName("Standard")) {
- encrypt.dictLookup("V", &versionObj);
- encrypt.dictLookup("R", &revisionObj);
- encrypt.dictLookup("Length", &lengthObj);
- encrypt.dictLookup("O", &ownerKey);
- encrypt.dictLookup("U", &userKey);
- encrypt.dictLookup("P", &permissions);
- trailerDict.dictLookup("ID", &fileID);
- if (versionObj.isInt() &&
- revisionObj.isInt() &&
- ownerKey.isString() && ownerKey.getString()->getLength() == 32 &&
- userKey.isString() && userKey.getString()->getLength() == 32 &&
- permissions.isInt() &&
- fileID.isArray()) {
- encVersion = versionObj.getInt();
- encRevision = revisionObj.getInt();
- if (lengthObj.isInt()) {
- keyLength = lengthObj.getInt() / 8;
- } else {
- keyLength = 5;
- }
- if (keyLength > 16) {
- keyLength = 16;
- }
- permFlags = permissions.getInt();
- if (encVersion >= 1 && encVersion <= 2 &&
- encRevision >= 2 && encRevision <= 3) {
- fileID.arrayGet(0, &fileID1);
- if (fileID1.isString()) {
- if (Decrypt::makeFileKey(encVersion, encRevision, keyLength,
- ownerKey.getString(), userKey.getString(),
- permFlags, fileID1.getString(),
- ownerPassword, userPassword, fileKey,
- &ownerPasswordOk)) {
- if (ownerPassword && !ownerPasswordOk) {
- error(-1, "Incorrect owner password");
- }
- ret = gFalse;
- } else {
- error(-1, "Incorrect password");
- }
- } else {
- error(-1, "Weird encryption info");
- }
- fileID1.free();
- } else {
- error(-1, "Unsupported version/revision (%d/%d) of Standard security handler",
- encVersion, encRevision);
- }
- } else {
- error(-1, "Weird encryption info");
- }
- fileID.free();
- permissions.free();
- userKey.free();
- ownerKey.free();
- lengthObj.free();
- revisionObj.free();
- versionObj.free();
- } else {
- error(-1, "Unknown security handler '%s'",
- filterObj.isName() ? filterObj.getName() : "???");
- }
- filterObj.free();
- }
- encrypt.free();
-
- // this flag has to be set *after* we read the O/U/P strings
- encrypted = encrypted1;
-
- return ret;
-}
-#else
-GBool XRef::checkEncrypted(GString *ownerPassword, GString *userPassword) {
- Object obj;
- GBool encrypted;
-
- trailerDict.dictLookup("Encrypt", &obj);
- if ((encrypted = !obj.isNull())) {
- error(-1, "PDF file is encrypted and this version of the Xpdf tools");
- error(-1, "was built without decryption support.");
- }
- obj.free();
- return encrypted;
-}
-#endif
-
-GBool XRef::okToPrint(GBool ignoreOwnerPW) {
-#ifndef NO_DECRYPTION
- return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permPrint);
-#else
- return gTrue;
-#endif
-}
-
-GBool XRef::okToChange(GBool ignoreOwnerPW) {
-#ifndef NO_DECRYPTION
- return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permChange);
-#else
- return gTrue;
-#endif
-}
-
-GBool XRef::okToCopy(GBool ignoreOwnerPW) {
-#ifndef NO_DECRYPTION
- return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permCopy);
-#else
- return gTrue;
-#endif
-}
-
-GBool XRef::okToAddNotes(GBool ignoreOwnerPW) {
-#ifndef NO_DECRYPTION
- return (!ignoreOwnerPW && ownerPasswordOk) || (permFlags & permNotes);
-#else
- return gTrue;
-#endif
-}
-
-Object *XRef::fetch(int num, int gen, Object *obj) {
- XRefEntry *e;
- Parser *parser;
- Object obj1, obj2, obj3;
-
- // check for bogus ref - this can happen in corrupted PDF files
- if (num < 0 || num >= size) {
- goto err;
- }
-
- e = &entries[num];
- switch (e->type) {
-
- case xrefEntryUncompressed:
- if (e->gen != gen) {
- goto err;
- }
- obj1.initNull();
- parser = new Parser(this,
- new Lexer(this,
- str->makeSubStream(start + e->offset, gFalse, 0, &obj1)));
- parser->getObj(&obj1);
- parser->getObj(&obj2);
- parser->getObj(&obj3);
- if (!obj1.isInt() || obj1.getInt() != num ||
- !obj2.isInt() || obj2.getInt() != gen ||
- !obj3.isCmd("obj")) {
- goto err;
- }
-#ifndef NO_DECRYPTION
- parser->getObj(obj, encrypted ? fileKey : (Guchar *)NULL, keyLength,
- num, gen);
-#else
- parser->getObj(obj);
-#endif
- obj1.free();
- obj2.free();
- obj3.free();
- delete parser;
- break;
-
- case xrefEntryCompressed:
- if (gen != 0) {
- goto err;
- }
- if (!objStr || objStr->getObjStrNum() != (int)e->offset) {
- if (objStr) {
- delete objStr;
- }
- objStr = new ObjectStream(this, e->offset);
- }
- objStr->getObject(e->gen, num, obj);
- break;
-
- default:
- goto err;
- }
-
- return obj;
-
- err:
- return obj->initNull();
-}
-
-Object *XRef::getDocInfo(Object *obj) {
- return trailerDict.dictLookup("Info", obj);
-}
-
-// Added for the pdftex project.
-Object *XRef::getDocInfoNF(Object *obj) {
- return trailerDict.dictLookupNF("Info", obj);
-}
-
-GBool XRef::getStreamEnd(Guint streamStart, Guint *streamEnd) {
- int a, b, m;
-
- if (streamEndsLen == 0 ||
- streamStart > streamEnds[streamEndsLen - 1]) {
- return gFalse;
- }
-
- a = -1;
- b = streamEndsLen - 1;
- // invariant: streamEnds[a] < streamStart <= streamEnds[b]
- while (b - a > 1) {
- m = (a + b) / 2;
- if (streamStart <= streamEnds[m]) {
- b = m;
- } else {
- a = m;
- }
- }
- *streamEnd = streamEnds[b];
- return gTrue;
-}
-
-Guint XRef::strToUnsigned(char *s) {
- Guint x;
- char *p;
- int i;
-
- x = 0;
- for (p = s, i = 0; *p && isdigit(*p) && i < 10; ++p, ++i) {
- x = 10 * x + (*p - '0');
- }
- return x;
-}
diff --git a/pdf/xpdf/XRef.h b/pdf/xpdf/XRef.h
deleted file mode 100644
index bec487a..0000000
--- a/pdf/xpdf/XRef.h
+++ /dev/null
@@ -1,135 +0,0 @@
-//========================================================================
-//
-// XRef.h
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XREF_H
-#define XREF_H
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include "gtypes.h"
-#include "Object.h"
-
-class Dict;
-class Stream;
-class Parser;
-class ObjectStream;
-
-//------------------------------------------------------------------------
-// XRef
-//------------------------------------------------------------------------
-
-enum XRefEntryType {
- xrefEntryFree,
- xrefEntryUncompressed,
- xrefEntryCompressed
-};
-
-struct XRefEntry {
- Guint offset;
- int gen;
- XRefEntryType type;
-};
-
-class XRef {
-public:
-
- // Constructor. Read xref table from stream.
- XRef(BaseStream *strA, GString *ownerPassword, GString *userPassword);
-
- // Destructor.
- ~XRef();
-
- // Is xref table valid?
- GBool isOk() { return ok; }
-
- // Get the error code (if isOk() returns false).
- int getErrorCode() { return errCode; }
-
- // Is the file encrypted?
-#ifndef NO_DECRYPTION
- GBool isEncrypted() { return encrypted; }
-#else
- GBool isEncrypted() { return gFalse; }
-#endif
-
- // Check various permissions.
- GBool okToPrint(GBool ignoreOwnerPW = gFalse);
- GBool okToChange(GBool ignoreOwnerPW = gFalse);
- GBool okToCopy(GBool ignoreOwnerPW = gFalse);
- GBool okToAddNotes(GBool ignoreOwnerPW = gFalse);
-
- // Get catalog object.
- Object *getCatalog(Object *obj) { return fetch(rootNum, rootGen, obj); }
-
- // Fetch an indirect reference.
- Object *fetch(int num, int gen, Object *obj);
-
- // Return the document's Info dictionary (if any).
- Object *getDocInfo(Object *obj);
- Object *getDocInfoNF(Object *obj);
-
- // Return the number of objects in the xref table.
- int getNumObjects() { return size; }
-
- // Return the offset of the last xref table.
- Guint getLastXRefPos() { return lastXRefPos; }
-
- // Return the catalog object reference.
- int getRootNum() { return rootNum; }
- int getRootGen() { return rootGen; }
-
- // Get end position for a stream in a damaged file.
- // Returns false if unknown or file is not damaged.
- GBool getStreamEnd(Guint streamStart, Guint *streamEnd);
-
- // Direct access.
- int getSize() { return size; }
- XRefEntry *getEntry(int i) { return &entries[i]; }
- Object *getTrailerDict() { return &trailerDict; }
-
-private:
-
- BaseStream *str; // input stream
- Guint start; // offset in file (to allow for garbage
- // at beginning of file)
- XRefEntry *entries; // xref entries
- int size; // size of <entries> array
- int rootNum, rootGen; // catalog dict
- GBool ok; // true if xref table is valid
- int errCode; // error code (if <ok> is false)
- Object trailerDict; // trailer dictionary
- Guint lastXRefPos; // offset of last xref table
- Guint *streamEnds; // 'endstream' positions - only used in
- // damaged files
- int streamEndsLen; // number of valid entries in streamEnds
- ObjectStream *objStr; // cached object stream
-#ifndef NO_DECRYPTION
- GBool encrypted; // true if file is encrypted
- int encVersion; // encryption algorithm
- int encRevision; // security handler revision
- int keyLength; // length of key, in bytes
- int permFlags; // permission bits
- Guchar fileKey[16]; // file decryption key
- GBool ownerPasswordOk; // true if owner password is correct
-#endif
-
- Guint getStartXref();
- GBool readXRef(Guint *pos);
- GBool readXRefTable(Parser *parser, Guint *pos);
- GBool readXRefStreamSection(Stream *xrefStr, int *w, int first, int n);
- GBool readXRefStream(Stream *xrefStr, Guint *pos);
- GBool constructXRef();
- GBool checkEncrypted(GString *ownerPassword, GString *userPassword);
- Guint strToUnsigned(char *s);
-};
-
-#endif
diff --git a/pdf/xpdf/XSplashOutputDev.cc b/pdf/xpdf/XSplashOutputDev.cc
deleted file mode 100644
index 3e2bfc4..0000000
--- a/pdf/xpdf/XSplashOutputDev.cc
+++ /dev/null
@@ -1,323 +0,0 @@
-//========================================================================
-//
-// XSplashOutputDev.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-
-#ifdef USE_GCC_PRAGMAS
-#pragma implementation
-#endif
-
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#include "gmem.h"
-#include "SplashTypes.h"
-#include "SplashBitmap.h"
-#include "Object.h"
-#include "GfxState.h"
-#include "TextOutputDev.h"
-#include "XSplashOutputDev.h"
-
-//------------------------------------------------------------------------
-// Constants and macros
-//------------------------------------------------------------------------
-
-#define xoutRound(x) ((int)(x + 0.5))
-
-//------------------------------------------------------------------------
-// XSplashOutputDev
-//------------------------------------------------------------------------
-
-XSplashOutputDev::XSplashOutputDev(Display *displayA, int screenNumA,
- Visual *visualA, Colormap colormapA,
- GBool reverseVideoA,
- SplashColor paperColorA,
- GBool installCmapA, int rgbCubeSizeA,
- GBool incrementalUpdateA,
- void (*redrawCbkA)(void *data),
- void *redrawCbkDataA):
- SplashOutputDev(splashModeRGB8, reverseVideoA, paperColorA)
-{
- XVisualInfo visualTempl;
- XVisualInfo *visualList;
- Gulong mask;
- int nVisuals;
- XColor xcolor;
- XColor *xcolors;
- int r, g, b, n, m;
- GBool ok;
-
- incrementalUpdate = incrementalUpdateA;
- redrawCbk = redrawCbkA;
- redrawCbkData = redrawCbkDataA;
-
- // create text object
- text = new TextPage(gFalse);
-
- //----- set up the X color stuff
-
- display = displayA;
- visual = visualA;
-
- // check for TrueColor visual
- //~ this should scan the list, not just look at the first one
- visualTempl.visualid = XVisualIDFromVisual(visual);
- visualList = XGetVisualInfo(display, VisualIDMask,
- &visualTempl, &nVisuals);
- if (nVisuals < 1) {
- // this shouldn't happen
- XFree((XPointer)visualList);
- visualList = XGetVisualInfo(display, VisualNoMask, &visualTempl,
- &nVisuals);
- }
- depth = visualList->depth;
- if (visualList->c_class == TrueColor) {
- trueColor = gTrue;
- for (mask = visualList->red_mask, rShift = 0;
- mask && !(mask & 1);
- mask >>= 1, ++rShift) ;
- for (rDiv = 8; mask; mask >>= 1, --rDiv) ;
- for (mask = visualList->green_mask, gShift = 0;
- mask && !(mask & 1);
- mask >>= 1, ++gShift) ;
- for (gDiv = 8; mask; mask >>= 1, --gDiv) ;
- for (mask = visualList->blue_mask, bShift = 0;
- mask && !(mask & 1);
- mask >>= 1, ++bShift) ;
- for (bDiv = 8; mask; mask >>= 1, --bDiv) ;
- } else {
- trueColor = gFalse;
- }
- XFree((XPointer)visualList);
-
- // allocate a color cube
- if (!trueColor) {
-
- // set colors in private colormap
- if (installCmapA) {
- for (rgbCubeSize = xOutMaxRGBCube; rgbCubeSize >= 2; --rgbCubeSize) {
- m = rgbCubeSize * rgbCubeSize * rgbCubeSize;
- if (XAllocColorCells(display, colormapA, False, NULL, 0, colors, m)) {
- break;
- }
- }
- if (rgbCubeSize >= 2) {
- m = rgbCubeSize * rgbCubeSize * rgbCubeSize;
- xcolors = (XColor *)gmalloc(m * sizeof(XColor));
- n = 0;
- for (r = 0; r < rgbCubeSize; ++r) {
- for (g = 0; g < rgbCubeSize; ++g) {
- for (b = 0; b < rgbCubeSize; ++b) {
- xcolors[n].pixel = colors[n];
- xcolors[n].red = (r * 65535) / (rgbCubeSize - 1);
- xcolors[n].green = (g * 65535) / (rgbCubeSize - 1);
- xcolors[n].blue = (b * 65535) / (rgbCubeSize - 1);
- xcolors[n].flags = DoRed | DoGreen | DoBlue;
- ++n;
- }
- }
- }
- XStoreColors(display, colormapA, xcolors, m);
- gfree(xcolors);
- } else {
- rgbCubeSize = 1;
- colors[0] = BlackPixel(display, screenNumA);
- colors[1] = WhitePixel(display, screenNumA);
- }
-
- // allocate colors in shared colormap
- } else {
- if (rgbCubeSize > xOutMaxRGBCube) {
- rgbCubeSize = xOutMaxRGBCube;
- }
- ok = gFalse;
- for (rgbCubeSize = rgbCubeSizeA; rgbCubeSize >= 2; --rgbCubeSize) {
- ok = gTrue;
- n = 0;
- for (r = 0; r < rgbCubeSize && ok; ++r) {
- for (g = 0; g < rgbCubeSize && ok; ++g) {
- for (b = 0; b < rgbCubeSize && ok; ++b) {
- if (n == 0) {
- colors[n] = BlackPixel(display, screenNumA);
- ++n;
- } else {
- xcolor.red = (r * 65535) / (rgbCubeSize - 1);
- xcolor.green = (g * 65535) / (rgbCubeSize - 1);
- xcolor.blue = (b * 65535) / (rgbCubeSize - 1);
- if (XAllocColor(display, colormapA, &xcolor)) {
- colors[n++] = xcolor.pixel;
- } else {
- ok = gFalse;
- }
- }
- }
- }
- }
- if (ok) {
- break;
- }
- XFreeColors(display, colormapA, &colors[1], n-1, 0);
- }
- if (!ok) {
- rgbCubeSize = 1;
- colors[0] = BlackPixel(display, screenNumA);
- colors[1] = WhitePixel(display, screenNumA);
- }
- }
- }
-}
-
-XSplashOutputDev::~XSplashOutputDev() {
- delete text;
-}
-
-void XSplashOutputDev::drawChar(GfxState *state, double x, double y,
- double dx, double dy,
- double originX, double originY,
- CharCode code, Unicode *u, int uLen) {
- text->addChar(state, x, y, dx, dy, code, u, uLen);
- SplashOutputDev::drawChar(state, x, y, dx, dy, originX, originY,
- code, u, uLen);
-}
-
-GBool XSplashOutputDev::beginType3Char(GfxState *state, double x, double y,
- double dx, double dy,
- CharCode code, Unicode *u, int uLen) {
- text->addChar(state, x, y, dx, dy, code, u, uLen);
- return SplashOutputDev::beginType3Char(state, x, y, dx, dy, code, u, uLen);
-}
-
-void XSplashOutputDev::clear() {
- startDoc(NULL);
- startPage(0, NULL);
-}
-
-void XSplashOutputDev::startPage(int pageNum, GfxState *state) {
- SplashOutputDev::startPage(pageNum, state);
- text->startPage(state);
-}
-
-void XSplashOutputDev::endPage() {
- SplashOutputDev::endPage();
- if (!incrementalUpdate) {
- (*redrawCbk)(redrawCbkData);
- }
- text->coalesce(gTrue);
-}
-
-void XSplashOutputDev::dump() {
- if (incrementalUpdate) {
- (*redrawCbk)(redrawCbkData);
- }
-}
-
-void XSplashOutputDev::updateFont(GfxState *state) {
- SplashOutputDev::updateFont(state);
- text->updateFont(state);
-}
-
-void XSplashOutputDev::redraw(int srcX, int srcY,
- Drawable destDrawable, GC destGC,
- int destX, int destY,
- int width, int height) {
- XImage *image;
- SplashColorPtr dataPtr;
- SplashRGB8 *p;
- SplashRGB8 rgb;
- Gulong pixel;
- int bw, x, y, r, g, b, gray;
-
- //~ allocate this image once (whenever the window changes size)
- //~ use XShm
- image = XCreateImage(display, visual, depth, ZPixmap, 0, NULL,
- width, height, 8, 0);
- image->data = (char *)gmalloc(height * image->bytes_per_line);
-
- //~ optimize for known XImage formats
- bw = getBitmap()->getWidth();
- dataPtr = getBitmap()->getDataPtr();
-
- if (trueColor) {
- for (y = 0; y < height; ++y) {
- p = dataPtr.rgb8 + (y + srcY) * bw + srcX;
- for (x = 0; x < width; ++x) {
- rgb = *p++;
- r = splashRGB8R(rgb) >> rDiv;
- g = splashRGB8G(rgb) >> gDiv;
- b = splashRGB8B(rgb) >> bDiv;
- pixel = ((Gulong)r << rShift) +
- ((Gulong)g << gShift) +
- ((Gulong)b << bShift);
- XPutPixel(image, x, y, pixel);
- }
- }
- } else if (rgbCubeSize == 1) {
- //~ this should really use splashModeMono, with non-clustered dithering
- for (y = 0; y < height; ++y) {
- p = dataPtr.rgb8 + (y + srcY) * bw + srcX;
- for (x = 0; x < width; ++x) {
- rgb = *p++;
- gray = xoutRound(0.299 * splashRGB8R(rgb) +
- 0.587 * splashRGB8G(rgb) +
- 0.114 * splashRGB8B(rgb));
- if (gray < 128) {
- pixel = colors[0];
- } else {
- pixel = colors[1];
- }
- XPutPixel(image, x, y, pixel);
- }
- }
- } else {
- for (y = 0; y < height; ++y) {
- p = dataPtr.rgb8 + (y + srcY) * bw + srcX;
- for (x = 0; x < width; ++x) {
- rgb = *p++;
- r = (splashRGB8R(rgb) * (rgbCubeSize - 1)) / 255;
- g = (splashRGB8G(rgb) * (rgbCubeSize - 1)) / 255;
- b = (splashRGB8B(rgb) * (rgbCubeSize - 1)) / 255;
- pixel = colors[(r * rgbCubeSize + g) * rgbCubeSize + b];
- XPutPixel(image, x, y, pixel);
- }
- }
- }
-
- XPutImage(display, destDrawable, destGC, image,
- 0, 0, destX, destY, width, height);
-
- gfree(image->data);
- image->data = NULL;
- XDestroyImage(image);
-}
-
-GBool XSplashOutputDev::findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- int *xMin, int *yMin,
- int *xMax, int *yMax) {
- double xMin1, yMin1, xMax1, yMax1;
-
- xMin1 = (double)*xMin;
- yMin1 = (double)*yMin;
- xMax1 = (double)*xMax;
- yMax1 = (double)*yMax;
- if (text->findText(s, len, startAtTop, stopAtBottom,
- startAtLast, stopAtLast,
- &xMin1, &yMin1, &xMax1, &yMax1)) {
- *xMin = xoutRound(xMin1);
- *xMax = xoutRound(xMax1);
- *yMin = xoutRound(yMin1);
- *yMax = xoutRound(yMax1);
- return gTrue;
- }
- return gFalse;
-}
-
-GString *XSplashOutputDev::getText(int xMin, int yMin, int xMax, int yMax) {
- return text->getText((double)xMin, (double)yMin,
- (double)xMax, (double)yMax);
-}
diff --git a/pdf/xpdf/XSplashOutputDev.h b/pdf/xpdf/XSplashOutputDev.h
deleted file mode 100644
index 71e5b48..0000000
--- a/pdf/xpdf/XSplashOutputDev.h
+++ /dev/null
@@ -1,110 +0,0 @@
-//========================================================================
-//
-// XSplashOutputDev.h
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef XSPLASHOUTPUTDEV_H
-#define XSPLASHOUTPUTDEV_H
-
-#ifdef USE_GCC_PRAGMAS
-#pragma interface
-#endif
-
-#include <X11/Xlib.h>
-#include "SplashTypes.h"
-#include "SplashOutputDev.h"
-
-//------------------------------------------------------------------------
-
-#define xOutMaxRGBCube 6 // max size of RGB color cube
-
-//------------------------------------------------------------------------
-// XSplashOutputDev
-//------------------------------------------------------------------------
-
-class XSplashOutputDev: public SplashOutputDev {
-public:
-
- XSplashOutputDev(Display *displayA, int screenNumA,
- Visual *visualA, Colormap colormapA,
- GBool reverseVideoA, SplashColor paperColorA,
- GBool installCmapA, int rgbCubeSizeA,
- GBool incrementalUpdateA,
- void (*redrawCbkA)(void *data),
- void *redrawCbkDataA);
-
- virtual ~XSplashOutputDev();
-
- //----- initialization and control
-
- // Start a page.
- virtual void startPage(int pageNum, GfxState *state);
-
- // End a page.
- virtual void endPage();
-
- // Dump page contents to display.
- virtual void dump();
-
- //----- update text state
- virtual void updateFont(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);
-
- //----- special access
-
- // Clear out the document (used when displaying an empty window).
- void clear();
-
- // Copy the rectangle (srcX, srcY, width, height) to (destX, destY)
- // in destDC.
- void redraw(int srcX, int srcY,
- Drawable destDrawable, GC destGC,
- int destX, int destY,
- int width, int height);
-
- // Find a string. If <startAtTop> is true, starts looking at the
- // top of the page; else if <startAtLast> is true, starts looking
- // immediately after the last find result; else starts looking at
- // <xMin>,<yMin>. If <stopAtBottom> is true, stops looking at the
- // bottom of the page; else if <stopAtLast> is true, stops looking
- // just before the last find result; else stops looking at
- // <xMax>,<yMax>.
- GBool findText(Unicode *s, int len,
- GBool startAtTop, GBool stopAtBottom,
- GBool startAtLast, GBool stopAtLast,
- int *xMin, int *yMin,
- int *xMax, int *yMax);
-
- // Get the text which is inside the specified rectangle.
- GString *getText(int xMin, int yMin, int xMax, int yMax);
-
-private:
-
- GBool incrementalUpdate; // incrementally update the display?
- void (*redrawCbk)(void *data);
- void *redrawCbkData;
- TextPage *text; // text from the current page
-
- Display *display; // X display pointer
- Visual *visual; // X visual
- Guint depth; // visual depth
- GBool trueColor; // set if using a TrueColor visual
- int rDiv, gDiv, bDiv; // RGB right shifts (for TrueColor)
- int rShift, gShift, bShift; // RGB left shifts (for TrueColor)
- int rgbCubeSize; // size of color cube (for non-TrueColor)
- Gulong // color cube (for non-TrueColor)
- colors[xOutMaxRGBCube * xOutMaxRGBCube * xOutMaxRGBCube];
-};
-
-#endif
diff --git a/pdf/xpdf/about-text.h b/pdf/xpdf/about-text.h
deleted file mode 100644
index 54925ce..0000000
--- a/pdf/xpdf/about-text.h
+++ /dev/null
@@ -1,47 +0,0 @@
-//========================================================================
-//
-// about-text.h
-//
-// Copyright 2002-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-static char *aboutWinText[] = {
- "http://www.foolabs.com/xpdf/",
- "derekn@foolabs.com",
- " ",
- "Licensed under the GNU General Public License (GPL).",
- "See the 'COPYING' file for details.",
- " ",
- "Supports PDF version " supportedPDFVersionStr ".",
- " ",
- "The PDF data structures, operators, and specification",
- "are copyright 1985-2003 Adobe Systems Inc.",
- " ",
- "Mouse bindings:",
- " button 1: select text / follow link",
- " button 2: pan window",
- " button 3: menu",
- " ",
- "Key bindings:",
- " o = open file",
- " r = reload",
- " f / ctrl-F = find text",
- " ctrl-G = find next",
- " ctrl-P = print",
- " n = next page",
- " p = previous page",
- " <PgDn> = <space> = scroll down",
- " <PgUp> = <backspace> = <delete> = scroll up",
- " v = forward (history path)",
- " b = backward (history path)",
- " 0 / + / - = zoom zero / in / out",
- " z / w = zoom page / page width",
- " ctrl-L = redraw",
- " q = quit",
- " <home> / <end> = top / bottom of page",
- " <arrows> = scroll",
- " ",
- "For more information, please read the xpdf(1) man page.",
- NULL
-};
diff --git a/pdf/xpdf/about.xbm b/pdf/xpdf/about.xbm
deleted file mode 100644
index 86f8472..0000000
--- a/pdf/xpdf/about.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define about_width 10
-#define about_height 15
-static unsigned char about_bits[] = {
- 0x78, 0x00, 0xfc, 0x00, 0xce, 0x01, 0x86, 0x01, 0x80, 0x01, 0x80, 0x01,
- 0xc0, 0x01, 0xe0, 0x00, 0x70, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00,
- 0x00, 0x00, 0x30, 0x00, 0x30, 0x00};
diff --git a/pdf/xpdf/backArrow.xbm b/pdf/xpdf/backArrow.xbm
deleted file mode 100644
index 47f49e1..0000000
--- a/pdf/xpdf/backArrow.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define backArrow_width 16
-#define backArrow_height 15
-static unsigned char backArrow_bits[] = {
- 0x80, 0x00, 0xc0, 0x00, 0xe0, 0x00, 0xf0, 0x00, 0xf8, 0x00, 0xfc, 0xcc,
- 0xfe, 0xcc, 0xff, 0xcc, 0xfe, 0xcc, 0xfc, 0xcc, 0xf8, 0xcc, 0xf0, 0x00,
- 0xe0, 0x00, 0xc0, 0x00, 0x80, 0x00};
diff --git a/pdf/xpdf/backArrowDis.xbm b/pdf/xpdf/backArrowDis.xbm
deleted file mode 100644
index 7529639..0000000
--- a/pdf/xpdf/backArrowDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define backArrowDis_width 16
-#define backArrowDis_height 15
-static unsigned char backArrowDis_bits[] = {
- 0x80, 0x00, 0x40, 0x00, 0xa0, 0x00, 0x50, 0x00, 0xa8, 0x00, 0x54, 0x44,
- 0xaa, 0x88, 0x55, 0x44, 0xaa, 0x88, 0x54, 0x44, 0xa8, 0x88, 0x50, 0x00,
- 0xa0, 0x00, 0x40, 0x00, 0x80, 0x00};
diff --git a/pdf/xpdf/dblLeftArrow.xbm b/pdf/xpdf/dblLeftArrow.xbm
deleted file mode 100644
index 616d2bd..0000000
--- a/pdf/xpdf/dblLeftArrow.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define dblLeftArrow_width 16
-#define dblLeftArrow_height 15
-static unsigned char dblLeftArrow_bits[] = {
- 0x80, 0x80, 0xc0, 0xc0, 0xe0, 0xe0, 0xf0, 0xf0, 0xf8, 0xf8, 0xfc, 0xfc,
- 0xfe, 0xfe, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfc, 0xf8, 0xf8, 0xf0, 0xf0,
- 0xe0, 0xe0, 0xc0, 0xc0, 0x80, 0x80};
diff --git a/pdf/xpdf/dblLeftArrowDis.xbm b/pdf/xpdf/dblLeftArrowDis.xbm
deleted file mode 100644
index 3fb78d8..0000000
--- a/pdf/xpdf/dblLeftArrowDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define dblLeftArrowDis_width 16
-#define dblLeftArrowDis_height 15
-static unsigned char dblLeftArrowDis_bits[] = {
- 0x80, 0x80, 0x40, 0x40, 0xa0, 0xa0, 0x50, 0x50, 0xa8, 0xa8, 0x54, 0x54,
- 0xaa, 0xaa, 0x55, 0x55, 0xaa, 0xaa, 0x54, 0x54, 0xa8, 0xa8, 0x50, 0x50,
- 0xa0, 0xa0, 0x40, 0x40, 0x80, 0x80};
diff --git a/pdf/xpdf/dblRightArrow.xbm b/pdf/xpdf/dblRightArrow.xbm
deleted file mode 100644
index 0072810..0000000
--- a/pdf/xpdf/dblRightArrow.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define dblRightArrow_width 16
-#define dblRightArrow_height 15
-static unsigned char dblRightArrow_bits[] = {
- 0x01, 0x01, 0x03, 0x03, 0x07, 0x07, 0x0f, 0x0f, 0x1f, 0x1f, 0x3f, 0x3f,
- 0x7f, 0x7f, 0xff, 0xff, 0x7f, 0x7f, 0x3f, 0x3f, 0x1f, 0x1f, 0x0f, 0x0f,
- 0x07, 0x07, 0x03, 0x03, 0x01, 0x01};
diff --git a/pdf/xpdf/dblRightArrowDis.xbm b/pdf/xpdf/dblRightArrowDis.xbm
deleted file mode 100644
index a6c1e37..0000000
--- a/pdf/xpdf/dblRightArrowDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define dblRightArrowDis_width 16
-#define dblRightArrowDis_height 15
-static unsigned char dblRightArrowDis_bits[] = {
- 0x01, 0x01, 0x02, 0x02, 0x05, 0x05, 0x0a, 0x0a, 0x15, 0x15, 0x2a, 0x2a,
- 0x55, 0x55, 0xaa, 0xaa, 0x55, 0x55, 0x2a, 0x2a, 0x15, 0x15, 0x0a, 0x0a,
- 0x05, 0x05, 0x02, 0x02, 0x01, 0x01};
diff --git a/pdf/xpdf/find.xbm b/pdf/xpdf/find.xbm
deleted file mode 100644
index 206da87..0000000
--- a/pdf/xpdf/find.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define find_width 15
-#define find_height 15
-static unsigned char find_bits[] = {
- 0x38, 0x0e, 0x28, 0x0a, 0x2e, 0x3a, 0xfe, 0x3f, 0x7f, 0x7f, 0x61, 0x43,
- 0x61, 0x43, 0x61, 0x43, 0x61, 0x43, 0xe1, 0x43, 0x21, 0x42, 0x21, 0x42,
- 0x21, 0x42, 0x21, 0x42, 0x3f, 0x7e};
diff --git a/pdf/xpdf/findDis.xbm b/pdf/xpdf/findDis.xbm
deleted file mode 100644
index cf666f2..0000000
--- a/pdf/xpdf/findDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define findDis_width 15
-#define findDis_height 15
-static unsigned char findDis_bits[] = {
- 0x10, 0x04, 0x28, 0x0a, 0x04, 0x10, 0xaa, 0x2a, 0x55, 0x55, 0x20, 0x02,
- 0x41, 0x41, 0x20, 0x02, 0x41, 0x41, 0xa0, 0x02, 0x01, 0x40, 0x20, 0x02,
- 0x01, 0x40, 0x20, 0x02, 0x15, 0x54};
diff --git a/pdf/xpdf/forwardArrow.xbm b/pdf/xpdf/forwardArrow.xbm
deleted file mode 100644
index e387535..0000000
--- a/pdf/xpdf/forwardArrow.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define forwardArrow_width 16
-#define forwardArrow_height 15
-static unsigned char forwardArrow_bits[] = {
- 0x00, 0x01, 0x00, 0x03, 0x00, 0x07, 0x00, 0x0f, 0x00, 0x1f, 0x33, 0x3f,
- 0x33, 0x7f, 0x33, 0xff, 0x33, 0x7f, 0x33, 0x3f, 0x00, 0x1f, 0x00, 0x0f,
- 0x00, 0x07, 0x00, 0x03, 0x00, 0x01};
diff --git a/pdf/xpdf/forwardArrowDis.xbm b/pdf/xpdf/forwardArrowDis.xbm
deleted file mode 100644
index 58d0cc0..0000000
--- a/pdf/xpdf/forwardArrowDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define forwardArrowDis_width 16
-#define forwardArrowDis_height 15
-static unsigned char forwardArrowDis_bits[] = {
- 0x00, 0x01, 0x00, 0x02, 0x00, 0x05, 0x00, 0x0a, 0x00, 0x15, 0x22, 0x2a,
- 0x11, 0x55, 0x22, 0xaa, 0x11, 0x55, 0x22, 0x2a, 0x00, 0x15, 0x00, 0x0a,
- 0x00, 0x05, 0x00, 0x02, 0x00, 0x01};
diff --git a/pdf/xpdf/gpdf-g-switch.h b/pdf/xpdf/gpdf-g-switch.h
deleted file mode 100644
index ffc59c2..0000000
--- a/pdf/xpdf/gpdf-g-switch.h
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * When including goo and glib headers in one file:
- *
- * #include "GList.h"
- * #include "gpdf-g-switch.h"
- * #include "glib.h"
- * < more glib/gtk+/gnome headers >
- * #include "gpdf-g-switch.h"
- */
-
-
-#ifdef GPDF_GOO
-# undef GString
-# undef GList
-# undef GDir
-# undef GMutex
-# undef GPDF_GOO
-#else
-# define GString G_String
-# define GList G_List
-# define GDir G_Dir
-# define GMutex G_Mutex
-# define GPDF_GOO
-#endif
diff --git a/pdf/xpdf/leftArrow.xbm b/pdf/xpdf/leftArrow.xbm
deleted file mode 100644
index 367e4e6..0000000
--- a/pdf/xpdf/leftArrow.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define leftArrow_width 8
-#define leftArrow_height 15
-static unsigned char leftArrow_bits[] = {
- 0x80, 0xc0, 0xe0, 0xf0, 0xf8, 0xfc, 0xfe, 0xff, 0xfe, 0xfc, 0xf8, 0xf0,
- 0xe0, 0xc0, 0x80};
diff --git a/pdf/xpdf/leftArrowDis.xbm b/pdf/xpdf/leftArrowDis.xbm
deleted file mode 100644
index 953092a..0000000
--- a/pdf/xpdf/leftArrowDis.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define leftArrowDis_width 8
-#define leftArrowDis_height 15
-static unsigned char leftArrowDis_bits[] = {
- 0x80, 0x40, 0xa0, 0x50, 0xa8, 0x54, 0xaa, 0x55, 0xaa, 0x54, 0xa8, 0x50,
- 0xa0, 0x40, 0x80};
diff --git a/pdf/xpdf/pdffonts.cc b/pdf/xpdf/pdffonts.cc
deleted file mode 100644
index 66d9c37..0000000
--- a/pdf/xpdf/pdffonts.cc
+++ /dev/null
@@ -1,292 +0,0 @@
-//========================================================================
-//
-// pdffonts.cc
-//
-// Copyright 2001-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <math.h>
-#include "parseargs.h"
-#include "GString.h"
-#include "gmem.h"
-#include "GlobalParams.h"
-#include "Error.h"
-#include "Object.h"
-#include "Dict.h"
-#include "GfxFont.h"
-#include "Annot.h"
-#include "PDFDoc.h"
-#include "xpdfconfig.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;
- GString *fileName;
- GString *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 GString(argv[1]);
-
- // read config file
- globalParams = new GlobalParams(cfgFileName);
-
- // open PDF file
- if (ownerPassword[0] != '\001') {
- ownerPW = new GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0] != '\001') {
- userPW = new GString(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;
- GString *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 --git a/pdf/xpdf/pdfimages.cc b/pdf/xpdf/pdfimages.cc
deleted file mode 100644
index 319e141..0000000
--- a/pdf/xpdf/pdfimages.cc
+++ /dev/null
@@ -1,154 +0,0 @@
-//========================================================================
-//
-// pdfimages.cc
-//
-// Copyright 1998-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "parseargs.h"
-#include "GString.h"
-#include "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 "xpdfconfig.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;
- GString *fileName;
- char *imgRoot;
- GString *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 GString(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 GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0] != '\001') {
- userPW = new GString(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
- if (!doc->okToCopy()) {
- error(-1, "Copying of images from this document is not allowed.");
- exitCode = 3;
- goto err1;
- }
-
- // 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 --git a/pdf/xpdf/pdfinfo.cc b/pdf/xpdf/pdfinfo.cc
deleted file mode 100644
index 3389837..0000000
--- a/pdf/xpdf/pdfinfo.cc
+++ /dev/null
@@ -1,376 +0,0 @@
-//========================================================================
-//
-// pdfinfo.cc
-//
-// Copyright 1998-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include <time.h>
-#include <math.h>
-#include "parseargs.h"
-#include "GString.h"
-#include "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 "xpdfconfig.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;
- GString *fileName;
- GString *ownerPW, *userPW;
- UnicodeMap *uMap;
- Page *page;
- Object info;
- char buf[256];
- double w, h, wISO, hISO;
- FILE *f;
- GString *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 GString(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 GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0] != '\001') {
- userPW = new GString(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;
- GString *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 --git a/pdf/xpdf/pdftoppm.cc b/pdf/xpdf/pdftoppm.cc
deleted file mode 100644
index c12a151..0000000
--- a/pdf/xpdf/pdftoppm.cc
+++ /dev/null
@@ -1,189 +0,0 @@
-//========================================================================
-//
-// pdftoppm.cc
-//
-// Copyright 2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include "parseargs.h"
-#include "gmem.h"
-#include "GString.h"
-#include "GlobalParams.h"
-#include "Object.h"
-#include "PDFDoc.h"
-#include "SplashBitmap.h"
-#include "Splash.h"
-#include "SplashOutputDev.h"
-#include "xpdfconfig.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;
- GString *fileName;
- char *ppmRoot;
- char ppmFile[512];
- GString *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 GString(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 GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0]) {
- userPW = new GString(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 --git a/pdf/xpdf/pdftops.cc b/pdf/xpdf/pdftops.cc
deleted file mode 100644
index cb230a7..0000000
--- a/pdf/xpdf/pdftops.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-//========================================================================
-//
-// pdftops.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "parseargs.h"
-#include "GString.h"
-#include "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 "xpdfconfig.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;
- GString *fileName;
- GString *psFileName;
- PSLevel level;
- PSOutMode mode;
- GString *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 GString(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 GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0] != '\001') {
- userPW = new GString(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 print permission
- if (!doc->okToPrint()) {
- error(-1, "Printing this document is not allowed.");
- exitCode = 3;
- goto err1;
- }
-
- // construct PostScript file name
- if (argc == 3) {
- psFileName = new GString(argv[2]);
- } else {
- p = fileName->getCString() + fileName->getLength() - 4;
- if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
- psFileName = new GString(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 --git a/pdf/xpdf/pdftotext.cc b/pdf/xpdf/pdftotext.cc
deleted file mode 100644
index cb8c896..0000000
--- a/pdf/xpdf/pdftotext.cc
+++ /dev/null
@@ -1,332 +0,0 @@
-//========================================================================
-//
-// pdftotext.cc
-//
-// Copyright 1997-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stddef.h>
-#include <string.h>
-#include "parseargs.h"
-#include "GString.h"
-#include "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 "xpdfconfig.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;
- GString *fileName;
- GString *textFileName;
- GString *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 GString(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 GString(ownerPassword);
- } else {
- ownerPW = NULL;
- }
- if (userPassword[0] != '\001') {
- userPW = new GString(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;
- }
-
- // check for copy permission
- if (!doc->okToCopy()) {
- error(-1, "Copying of text from this document is not allowed.");
- exitCode = 3;
- goto err2;
- }
-
- // construct text file name
- if (argc == 3) {
- textFileName = new GString(argv[2]);
- } else {
- p = fileName->getCString() + fileName->getLength() - 4;
- if (!strcmp(p, ".pdf") || !strcmp(p, ".PDF")) {
- textFileName = new GString(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;
- GString *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 --git a/pdf/xpdf/prefs-strings.h b/pdf/xpdf/prefs-strings.h
deleted file mode 100644
index 4d99767..0000000
--- a/pdf/xpdf/prefs-strings.h
+++ /dev/null
@@ -1,4 +0,0 @@
-/* Window appeareance */
-#define CONF_WINDOWS_SIDEBAR_PAGE "/apps/gpdf/UI/Windows/sidebar_page"
-#define CONF_WINDOWS_SIDEBAR_SIZE "/apps/gpdf/UI/Windows/sidebar_size"
-#define CONF_WINDOWS_SHOW_SIDEBAR "/apps/gpdf/UI/Windows/show_sidebar"
diff --git a/pdf/xpdf/print.xbm b/pdf/xpdf/print.xbm
deleted file mode 100644
index 209eb43..0000000
--- a/pdf/xpdf/print.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define print_width 15
-#define print_height 15
-static unsigned char print_bits[] = {
- 0xf0, 0x7f, 0x10, 0x40, 0x10, 0x40, 0xc8, 0x23, 0x08, 0x20, 0x68, 0x23,
- 0x04, 0x10, 0x34, 0x10, 0x04, 0x10, 0xff, 0x7f, 0x55, 0x55, 0xab, 0x6a,
- 0x55, 0x55, 0xab, 0x6a, 0xfe, 0x3f};
diff --git a/pdf/xpdf/printDis.xbm b/pdf/xpdf/printDis.xbm
deleted file mode 100644
index 19e962d..0000000
--- a/pdf/xpdf/printDis.xbm
+++ /dev/null
@@ -1,6 +0,0 @@
-#define printDis_width 15
-#define printDis_height 15
-static unsigned char printDis_bits[] = {
- 0xa0, 0x2a, 0x10, 0x40, 0x00, 0x00, 0x40, 0x01, 0x08, 0x20, 0x40, 0x01,
- 0x00, 0x00, 0x14, 0x10, 0x00, 0x00, 0x55, 0x55, 0x00, 0x00, 0x01, 0x40,
- 0x00, 0x00, 0x01, 0x40, 0xaa, 0x2a};
diff --git a/pdf/xpdf/rightArrow.xbm b/pdf/xpdf/rightArrow.xbm
deleted file mode 100644
index 4ccb16b..0000000
--- a/pdf/xpdf/rightArrow.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define rightArrow_width 8
-#define rightArrow_height 15
-static unsigned char rightArrow_bits[] = {
- 0x01, 0x03, 0x07, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0x7f, 0x3f, 0x1f, 0x0f,
- 0x07, 0x03, 0x01};
diff --git a/pdf/xpdf/rightArrowDis.xbm b/pdf/xpdf/rightArrowDis.xbm
deleted file mode 100644
index 1216c47..0000000
--- a/pdf/xpdf/rightArrowDis.xbm
+++ /dev/null
@@ -1,5 +0,0 @@
-#define rightArrowDis_width 8
-#define rightArrowDis_height 15
-static unsigned char rightArrowDis_bits[] = {
- 0x01, 0x02, 0x05, 0x0a, 0x15, 0x2a, 0x55, 0xaa, 0x55, 0x2a, 0x15, 0x0a,
- 0x05, 0x02, 0x01};
diff --git a/pdf/xpdf/vms_make.com b/pdf/xpdf/vms_make.com
deleted file mode 100644
index f4fb74a..0000000
--- a/pdf/xpdf/vms_make.com
+++ /dev/null
@@ -1,129 +0,0 @@
-$!========================================================================
-$!
-$! Xpdf compile script for VMS.
-$!
-$! Written by Patrick Moreau, Martin P.J. Zinser.
-$!
-$! Copyright 1996-2003 Glyph & Cog, LLC
-$!
-$!========================================================================
-$!
-$ i = 0
-$ j = 0
-$ APPS = "XPDF,PDFTOPS,PDFTOTEXT,PDFINFO,PDFTOPBM,PDFIMAGES,PDFFONTS"
-$ if f$search("COMMON.OLB").eqs."" then lib/create common.olb
-$!
-$ COMMON_OBJS = "Annot.obj,Array.obj,BuiltinFont.obj," + -
- "BuiltinFontTables.obj,Catalog.obj,CharCodeToUnicode.obj," + -
- "CMap.obj,Decrypt.obj,Dict.obj,Error.obj," + -
- "FontEncodingTables.obj,FontFile.obj," + -
- "Function.obj,Gfx.obj,GfxFont.obj,GfxState.obj,"+ -
- "GlobalParams.obj,JArithmeticDecoder.obj,JBIG2Stream.obj,"+ -
- "Lexer.obj,Link.obj,NameToCharCode.obj,Object.obj,"+ -
- "Outline.obj,OutputDev.obj,Page.obj,Parser.obj,PDFdoc.obj," + -
- "PDFDocEncoding.obj,PSTokenizer.obj,Stream.obj," + -
- "UnicodeMap.obj,UnicodeTypeTable.obj,XRef.obj"
-$ COMMON_LIBS = "[]common.olb/lib,[-.goo]libgoo.olb/lib"
-$!
-$ XPDF_OBJS = "xpdf.obj,FTFont.obj,PSOutputDev.obj," + -
- "SFont.obj,T1Font.obj,TextOutputDev.obj,TTFont.obj," + -
- "XOutputDev.obj,XPDFApp.obj,XPDFCore.obj,XPDFTree.obj," + -
- "XPDFViewer.obj,XPixmapOutputDev.obj"
-$ XPDF_LIBS = ""
-$!
-$ PDFTOPS_OBJS = "pdftops.obj,PSOutputDev.obj"
-$ PDFTOPS_LIBS = ""
-$!
-$ PDFTOTEXT_OBJS = "pdftotext.obj,TextOutputDev.obj"
-$ PDFTOTEXT_LIBS = ""
-$!
-$ PDFINFO_OBJS = "pdfinfo.obj"
-$ PDFINFO_LIBS = ""
-$!
-$ PDFTOPBM_OBJS = "pdftopbm.obj,FTFont.obj,PBMOutputDev.obj,SFont.obj," + -
- "T1Font.obj,TextOutputDev.obj,TTFont.obj,XOutputDev.obj"
-$ PDFTOPBM_LIBS = ""
-$!
-$ PDFIMAGES_OBJS = "pdfimages.obj,ImageOutputDev.obj"
-$ PDFIMAGES_LIBS = ""
-$!
-$ PDFFONTS_OBJS = "pdffonts.obj"
-$ PDFFONTS_LIBS = ""
-$!
-$COMPILE_CXX_LOOP:
-$ file = f$element(i, ",",COMMON_OBJS)
-$ if file .eqs. "," then goto BUILD_APPS
-$ i = i + 1
-$ name = f$parse(file,,,"NAME")
-$ call make 'file "CXXCOMP ''name'.cc" -
- 'name'.cc
-$ call make common.olb "lib/replace common.olb ''name'.obj" -
- 'name'.obj
-$ goto COMPILE_CXX_LOOP
-$!
-$BUILD_APPS:
-$ curr_app = f$element(j,",",APPS)
-$ if curr_app .eqs. "," then exit
-$ j = j + 1
-$ i = 0
-$COMPILE_APP:
-$ file = f$element(i,",",'curr_app'_OBJS)
-$ if file .eqs. "," then goto LINK_APP
-$ i = i + 1
-$ name = f$parse(file,,,"NAME")
-$ call make 'file "CXXCOMP ''name'.cc" -
- 'name'.cc
-$ goto COMPILE_APP
-$LINK_APP:
-$ if 'curr_app'_LIBS .nes. ""
-$ then
-$ LIBS = 'curr_app'_LIBS + "," + COMMON_LIBS
-$ else
-$ LIBS = COMMON_LIBS
-$ endif
-$ OBJS = 'curr_app'_OBJS
-$ write sys$output "Linking ''curr_app'..."
-$ xpdf_link/exe='curr_app'.exe 'OBJS','libs',[-]xpdf.opt/opt
-$!
-$ goto BUILD_APPS
-$ exit
-$!
-$MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES
-$ V = 'F$Verify(0)
-$! P1 = What we are trying to make
-$! P2 = Command to make it
-$! P3 - P8 What it depends on
-$
-$ If F$Search(P1) .Eqs. "" Then Goto Makeit
-$ Time = F$CvTime(F$File(P1,"RDT"))
-$arg=3
-$Loop:
-$ Argument = P'arg
-$ If Argument .Eqs. "" Then Goto Exit
-$ El=0
-$Loop2:
-$ File = F$Element(El," ",Argument)
-$ If File .Eqs. " " Then Goto Endl
-$ AFile = ""
-$Loop3:
-$ OFile = AFile
-$ AFile = F$Search(File)
-$ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl
-$ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit
-$ Goto Loop3
-$NextEL:
-$ El = El + 1
-$ Goto Loop2
-$EndL:
-$ arg=arg+1
-$ If arg .Le. 8 Then Goto Loop
-$ Goto Exit
-$
-$Makeit:
-$ VV=F$VERIFY(0)
-$ write sys$output P2
-$ 'P2
-$ VV='F$Verify(VV)
-$Exit:
-$ If V Then Set Verify
-$ENDSUBROUTINE
diff --git a/pdf/xpdf/xpdf.cc b/pdf/xpdf/xpdf.cc
deleted file mode 100644
index 2705cf6..0000000
--- a/pdf/xpdf/xpdf.cc
+++ /dev/null
@@ -1,316 +0,0 @@
-//========================================================================
-//
-// xpdf.cc
-//
-// Copyright 1996-2003 Glyph & Cog, LLC
-//
-//========================================================================
-
-#include <aconf.h>
-#include "gtypes.h"
-#include "GString.h"
-#include "parseargs.h"
-#include "gfile.h"
-#include "gmem.h"
-#include "GlobalParams.h"
-#include "Object.h"
-#include "XPDFApp.h"
-#include "xpdfconfig.h"
-
-//------------------------------------------------------------------------
-// command line options
-//------------------------------------------------------------------------
-
-static char enableT1libStr[16] = "";
-static char enableFreeTypeStr[16] = "";
-static char antialiasStr[16] = "";
-static char psFileArg[256];
-static char paperSize[15] = "";
-static int paperWidth = 0;
-static int paperHeight = 0;
-static GBool level1 = gFalse;
-static char textEncName[128] = "";
-static char textEOL[16] = "";
-static char ownerPassword[33] = "\001";
-static char userPassword[33] = "\001";
-static GBool fullScreen = gFalse;
-static char remoteName[100] = "xpdf_";
-static GBool doRemoteReload = gFalse;
-static GBool doRemoteRaise = gFalse;
-static GBool doRemoteQuit = gFalse;
-static GBool printCommands = gFalse;
-static GBool quiet = gFalse;
-static char cfgFileName[256] = "";
-static GBool printVersion = gFalse;
-static GBool printHelp = gFalse;
-
-static ArgDesc argDesc[] = {
- {"-g", argStringDummy, NULL, 0,
- "initial window geometry"},
- {"-geometry", argStringDummy, NULL, 0,
- "initial window geometry"},
- {"-title", argStringDummy, NULL, 0,
- "window title"},
- {"-cmap", argFlagDummy, NULL, 0,
- "install a private colormap"},
- {"-rgb", argIntDummy, NULL, 0,
- "biggest RGB cube to allocate (default is 5)"},
- {"-rv", argFlagDummy, NULL, 0,
- "reverse video"},
- {"-papercolor", argStringDummy, NULL, 0,
- "color of paper background"},
- {"-z", argStringDummy, NULL, 0,
- "initial zoom level (percent, 'page', 'width')"},
-#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"},
- {"-ps", argString, psFileArg, sizeof(psFileArg),
- "default PostScript file name or command"},
- {"-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"},
- {"-level1", argFlag, &level1, 0,
- "generate Level 1 PostScript"},
- {"-enc", argString, textEncName, sizeof(textEncName),
- "output text encoding name"},
- {"-eol", argString, textEOL, sizeof(textEOL),
- "output end-of-line convention (unix, dos, or mac)"},
- {"-opw", argString, ownerPassword, sizeof(ownerPassword),
- "owner password (for encrypted files)"},
- {"-upw", argString, userPassword, sizeof(userPassword),
- "user password (for encrypted files)"},
- {"-fullscreen", argFlag, &fullScreen, 0,
- "run in full-screen (presentation) mode"},
- {"-remote", argString, remoteName + 5, sizeof(remoteName) - 5,
- "start/contact xpdf remote server with specified name"},
- {"-reload", argFlag, &doRemoteReload, 0,
- "reload xpdf remove server window (with -remote only)"},
- {"-raise", argFlag, &doRemoteRaise, 0,
- "raise xpdf remote server window (with -remote only)"},
- {"-quit", argFlag, &doRemoteQuit, 0,
- "kill xpdf remote server (with -remote only)"},
- {"-cmd", argFlag, &printCommands, 0,
- "print commands as they're executed"},
- {"-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[]) {
- XPDFApp *app;
- GString *fileName;
- int pg;
- GString *destName;
- GString *userPasswordStr, *ownerPasswordStr;
- GBool ok;
- int exitCode;
-
- exitCode = 0;
- userPasswordStr = ownerPasswordStr = NULL;
-
- // parse args
- ok = parseArgs(argDesc, &argc, argv);
- if (!ok || printVersion || printHelp) {
- fprintf(stderr, "xpdf version %s\n", xpdfVersion);
- fprintf(stderr, "%s\n", xpdfCopyright);
- if (!printVersion) {
- printUsage("xpdf", "[<PDF-file> [<page> | +<dest>]]", argDesc);
- }
- exitCode = 99;
- goto done0;
- }
-
- // read config file
- globalParams = new GlobalParams(cfgFileName);
- globalParams->setupBaseFonts(NULL);
- if (psFileArg[0]) {
- globalParams->setPSFile(psFileArg);
- }
- if (paperSize[0]) {
- if (!globalParams->setPSPaperSize(paperSize)) {
- fprintf(stderr, "Invalid paper size\n");
- }
- } else {
- if (paperWidth) {
- globalParams->setPSPaperWidth(paperWidth);
- }
- if (paperHeight) {
- globalParams->setPSPaperHeight(paperHeight);
- }
- }
- if (level1) {
- globalParams->setPSLevel(psLevel1);
- }
- if (textEncName[0]) {
- globalParams->setTextEncoding(textEncName);
- }
- if (textEOL[0]) {
- if (!globalParams->setTextEOL(textEOL)) {
- fprintf(stderr, "Bad '-eol' value on command line\n");
- }
- }
- 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 (printCommands) {
- globalParams->setPrintCommands(printCommands);
- }
- if (quiet) {
- globalParams->setErrQuiet(quiet);
- }
-
- // create the XPDFApp object
- app = new XPDFApp(&argc, argv);
-
- // the initialZoom parameter can be set in either the config file or
- // as an X resource (or command line arg)
- if (app->getInitialZoom()) {
- globalParams->setInitialZoom(app->getInitialZoom()->getCString());
- }
-
- // check command line
- ok = ok && argc >= 1 && argc <= 3;
- if (doRemoteReload) {
- ok = ok && remoteName[5] && !doRemoteQuit && argc == 1;
- }
- if (doRemoteRaise) {
- ok = ok && remoteName[5] && !doRemoteQuit;
- }
- if (doRemoteQuit) {
- ok = ok && remoteName[5] && argc == 1;
- }
- if (!ok || printVersion || printHelp) {
- fprintf(stderr, "xpdf version %s\n", xpdfVersion);
- fprintf(stderr, "%s\n", xpdfCopyright);
- if (!printVersion) {
- printUsage("xpdf", "[<PDF-file> [<page> | +<dest>]]", argDesc);
- }
- exitCode = 99;
- goto done1;
- }
- if (argc >= 2) {
- fileName = new GString(argv[1]);
- } else {
- fileName = NULL;
- }
- pg = 1;
- destName = NULL;
- if (argc == 3) {
- if (argv[2][0] == '+') {
- destName = new GString(&argv[2][1]);
- } else {
- pg = atoi(argv[2]);
- }
- }
-
- // handle remote server stuff
- if (remoteName[5]) {
- app->setRemoteName(remoteName);
- if (app->remoteServerRunning()) {
- if (fileName) {
- if (destName) {
- app->remoteOpenAtDest(fileName, destName, doRemoteRaise);
- } else {
- app->remoteOpen(fileName, pg, doRemoteRaise);
- }
- } else if (doRemoteReload) {
- app->remoteReload(doRemoteRaise);
- } else if (doRemoteRaise) {
- app->remoteRaise();
- } else if (doRemoteQuit) {
- app->remoteQuit();
- }
- goto done2;
- }
- if (doRemoteQuit) {
- goto done2;
- }
- }
-
- // set options
- app->setFullScreen(fullScreen);
-
- // check for password string(s)
- ownerPasswordStr = ownerPassword[0] != '\001' ? new GString(ownerPassword)
- : (GString *)NULL;
- userPasswordStr = userPassword[0] != '\001' ? new GString(userPassword)
- : (GString *)NULL;
-
- // open the file and run the main loop
- if (destName) {
- if (!app->openAtDest(fileName, destName,
- ownerPasswordStr, userPasswordStr)) {
- exitCode = 1;
- goto done2;
- }
- } else {
- if (!app->open(fileName, pg, ownerPasswordStr, userPasswordStr)) {
- exitCode = 1;
- goto done2;
- }
- }
- app->run();
-
- exitCode = 0;
-
- // clean up
- done2:
- if (userPasswordStr) {
- delete userPasswordStr;
- }
- if (ownerPasswordStr) {
- delete ownerPasswordStr;
- }
- if (destName) {
- delete destName;
- }
- if (fileName) {
- delete fileName;
- }
- done1:
- delete app;
- delete globalParams;
-
- // check for memory leaks
- done0:
- Object::memCheck(stderr);
- gMemReport(stderr);
-
- return exitCode;
-}
diff --git a/pdf/xpdf/xpdfIcon.xpm b/pdf/xpdf/xpdfIcon.xpm
deleted file mode 100644
index 5e05d20..0000000
--- a/pdf/xpdf/xpdfIcon.xpm
+++ /dev/null
@@ -1,62 +0,0 @@
-/* XPM */
-static char *xpdfIcon[] = {
-/* width height num_colors chars_per_pixel */
-" 48 48 7 1",
-/* colors */
-". c #000000",
-"# c #a00000",
-"a c #a0a0a0",
-"b c #c0c0c0",
-"c c #e00000",
-"d c #e0e0e0",
-"e c #ffffff",
-/* pixels */
-"................................................",
-"................................................",
-"................................................",
-"................................................",
-"#ccccccc#................................#ccc#..",
-".#ccccccc#..............................#ccc#...",
-"..#ccccccc#............................#ccc#....",
-"...#ccccccc#................bbba.....abbbc#.....",
-"....#ccccccc#...............beea....debbed......",
-".....#ccccccc#...............ee....bebccee......",
-"......#ccccccc#..............ee....eecc#bb......",
-".......#ccccccc#............aee...#eec#.........",
-"........#ccccccc#...........bed..#beb#..........",
-".........#ccccccc#..........beb.#cbeb...........",
-"..........#ccccccc#.........beb#ccbeb...........",
-"...........#ccccccc#........bebcccbeb...........",
-"............#ccccccc#.......eebcc#dea...........",
-".............#ccccccc#......eecc#.ee............",
-".........ae...#ccccccc#....#eec#..ee............",
-"........aeeaeeeebcccccabeeeaee#.beeeeee.........",
-".......aeeeea..debcccaed##ceee....ee............",
-"......addee.....eeccaedccccbed...beb............",
-"......a.bee.....ee#cbeaccccbeb...beb............",
-"........beb.....ee.#eecccccbeb...beb............",
-"........beb.....ee..eecccccbeb...beb............",
-"........beb.....ee..eeccccceeb...dea............",
-"........deb....aeb.#eeccccceec#..ee.............",
-"........eea....dea#cee##ccceecc#.ee.............",
-"........eee...dea#ccbeda#cdeeccc#ee.............",
-"........eeaeeeba#ccc#beeeeaeeecceeee............",
-"........ee.....#ccc#......#ccccccc#.............",
-".......bee....#ccc#........#ccccccc#............",
-".......beb...#ccc#..........#ccccccc#...........",
-".......beb..#ccc#............#ccccccc#..........",
-".......beb.#ccc#..............#ccccccc#.........",
-".......deb#ccc#................#ccccccc#........",
-".......eeaccc#..................#ccccccc#.......",
-".......eeccc#....................#ccccccc#......",
-".......eecc#......................#ccccccc#.....",
-"......beeb#........................#ccccccc#....",
-".....#bbbb..........................#ccccccc#...",
-"....#ccc#............................#ccccccc#..",
-"...#ccc#..............................#ccccccc#.",
-"..#ccc#................................#ccccccc.",
-"................................................",
-"................................................",
-"................................................",
-"................................................"
-};
diff --git a/pdf/xpdf/xpdfconfig.h b/pdf/xpdf/xpdfconfig.h
deleted file mode 100644
index bf6baf4..0000000
--- a/pdf/xpdf/xpdfconfig.h
+++ /dev/null
@@ -1,110 +0,0 @@
-//========================================================================
-//
-// config.h
-//
-// Copyright 1996-2004 Glyph & Cog, LLC
-//
-//========================================================================
-
-#ifndef CONFIG_H
-#define CONFIG_H
-
-//------------------------------------------------------------------------
-// version
-//------------------------------------------------------------------------
-
-// xpdf version
-#define xpdfVersion "3.00"
-#define xpdfVersionNum 3.00
-#define xpdfMajorVersion 3
-#define xpdfMinorVersion 0
-#define xpdfMajorVersionStr "3"
-#define xpdfMinorVersionStr "0"
-
-// supported PDF version
-#define supportedPDFVersionStr "1.5"
-#define supportedPDFVersionNum 1.5
-
-// copyright notice
-#define xpdfCopyright "Copyright 1996-2004 Glyph & Cog, LLC"
-
-// Windows resource file stuff
-#define winxpdfVersion "WinXpdf 3.00"
-#define xpdfCopyrightAmp "Copyright 1996-2004 Glyph && Cog, LLC"
-
-//------------------------------------------------------------------------
-// paper size
-//------------------------------------------------------------------------
-
-// default paper size (in points) for PostScript output
-#ifdef A4_PAPER
-#define defPaperWidth 595 // ISO A4 (210x297 mm)
-#define defPaperHeight 842
-#else
-#define defPaperWidth 612 // American letter (8.5x11")
-#define defPaperHeight 792
-#endif
-
-//------------------------------------------------------------------------
-// config file (xpdfrc) path
-//------------------------------------------------------------------------
-
-// user config file name, relative to the user's home directory
-#if defined(VMS) || (defined(WIN32) && !defined(__CYGWIN32__))
-#define xpdfUserConfigFile "xpdfrc"
-#else
-#define xpdfUserConfigFile ".xpdfrc"
-#endif
-
-// system config file name (set via the configure script)
-#ifdef SYSTEM_XPDFRC
-#define xpdfSysConfigFile SYSTEM_XPDFRC
-#else
-// under Windows, we get the directory with the executable and then
-// append this file name
-#define xpdfSysConfigFile "xpdfrc"
-#endif
-
-//------------------------------------------------------------------------
-// X-related constants
-//------------------------------------------------------------------------
-
-// default maximum size of color cube to allocate
-#define defaultRGBCube 5
-
-// number of fonts (combined t1lib, FreeType, X server) to cache
-#define xOutFontCacheSize 64
-
-// number of Type 3 fonts to cache
-#define xOutT3FontCacheSize 8
-
-//------------------------------------------------------------------------
-// popen
-//------------------------------------------------------------------------
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define popen _popen
-#define pclose _pclose
-#endif
-
-#if defined(VMS) || defined(VMCMS) || defined(DOS) || defined(OS2) || defined(__EMX__) || defined(WIN32) || defined(__DJGPP__) || defined(MACOS)
-#define POPEN_READ_MODE "rb"
-#else
-#define POPEN_READ_MODE "r"
-#endif
-
-//------------------------------------------------------------------------
-// Win32 stuff
-//------------------------------------------------------------------------
-
-#ifdef CDECL
-#undef CDECL
-#endif
-
-#if defined(_MSC_VER) || defined(__BORLANDC__)
-#define CDECL __cdecl
-#else
-#define CDECL
-#endif
-
-#endif