poppler/CMap.cc | 47 +++++++++++++++++++++++++++--------------- poppler/CMap.h | 8 ++++--- poppler/GfxFont.cc | 6 +++-- poppler/JArithmeticDecoder.cc | 47 +++++++++++++++++++++++++++++++++++------- poppler/JArithmeticDecoder.h | 4 +++ poppler/XRef.h | 2 - splash/SplashFTFont.cc | 8 +++---- splash/SplashFontEngine.cc | 2 - splash/SplashT1Font.cc | 2 - utils/ImageOutputDev.cc | 21 ++++++++++++------ 10 files changed, 105 insertions(+), 42 deletions(-)
New commits: commit 19204ed5cd5cb64809f1a1f51dd5ffdef2b9417a Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 17:28:39 2011 +0200 xpdf303: CMap::getCID signature change diff --git a/poppler/CMap.cc b/poppler/CMap.cc index 884b5c5..357b0f0 100644 --- a/poppler/CMap.cc +++ b/poppler/CMap.cc @@ -188,6 +188,7 @@ CMap::CMap(GooString *collectionA, GooString *cMapNameA) { collection = collectionA; cMapName = cMapNameA; + isIdent = gFalse; wMode = 0; vector = (CMapVectorEntry *)gmallocn(256, sizeof(CMapVectorEntry)); for (i = 0; i < 256; ++i) { @@ -203,6 +204,7 @@ CMap::CMap(GooString *collectionA, GooString *cMapNameA) { CMap::CMap(GooString *collectionA, GooString *cMapNameA, int wModeA) { collection = collectionA; cMapName = cMapNameA; + isIdent = gTrue; wMode = wModeA; vector = NULL; refCnt = 1; @@ -216,12 +218,23 @@ void CMap::useCMap(CMapCache *cache, char *useName) { CMap *subCMap; useNameStr = new GooString(useName); - subCMap = cache->getCMap(collection, useNameStr, NULL); + // if cache is non-NULL, we already have a lock, and we can use + // CMapCache::getCMap() directly; otherwise, we need to use + // GlobalParams::getCMap() in order to acqure the lock need to use + // GlobalParams::getCMap + if (cache) { + subCMap = cache->getCMap(collection, useNameStr, NULL); + } else { + subCMap = globalParams->getCMap(collection, useNameStr); + } delete useNameStr; if (!subCMap) { return; } - copyVector(vector, subCMap->vector); + isIdent = subCMap->isIdent; + if (subCMap->vector) { + copyVector(vector, subCMap->vector); + } subCMap->decRefCnt(); } @@ -356,31 +369,33 @@ GBool CMap::match(GooString *collectionA, GooString *cMapNameA) { return !collection->cmp(collectionA) && !cMapName->cmp(cMapNameA); } -CID CMap::getCID(char *s, int len, int *nUsed) { +CID CMap::getCID(char *s, int len, CharCode *c, int *nUsed) { CMapVectorEntry *vec; + CharCode cc; int n, i; - if (!(vec = vector)) { - // identity CMap - *nUsed = 2; - if (len < 2) { - return 0; - } - return ((s[0] & 0xff) << 8) + (s[1] & 0xff); - } + vec = vector; + cc = 0; n = 0; - while (1) { - if (n >= len) { - *nUsed = n; - return 0; - } + while (vec && n < len) { i = s[n++] & 0xff; + cc = (cc << 8) | i; if (!vec[i].isVector) { + *c = cc; *nUsed = n; return vec[i].cid; } vec = vec[i].vector; } + if (isIdent && len >= 2) { + // identity CMap + *nUsed = 2; + *c = cc = ((s[0] & 0xff) << 8) + (s[1] & 0xff); + return cc; + } + *nUsed = 1; + *c = s[0] & 0xff; + return 0; } void CMap::setReverseMapVector(Guint startCode, CMapVectorEntry *vec, diff --git a/poppler/CMap.h b/poppler/CMap.h index 9de0a87..7803d63 100644 --- a/poppler/CMap.h +++ b/poppler/CMap.h @@ -67,9 +67,9 @@ public: GBool match(GooString *collectionA, GooString *cMapNameA); // Return the CID corresponding to the character code starting at - // <s>, which contains <len> bytes. Sets *<nUsed> to the number of - // bytes used by the char code. - CID getCID(char *s, int len, int *nUsed); + // <s>, which contains <len> bytes. Sets *<c> to the char code, and + // *<nUsed> to the number of bytes used by the char code. + CID getCID(char *s, int len, CharCode *c, int *nUsed); // Return the writing mode (0=horizontal, 1=vertical). int getWMode() { return wMode; } @@ -91,6 +91,8 @@ private: GooString *collection; GooString *cMapName; + GBool isIdent; // true if this CMap is an identity mapping, + // or is based on one (via usecmap) int wMode; // writing mode (0=horizontal, 1=vertical) CMapVectorEntry *vector; // vector for first byte (NULL for // identity CMap) diff --git a/poppler/GfxFont.cc b/poppler/GfxFont.cc index 79b2f0a..d81cf4f 100644 --- a/poppler/GfxFont.cc +++ b/poppler/GfxFont.cc @@ -1702,6 +1702,7 @@ int GfxCIDFont::getNextChar(char *s, int len, CharCode *code, Unicode **u, int *uLen, double *dx, double *dy, double *ox, double *oy) { CID cid; + CharCode c; double w, h, vx, vy; int n, a, b, m; @@ -1712,7 +1713,7 @@ int GfxCIDFont::getNextChar(char *s, int len, CharCode *code, return 1; } - *code = (CharCode)(cid = cMap->getCID(s, len, &n)); + *code = (CharCode)(cid = cMap->getCID(s, len, &c, &n)); if (ctu) { if (hasToUnicode) { int i = 0, c = 0; @@ -2060,8 +2061,9 @@ double GfxCIDFont::getWidth (char* s, int len) { int nUsed; double w; int a, b, m; + CharCode c; - CID cid = cMap->getCID(s, len, &nUsed); + CID cid = cMap->getCID(s, len, &c, &nUsed); w = widths.defWidth; if (widths.nExceps > 0 && cid >= widths.exceps[0].first) { commit 9c74bef77e7e1d7a8464dff43cae16bb1206665e Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 17:04:04 2011 +0200 xpdf303: Use splashDist instead of splashSqrt diff --git a/splash/SplashT1Font.cc b/splash/SplashT1Font.cc index 536c560..89813de 100644 --- a/splash/SplashT1Font.cc +++ b/splash/SplashT1Font.cc @@ -90,7 +90,7 @@ SplashT1Font::SplashT1Font(SplashT1FontFile *fontFileA, SplashCoord *matA, outlineID = -1; // compute font size - size = (float)splashSqrt(mat[2]*mat[2] + mat[3]*mat[3]); + size = (float)splashDist(0, 0, mat[2], mat[3]); // transform the four corners of the font bounding box -- the min // and max values form the bounding box of the transformed font commit 0568d0dc3c42b68b715226e5ce0ff98d73a94ac7 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 17:01:30 2011 +0200 xpdf303: Do the multiplication the other way around No idea why :-D diff --git a/splash/SplashFTFont.cc b/splash/SplashFTFont.cc index 55a4957..d663d08 100644 --- a/splash/SplashFTFont.cc +++ b/splash/SplashFTFont.cc @@ -159,10 +159,10 @@ SplashFTFont::SplashFTFont(SplashFTFontFile *fontFileA, SplashCoord *matA, matrix.yx = (FT_Fixed)((mat[1] / size) * 65536); matrix.xy = (FT_Fixed)((mat[2] / size) * 65536); matrix.yy = (FT_Fixed)((mat[3] / size) * 65536); - textMatrix.xx = (FT_Fixed)((textMat[0] / (size * textScale)) * 65536); - textMatrix.yx = (FT_Fixed)((textMat[1] / (size * textScale)) * 65536); - textMatrix.xy = (FT_Fixed)((textMat[2] / (size * textScale)) * 65536); - textMatrix.yy = (FT_Fixed)((textMat[3] / (size * textScale)) * 65536); + textMatrix.xx = (FT_Fixed)((textMat[0] / (textScale * size)) * 65536); + textMatrix.yx = (FT_Fixed)((textMat[1] / (textScale * size)) * 65536); + textMatrix.xy = (FT_Fixed)((textMat[2] / (textScale * size)) * 65536); + textMatrix.yy = (FT_Fixed)((textMat[3] / (textScale * size)) * 65536); #endif } commit 3c0da502aa1d5b1acae01cf1e43fb96f5ecc11da Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 17:00:31 2011 +0200 xpdf303: Use splashCheckDet isntead of splashAbs diff --git a/splash/SplashFontEngine.cc b/splash/SplashFontEngine.cc index aff059d..6e3db3d 100644 --- a/splash/SplashFontEngine.cc +++ b/splash/SplashFontEngine.cc @@ -297,7 +297,7 @@ SplashFont *SplashFontEngine::getFont(SplashFontFile *fontFile, mat[1] = -(textMat[0] * ctm[1] + textMat[1] * ctm[3]); mat[2] = textMat[2] * ctm[0] + textMat[3] * ctm[2]; mat[3] = -(textMat[2] * ctm[1] + textMat[3] * ctm[3]); - if (splashAbs(mat[0] * mat[3] - mat[1] * mat[2]) < 0.01) { + if (!splashCheckDet(mat[0], mat[1], mat[2], mat[3], 0.01)) { // avoid a singular (or close-to-singular) matrix mat[0] = 0.01; mat[1] = 0; mat[2] = 0; mat[3] = 0.01; commit 2b4303c66f8de9a267413465898897fd6b0ebb17 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 16:51:53 2011 +0200 xpdf303: Bigger fileKey diff --git a/poppler/XRef.h b/poppler/XRef.h index 8b77b6c..0fa49ef 100644 --- a/poppler/XRef.h +++ b/poppler/XRef.h @@ -154,7 +154,7 @@ private: CryptAlgorithm encAlgorithm; // encryption algorithm int keyLength; // length of key, in bytes int permFlags; // permission bits - Guchar fileKey[16]; // file decryption key + Guchar fileKey[32]; // file decryption key GBool ownerPasswordOk; // true if owner password is correct Guint prevXRefOffset; // position of prev XRef section (= next to read) Guint mainXRefEntriesOffset; // offset of entries in main XRef table commit 53060857e31a01413936fbe33b7032a0a325b384 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 16:50:08 2011 +0200 xpdf303: Merge JArithmeticDecoder.* diff --git a/poppler/JArithmeticDecoder.cc b/poppler/JArithmeticDecoder.cc index ec0778e..d23f7ea 100644 --- a/poppler/JArithmeticDecoder.cc +++ b/poppler/JArithmeticDecoder.cc @@ -91,6 +91,7 @@ JArithmeticDecoder::JArithmeticDecoder() { str = NULL; dataLen = 0; limitStream = gFalse; + nBytesRead = 0; } inline Guint JArithmeticDecoder::readByte() { @@ -100,6 +101,7 @@ inline Guint JArithmeticDecoder::readByte() { return 0xff; } } + ++nBytesRead; return (Guint)str->getChar() & 0xff; } @@ -120,14 +122,40 @@ void JArithmeticDecoder::start() { } void JArithmeticDecoder::restart(int dataLenA) { - int oldDataLen; - - oldDataLen = dataLen; - dataLen = dataLenA; - if (oldDataLen == -1) { + Guint cAdd; + GBool prevFF; + int k, nBits; + + if (dataLen >= 0) { + dataLen = dataLenA; + } else if (dataLen == -1) { + dataLen = dataLenA; buf1 = readByte(); - } else if (oldDataLen <= -2) { - buf0 = readByte(); + } else { + k = (-dataLen - 1) * 8 - ct; + dataLen = dataLenA; + cAdd = 0; + prevFF = gFalse; + while (k > 0) { + buf0 = readByte(); + if (prevFF) { + cAdd += 0xfe00 - (buf0 << 9); + nBits = 7; + } else { + cAdd += 0xff00 - (buf0 << 8); + nBits = 8; + } + prevFF = buf0 == 0xff; + if (k > nBits) { + cAdd <<= nBits; + k -= nBits; + } else { + cAdd <<= k; + ct = nBits - k; + k = 0; + } + } + c += cAdd; buf1 = readByte(); } } @@ -306,6 +334,11 @@ Guint JArithmeticDecoder::decodeIAID(Guint codeLen, void JArithmeticDecoder::byteIn() { if (buf0 == 0xff) { if (buf1 > 0x8f) { + if (limitStream) { + buf0 = buf1; + buf1 = readByte(); + c = c + 0xff00 - (buf0 << 8); + } ct = 8; } else { buf0 = buf1; diff --git a/poppler/JArithmeticDecoder.h b/poppler/JArithmeticDecoder.h index 0f091b7..3c3e6fe 100644 --- a/poppler/JArithmeticDecoder.h +++ b/poppler/JArithmeticDecoder.h @@ -82,6 +82,9 @@ public: Guint decodeIAID(Guint codeLen, JArithmeticDecoderStats *stats); + void resetByteCounter() { nBytesRead = 0; } + Guint getByteCounter() { return nBytesRead; } + private: Guint readByte(); @@ -100,6 +103,7 @@ private: Guint prev; // for the integer decoder Stream *str; + Guint nBytesRead; int dataLen; GBool limitStream; }; commit 0722960b4cf4ce40b6bd278ac7287d64a1d70bf2 Author: Albert Astals Cid <[email protected]> Date: Thu Sep 1 16:48:31 2011 +0200 xpdf303: Do not crash if imgStr->getLine() is NULL diff --git a/utils/ImageOutputDev.cc b/utils/ImageOutputDev.cc index 6ca5ef4..b35869f 100644 --- a/utils/ImageOutputDev.cc +++ b/utils/ImageOutputDev.cc @@ -230,13 +230,20 @@ void ImageOutputDev::drawImage(GfxState *state, Object *ref, Stream *str, for (y = 0; y < height; ++y) { // write the line - p = imgStr->getLine(); - for (x = 0; x < width; ++x) { - colorMap->getRGB(p, &rgb); - fputc(colToByte(rgb.r), f); - fputc(colToByte(rgb.g), f); - fputc(colToByte(rgb.b), f); - p += colorMap->getNumPixelComps(); + if ((p = imgStr->getLine())) { + for (x = 0; x < width; ++x) { + colorMap->getRGB(p, &rgb); + fputc(colToByte(rgb.r), f); + fputc(colToByte(rgb.g), f); + fputc(colToByte(rgb.b), f); + p += colorMap->getNumPixelComps(); + } + } else { + for (x = 0; x < width; ++x) { + fputc(0, f); + fputc(0, f); + fputc(0, f); + } } } imgStr->close(); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
