diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc index 1055df1..dca36fc 100644 --- a/poppler/GfxFont.cc +++ b/poppler/GfxFont.cc @@ -1669,6 +1669,7 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { }; Unicode *humap = 0; Unicode *vumap = 0; + Unicode *tumap = 0; Gushort *codeToGID = 0; unsigned long n; int i; @@ -1712,9 +1713,8 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { break; } } - //n = ctu->getLength(); n = 65536; - humap = new Unicode[n*N_UCS_CANDIDATES]; + tumap = new Unicode[n*N_UCS_CANDIDATES]; if (lp->collection != 0) { CharCodeToUnicode *tctu; GooString tname(lp->toUnicodeMap); @@ -1727,19 +1727,21 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { len = tctu->mapToUnicode(cid,ucodes,4); if (len == 1) { - humap[cid*N_UCS_CANDIDATES] = ucodes[0]; + tumap[cid*N_UCS_CANDIDATES] = ucodes[0]; for (i = 1;i < N_UCS_CANDIDATES;i++) { - humap[cid*N_UCS_CANDIDATES+i] = 0; + tumap[cid*N_UCS_CANDIDATES+i] = 0; } } else { /* if not single character, ignore it */ for (i = 0;i < N_UCS_CANDIDATES;i++) { - humap[cid*N_UCS_CANDIDATES+i] = 0; + tumap[cid*N_UCS_CANDIDATES+i] = 0; } } } delete tctu; } + humap = new Unicode[n*N_UCS_CANDIDATES]; + memset(humap,0,sizeof(Unicode)*n*N_UCS_CANDIDATES); vumap = new Unicode[n]; memset(vumap,0,sizeof(Unicode)*n); for (cmapName = lp->CMaps;*cmapName != 0;cmapName++) { @@ -1782,20 +1784,29 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) { unicode = 0; gid = 0; - if (vumap != 0) unicode = vumap[code]; - if (unicode != 0) { - gid = mapCodeToGID(ff,cmap,unicode,gTrue); - if (gid == 0 && humap != 0) { - for (i = 0;i < N_UCS_CANDIDATES - && gid == 0 && (unicode = humap[code*N_UCS_CANDIDATES+i]) != 0;i++) { - gid = mapCodeToGID(ff,cmap,unicode,gTrue); + if (humap != 0) { + for (i = 0;i < N_UCS_CANDIDATES + && gid == 0 && (unicode = humap[code*N_UCS_CANDIDATES+i]) != 0;i++) { + gid = mapCodeToGID(ff,cmap,unicode,gFalse); + } + } + if (gid == 0 && vumap != 0) { + unicode = vumap[code]; + if (unicode != 0) { + gid = mapCodeToGID(ff,cmap,unicode,gTrue); + if (gid == 0 && humap != 0) { + for (i = 0;i < N_UCS_CANDIDATES + && gid == 0 && (unicode = tumap[code*N_UCS_CANDIDATES+i]) != 0; + i++) { + gid = mapCodeToGID(ff,cmap,unicode,gTrue); + } } } } - if (gid == 0 && humap != 0) { + if (gid == 0 && tumap != 0) { for (i = 0;i < N_UCS_CANDIDATES - && gid == 0 && (unicode = humap[code*N_UCS_CANDIDATES+i]) != 0;i++) { - gid = mapCodeToGID(ff,cmap,unicode,wmode); + && gid == 0 && (unicode = tumap[code*N_UCS_CANDIDATES+i]) != 0;i++) { + gid = mapCodeToGID(ff,cmap,unicode,gFalse); } } if (gid == 0) {