Pardon me. The patch file was missing. Attached is it. Here you go.
Thanks, Haru
diff -Nru kdegraphics-3.3.1/kpdf/xpdf/SplashOutputDev.cc kdegraphics-patched/kpdf/xpdf/SplashOutputDev.cc --- kdegraphics-3.3.1/kpdf/xpdf/SplashOutputDev.cc 2004-11-03 14:56:59.000000000 +0900 +++ kdegraphics-patched/kpdf/xpdf/SplashOutputDev.cc 2004-11-03 22:03:37.000000000 +0900 @@ -497,15 +497,18 @@ FILE *tmpFile; Gushort *codeToGID; DisplayFontParam *dfp; + CharCodeToUnicode *ctu; double m11, m12, m21, m22, w1, w2; SplashCoord mat[4]; - const char *name; - int c, substIdx, n, code; + const char *name; + Unicode uBuf[8]; + int c, substIdx, n, code, cmap; needFontUpdate = gFalse; font = NULL; tmpFileName = NULL; substIdx = -1; + dfp = NULL; if (!(gfxFont = state->getFont())) { goto err1; @@ -544,7 +547,6 @@ } 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-> @@ -650,10 +652,48 @@ } break; case fontCIDType2: - n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); - codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), - n * sizeof(Gushort)); + codeToGID = NULL; + n = 0; + if (dfp) { + // create a CID-to-GID mapping, via Unicode + if ((ctu = ((GfxCIDFont *)gfxFont)->getToUnicode())) { + if ((ff = FoFiTrueType::load(fileName->getCString()))) { + // look for a Unicode cmap + for (cmap = 0; cmap < ff->getNumCmaps(); ++cmap) { + if ((ff->getCmapPlatform(cmap) == 3 && + ff->getCmapEncoding(cmap) == 1) || + ff->getCmapPlatform(cmap) == 0) { + break; + } + } + if (cmap < ff->getNumCmaps()) { + // map CID -> Unicode -> GID + n = ctu->getLength(); + codeToGID = (Gushort *)gmalloc(n * sizeof(Gushort)); + for (code = 0; code < n; ++code) { + if (ctu->mapToUnicode(code, uBuf, 8) > 0) { + codeToGID[code] = ff->mapCodeToGID(cmap, uBuf[0]); + } else { + codeToGID[code] = 0; + } + } + } + delete ff; + } + ctu->decRefCnt(); + } else { + error(-1, "Couldn't find a mapping to Unicode for font '%s'", + gfxFont->getName() ? gfxFont->getName()->getCString() + : "(unnamed)"); + } + } else { + if (((GfxCIDFont *)gfxFont)->getCIDToGID()) { + 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(), diff -Nru kdegraphics-3.3.1/kpdf/xpdf/CharCodeToUnicode.h kdegraphics-patched/kpdf/xpdf/CharCodeToUnicode.h --- kdegraphics-3.3.1/kpdf/xpdf/CharCodeToUnicode.h 2004-11-03 22:03:37.000000000 +0900 +++ kdegraphics-patched/kpdf/xpdf/CharCodeToUnicode.h 2004-11-04 19:09:01.000000000 +0900 @@ -67,6 +67,10 @@ // Map a CharCode to Unicode. int mapToUnicode(CharCode c, Unicode *u, int size); + // Return the mapping's length, i.e., one more than the max char + // code supported by the mapping. + CharCode getLength() { return mapLen; } + private: void parseCMap1(int (*getCharFunc)(void *), void *data, int nBits); diff -Nru kdegraphics-3.3.1/kpdf/splash/SplashFTFont.cc kdegraphics-patched/kpdf/splash/SplashFTFont.cc --- kdegraphics-3.3.1/kpdf/splash/SplashFTFont.cc 2004-11-06 03:13:13.000000000 +0900 +++ kdegraphics-patched/kpdf/splash/SplashFTFont.cc 2004-11-03 22:03:37.000000000 +0900 @@ -225,6 +225,9 @@ if (FT_Get_Glyph(slot, &glyph)) { return NULL; } + if (glyph->format != FT_GLYPH_FORMAT_OUTLINE) { + return NULL; + } path = new SplashPath(); FT_Outline_Decompose(&((FT_OutlineGlyph)glyph)->outline, &outlineFuncs, path);