'use strict';
- var PDFImage = (function pdfImage() {
+ var PDFImage = (function PDFImageClosure() {
- function PDFImage(xref, res, image, inline) {
+ /**
+ * Decode the image in the main thread if it supported. Resovles the promise
+ * when the image data is ready.
+ */
+ function handleImageData(handler, xref, res, image, promise) {
+ if (image instanceof JpegStream && image.isNative) {
+ // For natively supported jpegs send them to the main thread for decoding.
+ var dict = image.dict;
+ var colorSpace = dict.get('ColorSpace', 'CS');
+ colorSpace = ColorSpace.parse(colorSpace, xref, res);
+ var numComps = colorSpace.numComps;
+ handler.send('jpeg_decode', [image.getIR(), numComps], function(message) {
+ var data = message.data;
+ var stream = new Stream(data, 0, data.length, image.dict);
+ promise.resolve(stream);
+ });
+ } else {
+ promise.resolve(image);
+ }
+ }
- function constructor(xref, res, image, inline, smask) {
++ function PDFImage(xref, res, image, inline, smask) {
this.image = image;
+
if (image.getParams) {
// JPX/JPEG2000 streams directly contain bits per component
// and color space mode information.
if (mask) {
TODO('masked images');
} else if (smask) {
- this.smask = new PDFImage(xref, res, smask);
+ this.smask = new PDFImage(xref, res, smask, false);
}
}
- constructor.buildImage = function buildImage(callback, handler, xref, res,
+ /**
+ * Handles processing of image data and calls the callback with an argument
+ * of a PDFImage when the image is ready to be used.
+ */
++ PDFImage.buildImage = function buildImage(callback, handler, xref, res,
+ image, inline) {
+ var promise = new Promise();
+ var smaskPromise = new Promise();
+ var promises = [promise, smaskPromise];
+ // The image data and smask data may not be ready yet, wait till both are
+ // resolved.
+ Promise.all(promises).then(function(results) {
+ var image = new PDFImage(xref, res, results[0], inline, results[1]);
+ callback(image);
+ });
+
+ handleImageData(handler, xref, res, image, promise);
+
+ var smask = xref.fetchIfRef(image.dict.get('SMask'));
+ if (smask)
+ handleImageData(handler, xref, res, smask, smaskPromise);
+ else
+ smaskPromise.resolve(null);
+ };
- constructor.prototype = {
+ PDFImage.prototype = {
getComponents: function getComponents(buffer, decodeMap) {
var bpc = this.bpc;
if (bpc == 8)
for (var i = 0; i < length; ++i)
buffer[i] = comps[i];
+ },
+ getImageBytes: function getImageBytes(length) {
+ this.image.reset();
+ return this.image.getBytes(length);
}
};
- return constructor;
+ return PDFImage;
})();
+
function loadJpegStream(id, imageData, objs) {
var img = new Image();
img.onload = (function jpegImageLoaderOnload() {