poppler/Function.cc | 28 ++++++++++++++++++++++++++++ poppler/Gfx.cc | 19 +++++++++++++------ poppler/PopplerCache.cc | 20 ++++++++++++++++++++ poppler/PopplerCache.h | 14 ++++++++++++++ 4 files changed, 75 insertions(+), 6 deletions(-)
New commits: commit 572779f8037763c1e0ee64c47a3dad6df0d3b693 Author: Koji Otani <[email protected]> Date: Wed Jun 10 22:55:26 2009 +0200 Fix dashed line in page 1 of bug 20011 diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index a5c2678..1b6c3e6 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -1906,10 +1906,6 @@ void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, out->updateFillColor(state); state->setStrokePattern(NULL); out->updateStrokeColor(state); - if (!stroke) { - state->setLineWidth(0); - out->updateLineWidth(state); - } // clip to current path if (stroke) { @@ -1924,6 +1920,8 @@ void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, } } state->clearPath(); + state->setLineWidth(0); + out->updateLineWidth(state); // get the clip region, check for empty state->getClipBBox(&cxMin, &cyMin, &cxMax, &cyMax); commit b97591672e0d9c31a3d044fe52e34cc80a491221 Author: Koji Otani <[email protected]> Date: Wed Jun 10 22:54:57 2009 +0200 Fix "Conditional jump or move depends on uninitialised value" When stroking with a pattern, set strokeColor with a copy of fillColor. This is wrong and the fillColor may be uninitialized. See bug 20011 diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index afd1d15..a5c2678 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -1824,6 +1824,7 @@ void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, GBool stroke, GBool eoFill) { GfxPatternColorSpace *patCS; GfxColorSpace *cs; + GfxColor color; GfxPath *savedPath; double xMin, yMin, xMax, yMax, x, y, x1, y1; double cxMin, cyMin, cxMax, cyMax; @@ -1886,11 +1887,19 @@ void Gfx::doTilingPatternFill(GfxTilingPattern *tPat, out->updateFillColorSpace(state); state->setStrokeColorSpace(cs->copy()); out->updateStrokeColorSpace(state); - state->setStrokeColor(state->getFillColor()); + if (stroke) { + state->setFillColor(state->getStrokeColor()); + } else { + state->setStrokeColor(state->getFillColor()); + } } else { - state->setFillColorSpace(new GfxDeviceGrayColorSpace()); + cs = new GfxDeviceGrayColorSpace(); + state->setFillColorSpace(cs); + cs->getDefaultColor(&color); + state->setFillColor(&color); out->updateFillColorSpace(state); state->setStrokeColorSpace(new GfxDeviceGrayColorSpace()); + state->setStrokeColor(&color); out->updateStrokeColorSpace(state); } state->setFillPattern(NULL); commit a92b38836b1e4475d5a7a1b9cb8f3e9429cef275 Author: Albert Astals Cid <[email protected]> Date: Tue Jun 9 22:39:19 2009 +0200 Correctly duplicate the cache on PostScriptFunction(PostScriptFunction *func) diff --git a/poppler/Function.cc b/poppler/Function.cc index 9c53cec..431dc5d 100644 --- a/poppler/Function.cc +++ b/poppler/Function.cc @@ -1024,6 +1024,16 @@ class PostScriptFunctionKey : public PopplerCacheKey public: PostScriptFunctionKey(int sizeA, double *inA, bool copyA) { + init(sizeA, inA, copyA); + } + + PostScriptFunctionKey(const PostScriptFunctionKey &key) + { + init(key.size, key.in, key.copied); + } + + void init(int sizeA, double *inA, bool copyA) + { copied = copyA; size = sizeA; if (copied) { @@ -1063,6 +1073,16 @@ class PostScriptFunctionItem : public PopplerCacheItem public: PostScriptFunctionItem(int sizeA, double *outA) { + init(sizeA, outA); + } + + PostScriptFunctionItem(const PostScriptFunctionItem &item) + { + init(item.size, item.out); + } + + void init(int sizeA, double *outA) + { size = sizeA; out = new double[size]; for (int i = 0; i < size; ++i) out[i] = outA[i]; @@ -1138,6 +1158,14 @@ PostScriptFunction::PostScriptFunction(PostScriptFunction *func) { codeString = func->codeString->copy(); stack = new PSStack(); memcpy(stack, func->stack, sizeof(PSStack)); + + cache = new PopplerCache(func->cache->size()); + for (int i = 0; i < func->cache->numberOfItems(); ++i) + { + PostScriptFunctionKey *key = new PostScriptFunctionKey(*(PostScriptFunctionKey*)func->cache->key(i)); + PostScriptFunctionItem *item = new PostScriptFunctionItem(*(PostScriptFunctionItem*)func->cache->item(i)); + cache->put(key, item); + } } PostScriptFunction::~PostScriptFunction() { diff --git a/poppler/PopplerCache.cc b/poppler/PopplerCache.cc index 10c5f99..b0859aa 100644 --- a/poppler/PopplerCache.cc +++ b/poppler/PopplerCache.cc @@ -80,3 +80,23 @@ void PopplerCache::put(PopplerCacheKey *key, PopplerCacheItem *item) keys[0] = key; items[0] = item; } + +int PopplerCache::size() +{ + return cacheSize; +} + +int PopplerCache::numberOfItems() +{ + return lastValidCacheIndex + 1; +} + +PopplerCacheItem *PopplerCache::item(int index) +{ + return items[index]; +} + +PopplerCacheKey *PopplerCache::key(int index) +{ + return keys[index]; +} diff --git a/poppler/PopplerCache.h b/poppler/PopplerCache.h index 7d72d76..5f22409 100644 --- a/poppler/PopplerCache.h +++ b/poppler/PopplerCache.h @@ -36,8 +36,22 @@ class PopplerCache /* The key and item pointers ownership is taken by the cache */ void put(PopplerCacheKey *key, PopplerCacheItem *item); + + /* The max size of the cache */ + int size(); + + /* The number of items in the cache */ + int numberOfItems(); + + /* The n-th item in the cache */ + PopplerCacheItem *item(int index); + + /* The n-th key in the cache */ + PopplerCacheKey *key(int index); private: + PopplerCache(const PopplerCache &cache); // not allowed + PopplerCacheKey **keys; PopplerCacheItem **items; int lastValidCacheIndex; _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
