aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--graphics/xpdf/Makefile1
-rw-r--r--graphics/xpdf/files/patch-truetype.patch352
2 files changed, 353 insertions, 0 deletions
diff --git a/graphics/xpdf/Makefile b/graphics/xpdf/Makefile
index 4a552ac1596c..1134a558a634 100644
--- a/graphics/xpdf/Makefile
+++ b/graphics/xpdf/Makefile
@@ -7,6 +7,7 @@
PORTNAME= xpdf
PORTVERSION= 3.00
+PORTREVISION= 1
CATEGORIES= graphics print
MASTER_SITES= ftp://ftp.foolabs.com/pub/xpdf/ \
${MASTER_SITE_TEX_CTAN}
diff --git a/graphics/xpdf/files/patch-truetype.patch b/graphics/xpdf/files/patch-truetype.patch
new file mode 100644
index 000000000000..2337ed71f198
--- /dev/null
+++ b/graphics/xpdf/files/patch-truetype.patch
@@ -0,0 +1,352 @@
+--- splash/Splash.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/Splash.cc Fri Mar 5 21:37:59 2004
+@@ -952,7 +952,7 @@
+ }
+
+ SplashError Splash::fillChar(SplashCoord x, SplashCoord y,
+- int c, SplashFont *font) {
++ int c, SplashFont *font, Unicode *u) {
+ SplashGlyphBitmap glyph;
+ int x0, y0, xFrac, yFrac;
+ SplashError err;
+@@ -965,7 +965,7 @@
+ xFrac = splashFloor((x - x0) * splashFontFraction);
+ y0 = splashFloor(y);
+ yFrac = splashFloor((y - y0) * splashFontFraction);
+- if (!font->getGlyph(c, xFrac, yFrac, &glyph)) {
++ if (!font->getGlyph(c, xFrac, yFrac, &glyph, u)) {
+ return splashErrNoGlyph;
+ }
+ err = fillGlyph(x, y, &glyph);
+--- splash/Splash.h.orig Thu Jan 22 10:26:44 2004
++++ splash/Splash.h Fri Mar 5 21:37:59 2004
+@@ -104,7 +104,7 @@
+ SplashError xorFill(SplashPath *path, GBool eo);
+
+ // Draw a character, using the current fill pattern.
+- SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font);
++ SplashError fillChar(SplashCoord x, SplashCoord y, int c, SplashFont *font, Unicode *u);
+
+ // Draw a glyph, using the current fill pattern. This function does
+ // not free any data, i.e., it ignores glyph->freeData.
+--- splash/SplashFTFont.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFTFont.cc Fri Mar 5 21:37:59 2004
+@@ -125,12 +125,12 @@
+ }
+
+ GBool SplashFTFont::getGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap) {
+- return SplashFont::getGlyph(c, xFrac, 0, bitmap);
++ SplashGlyphBitmap *bitmap, Unicode *u) {
++ return SplashFont::getGlyph(c, xFrac, 0, bitmap, u);
+ }
+
+ GBool SplashFTFont::makeGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap) {
++ SplashGlyphBitmap *bitmap, Unicode *u) {
+ SplashFTFontFile *ff;
+ FT_Vector offset;
+ FT_GlyphSlot slot;
+@@ -147,11 +147,21 @@
+ FT_Set_Transform(ff->face, &matrix, &offset);
+ slot = ff->face->glyph;
+
++#if 1
+ if (ff->codeToGID && c < ff->codeToGIDLen) {
+ gid = (FT_UInt)ff->codeToGID[c];
++ } else if (ff->modeUnicode) {
++ gid = FT_Get_Char_Index(ff->face, (FT_ULong)*u);
+ } else {
+ gid = (FT_UInt)c;
+ }
++#else
++ if (ff->codeToGID && c < ff->codeToGIDLen) {
++ gid = (FT_UInt)ff->codeToGID[c];
++ } else {
++ gid = (FT_UInt)c;
++ }
++#endif
+
+ // if we have the FT2 bytecode interpreter, autohinting won't be used
+ #ifdef TT_CONFIG_OPTION_BYTECODE_INTERPRETER
+@@ -196,7 +206,7 @@
+ return gTrue;
+ }
+
+-SplashPath *SplashFTFont::getGlyphPath(int c) {
++SplashPath *SplashFTFont::getGlyphPath(int c, Unicode *u) {
+ static FT_Outline_Funcs outlineFuncs = {
+ &glyphPathMoveTo,
+ &glyphPathLineTo,
+@@ -214,11 +224,21 @@
+ ff->face->size = sizeObj;
+ FT_Set_Transform(ff->face, &matrix, NULL);
+ slot = ff->face->glyph;
++#if 1
++ if (ff->codeToGID && c < ff->codeToGIDLen) {
++ gid = (FT_UInt)ff->codeToGID[c];
++ } else if (ff->modeUnicode) {
++ gid = FT_Get_Char_Index(ff->face, (FT_ULong)*u);
++ } else {
++ gid = (FT_UInt)c;
++ }
++#else
+ if (ff->codeToGID && c < ff->codeToGIDLen) {
+ gid = ff->codeToGID[c];
+ } else {
+ gid = (FT_UInt)c;
+ }
++#endif
+ if (FT_Load_Glyph(ff->face, gid, FT_LOAD_DEFAULT)) {
+ return NULL;
+ }
+--- splash/SplashFTFont.h.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFTFont.h Fri Mar 5 21:37:59 2004
+@@ -33,15 +33,15 @@
+
+ // Munge xFrac and yFrac before calling SplashFont::getGlyph.
+ virtual GBool getGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap);
++ SplashGlyphBitmap *bitmap, Unicode *u);
+
+ // 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);
++ SplashGlyphBitmap *bitmap, Unicode *u);
+
+ // Return the path for a glyph.
+- virtual SplashPath *getGlyphPath(int c);
++ virtual SplashPath *getGlyphPath(int c, Unicode *u);
+
+ private:
+
+--- splash/SplashFTFontEngine.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFTFontEngine.cc Fri Mar 5 21:38:00 2004
+@@ -107,7 +107,12 @@
+ SplashFontFile *ret;
+
+ if (!(ff = FoFiTrueType::load(fileName))) {
+- return NULL;
++ ret = SplashFTFontFile::loadTrueTypeFont(this, idA,
++ fileName, gTrue,
++ codeToGID, codeToGIDLen);
++
++ delete ff;
++ return ret;
+ }
+ tmpFileName = NULL;
+ if (!openTempFile(&tmpFileName, &tmpFile, "wb", NULL)) {
+--- splash/SplashFTFontFile.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFTFontFile.cc Fri Mar 5 21:38:00 2004
+@@ -43,7 +43,7 @@
+ }
+
+ return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
+- faceA, codeToGIDA, 256);
++ faceA, gFalse, codeToGIDA, 256);
+ }
+
+ SplashFontFile *SplashFTFontFile::loadCIDFont(SplashFTFontEngine *engineA,
+@@ -59,7 +59,7 @@
+ }
+
+ return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
+- faceA, codeToGIDA, codeToGIDLenA);
++ faceA, gFalse, codeToGIDA, codeToGIDLenA);
+ }
+
+ SplashFontFile *SplashFTFontFile::loadTrueTypeFont(SplashFTFontEngine *engineA,
+@@ -69,19 +69,39 @@
+ Gushort *codeToGIDA,
+ int codeToGIDLenA) {
+ FT_Face faceA;
++ GBool modeUnicodeA = gFalse;
+
+ if (FT_New_Face(engineA->lib, fileNameA, 0, &faceA)) {
+ return NULL;
+ }
+
++#if 1
++ if (!codeToGIDLenA) {
++ int i;
++ modeUnicodeA = gTrue;
++
++ for (i = 0; i < faceA->num_charmaps; ++i) {
++ if ((faceA->charmaps[i]->platform_id == 3 &&
++ faceA->charmaps[i]->encoding_id == 1) ||
++ faceA->charmaps[i]->platform_id == 0) {
++ break;
++ }
++ }
++ if (i == faceA->num_charmaps) {
++ i = 0;
++ }
++ if (i) FT_Set_Charmap(faceA, faceA->charmaps[i]);
++ }
++#endif
++
+ return new SplashFTFontFile(engineA, idA, fileNameA, deleteFileA,
+- faceA, codeToGIDA, codeToGIDLenA);
++ faceA, modeUnicodeA, codeToGIDA, codeToGIDLenA);
+ }
+
+ SplashFTFontFile::SplashFTFontFile(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+ char *fileNameA, GBool deleteFileA,
+- FT_Face faceA,
++ FT_Face faceA, GBool modeUnicodeA,
+ Gushort *codeToGIDA, int codeToGIDLenA):
+ SplashFontFile(idA, fileNameA, deleteFileA)
+ {
+@@ -89,6 +109,7 @@
+ face = faceA;
+ codeToGID = codeToGIDA;
+ codeToGIDLen = codeToGIDLenA;
++ modeUnicode = modeUnicodeA;
+ }
+
+ SplashFTFontFile::~SplashFTFontFile() {
+--- splash/SplashFTFontFile.h.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFTFontFile.h Fri Mar 5 21:38:00 2004
+@@ -53,13 +53,14 @@
+ SplashFTFontFile(SplashFTFontEngine *engineA,
+ SplashFontFileID *idA,
+ char *fileNameA, GBool deleteFileA,
+- FT_Face faceA,
++ FT_Face faceA, GBool modeUnicodeA,
+ Gushort *codeToGIDA, int codeToGIDLenA);
+
+ SplashFTFontEngine *engine;
+ FT_Face face;
+ Gushort *codeToGID;
+ int codeToGIDLen;
++ GBool modeUnicode;
+
+ friend class SplashFTFont;
+ };
+--- splash/SplashFont.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFont.cc Fri Mar 5 21:38:00 2004
+@@ -89,7 +89,7 @@
+ }
+
+ GBool SplashFont::getGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap) {
++ SplashGlyphBitmap *bitmap, Unicode *u) {
+ SplashGlyphBitmap bitmap2;
+ int size;
+ Guchar *p;
+@@ -122,7 +122,7 @@
+ }
+
+ // generate the glyph bitmap
+- if (!makeGlyph(c, xFrac, yFrac, &bitmap2)) {
++ if (!makeGlyph(c, xFrac, yFrac, &bitmap2, u)) {
+ return gFalse;
+ }
+
+--- splash/SplashFont.h.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashFont.h Fri Mar 5 21:38:00 2004
+@@ -61,15 +61,15 @@
+ // 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);
++ SplashGlyphBitmap *bitmap, Unicode *u);
+
+ // 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;
++ SplashGlyphBitmap *bitmap, Unicode *u) = 0;
+
+ // Return the path for a glyph.
+- virtual SplashPath *getGlyphPath(int c) = 0;
++ virtual SplashPath *getGlyphPath(int c, Unicode *u) = 0;
+
+ protected:
+
+--- splash/SplashT1Font.cc.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashT1Font.cc Fri Mar 5 21:38:00 2004
+@@ -171,12 +171,12 @@
+ }
+
+ GBool SplashT1Font::getGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap) {
+- return SplashFont::getGlyph(c, 0, 0, bitmap);
++ SplashGlyphBitmap *bitmap, Unicode *u) {
++ return SplashFont::getGlyph(c, 0, 0, bitmap, u);
+ }
+
+ GBool SplashT1Font::makeGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap) {
++ SplashGlyphBitmap *bitmap, Unicode *u) {
+ GLYPH *glyph;
+ int n, i;
+
+@@ -209,7 +209,7 @@
+ return gTrue;
+ }
+
+-SplashPath *SplashT1Font::getGlyphPath(int c) {
++SplashPath *SplashT1Font::getGlyphPath(int c, Unicode *u) {
+ SplashPath *path;
+ T1_OUTLINE *outline;
+ T1_PATHSEGMENT *seg;
+--- splash/SplashT1Font.h.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashT1Font.h Fri Mar 5 21:38:00 2004
+@@ -30,15 +30,15 @@
+
+ // Munge xFrac and yFrac before calling SplashFont::getGlyph.
+ virtual GBool getGlyph(int c, int xFrac, int yFrac,
+- SplashGlyphBitmap *bitmap);
++ SplashGlyphBitmap *bitmap, Unicode *u);
+
+ // 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);
++ SplashGlyphBitmap *bitmap, Unicode *u);
+
+ // Return the path for a glyph.
+- virtual SplashPath *getGlyphPath(int c);
++ virtual SplashPath *getGlyphPath(int c, Unicode *u);
+
+ private:
+
+--- splash/SplashTypes.h.orig Thu Jan 22 10:26:44 2004
++++ splash/SplashTypes.h Fri Mar 5 21:38:00 2004
+@@ -9,6 +9,7 @@
+
+ #include <aconf.h>
+ #include "gtypes.h"
++#include "../xpdf/CharTypes.h"
+
+ //------------------------------------------------------------------------
+ // coordinates
+--- xpdf/SplashOutputDev.cc.orig Thu Jan 22 10:26:45 2004
++++ xpdf/SplashOutputDev.cc Fri Mar 5 21:38:00 2004
+@@ -823,12 +823,12 @@
+
+ // fill
+ if (!(render & 1)) {
+- splash->fillChar((SplashCoord)x1, (SplashCoord)y1, code, font);
++ splash->fillChar((SplashCoord)x1, (SplashCoord)y1, code, font, u);
+ }
+
+ // stroke
+ if ((render & 3) == 1 || (render & 3) == 2) {
+- if ((path = font->getGlyphPath(code))) {
++ if ((path = font->getGlyphPath(code, u))) {
+ path->offset((SplashCoord)x1, (SplashCoord)y1);
+ splash->stroke(path);
+ delete path;
+@@ -837,7 +837,7 @@
+
+ // clip
+ if (render & 4) {
+- path = font->getGlyphPath(code);
++ path = font->getGlyphPath(code, u);
+ path->offset((SplashCoord)x1, (SplashCoord)y1);
+ if (textClipPath) {
+ textClipPath->append(path);