From: Brendan Dahl Date: Mon, 12 Dec 2011 05:13:53 +0000 (-0800) Subject: Merge upstream. X-Git-Url: https://git.parisson.com/?a=commitdiff_plain;h=4c01766278ac3a1385d5271aeff1e98882f8e234;p=pdf.js.git Merge upstream. --- 4c01766278ac3a1385d5271aeff1e98882f8e234 diff --cc src/core.js index cbe4d0f,9f3e6b8..fd3dec0 --- a/src/core.js +++ b/src/core.js @@@ -5,8 -5,10 +5,10 @@@ var globalScope = (typeof window === 'undefined') ? this : window; + var isWorker = (typeof window == 'undefined'); + var ERRORS = 0, WARNINGS = 1, TODOS = 5; -var verbosity = WARNINGS; +var verbosity = TODOS; // The global PDFJS object exposes the API // In production, it will be declared outside a global wrapper diff --cc src/image.js index ac00a1c,15c31b0..030c209 --- a/src/image.js +++ b/src/image.js @@@ -3,30 -3,9 +3,30 @@@ '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. @@@ -76,35 -56,11 +76,35 @@@ if (mask) { TODO('masked images'); } else if (smask) { - this.smask = new PDFImage(xref, res, smask); + this.smask = new PDFImage(xref, res, smask, false); } } + /** + * Handles processing of image data and calls the callback with an argument + * of a PDFImage when the image is ready to be used. + */ - constructor.buildImage = function buildImage(callback, handler, xref, res, ++ 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) @@@ -253,14 -224,11 +253,15 @@@ 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() {