mirror of
https://git.freebsd.org/ports.git
synced 2025-07-18 17:59:20 -04:00
o Fix broken handling True Type (multibyte) fonts.
o Accordingly bump PORTREVISION. Obtained from: Debian-JP and Vine Linux(VineSeed) Approved by: dougb (maintainer)
This commit is contained in:
parent
f7cf58143c
commit
83f729088f
Notes:
svn2git
2021-03-31 03:12:20 +00:00
svn path=/head/; revision=107566
2 changed files with 353 additions and 0 deletions
|
@ -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}
|
||||
|
|
352
graphics/xpdf/files/patch-truetype.patch
Normal file
352
graphics/xpdf/files/patch-truetype.patch
Normal file
|
@ -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);
|
Loading…
Add table
Reference in a new issue