[Pkg-javascript-commits] [pdf.js] 84/115: Adds transfer function support for SMask.

David Prévot taffit at moszumanska.debian.org
Wed Dec 16 20:03:19 UTC 2015


This is an automated email from the git hooks/post-receive script.

taffit pushed a commit to branch master
in repository pdf.js.

commit 15c9969abedf51d091e1b8b6346db4027a2a1d8b
Author: Yury Delendik <ydelendik at mozilla.com>
Date:   Fri Dec 4 12:52:45 2015 -0600

    Adds transfer function support for SMask.
---
 src/core/evaluator.js   |  19 ++++++++++++++++++-
 src/display/canvas.js   |  21 ++++++++++++---------
 test/pdfs/.gitignore    |   1 +
 test/pdfs/issue5044.pdf | Bin 0 -> 24214 bytes
 test/test_manifest.json |   7 +++++++
 5 files changed, 38 insertions(+), 10 deletions(-)

diff --git a/src/core/evaluator.js b/src/core/evaluator.js
index 6d61fea..05bf061 100644
--- a/src/core/evaluator.js
+++ b/src/core/evaluator.js
@@ -20,7 +20,8 @@
            stdFontMap, symbolsFonts, getTilingPatternIR, warn, Util, Promise,
            RefSetCache, isRef, TextRenderingMode, IdentityToUnicodeMap,
            OPS, UNSUPPORTED_FEATURES, NormalizedUnicodes, IDENTITY_MATRIX,
-           reverseIfRtl, createPromiseCapability, ToUnicodeMap, getFontType */
+           reverseIfRtl, createPromiseCapability, ToUnicodeMap, getFontType,
+           isPDFFunction, PDFFunction */
 
 'use strict';
 
@@ -274,6 +275,22 @@ var PartialEvaluator = (function PartialEvaluatorClosure() {
         subtype: smask.get('S').name,
         backdrop: smask.get('BC')
       };
+
+      // The SMask might have a alpha/luminosity value transfer function --
+      // we will build a map of integer values in range 0..255 to be fast.
+      var transferObj = smask.get('TR');
+      if (isPDFFunction(transferObj)) {
+        var transferFn = PDFFunction.parse(this.xref, transferObj);
+        var transferMap = new Uint8Array(256);
+        var tmp = new Float32Array(1);
+        for (var i = 0; i < 255; i++) {
+          tmp[0] = i / 255;
+          transferFn(tmp, 0, tmp, 0);
+          transferMap[i] = (tmp[0] * 255) | 0;
+        }
+        smaskOptions.transferMap = transferMap;
+      }
+
       return this.buildFormXObject(resources, smaskContent, smaskOptions,
                             operatorList, task, stateManager.state.clone());
     },
diff --git a/src/display/canvas.js b/src/display/canvas.js
index 0ffe01d..b704f8f 100644
--- a/src/display/canvas.js
+++ b/src/display/canvas.js
@@ -632,27 +632,29 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
     }
   }
 
-  function composeSMaskAlpha(maskData, layerData) {
+  function composeSMaskAlpha(maskData, layerData, transferMap) {
     var length = maskData.length;
     var scale = 1 / 255;
     for (var i = 3; i < length; i += 4) {
-      var alpha = maskData[i];
+      var alpha = transferMap ? transferMap[maskData[i]] : maskData[i];
       layerData[i] = (layerData[i] * alpha * scale) | 0;
     }
   }
 
-  function composeSMaskLuminosity(maskData, layerData) {
+  function composeSMaskLuminosity(maskData, layerData, transferMap) {
     var length = maskData.length;
     for (var i = 3; i < length; i += 4) {
       var y = (maskData[i - 3] * 77) +  // * 0.3 / 255 * 0x10000
               (maskData[i - 2] * 152) + // * 0.59 ....
               (maskData[i - 1] * 28);   // * 0.11 ....
-      layerData[i] = (layerData[i] * y) >> 16;
+      layerData[i] = transferMap ?
+        (layerData[i] * transferMap[y >> 8]) >> 8 :
+        (layerData[i] * y) >> 16;
     }
   }
 
   function genericComposeSMask(maskCtx, layerCtx, width, height,
-                               subtype, backdrop) {
+                               subtype, backdrop, transferMap) {
     var hasBackdrop = !!backdrop;
     var r0 = hasBackdrop ? backdrop[0] : 0;
     var g0 = hasBackdrop ? backdrop[1] : 0;
@@ -676,7 +678,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
       if (hasBackdrop) {
         composeSMaskBackdrop(maskData.data, r0, g0, b0);
       }
-      composeFn(maskData.data, layerData.data);
+      composeFn(maskData.data, layerData.data, transferMap);
 
       maskCtx.putImageData(layerData, 0, row);
     }
@@ -690,7 +692,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
                      smask.offsetX, smask.offsetY);
 
     var backdrop = smask.backdrop || null;
-    if (WebGLUtils.isEnabled) {
+    if (!smask.transferMap && WebGLUtils.isEnabled) {
       var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
         {subtype: smask.subtype, backdrop: backdrop});
       ctx.setTransform(1, 0, 0, 1, 0, 0);
@@ -698,7 +700,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
       return;
     }
     genericComposeSMask(maskCtx, layerCtx, mask.width, mask.height,
-                        smask.subtype, backdrop);
+                        smask.subtype, backdrop, smask.transferMap);
     ctx.drawImage(mask, 0, 0);
   }
 
@@ -1749,7 +1751,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
           scaleX: scaleX,
           scaleY: scaleY,
           subtype: group.smask.subtype,
-          backdrop: group.smask.backdrop
+          backdrop: group.smask.backdrop,
+          transferMap: group.smask.transferMap || null
         });
       } else {
         // Setup the current ctx so when the group is popped we draw it at the
diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore
index 38a33eb..d6062dc 100644
--- a/test/pdfs/.gitignore
+++ b/test/pdfs/.gitignore
@@ -172,6 +172,7 @@
 !issue5334.pdf
 !bug1186827.pdf
 !issue215.pdf
+!issue5044.pdf
 !issue1512r.pdf
 !issue2128r.pdf
 !issue5540.pdf
diff --git a/test/pdfs/issue5044.pdf b/test/pdfs/issue5044.pdf
new file mode 100644
index 0000000..ed45dbc
Binary files /dev/null and b/test/pdfs/issue5044.pdf differ
diff --git a/test/test_manifest.json b/test/test_manifest.json
index 7e907db..7d923c3 100644
--- a/test/test_manifest.json
+++ b/test/test_manifest.json
@@ -430,6 +430,13 @@
        "link": false,
        "type": "eq"
     },
+    {  "id": "issue5044",
+       "file": "pdfs/issue5044.pdf",
+       "md5": "44788cd31dcb4a2495ded34a84c4a765",
+       "rounds": 1,
+       "link": false,
+       "type": "eq"
+    },
     {  "id": "bug1186827",
        "file": "pdfs/bug1186827.pdf",
        "md5": "6c5526ae1a9d66cb517153001afc196e",

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-javascript/pdf.js.git



More information about the Pkg-javascript-commits mailing list