diff --git a/pdf.js b/pdf.js
index e0ec7e5aa..64e9432e9 100644
--- a/pdf.js
+++ b/pdf.js
@@ -1926,17 +1926,39 @@ var CanvasGraphics = (function() {
             var pixels = imgData.data;
 
             var alpha = 25;
-            if (image.dict.has("SMask"))
+            if (image.dict.has("SMask")) {
+                var smask = image.dict.get("SMask");
+                smask = this.xref.fetchIfRef(smask);
                 // Specifies either a shape or opacity mask to be
                 // applied to the image samples
                 TODO("SMask");
+            }
 
-            for (var i = 0; i < 4 * w * h; ++i) {
-                // TODO blend if SMask is a mask image
-                if (3 === i % 4) {
-                    pixels[i] = alpha;
-                } else {
-                    pixels[i] = image.getChar();
+            if (smask) {
+                var smaskDict = smask.dict;
+                if (!smaskDict)
+                    error("No dictionary for smask");
+                var smaskBitsPerComponent = smaskDict.get("BitsPerComponent") || smaskDict.get("BPC");
+                if (!smaskBitsPerComponent)
+                    error("Bad BPC for smask");
+                var max = (1 << bitsPerComponent) - 1;
+
+                var matte = smaskDict.get("Matte");
+                if (matte) {
+                    TODO(matte);
+                }
+
+                for (var i = 0; i < 4 * w * h; ++i) {
+                    pixels[i] = image.getChar() * smask.getChar() / max;
+                }
+            } else {
+                for (var i = 0; i < 4 * w * h; ++i) {
+                    // TODO blend if SMask is a mask image
+                    if (3 === i % 4) {
+                        pixels[i] = alpha;
+                    } else {
+                        pixels[i] = image.getChar();
+                    }
                 }
             }
             tmpCtx.putImageData(imgData, 0, 0);