fofi/FoFiTrueType.cc | 47 ++++++++++++++++++++++++++++++++++++----------- fofi/FoFiTrueType.h | 8 +++++++- glib/poppler-page.cc | 2 +- poppler/GfxFont.cc | 14 ++++++++------ poppler/GlobalParams.cc | 16 ---------------- poppler/GlobalParams.h | 3 --- poppler/PSOutputDev.cc | 6 +++++- poppler/PSOutputDev.h | 3 +++ 8 files changed, 60 insertions(+), 39 deletions(-)
New commits: commit a5257efe00d0fe850b1abe5c552f7581027ac64c Author: Fabio D'Urso <[email protected]> Date: Mon Mar 26 19:28:55 2012 +0200 Re-added forceRasterize to PSOutputDev (and qt4 fix too)â The patch restores the forceRasterize argument in PSOutputDev ctors. Commit 6ee907f291427b8751a872b31210bf32e8d2b722 had removed it, turning it into a global param. As a side effect, this patch also fixes qt4/poppler-ps-converter, which had not been updated to the new signature, and thus produced corrupted output if forceRasterization was set. diff --git a/glib/poppler-page.cc b/glib/poppler-page.cc index 64a65bd..c5252aa 100644 --- a/glib/poppler-page.cc +++ b/glib/poppler-page.cc @@ -1065,7 +1065,7 @@ poppler_page_render_to_ps (PopplerPage *page, ps_file->first_page, ps_file->last_page, psModePS, (int)ps_file->paper_width, (int)ps_file->paper_height, ps_file->duplex, - 0, 0, 0, 0, gFalse); + 0, 0, 0, 0, gFalse, gFalse); ps_file->document->doc->displayPage (ps_file->out, page->index + 1, 72.0, 72.0, diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index 73a9855..76da74a 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -588,7 +588,6 @@ GlobalParams::GlobalParams(const char *customPopplerDataDir) psUncompressPreloadedImages = gFalse; psRasterResolution = 300; psRasterMono = gFalse; - psAlwaysRasterize = gFalse; textEncoding = new GooString("UTF-8"); #if defined(_WIN32) textEOL = eolDOS; @@ -1618,15 +1617,6 @@ GBool GlobalParams::getPSRasterMono() { return mono; } -GBool GlobalParams::getPSAlwaysRasterize() { - GBool rast; - - lockGlobalParams; - rast = psAlwaysRasterize; - unlockGlobalParams; - return rast; -} - GooString *GlobalParams::getTextEncodingName() { GooString *s; @@ -2016,12 +2006,6 @@ void GlobalParams::setPSRasterMono(GBool mono) { unlockGlobalParams; } -void GlobalParams::setPSAlwaysRasterize(GBool always) { - lockGlobalParams; - psAlwaysRasterize = always; - unlockGlobalParams; -} - void GlobalParams::setTextEncoding(char *encodingName) { lockGlobalParams; delete textEncoding; diff --git a/poppler/GlobalParams.h b/poppler/GlobalParams.h index be1d4b6..be14123 100644 --- a/poppler/GlobalParams.h +++ b/poppler/GlobalParams.h @@ -170,7 +170,6 @@ public: GBool getPSUncompressPreloadedImages(); double getPSRasterResolution(); GBool getPSRasterMono(); - GBool getPSAlwaysRasterize(); GooString *getTextEncodingName(); EndOfLineKind getTextEOL(); GBool getTextPageBreaks(); @@ -225,7 +224,6 @@ public: void setPSUncompressPreloadedImages(GBool uncomp); void setPSRasterResolution(double res); void setPSRasterMono(GBool mono); - void setPSAlwaysRasterize(GBool always); void setTextEncoding(char *encodingName); GBool setTextEOL(char *s); void setTextPageBreaks(GBool pageBreaks); @@ -327,7 +325,6 @@ private: GBool psRasterMono; // true to do PostScript rasterization // in monochrome (gray); false to do it // in color (RGB/CMYK) - GBool psAlwaysRasterize; // force PostScript rasterization GooString *textEncoding; // encoding (unicodeMap) to use for text // output EndOfLineKind textEOL; // type of EOL marker to use for text diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc index f30f53e..8fa8410 100644 --- a/poppler/PSOutputDev.cc +++ b/poppler/PSOutputDev.cc @@ -1052,6 +1052,7 @@ PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, int firstPage, int lastPage, PSOutMode modeA, int paperWidthA, int paperHeightA, GBool duplexA, int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool forceRasterizeA, GBool manualCtrlA, PSOutCustomCodeCbk customCodeCbkA, void *customCodeCbkDataA) { @@ -1078,6 +1079,7 @@ PSOutputDev::PSOutputDev(const char *fileName, PDFDoc *doc, customColors = NULL; haveTextClip = gFalse; t3String = NULL; + forceRasterize = forceRasterizeA; // open file or pipe if (!strcmp(fileName, "-")) { @@ -1120,6 +1122,7 @@ PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, int firstPage, int lastPage, PSOutMode modeA, int paperWidthA, int paperHeightA, GBool duplexA, int imgLLXA, int imgLLYA, int imgURXA, int imgURYA, + GBool forceRasterizeA, GBool manualCtrlA, PSOutCustomCodeCbk customCodeCbkA, void *customCodeCbkDataA) { @@ -1143,6 +1146,7 @@ PSOutputDev::PSOutputDev(PSOutputFunc outputFuncA, void *outputStreamA, customColors = NULL; haveTextClip = gFalse; t3String = NULL; + forceRasterize = forceRasterizeA; init(outputFuncA, outputStreamA, psGeneric, psTitle, doc, firstPage, lastPage, modeA, @@ -3055,7 +3059,7 @@ GBool PSOutputDev::checkPageSlice(Page *page, double /*hDPI*/, double /*vDPI*/, GBool useBinary; GBool isGray; - if (globalParams->getPSAlwaysRasterize()) { + if (forceRasterize) { rasterize = gTrue; } else { scan = new PreScanOutputDev(doc); diff --git a/poppler/PSOutputDev.h b/poppler/PSOutputDev.h index ed23c5c..82f8dfa 100644 --- a/poppler/PSOutputDev.h +++ b/poppler/PSOutputDev.h @@ -98,6 +98,7 @@ public: GBool duplexA = gTrue, int imgLLXA = 0, int imgLLYA = 0, int imgURXA = 0, int imgURYA = 0, + GBool forceRasterizeA = gFalse, GBool manualCtrlA = gFalse, PSOutCustomCodeCbk customCodeCbkA = NULL, void *customCodeCbkDataA = NULL); @@ -111,6 +112,7 @@ public: GBool duplexA = gTrue, int imgLLXA = 0, int imgLLYA = 0, int imgURXA = 0, int imgURYA = 0, + GBool forceRasterizeA = gFalse, GBool manualCtrlA = gFalse, PSOutCustomCodeCbk customCodeCbkA = NULL, void *customCodeCbkDataA = NULL); @@ -474,6 +476,7 @@ private: GBool t3FillColorOnly; // operators should only use the fill color GBool t3Cacheable; // cleared if char is not cacheable GBool t3NeedsRestore; // set if a 'q' operator was issued + GBool forceRasterize; // forces the page to be rasterized into a image before printing GBool displayText; // displayText #if OPI_SUPPORT commit 55d039ada063a9427de6dd59846ce1570ab26e9f Author: Suzuki Toshiya <[email protected]> Date: Mon Mar 26 22:31:29 2012 +0200 CJK improvements More info in the mailing list threads * script names for vertical writing mode should be differentiated for CJK * 2 workarounds for a Korean font on Microsoft Windows diff --git a/fofi/FoFiTrueType.cc b/fofi/FoFiTrueType.cc index 431910d..d0bc800 100644 --- a/fofi/FoFiTrueType.cc +++ b/fofi/FoFiTrueType.cc @@ -18,6 +18,7 @@ // Copyright (C) 2007 Carlos Garcia Campos <[email protected]> // Copyright (C) 2008, 2009 Albert Astals Cid <[email protected]> // Copyright (C) 2008 Tomas Are Haavet <[email protected]> +// Copyright (C) 2012 Suzuki Toshiya <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -2219,7 +2220,17 @@ Guint FoFiTrueType::charToTag(const char *tagName) setup GSUB table data Only supporting vertical text substitution. */ -int FoFiTrueType::setupGSUB(const char *tagName) +int FoFiTrueType::setupGSUB(const char *scriptName) +{ + return setupGSUB(scriptName, NULL); +} + +/* + setup GSUB table data + Only supporting vertical text substitution. +*/ +int FoFiTrueType::setupGSUB(const char *scriptName, + const char *languageName) { Guint gsubTable; unsigned int i; @@ -2236,11 +2247,11 @@ int FoFiTrueType::setupGSUB(const char *tagName) int x; Guint pos; - if (tagName == 0) { + if (scriptName == 0) { gsubFeatureTable = 0; return 0; } - scriptTag = charToTag(tagName); + scriptTag = charToTag(scriptName); /* read GSUB Header */ if ((x = seekTable("GSUB")) < 0) { return 0; /* GSUB table not found */ @@ -2277,11 +2288,25 @@ int FoFiTrueType::setupGSUB(const char *tagName) /* read script table */ /* use default language system */ pos = gsubTable+scriptList+scriptTable; - langSys = getU16BE(pos,&parsedOk);/* default language system */ + langSys = 0; + if (languageName) { + Guint langTag = charToTag(languageName); + Guint langCount = getU16BE(pos+2,&parsedOk); + for (i = 0;i < langCount && langSys == 0;i++) { + tag = getU32BE(pos+4+i*(4+2),&parsedOk); + if (tag == langTag) { + langSys = getU16BE(pos+4+i*(4+2)+4,&parsedOk); + } + } + } + if (langSys == 0) { + /* default language system */ + langSys = getU16BE(pos,&parsedOk); + } /* read LangSys table */ if (langSys == 0) { - /* no ldefault LangSys */ + /* no default LangSys */ return 0; } @@ -2453,6 +2478,9 @@ int FoFiTrueType::checkGIDInCoverage(Guint coverage, Guint orgGID) case 1: count = getU16BE(pos,&parsedOk); pos += 2; + // In some poor CJK fonts, key GIDs are not sorted, + // thus we cannot finish checking even when the range + // including orgGID seems to have already passed. for (i = 0;i < count;i++) { Guint gid; @@ -2462,9 +2490,6 @@ int FoFiTrueType::checkGIDInCoverage(Guint coverage, Guint orgGID) /* found */ index = i; break; - } else if (gid > orgGID) { - /* not found */ - break; } } break; @@ -2481,13 +2506,13 @@ int FoFiTrueType::checkGIDInCoverage(Guint coverage, Guint orgGID) pos += 2; startIndex = getU16BE(pos,&parsedOk); pos += 2; + // In some poor CJK fonts, key GIDs are not sorted, + // thus we cannot finish checking even when the range + // including orgGID seems to have already passed. if (startGID <= orgGID && orgGID <= endGID) { /* found */ index = startIndex+orgGID-startGID; break; - } else if (orgGID <= endGID) { - /* not found */ - break; } } break; diff --git a/fofi/FoFiTrueType.h b/fofi/FoFiTrueType.h index c2d7bd4..fb05ae9 100644 --- a/fofi/FoFiTrueType.h +++ b/fofi/FoFiTrueType.h @@ -16,6 +16,7 @@ // Copyright (C) 2006 Takashi Iwai <[email protected]> // Copyright (C) 2007 Koji Otani <[email protected]> // Copyright (C) 2011 Albert Astals Cid <[email protected]> +// Copyright (C) 2012 Suzuki Toshiya <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -165,7 +166,12 @@ public: // Otherwise returns false. (Only useful for OpenType CFF fonts). GBool getCFFBlock(char **start, int *length); - int setupGSUB(const char *tagName); + // setup vert/vrt2 GSUB for default lang + int setupGSUB(const char *scriptName); + + // setup vert/vrt2 GSUB for specified lang + int setupGSUB(const char *scriptName, const char* languageName); + private: FoFiTrueType(char *fileA, int lenA, GBool freeFileDataA, int faceIndexA); diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc index ac4942d..b3016f4 100644 --- a/poppler/GfxFont.cc +++ b/poppler/GfxFont.cc @@ -28,6 +28,7 @@ // Copyright (C) 2011 Axel Strübing <[email protected]> // Copyright (C) 2011, 2012 Adrian Johnson <[email protected]> // Copyright (C) 2012 Yi Yang <[email protected]> +// Copyright (C) 2012 Suzuki Toshiya <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -2232,36 +2233,37 @@ int *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { static struct CMapListEntry { const char *collection; const char *scriptTag; + const char *languageTag; const char *toUnicodeMap; const char **CMaps; } CMapList[] = { { "Adobe-CNS1", - "kana", + "hani", "CHN ", "Adobe-CNS1-UCS2", adobe_cns1_cmaps, }, { "Adobe-GB1", - "kana", + "hani", "CHN ", "Adobe-GB1-UCS2", adobe_gb1_cmaps, }, { "Adobe-Japan1", - "kana", + "kana", "JAN ", "Adobe-Japan1-UCS2", adobe_japan1_cmaps, }, { "Adobe-Japan2", - "kana", + "kana", "JAN ", "Adobe-Japan2-UCS2", adobe_japan2_cmaps, }, { "Adobe-Korea1", - "kana", + "hang", "KOR ", "Adobe-Korea1-UCS2", adobe_korea1_cmaps, }, @@ -2359,7 +2361,7 @@ int *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { cMap->decRefCnt(); } } - ff->setupGSUB(lp->scriptTag); + ff->setupGSUB(lp->scriptTag, lp->languageTag); } else { error(errSyntaxError, -1, "Unknown character collection {0:t}\n", getCollection());
_______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
