summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlbert Astals Cid <aacid@kde.org>2009-06-07 13:38:50 +0200
committerAlbert Astals Cid <aacid@kde.org>2009-06-07 13:38:50 +0200
commit3d40dcad850a2bc0e28845a15722db0c79920135 (patch)
tree5e877a8873e81829724609a652720a5dc4656c8c
parent2619e09833f421fb3d8cc68d41d15081ae6824e4 (diff)
Move the GfxState cache to the new poppler cache class
-rw-r--r--poppler/GfxState.cc97
-rw-r--r--poppler/GfxState.h19
2 files changed, 49 insertions, 67 deletions
diff --git a/poppler/GfxState.cc b/poppler/GfxState.cc
index d75e015a..932bfff1 100644
--- a/poppler/GfxState.cc
+++ b/poppler/GfxState.cc
@@ -43,6 +43,7 @@
#include "GfxState_helpers.h"
#include "GfxFont.h"
#include "GlobalParams.h"
+#include "PopplerCache.h"
//------------------------------------------------------------------------
@@ -1351,6 +1352,38 @@ void GfxLabColorSpace::getDefaultRanges(double *decodeLow, double *decodeRange,
// GfxICCBasedColorSpace
//------------------------------------------------------------------------
+class GfxICCBasedColorSpaceKey : public PopplerCacheKey
+{
+ public:
+ GfxICCBasedColorSpaceKey(int numA, int genA) : num(numA), gen(genA)
+ {
+ }
+
+ bool operator==(const PopplerCacheKey &key) const
+ {
+ const GfxICCBasedColorSpaceKey *k = static_cast<const GfxICCBasedColorSpaceKey*>(&key);
+ return k->num == num && k->gen == gen;
+ }
+
+ int num, gen;
+};
+
+class GfxICCBasedColorSpaceItem : public PopplerCacheItem
+{
+ public:
+ GfxICCBasedColorSpaceItem(GfxICCBasedColorSpace *csA)
+ {
+ cs = static_cast<GfxICCBasedColorSpace*>(csA->copy());
+ }
+
+ ~GfxICCBasedColorSpaceItem()
+ {
+ delete cs;
+ }
+
+ GfxICCBasedColorSpace *cs;
+};
+
GfxICCBasedColorSpace::GfxICCBasedColorSpace(int nCompsA, GfxColorSpace *altA,
Ref *iccProfileStreamA) {
nComps = nCompsA;
@@ -1413,9 +1446,15 @@ GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) {
obj1.free();
#ifdef USE_CMS
// check cache
- if (iccProfileStreamA.num > 0
- && (cs = GfxICCBasedCache::lookup(iccProfileStreamA.num,
- iccProfileStreamA.gen)) != NULL) return cs;
+ if (iccProfileStreamA.num > 0) {
+ GfxICCBasedColorSpaceKey k(iccProfileStreamA.num, iccProfileStreamA.gen);
+ GfxICCBasedColorSpaceItem *item = static_cast<GfxICCBasedColorSpaceItem *>(cache->lookup(k));
+ if (item != NULL)
+ {
+ cs = static_cast<GfxICCBasedColorSpace*>(item->cs->copy());
+ return cs;
+ }
+ }
#endif
arr->get(1, &obj1);
if (!obj1.isStream()) {
@@ -1529,7 +1568,9 @@ GfxColorSpace *GfxICCBasedColorSpace::parse(Array *arr) {
obj1.free();
// put this colorSpace into cache
if (iccProfileStreamA.num > 0) {
- GfxICCBasedCache::put(iccProfileStreamA.num,iccProfileStreamA.gen,cs);
+ GfxICCBasedColorSpaceKey *k = new GfxICCBasedColorSpaceKey(iccProfileStreamA.num, iccProfileStreamA.gen);
+ GfxICCBasedColorSpaceItem *item = new GfxICCBasedColorSpaceItem(cs);
+ cache->put(k, item);
}
#endif
return cs;
@@ -1670,53 +1711,7 @@ void GfxICCBasedColorSpace::getDefaultRanges(double *decodeLow,
}
#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 = i;j > 0;j--) {
- if (cache[j - 1].num > 0) cache[j] = cache[j-1];
- }
- 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 = GFX_ICCBASED_CACHE_SIZE-1; i > 0; i--) {
- if (cache[i - 1].num > 0) cache[i] = cache[i - 1];
- }
- cache[0].num = numA;
- cache[0].gen = genA;
- cache[0].colorSpace = (GfxICCBasedColorSpace *)cs->copy();
-}
+PopplerCache *GfxICCBasedColorSpace::cache = new PopplerCache(5);
#endif
//------------------------------------------------------------------------
diff --git a/poppler/GfxState.h b/poppler/GfxState.h
index 09abc2fd..6c8be492 100644
--- a/poppler/GfxState.h
+++ b/poppler/GfxState.h
@@ -38,6 +38,7 @@ class Array;
class GfxFont;
class PDFRectangle;
class GfxShading;
+class PopplerCache;
class Matrix {
public:
@@ -458,24 +459,10 @@ private:
#ifdef USE_CMS
GfxColorTransform *transform;
GfxColorTransform *lineTransform; // color transform for line
-#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];
-};
+ static PopplerCache *cache;
#endif
-
+};
//------------------------------------------------------------------------
// GfxIndexedColorSpace
//------------------------------------------------------------------------