poppler/GfxState.cc | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ poppler/GfxState.h | 15 +++++++++++++ 2 files changed, 75 insertions(+)
New commits: commit 90f95127d8d89cfcadeb7d701437ab07ce4a8a61 Author: Koji Otani <[email protected]> Date: Sun Jan 25 23:17:39 2009 +0100 Cache last 5 GfxICCBasedColorSpace diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc index 913245b..0de4840 100644 --- a/poppler/GfxState.cc +++ b/poppler/GfxState.cc @@ -1410,6 +1410,12 @@ GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) { iccProfileStreamA.gen = 0; } obj1.free(); +#ifdef USE_CMS + // check cache + if (iccProfileStreamA.num > 0 + && (cs = GfxICCBasedCache::lookup(iccProfileStreamA.num, + iccProfileStreamA.gen)) != NULL) return cs; +#endif arr->get(1, &obj1); if (!obj1.isStream()) { error(-1, "Bad ICCBased color space (stream)"); @@ -1516,6 +1522,10 @@ GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) { cmsCloseProfile(hp); } obj1.free(); + // put this colorSpace into cache + if (iccProfileStreamA.num > 0) { + GfxICCBasedCache::put(iccProfileStreamA.num,iccProfileStreamA.gen,cs); + } #endif return cs; } @@ -1654,6 +1664,56 @@ void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow, #endif } +#ifdef USE_CMS +GfxICCBasedCache + GfxICCBasedCache::cache[GFX_ICCBASED_CACHE_SIZE]; + +GfxICCBasedCache::GfxICCBasedCache() +{ + num = 0; + gen = 0; + colorSpace = 0; +} + +GfxICCBasedColorSpace *GfxICCBasedCache::lookup(int numA, int genA) +{ + int i; + + if (cache[0].num == numA && cache[0].gen == genA) { + return (GfxICCBasedColorSpace *)cache[0].colorSpace->copy(); + } + for (i = 1;i < GFX_ICCBASED_CACHE_SIZE && cache[i].num > 0;i++) { + if (cache[i].num == numA && cache[i].gen == genA) { + int j; + GfxICCBasedCache hit = cache[i]; + + for (j = 0;j < i;j++) { + cache[j+1] = cache[j]; + } + cache[0] = hit; + return (GfxICCBasedColorSpace *)hit.colorSpace->copy(); + } + } + return NULL; +} + +void GfxICCBasedCache::put(int numA, int genA, + GfxICCBasedColorSpace *cs) +{ + int i; + + if (cache[GFX_ICCBASED_CACHE_SIZE-1].num > 0) { + delete cache[GFX_ICCBASED_CACHE_SIZE-1].colorSpace; + } + for (i = 0;i < GFX_ICCBASED_CACHE_SIZE-1 && cache[i].num > 0;i++) { + cache[i+1] = cache[i]; + } + cache[0].num = numA; + cache[0].gen = genA; + cache[0].colorSpace = (GfxICCBasedColorSpace *)cs->copy(); +} +#endif + //------------------------------------------------------------------------ // GfxIndexedColorSpace //------------------------------------------------------------------------ diff --git a/poppler/GfxState.h b/poppler/GfxState.h index 1a0aacf..ad5fae6 100644 --- a/poppler/GfxState.h +++ b/poppler/GfxState.h @@ -497,6 +497,21 @@ private: #endif }; +#ifdef USE_CMS +#define GFX_ICCBASED_CACHE_SIZE 5 +class GfxICCBasedCache { +public: + static GfxICCBasedColorSpace *lookup(int numA, int genA); + static void put(int numA, int genA, GfxICCBasedColorSpace *cs); +private: + GfxICCBasedCache(); + int num; + int gen; + GfxICCBasedColorSpace *colorSpace; + static GfxICCBasedCache cache[GFX_ICCBASED_CACHE_SIZE]; +}; +#endif + //------------------------------------------------------------------------ // GfxIndexedColorSpace //------------------------------------------------------------------------ _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
