From: sbarman Date: Thu, 9 Jun 2011 21:42:31 +0000 (-0700) Subject: Merge commit '496a6374c1ac04e' X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=c5a04b900f7d91ee3a4ae168317c74502831d5da;p=pdf.js.git Merge commit '496a6374c1ac04e' Conflicts: pdf.js --- c5a04b900f7d91ee3a4ae168317c74502831d5da diff --cc pdf.js index 8e1cf90,cc5f3f1..a7da657 --- a/pdf.js +++ b/pdf.js @@@ -1918,26 -1953,25 +1981,25 @@@ var CanvasGraphics = (function() // TODO cache rendered images? var dict = image.dict; - var w = dict.get("Width") || dict.get("W"); - var h = dict.get("Height") || dict.get("H"); + var w = dict.get2("Width", "W"); + var h = dict.get2("Height", "H"); + + if (w < 1 || h < 1) + error("Invalid image width or height"); + + // scale the image to the unit square + this.ctx.scale(1/w, 1/h); - - if (!IsNum(w) || !IsNum(h) || w < 1 || h < 1) - error("Invalid image width or height"); - var interpolate = dict.get("Interpolate") || dict.get("I"); + var interpolate = dict.get2("Interpolate", "I"); if (!IsBool(interpolate)) interpolate = false; - var imageMask = dict.get("ImageMask") || dict.get("IM"); + var imageMask = dict.get2("ImageMask", "IM"); if (!IsBool(imageMask)) imageMask = false; - // JPX/JPEG2000 streams directly contain bits per component - // and color space mode information. var bitsPerComponent = image.bitsPerComponent; - var csMode = image.csMode; - if (!bitsPerComponent) { - bitsPerComponent = dict.get("BitsPerComponent") || dict.get("BPC"); + bitsPerComponent = dict.get("BitsPerComponent", "BPC"); if (!bitsPerComponent) { if (imageMask) bitsPerComponent = 1; @@@ -1949,54 -2049,73 +2077,74 @@@ var tmpCanvas = document.createElement("canvas"); tmpCanvas.width = w; tmpCanvas.height = h; + // tmpCanvas.mozOpaque = false; + var ctx = this.ctx; var tmpCtx = tmpCanvas.getContext("2d"); + tmpCtx.fillStyle = "rgb(255, 255, 255)"; + tmpCtx.fillRect(0, 0, w, h); var imgData = tmpCtx.getImageData(0, 0, w, h); var pixels = imgData.data; - - // Read in image data - image.snarf(pixels); - - var alpha = 25; - 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"); - } - + if (smask) { - var smaskDict = smask.dict; - if (!smaskDict) - error("No dictionary for smask"); - var smaskBitsPerComponent = smaskDict.get2("BitsPerComponent", "BPC"); - if (!smaskBitsPerComponent) - error("Bad BPC for smask"); - var max = (1 << bitsPerComponent) - 1; - - var matte = smaskDict.get("Matte"); - if (matte) { - TODO(matte); + if (maskColorSpace.numComps != 1) + error("Incorrect number of components in smask"); + + var numComps = colorSpace.numComps; + // factor in bits per component + var imgArray = image.getBytes(numComps * w * h); + var imgIdx = 0; + + var smArray = smask.getBytes(w * h); + var smIdx = 0; + + // hoist out loop end + for (var i = 0; i < 4 * w * h; i+=4) { + var alpha = smArray[smIdx++]; + var alphaComp = (1 << maskBPC) - 1 - alpha; + + switch (numComps) { + case 1: + var p = imgArray[imageIdx++]*alpha; + pixels[i] = (p + pixels[i]*alphaComp) >> maskBPC; + pixels[i+1] = (p + pixels[i+1]*alphaComp) >> maskBPC; + pixels[i+2] = (p + pixels[i+2]*alphaComp) >> maskBPC; + pixels[i+3] = 255; + break; + case 3: + pixels[i] = imgArray[imgIdx++]; //*alpha) >> maskBPC; + pixels[i+1] = imgArray[imgIdx++];//*alpha) >> maskBPC; + pixels[i+2] = imgArray[imgIdx++];//*alpha) >> maskBPC; + pixels[i+3] = alpha; + break; + default: + error("unhandled amount of components per pixel: " + numComps); + } } - - // read in mask data - var mask = new Uint8Array(4 * w * h); - smask.snarf(mask); - - // and blend images with it - var stop = 4 * w * h; - for (var i = 0; i < stop; ++i) - pixels[i] = pixels[i] * mask[i] / max; } else { - // TODO blend if SMask is a mask image - var stop = 4 * w * h; - for (var i = 3; i < stop; i += 4) - pixels[i] = alpha; + var numComps = colorSpace.numComps; + for (var i = 0; i < 4 * w * h; i+=4) { + switch (numComps) { + case 1: + var t = image.getByte(); + pixels[i] = t; + pixels[i+1] = t; + pixels[i+2] = t; + pixels[i+3] = 255; + break; + case 3: + pixels[i] = image.getByte(); + pixels[i+1] = image.getByte(); + pixels[i+2] = image.getByte(); + pixels[i+3] = 255; + break; + default: + error("unhandled amount of components per pixel: " + numComps); + } + } ++>>>>>>> 496a6374c1ac04e } tmpCtx.putImageData(imgData, 0, 0); - this.ctx.drawImage(tmpCanvas, 0, 0); - this.restore(); },