summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2008-06-01 16:32:55 +0200
committerAlbert Astals Cid <aacid@kde.org>2008-06-01 16:35:25 +0200
commitbaf8f9cd3f90ea64dc8dbd1ebd7227722f6cb267 (patch)
tree0a20f18896c6af4a99e061ad703a8e7c73ca6ba0
parent5fd139bf903de7c476eeb43c74b460e6094475ae (diff)
Do not limit CharCodeToUnicodeString to 8 characters
-rw-r--r--poppler/Annot.cc10
-rw-r--r--poppler/CharCodeToUnicode.cc37
-rw-r--r--poppler/CharCodeToUnicode.h2
-rw-r--r--poppler/Gfx.cc8
-rw-r--r--poppler/GfxFont.cc43
-rw-r--r--poppler/GfxFont.h6
-rw-r--r--poppler/PSOutputDev.cc4
7 files changed, 60 insertions, 50 deletions
diff --git a/poppler/Annot.cc b/poppler/Annot.cc
index e8b5d77c..50babca2 100644
--- a/poppler/Annot.cc
+++ b/poppler/Annot.cc
@@ -1823,7 +1823,7 @@ void AnnotWidget::layoutText(GooString *text, GooString *outBuf, int *i,
int *charCount, GBool noReencode)
{
CharCode c;
- Unicode uChar;
+ Unicode uChar, *uAux;
double w = 0.0;
int uLen, n;
double dx, dy, ox, oy;
@@ -1922,7 +1922,7 @@ void AnnotWidget::layoutText(GooString *text, GooString *outBuf, int *i,
dx = 0.0;
font->getNextChar(outBuf->getCString() + last_o2,
outBuf->getLength() - last_o2,
- &c, &uChar, 1, &uLen, &dx, &dy, &ox, &oy);
+ &c, &uAux, &uLen, &dx, &dy, &ox, &oy);
w += dx;
}
@@ -1985,7 +1985,7 @@ void AnnotWidget::layoutText(GooString *text, GooString *outBuf, int *i,
while (len > 0) {
dx = 0.0;
- n = font->getNextChar(s, len, &c, &uChar, 1, &uLen, &dx, &dy, &ox, &oy);
+ n = font->getNextChar(s, len, &c, &uAux, &uLen, &dx, &dy, &ox, &oy);
if (n == 0) {
break;
@@ -2291,12 +2291,12 @@ void AnnotWidget::drawText(GooString *text, GooString *da, GfxFontDict *fontDict
xPrev = w; // so that first character is placed properly
while (i < comb && len > 0) {
CharCode code;
- Unicode u;
+ Unicode *uAux;
int uLen, n;
double dx, dy, ox, oy;
dx = 0.0;
- n = font->getNextChar(s, len, &code, &u, 1, &uLen, &dx, &dy, &ox, &oy);
+ n = font->getNextChar(s, len, &code, &uAux, &uLen, &dx, &dy, &ox, &oy);
dx *= fontSize;
// center each character within its cell, by advancing the text
diff --git a/poppler/CharCodeToUnicode.cc b/poppler/CharCodeToUnicode.cc
index aba0b0a2..de2617ae 100644
--- a/poppler/CharCodeToUnicode.cc
+++ b/poppler/CharCodeToUnicode.cc
@@ -24,11 +24,9 @@
//------------------------------------------------------------------------
-#define maxUnicodeString 8
-
struct CharCodeToUnicodeString {
CharCode c;
- Unicode u[maxUnicodeString];
+ Unicode *u;
int len;
};
@@ -104,7 +102,8 @@ CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
char buf[256];
char *tok;
Unicode u0;
- Unicode uBuf[maxUnicodeString];
+ int uBufSize = 8;
+ Unicode *uBuf = (Unicode *)gmallocn(uBufSize, sizeof(Unicode));
CharCodeToUnicode *ctu;
int line, n, i;
@@ -131,9 +130,11 @@ CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
continue;
}
n = 0;
- while (n < maxUnicodeString) {
- if (!(tok = strtok(NULL, " \t\r\n"))) {
- break;
+ while ((tok = strtok(NULL, " \t\r\n"))) {
+ if (n >= uBufSize)
+ {
+ uBufSize += 8;
+ uBuf = (Unicode *)greallocn(uBuf, uBufSize, sizeof(Unicode));
}
if (sscanf(tok, "%x", &uBuf[n]) != 1) {
error(-1, "Bad line (%d) in unicodeToUnicode file '%s'",
@@ -165,6 +166,7 @@ CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
greallocn(sMapA, sMapSizeA, sizeof(CharCodeToUnicodeString));
}
sMapA[sMapLenA].c = u0;
+ sMapA[sMapLenA].u = (Unicode*)gmallocn(n, sizeof(Unicode));
for (i = 0; i < n; ++i) {
sMapA[sMapLenA].u[i] = uBuf[i];
}
@@ -180,6 +182,7 @@ CharCodeToUnicode *CharCodeToUnicode::parseUnicodeToUnicode(
ctu = new CharCodeToUnicode(fileName->copy(), mapA, len, gTrue,
sMapA, sMapLenA, sMapSizeA);
gfree(mapA);
+ gfree(uBuf);
return ctu;
}
@@ -356,7 +359,8 @@ void CharCodeToUnicode::addMapping(CharCode code, char *uStr, int n,
map[code] = 0;
sMap[sMapLen].c = code;
sMap[sMapLen].len = n / 4;
- for (j = 0; j < sMap[sMapLen].len && j < maxUnicodeString; ++j) {
+ sMap[sMapLen].u = (Unicode*)gmallocn(sMap[sMapLen].len, sizeof(Unicode));
+ for (j = 0; j < sMap[sMapLen].len; ++j) {
strncpy(uHex, uStr + j*4, 4);
uHex[4] = '\0';
if (sscanf(uHex, "%x", &sMap[sMapLen].u[j]) != 1) {
@@ -412,6 +416,7 @@ CharCodeToUnicode::~CharCodeToUnicode() {
}
gfree(map);
if (sMap) {
+ for (int i = 0; i < sMapLen; ++i) gfree(sMap[i].u);
gfree(sMap);
}
#if MULTITHREADED
@@ -456,6 +461,7 @@ void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) {
} else {
for (i = 0; i < sMapLen; ++i) {
if (sMap[i].c == c) {
+ gfree(sMap[i].u);
break;
}
}
@@ -470,28 +476,27 @@ void CharCodeToUnicode::setMapping(CharCode c, Unicode *u, int len) {
map[c] = 0;
sMap[i].c = c;
sMap[i].len = len;
- for (j = 0; j < len && j < maxUnicodeString; ++j) {
+ sMap[i].u = (Unicode*)gmallocn(len, sizeof(Unicode));
+ for (j = 0; j < len; ++j) {
sMap[i].u[j] = u[j];
}
}
}
-int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode *u, int size) {
- int i, j;
+int CharCodeToUnicode::mapToUnicode(CharCode c, Unicode **u) {
+ int i;
if (c >= mapLen) {
return 0;
}
if (map[c]) {
- u[0] = map[c];
+ *u = &map[c];
return 1;
}
for (i = 0; i < sMapLen; ++i) {
if (sMap[i].c == c) {
- for (j = 0; j < sMap[i].len && j < size; ++j) {
- u[j] = sMap[i].u[j];
- }
- return j;
+ *u = sMap[i].u;
+ return sMap[i].len;
}
}
return 0;
diff --git a/poppler/CharCodeToUnicode.h b/poppler/CharCodeToUnicode.h
index f3b21732..08e5d758 100644
--- a/poppler/CharCodeToUnicode.h
+++ b/poppler/CharCodeToUnicode.h
@@ -66,7 +66,7 @@ public:
void setMapping(CharCode c, Unicode *u, int len);
// Map a CharCode to Unicode.
- int mapToUnicode(CharCode c, Unicode *u, int size);
+ int mapToUnicode(CharCode c, Unicode **u);
int mapToCharCode(Unicode* u, CharCode *c, int usize);
diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc
index 6fc9b8d9..da37016f 100644
--- a/poppler/Gfx.cc
+++ b/poppler/Gfx.cc
@@ -3266,7 +3266,7 @@ void Gfx::doShowText(GooString *s) {
int wMode;
double riseX, riseY;
CharCode code;
- Unicode u[8];
+ Unicode *u = NULL;
double x, y, dx, dy, dx2, dy2, curX, curY, tdx, tdy, lineX, lineY;
double originX, originY, tOriginX, tOriginY;
double oldCTM[6], newCTM[6];
@@ -3316,7 +3316,7 @@ void Gfx::doShowText(GooString *s) {
len = s->getLength();
while (len > 0) {
n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+ &u, &uLen,
&dx, &dy, &originX, &originY);
dx = dx * state->getFontSize() + state->getCharSpace();
if (n == 1 && *p == ' ') {
@@ -3365,7 +3365,7 @@ void Gfx::doShowText(GooString *s) {
len = s->getLength();
while (len > 0) {
n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+ &u, &uLen,
&dx, &dy, &originX, &originY);
if (wMode) {
dx *= state->getFontSize();
@@ -3399,7 +3399,7 @@ void Gfx::doShowText(GooString *s) {
nChars = nSpaces = 0;
while (len > 0) {
n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+ &u, &uLen,
&dx2, &dy2, &originX, &originY);
dx += dx2;
dy += dy2;
diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc
index d4c21706..083e6af2 100644
--- a/poppler/GfxFont.cc
+++ b/poppler/GfxFont.cc
@@ -840,16 +840,17 @@ Gfx8BitFont::Gfx8BitFont(XRef *xref, char *tagA, Ref idA, GooString *nameA,
// look for a Unicode-to-Unicode mapping
if (name && (utu = globalParams->getUnicodeToUnicode(name))) {
+ Unicode *uAux;
for (i = 0; i < 256; ++i) {
toUnicode[i] = 0;
}
ctu2 = CharCodeToUnicode::make8BitToUnicode(toUnicode);
for (i = 0; i < 256; ++i) {
- n = ctu->mapToUnicode((CharCode)i, uBuf, 8);
+ n = ctu->mapToUnicode((CharCode)i, &uAux);
if (n >= 1) {
- n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8);
+ n = utu->mapToUnicode((CharCode)uAux[0], &uAux);
if (n >= 1) {
- ctu2->setMapping((CharCode)i, uBuf, n);
+ ctu2->setMapping((CharCode)i, uAux, n);
}
}
}
@@ -1097,12 +1098,12 @@ static int parseCharName(char *charName, Unicode *uBuf, int uLen,
}
int Gfx8BitFont::getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
+ Unicode **u, int *uLen,
double *dx, double *dy, double *ox, double *oy) {
CharCode c;
*code = c = (CharCode)(*s & 0xff);
- *uLen = ctu->mapToUnicode(c, u, uSize);
+ *uLen = ctu->mapToUnicode(c, u);
*dx = widths[c];
*dy = *ox = *oy = 0;
return 1;
@@ -1204,11 +1205,14 @@ Gushort *Gfx8BitFont::getCodeToGIDMap(FoFiTrueType *ff) {
// map Unicode through the cmap
} else if (useUnicode) {
+ Unicode *uAux;
for (i = 0; i < 256; ++i) {
- if (((charName = enc[i]) &&
- (u = globalParams->mapNameToUnicode(charName))) ||
- (n = ctu->mapToUnicode((CharCode)i, &u, 1))) {
+ if (((charName = enc[i]) && (u = globalParams->mapNameToUnicode(charName))))
map[i] = ff->mapCodeToGID(cmap, u);
+ else
+ {
+ n = ctu->mapToUnicode((CharCode)i, &uAux);
+ if (n > 0) map[i] = ff->mapCodeToGID(cmap, uAux[0]);
}
}
@@ -1273,7 +1277,7 @@ GfxCIDFont::GfxCIDFont(XRef *xref, char *tagA, Ref idA, GooString *nameA,
Object obj1, obj2, obj3, obj4, obj5, obj6;
CharCodeToUnicode *utu;
CharCode c;
- Unicode uBuf[8];
+ Unicode *uBuf;
int c1, c2;
int excepsSize, i, j, k, n;
@@ -1387,9 +1391,9 @@ GfxCIDFont::GfxCIDFont(XRef *xref, char *tagA, Ref idA, GooString *nameA,
if (name && (utu = globalParams->getUnicodeToUnicode(name))) {
if (ctu) {
for (c = 0; c < ctu->getLength(); ++c) {
- n = ctu->mapToUnicode(c, uBuf, 8);
+ n = ctu->mapToUnicode(c, &uBuf);
if (n >= 1) {
- n = utu->mapToUnicode((CharCode)uBuf[0], uBuf, 8);
+ n = utu->mapToUnicode((CharCode)uBuf[0], &uBuf);
if (n >= 1) {
ctu->setMapping(c, uBuf, n);
}
@@ -1621,7 +1625,7 @@ GfxCIDFont::~GfxCIDFont() {
}
int GfxCIDFont::getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
+ Unicode **u, int *uLen,
double *dx, double *dy, double *ox, double *oy) {
CID cid;
double w, h, vx, vy;
@@ -1636,7 +1640,7 @@ int GfxCIDFont::getNextChar(char *s, int len, CharCode *code,
*code = (CharCode)(cid = cMap->getCID(s, len, &n));
if (ctu) {
- *uLen = ctu->mapToUnicode(cid, u, uSize);
+ *uLen = ctu->mapToUnicode(cid, u);
} else {
*uLen = 0;
}
@@ -1867,9 +1871,9 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) {
CharCode cid;
for (cid = 0;cid < n ;cid++) {
int len;
- Unicode ucodes[4];
+ Unicode *ucodes;
- len = tctu->mapToUnicode(cid,ucodes,4);
+ len = tctu->mapToUnicode(cid,&ucodes);
if (len == 1) {
tumap[cid] = ucodes[0];
} else {
@@ -1901,11 +1905,12 @@ Gushort *GfxCIDFont::getCodeToGIDMap(FoFiTrueType *ff, int *mapsizep) {
if ((ctu = getToUnicode()) != 0) {
CharCode cid;
for (cid = 0;cid < n ;cid++) {
- int len;
- Unicode ucode = 0;
+ Unicode *ucode;
- len = ctu->mapToUnicode(cid,&ucode,1);
- humap[cid*N_UCS_CANDIDATES] = ucode;
+ if (ctu->mapToUnicode(cid, &ucode))
+ humap[cid*N_UCS_CANDIDATES] = ucode[0];
+ else
+ humap[cid*N_UCS_CANDIDATES] = 0;
for (i = 1;i < N_UCS_CANDIDATES;i++) {
humap[cid*N_UCS_CANDIDATES+i] = 0;
}
diff --git a/poppler/GfxFont.h b/poppler/GfxFont.h
index 54de6755..72cc71f5 100644
--- a/poppler/GfxFont.h
+++ b/poppler/GfxFont.h
@@ -200,7 +200,7 @@ public:
// the number actually used. Returns the number of bytes used by
// the char code.
virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
+ Unicode **u, int *uLen,
double *dx, double *dy, double *ox, double *oy) = 0;
/* XXX: dfp shouldn't be public, however the font finding code is currently in
@@ -249,7 +249,7 @@ public:
virtual ~Gfx8BitFont();
virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
+ Unicode **u, int *uLen,
double *dx, double *dy, double *ox, double *oy);
// Return the encoding.
@@ -311,7 +311,7 @@ public:
virtual GBool isCIDFont() { return gTrue; }
virtual int getNextChar(char *s, int len, CharCode *code,
- Unicode *u, int uSize, int *uLen,
+ Unicode **u, int *uLen,
double *dx, double *dy, double *ox, double *oy);
// Return the writing mode (0=horizontal, 1=vertical).
diff --git a/poppler/PSOutputDev.cc b/poppler/PSOutputDev.cc
index 7eb486df..8ac6a154 100644
--- a/poppler/PSOutputDev.cc
+++ b/poppler/PSOutputDev.cc
@@ -4118,7 +4118,7 @@ void PSOutputDev::drawString(GfxState *state, GooString *s) {
char *p;
UnicodeMap *uMap;
CharCode code;
- Unicode u[8];
+ Unicode *u;
char buf[8];
int len, nChars, uLen, n, m, i, j;
@@ -4175,7 +4175,7 @@ void PSOutputDev::drawString(GfxState *state, GooString *s) {
s2 = new GooString();
while (len > 0) {
n = font->getNextChar(p, len, &code,
- u, (int)(sizeof(u) / sizeof(Unicode)), &uLen,
+ &u, &uLen,
&dx2, &dy2, &originX, &originY);
if (font->isCIDFont()) {
if (uMap) {