]> git.parisson.com Git - pdf.js.git/commitdiff
added stiched functions
authorsbarman <sbarman@L3CWZ5T.(none)>
Wed, 17 Aug 2011 01:15:20 +0000 (18:15 -0700)
committersbarman <sbarman@L3CWZ5T.(none)>
Wed, 17 Aug 2011 01:15:20 +0000 (18:15 -0700)
pdf.js

diff --git a/pdf.js b/pdf.js
index d9c1007bb972ddeb511404937b51fd4d9187b3de..45f5484f602d59663c9ddc4bbd88cfe204b8b686 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -5727,7 +5727,7 @@ var PDFFunction = (function() {
     if (!typeFn)
       error('Unknown type of function');
 
-    typeFn.call(this, fn, dict);
+    typeFn.call(this, fn, dict, xref);
   };
 
   constructor.prototype = {
@@ -5872,9 +5872,58 @@ var PDFFunction = (function() {
         return out;
       }
     },
-    constructStiched: function() {
-      TODO('unhandled type of function');
-      this.func = function() { return [255, 105, 180]; }
+    constructStiched: function(fn, dict, xref) {
+      var domain = dict.get('Domain');
+      var range = dict.get('Range');
+
+      if (!domain)
+        error('No domain');
+
+      var inputSize = domain.length / 2;
+      if (inputSize != 1)
+        error('Bad domain for stiched function');
+
+      var fnRefs = dict.get('Functions');
+      var fns = [];
+      for (var i = 0, ii = fnRefs.length; i < ii; ++i)
+        fns.push(new PDFFunction(xref, xref.fetchIfRef(fnRefs[i])));
+        
+      var bounds = dict.get('Bounds');
+      var encode = dict.get('Encode');
+
+      this.func = function(args) {
+        var clip = function(v, min, max) {
+          if (v > max)
+            v = max;
+          else if (v < min)
+            v = min;
+          return v;
+        }
+
+        // clip to domain
+        var v = clip(args[0], domain[0], domain[1]);
+        // calulate which bound the value is in
+        for (var i = 0, ii = bounds.length; i < ii; ++i) {
+          if (v < bounds[i])
+            break;
+        }
+
+        // encode value into domain of function
+        var dmin = domain[0];
+        if (i > 0)
+          dmin = bounds[i - 1];
+        var dmax = domain[1];
+        if (i < bounds.length)
+          dmax = bounds[i];
+        
+        var rmin = encode[2 * i];
+        var rmax = encode[2 * i + 1];
+
+        var v2 = rmin + (v - dmin) * (rmax - rmin) / (dmax - dmin);  
+        
+        // call the appropropriate function
+        return fns[i].func([v2]);
+      }
     },
     constructPostScript: function() {
       TODO('unhandled type of function');