this.restore();
},
+ paintJpegXObject: function canvasGraphicsPaintJpegXObject(objId, w, h) {
+ var domImage = this.objs.get(objId);
+ if (!domImage) {
+ error('Dependent image isn\'t ready yet');
+ }
+
+ this.save();
+
+ var ctx = this.ctx;
+ // scale the image to the unit square
+ ctx.scale(1 / w, -1 / h);
+
+ ctx.drawImage(domImage, 0, 0, domImage.width, domImage.height,
+ 0, -h, w, h);
+
+ this.restore();
+ },
paintImageMaskXObject: function canvasGraphicsPaintImageMaskXObject(
imgArray, inverseDecode, width, height) {
function applyStencilMask(buffer, inverseDecode) {
var type = data[1];
switch (type) {
+ case 'JpegStream':
+ var imageData = data[2];
+ loadJpegStream(id, imageData, this.objs);
+ break;
case 'Image':
var imageData = data[2];
this.objs.resolve(id, imageData);
// of image processing can be done here.
var objId = 'img_' + uniquePrefix + (++self.objIdCounter);
insertDependency([objId]);
- fn = 'paintImageXObject';
args = [objId, w, h];
- var resolve = (function(objId) {
- return function resolve(data) {
- handler.send('obj', [objId, 'Image', data]);
- };
- })(objId);
+ var softMask = dict.get('SMask', 'IM') || false;
+ if (!softMask && image instanceof JpegStream && image.isNative) {
+ // These JPEGs don't need any more processing so we can just send it.
+ fn = 'paintJpegXObject';
+ handler.send('obj', [objId, 'JpegStream', image.getIR()]);
+ return;
+ }
+
+ fn = 'paintImageXObject';
var imageObj = new PDFImage(xref, resources, image, inline, handler);
- imageObj.ready(function() {
- var imgData = {
- width: w,
- height: h,
- data: new Uint8Array(w * h * 4)
+ imageObj.ready((function() {
+ return function(data) {
+ var imgData = {
+ width: w,
+ height: h,
+ data: new Uint8Array(w * h * 4)
+ };
+ var pixels = imgData.data;
+ imageObj.fillRgbaBuffer(pixels, imageObj.decode);
+ handler.send('obj', [objId, 'Image', imgData]);
};
- var pixels = imgData.data;
- imageObj.fillRgbaBuffer(pixels, imageObj.decode);
- resolve(imgData);
- });
+ })(objId));
}
uniquePrefix = uniquePrefix || '';
var buf = new Uint8Array(width * height);
if (smask) {
+ if (!smask.isReady())
+ error('Soft mask is not ready.');
var sw = smask.width;
var sh = smask.height;
if (sw != this.width || sh != this.height)
applyStencilMask: function applyStencilMask(buffer, inverseDecode) {
var width = this.width, height = this.height;
var bitStrideLength = (width + 7) >> 3;
- this.image.reset();
- var imgArray = this.image.getBytes(bitStrideLength * height);
+ var imgArray = this.getImageBytes(bitStrideLength * height);
var imgArrayPos = 0;
var i, j, mask, buf;
// removing making non-masked pixels transparent
// rows start at byte boundary;
var rowBytes = (width * numComps * bpc + 7) >> 3;
- this.image.reset();
- var imgArray = this.image.getBytes(height * rowBytes);
+ var imgArray = this.getImageBytes(height * rowBytes);
var comps = this.colorSpace.getRgbBuffer(
this.getComponents(imgArray, decodeMap), bpc);
// rows start at byte boundary;
var rowBytes = (width * numComps * bpc + 7) >> 3;
- this.image.reset();
- var imgArray = this.image.getBytes(height * rowBytes);
+ var imgArray = this.getImageBytes(height * rowBytes);
var comps = this.getComponents(imgArray);
var length = width * height;
for (var i = 0; i < length; ++i)
buffer[i] = comps[i];
},
+ getImageBytes: function getImageBytes(length) {
+ if (!this.isReady())
+ error('Image is not ready to be read.');
+ this.image.reset();
+ return this.image.getBytes(length);
+ },
isReady: function isReady() {
return this.imageReady && this.smaskReady;
},
};
return constructor;
})();
+function loadJpegStream(id, imageData, objs) {
+ var img = new Image();
+ img.onload = (function jpegImageLoaderOnload() {
+ objs.resolve(id, img);
+ });
+ img.src = 'data:image/jpeg;base64,' + window.btoa(imageData);
+}
this.colorTransform = -1;
- this.bytes = bytes;
-
if (isAdobeImage(bytes)) {
// when bug 674619 land, let's check if browser can do
// normal cmyk and then we won't have to the following