diff options
author | Kristian Høgsberg <krh@redhat.com> | 2005-12-21 17:30:33 +0000 |
---|---|---|
committer | Kristian Høgsberg <krh@redhat.com> | 2005-12-21 17:30:33 +0000 |
commit | 97243286560cb4f264b875185c8768a6af09d554 (patch) | |
tree | 979af959195938358f661fc35ee35b83dcd90bfe /poppler | |
parent | cf887a9a9fae7272165d3aae05c85444ff5ca604 (diff) |
2005-12-21 Kristian Høgsberg <krh@redhat.com>
* utils/Makefile.am: Add parseargs.h to sources and add
-I$(top_srcdir)/poppler to INCLUDES.
* poppler/CairoFontEngine.cc: Apply patch from Hiroyuki Ikezoe to
man non-embedded CJK fonts work.
Diffstat (limited to 'poppler')
-rw-r--r-- | poppler/CairoFontEngine.cc | 52 |
1 files changed, 47 insertions, 5 deletions
diff --git a/poppler/CairoFontEngine.cc b/poppler/CairoFontEngine.cc index bd9cf863..f5ab8cb0 100644 --- a/poppler/CairoFontEngine.cc +++ b/poppler/CairoFontEngine.cc @@ -12,6 +12,7 @@ #include "config.h" #include <string.h> #include "CairoFontEngine.h" +#include "CharCodeToUnicode.h" #include "GlobalParams.h" #include <fofi/FoFiTrueType.h> #include <fofi/FoFiType1C.h> @@ -43,14 +44,17 @@ CairoFont::CairoFont(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs GooString *tmpFileName, *fileName, *substName,*tmpFileName2; DisplayFontParam *dfp; FILE *tmpFile; - int c, i, n; + int c, i, n, code, cmap; GfxFontType fontType; char **enc; char *name; FoFiTrueType *ff; FoFiType1C *ff1c; + CharCodeToUnicode *ctu; + Unicode uBuf[8]; static cairo_user_data_key_t cairo_font_face_key; + dfp = NULL; codeToGID = NULL; codeToGIDLen = 0; cairo_font_face = NULL; @@ -123,11 +127,49 @@ CairoFont::CairoFont(GfxFont *gfxFont, XRef *xref, FT_Library lib, GBool useCIDs break; case fontCIDType2: - n = ((GfxCIDFont *)gfxFont)->getCIDToGIDLen(); + 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 *)gmallocn(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 *)gmallocn(n, sizeof(Gushort)); + memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), + n * sizeof(Gushort)); + } + } codeToGIDLen = n; - codeToGID = (Gushort *)gmallocn(n, sizeof(Gushort)); - memcpy(codeToGID, ((GfxCIDFont *)gfxFont)->getCIDToGID(), - n * sizeof(Gushort)); /* Fall through */ case fontTrueType: if (!(ff = FoFiTrueType::load(fileName->getCString()))) { |