[poppler] Branch 'xpdf303merge' - poppler/Function.cc poppler/Function.h

Carlos Garcia Campos carlosgc at kemper.freedesktop.org
Mon Sep 5 12:01:23 PDT 2011


 poppler/Function.cc |   37 ++++++++++++++++++++++++++++++++++---
 poppler/Function.h  |    2 ++
 2 files changed, 36 insertions(+), 3 deletions(-)

New commits:
commit abad9b4e44d81a206bccff8a109ceb9a7effa2ad
Author: Carlos Garcia Campos <carlosgc at gnome.org>
Date:   Mon Sep 5 21:00:31 2011 +0200

    xpdf303: Cache the last transform for PostScript-type functions

diff --git a/poppler/Function.cc b/poppler/Function.cc
index 7d068d3..de9f35a 100644
--- a/poppler/Function.cc
+++ b/poppler/Function.cc
@@ -1111,6 +1111,8 @@ PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) {
   Stream *str;
   int codePtr;
   GooString *tok;
+  double in[funcMaxInputs];
+  int i;
 
   code = NULL;
   codeString = NULL;
@@ -1150,6 +1152,13 @@ PostScriptFunction::PostScriptFunction(Object *funcObj, Dict *dict) {
   }
   str->close();
 
+  //----- set up the cache
+  for (i = 0; i < m; ++i) {
+    in[i] = domain[i][0];
+    cacheIn[i] = in[i] - 1;
+  }
+  transform(in, cacheOut);
+
   ok = gTrue;
   
  err2:
@@ -1173,7 +1182,20 @@ PostScriptFunction::~PostScriptFunction() {
 void PostScriptFunction::transform(double *in, double *out) {
   PSStack stack;
   int i;
-  
+
+  // check the cache
+  for (i = 0; i < m; ++i) {
+    if (in[i] != cacheIn[i]) {
+      break;
+    }
+  }
+  if (i == m) {
+    for (i = 0; i < n; ++i) {
+      out[i] = cacheOut[i];
+    }
+    return;
+  }
+
   for (i = 0; i < m; ++i) {
     //~ may need to check for integers here
     stack.pushReal(in[i]);
@@ -1189,9 +1211,18 @@ void PostScriptFunction::transform(double *in, double *out) {
   }
   stack.clear();
 
-  // if (!stack.empty()) {
-  //   error(-1, "Extra values on stack at end of PostScript function");
+  // if (!stack->empty()) {
+  //   error(errSyntaxWarning, -1,
+  //         "Extra values on stack at end of PostScript function");
   // }
+
+  // save current result in the cache
+  for (i = 0; i < m; ++i) {
+    cacheIn[i] = in[i];
+  }
+  for (i = 0; i < n; ++i) {
+    cacheOut[i] = out[i];
+  }
 }
 
 GBool PostScriptFunction::parseCode(Stream *str, int *codePtr) {
diff --git a/poppler/Function.h b/poppler/Function.h
index 5043822..a456dfe 100644
--- a/poppler/Function.h
+++ b/poppler/Function.h
@@ -243,6 +243,8 @@ private:
   GooString *codeString;
   PSObject *code;
   int codeSize;
+  double cacheIn[funcMaxInputs];
+  double cacheOut[funcMaxOutputs];
   GBool ok;
 };
 


More information about the poppler mailing list