]> git.parisson.com Git - pdf.js.git/commitdiff
skeleton of shading fill
authorChris Jones <jones.chris.g@gmail.com>
Fri, 10 Jun 2011 19:16:45 +0000 (12:16 -0700)
committerChris Jones <jones.chris.g@gmail.com>
Fri, 10 Jun 2011 19:16:45 +0000 (12:16 -0700)
pdf.js

diff --git a/pdf.js b/pdf.js
index f7e553699bc82f0e97ac348fb93956da97aa1d9c..a7cf2c066c59f1aeddaf0e2f301a2e35ba012b5e 100644 (file)
--- a/pdf.js
+++ b/pdf.js
@@ -603,6 +603,27 @@ function IsRef(v) {
     return v instanceof Ref;
 }
 
+function IsFunction(v) {
+    var fnDict;
+    if (typeof v != "object")
+        return false;
+    else if (IsDict(v))
+        fnDict = v;
+    else if (IsStream(v))
+        fnDict = v.dict;
+    else
+        return false;
+    return fnDict.has("FunctionType");
+}
+
+function IsFunctionDict(v) {
+    return IsFunction(v) && IsDict(v);
+}
+
+function IsFunctionStream(v) {
+    return IsFunction(v) && IsStream(v);
+}
+
 var EOF = {};
 
 function IsEOF(v) {
@@ -1875,8 +1896,83 @@ var CanvasGraphics = (function() {
         },
 
         // Shading
-        shadingFill: function(entry) {
-            TODO("shading fill");
+        shadingFill: function(entryRef) {
+            var shadingRes = this.res.get("Shading");
+            if (!shadingRes)
+                return;
+            shadingRes = this.xref.fetchIfRef(shadingRes);
+            var shading = shadingRes.get(entryRef.name);
+            if (!shading)
+                return;
+            shading = this.xref.fetchIfRef(shading);
+            if (!shading)
+                return;
+
+            this.save();
+
+            var bbox = shading.get("BBox");
+            if (bbox && IsArray(bbox) && 4 == bbox.length) {
+                this.rectangle.apply(this, bbox);
+                this.clip();
+                this.endPath();
+            }
+
+            TODO("shading-fill color space");
+
+            var type = shading.get("ShadingType");
+            switch (type) {
+            case 1:
+                this.fillFunctionShading(shading);
+                break;
+            case 2:
+                this.fillAxialShading(shading);
+                break;
+            case 3:
+                this.fillRadialShading(shading);
+                break;
+            case 4: case 5: case 6: case 7:
+                TODO("shading fill type "+ type);
+            default:
+                malformed("Unknown shading type "+ type);
+            }
+
+            this.restore();
+        },
+        fillAxialShading: function(sh) {
+            var coordsArr = sh.get("Coords");
+            var x0 = coordsArr[0], y0 = coordsArr[1],
+                x1 = coordsArr[2], y1 = coordsArr[3];
+
+            var t0 = 0.0, t1 = 1.0;
+            if (sh.has("Domain")) {
+                var domainArr = sh.get("Domain");
+                t0 = domainArr[0], t1 = domainArr[1];
+            }
+
+            var extendStart = false, extendEnd = false;
+            if (sh.has("Extend")) {
+                var extendArr = sh.get("Extend");
+                extendStart = extendArr[0], extendEnd = extendArr[1];
+            }
+
+            var fn = sh.get("Function");
+            fn = this.xref.fetchIfRef(fn);
+/*
+            console.log("x0: "+ x0, "y0: "+ y0, "x1: "+ x1, "y1: "+ y1);
+            console.log("size: "+ fn.dict.get("Size"));
+            console.log("BPS: "+ fn.dict.get("BitsPerSample"));
+            console.log(fn.dict.get("Encode"));
+            console.log(fn.dict.get("Range"));
+            console.log(fn.dict.get("Decode"));
+*/
+            var gradient = this.ctx.createLinearGradient(x0, y0, x1, y1);
+
+            gradient.addColorStop(0, 'rgb(0,0,255)');
+            gradient.addColorStop(1, 'rgb(0,255,0)');
+
+            this.ctx.fillStyle = gradient;
+            this.ctx.fill();
+            this.consumePath();
         },
 
         // XObjects