var bufferLength = this.bufferLength;
var bufferPos = this.bufferPos;
var n = 0;
- while (bufferPos < bufferLength)
++
+ // entire front of stream needs to be copied over since flate
+ // looksback when decoding
+ while (0 < bufferLength)
dest[n++] = this.buffer[bufferPos++];
// now use dest as our buffer and fill it
this.buffer = dest;
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();
},