|
@@ -20,8 +20,8 @@ if (typeof PDFJS === 'undefined') {
|
|
|
(typeof window !== 'undefined' ? window : this).PDFJS = {};
|
|
|
}
|
|
|
|
|
|
-PDFJS.version = '1.2.129';
|
|
|
-PDFJS.build = '2f1a626';
|
|
|
+PDFJS.version = '1.2.131';
|
|
|
+PDFJS.build = '194994a';
|
|
|
|
|
|
(function pdfjsWrapper() {
|
|
|
// Use strict in our context only - users might not want it
|
|
@@ -2273,6 +2273,8 @@ var PDFDocumentProxy = (function PDFDocumentProxyClosure() {
|
|
|
* calling of PDFPage.getViewport method.
|
|
|
* @property {string} intent - Rendering intent, can be 'display' or 'print'
|
|
|
* (default value is 'display').
|
|
|
+ * @property {Array} transform - (optional) Additional transform, applied
|
|
|
+ * just before viewport transform.
|
|
|
* @property {Object} imageLayer - (optional) An object that has beginLayout,
|
|
|
* endLayout and appendImage functions.
|
|
|
* @property {function} continueCallback - (deprecated) A function that will be
|
|
@@ -3291,7 +3293,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() {
|
|
|
this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
|
|
|
this.objs, params.imageLayer);
|
|
|
|
|
|
- this.gfx.beginDrawing(params.viewport, transparency);
|
|
|
+ this.gfx.beginDrawing(params.transform, params.viewport, transparency);
|
|
|
this.operatorListIdx = 0;
|
|
|
this.graphicsReady = true;
|
|
|
if (this.graphicsReadyCallback) {
|
|
@@ -3588,13 +3590,15 @@ function addContextCurrentTransform(ctx) {
|
|
|
}
|
|
|
|
|
|
var CachedCanvases = (function CachedCanvasesClosure() {
|
|
|
- var cache = {};
|
|
|
- return {
|
|
|
+ function CachedCanvases() {
|
|
|
+ this.cache = Object.create(null);
|
|
|
+ }
|
|
|
+ CachedCanvases.prototype = {
|
|
|
getCanvas: function CachedCanvases_getCanvas(id, width, height,
|
|
|
trackTransform) {
|
|
|
var canvasEntry;
|
|
|
- if (cache[id] !== undefined) {
|
|
|
- canvasEntry = cache[id];
|
|
|
+ if (this.cache[id] !== undefined) {
|
|
|
+ canvasEntry = this.cache[id];
|
|
|
canvasEntry.canvas.width = width;
|
|
|
canvasEntry.canvas.height = height;
|
|
|
// reset canvas transform for emulated mozCurrentTransform, if needed
|
|
@@ -3605,21 +3609,22 @@ var CachedCanvases = (function CachedCanvasesClosure() {
|
|
|
if (trackTransform) {
|
|
|
addContextCurrentTransform(ctx);
|
|
|
}
|
|
|
- cache[id] = canvasEntry = {canvas: canvas, context: ctx};
|
|
|
+ this.cache[id] = canvasEntry = {canvas: canvas, context: ctx};
|
|
|
}
|
|
|
return canvasEntry;
|
|
|
},
|
|
|
clear: function () {
|
|
|
- for (var id in cache) {
|
|
|
- var canvasEntry = cache[id];
|
|
|
+ for (var id in this.cache) {
|
|
|
+ var canvasEntry = this.cache[id];
|
|
|
// Zeroing the width and height causes Firefox to release graphics
|
|
|
// resources immediately, which can greatly reduce memory consumption.
|
|
|
canvasEntry.canvas.width = 0;
|
|
|
canvasEntry.canvas.height = 0;
|
|
|
- delete cache[id];
|
|
|
+ delete this.cache[id];
|
|
|
}
|
|
|
}
|
|
|
};
|
|
|
+ return CachedCanvases;
|
|
|
})();
|
|
|
|
|
|
function compileType3Glyph(imgData) {
|
|
@@ -3857,6 +3862,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
this.smaskStack = [];
|
|
|
this.smaskCounter = 0;
|
|
|
this.tempSMask = null;
|
|
|
+ this.cachedCanvases = new CachedCanvases();
|
|
|
if (canvasCtx) {
|
|
|
// NOTE: if mozCurrentTransform is polyfilled, then the current state of
|
|
|
// the transformation must already be set in canvasCtx._transformMatrix.
|
|
@@ -4133,28 +4139,39 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
|
|
|
CanvasGraphics.prototype = {
|
|
|
|
|
|
- beginDrawing: function CanvasGraphics_beginDrawing(viewport, transparency) {
|
|
|
+ beginDrawing: function CanvasGraphics_beginDrawing(transform, viewport,
|
|
|
+ transparency) {
|
|
|
// For pdfs that use blend modes we have to clear the canvas else certain
|
|
|
// blend modes can look wrong since we'd be blending with a white
|
|
|
// backdrop. The problem with a transparent backdrop though is we then
|
|
|
- // don't get sub pixel anti aliasing on text, so we fill with white if
|
|
|
- // we can.
|
|
|
+ // don't get sub pixel anti aliasing on text, creating temporary
|
|
|
+ // transparent canvas when we have blend modes.
|
|
|
var width = this.ctx.canvas.width;
|
|
|
var height = this.ctx.canvas.height;
|
|
|
+
|
|
|
+ this.ctx.save();
|
|
|
+ this.ctx.fillStyle = 'rgb(255, 255, 255)';
|
|
|
+ this.ctx.fillRect(0, 0, width, height);
|
|
|
+ this.ctx.restore();
|
|
|
+
|
|
|
if (transparency) {
|
|
|
- this.ctx.clearRect(0, 0, width, height);
|
|
|
- } else {
|
|
|
- this.ctx.mozOpaque = true;
|
|
|
+ var transparentCanvas = this.cachedCanvases.getCanvas(
|
|
|
+ 'transparent', width, height, true);
|
|
|
+ this.compositeCtx = this.ctx;
|
|
|
+ this.transparentCanvas = transparentCanvas.canvas;
|
|
|
+ this.ctx = transparentCanvas.context;
|
|
|
this.ctx.save();
|
|
|
- this.ctx.fillStyle = 'rgb(255, 255, 255)';
|
|
|
- this.ctx.fillRect(0, 0, width, height);
|
|
|
- this.ctx.restore();
|
|
|
+ // The transform can be applied before rendering, transferring it to
|
|
|
+ // the new canvas.
|
|
|
+ this.ctx.transform.apply(this.ctx,
|
|
|
+ this.compositeCtx.mozCurrentTransform);
|
|
|
}
|
|
|
|
|
|
- var transform = viewport.transform;
|
|
|
-
|
|
|
this.ctx.save();
|
|
|
- this.ctx.transform.apply(this.ctx, transform);
|
|
|
+ if (transform) {
|
|
|
+ this.ctx.transform.apply(this.ctx, transform);
|
|
|
+ }
|
|
|
+ this.ctx.transform.apply(this.ctx, viewport.transform);
|
|
|
|
|
|
this.baseTransform = this.ctx.mozCurrentTransform.slice();
|
|
|
|
|
@@ -4236,7 +4253,14 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
|
|
|
endDrawing: function CanvasGraphics_endDrawing() {
|
|
|
this.ctx.restore();
|
|
|
- CachedCanvases.clear();
|
|
|
+
|
|
|
+ if (this.transparentCanvas) {
|
|
|
+ this.ctx = this.compositeCtx;
|
|
|
+ this.ctx.drawImage(this.transparentCanvas, 0, 0);
|
|
|
+ this.transparentCanvas = null;
|
|
|
+ }
|
|
|
+
|
|
|
+ this.cachedCanvases.clear();
|
|
|
WebGLUtils.clear();
|
|
|
|
|
|
if (this.imageLayer) {
|
|
@@ -4350,7 +4374,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
var drawnWidth = activeSMask.canvas.width;
|
|
|
var drawnHeight = activeSMask.canvas.height;
|
|
|
var cacheId = 'smaskGroupAt' + this.groupLevel;
|
|
|
- var scratchCanvas = CachedCanvases.getCanvas(
|
|
|
+ var scratchCanvas = this.cachedCanvases.getCanvas(
|
|
|
cacheId, drawnWidth, drawnHeight, true);
|
|
|
|
|
|
var currentCtx = this.ctx;
|
|
@@ -5134,7 +5158,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
// Using two cache entries is case if masks are used one after another.
|
|
|
cacheId += '_smask_' + ((this.smaskCounter++) % 2);
|
|
|
}
|
|
|
- var scratchCanvas = CachedCanvases.getCanvas(
|
|
|
+ var scratchCanvas = this.cachedCanvases.getCanvas(
|
|
|
cacheId, drawnWidth, drawnHeight, true);
|
|
|
var groupCtx = scratchCanvas.context;
|
|
|
|
|
@@ -5275,7 +5299,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
return;
|
|
|
}
|
|
|
|
|
|
- var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
|
|
|
+ var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
|
|
|
+ width, height);
|
|
|
var maskCtx = maskCanvas.context;
|
|
|
maskCtx.save();
|
|
|
|
|
@@ -5300,7 +5325,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
var fillColor = this.current.fillColor;
|
|
|
var isPatternFill = this.current.patternFill;
|
|
|
|
|
|
- var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
|
|
|
+ var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
|
|
|
+ width, height);
|
|
|
var maskCtx = maskCanvas.context;
|
|
|
maskCtx.save();
|
|
|
|
|
@@ -5335,7 +5361,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
var image = images[i];
|
|
|
var width = image.width, height = image.height;
|
|
|
|
|
|
- var maskCanvas = CachedCanvases.getCanvas('maskCanvas', width, height);
|
|
|
+ var maskCanvas = this.cachedCanvases.getCanvas('maskCanvas',
|
|
|
+ width, height);
|
|
|
var maskCtx = maskCanvas.context;
|
|
|
maskCtx.save();
|
|
|
|
|
@@ -5408,7 +5435,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
if (imgData instanceof HTMLElement || !imgData.data) {
|
|
|
imgToPaint = imgData;
|
|
|
} else {
|
|
|
- tmpCanvas = CachedCanvases.getCanvas('inlineImage', width, height);
|
|
|
+ tmpCanvas = this.cachedCanvases.getCanvas('inlineImage',
|
|
|
+ width, height);
|
|
|
var tmpCtx = tmpCanvas.context;
|
|
|
putBinaryImageData(tmpCtx, imgData);
|
|
|
imgToPaint = tmpCanvas.canvas;
|
|
@@ -5430,7 +5458,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
newHeight = Math.ceil(paintHeight / 2);
|
|
|
heightScale /= paintHeight / newHeight;
|
|
|
}
|
|
|
- tmpCanvas = CachedCanvases.getCanvas(tmpCanvasId, newWidth, newHeight);
|
|
|
+ tmpCanvas = this.cachedCanvases.getCanvas(tmpCanvasId,
|
|
|
+ newWidth, newHeight);
|
|
|
tmpCtx = tmpCanvas.context;
|
|
|
tmpCtx.clearRect(0, 0, newWidth, newHeight);
|
|
|
tmpCtx.drawImage(imgToPaint, 0, 0, paintWidth, paintHeight,
|
|
@@ -5462,7 +5491,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
|
|
|
var w = imgData.width;
|
|
|
var h = imgData.height;
|
|
|
|
|
|
- var tmpCanvas = CachedCanvases.getCanvas('inlineImage', w, h);
|
|
|
+ var tmpCanvas = this.cachedCanvases.getCanvas('inlineImage', w, h);
|
|
|
var tmpCtx = tmpCanvas.context;
|
|
|
putBinaryImageData(tmpCtx, imgData);
|
|
|
|
|
@@ -6120,7 +6149,7 @@ var createMeshCanvas = (function createMeshCanvasClosure() {
|
|
|
}
|
|
|
|
|
|
function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
|
|
|
- backgroundColor) {
|
|
|
+ backgroundColor, cachedCanvases) {
|
|
|
// we will increase scale on some weird factor to let antialiasing take
|
|
|
// care of "rough" edges
|
|
|
var EXPECTED_SCALE = 1.1;
|
|
@@ -6154,11 +6183,11 @@ var createMeshCanvas = (function createMeshCanvasClosure() {
|
|
|
figures, context);
|
|
|
|
|
|
// https://bugzilla.mozilla.org/show_bug.cgi?id=972126
|
|
|
- tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
|
|
|
+ tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
|
|
|
tmpCanvas.context.drawImage(canvas, 0, 0);
|
|
|
canvas = tmpCanvas.canvas;
|
|
|
} else {
|
|
|
- tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
|
|
|
+ tmpCanvas = cachedCanvases.getCanvas('mesh', width, height, false);
|
|
|
var tmpCtx = tmpCanvas.context;
|
|
|
|
|
|
var data = tmpCtx.createImageData(width, height);
|
|
@@ -6214,7 +6243,8 @@ ShadingIRs.Mesh = {
|
|
|
// Rasterizing on the main thread since sending/queue large canvases
|
|
|
// might cause OOM.
|
|
|
var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
|
|
|
- colors, figures, shadingFill ? null : background);
|
|
|
+ colors, figures, shadingFill ? null : background,
|
|
|
+ owner.cachedCanvases);
|
|
|
|
|
|
if (!shadingFill) {
|
|
|
ctx.setTransform.apply(ctx, owner.baseTransform);
|
|
@@ -6317,7 +6347,8 @@ var TilingPattern = (function TilingPatternClosure() {
|
|
|
height = Math.min(Math.ceil(Math.abs(height * combinedScale[1])),
|
|
|
MAX_PATTERN_SIZE);
|
|
|
|
|
|
- var tmpCanvas = CachedCanvases.getCanvas('pattern', width, height, true);
|
|
|
+ var tmpCanvas = owner.cachedCanvases.getCanvas('pattern',
|
|
|
+ width, height, true);
|
|
|
var tmpCtx = tmpCanvas.context;
|
|
|
var graphics = new CanvasGraphics(tmpCtx, commonObjs, objs);
|
|
|
graphics.groupLevel = owner.groupLevel;
|