mirror of
https://github.com/zen-browser/pdf.js.git
synced 2025-07-10 02:05:37 +02:00
Implements WebGL support
This commit is contained in:
parent
944219ad8a
commit
f57c6935d7
12 changed files with 517 additions and 34 deletions
|
@ -15,7 +15,7 @@
|
|||
* limitations under the License.
|
||||
*/
|
||||
/* globals CanvasGraphics, CachedCanvases, ColorSpace, Util, error, info,
|
||||
isArray, makeCssRgb */
|
||||
isArray, makeCssRgb, WebGLUtils */
|
||||
|
||||
'use strict';
|
||||
|
||||
|
@ -155,39 +155,59 @@ var createMeshCanvas = (function createMeshCanvasClosure() {
|
|||
// MAX_PATTERN_SIZE is used to avoid OOM situation.
|
||||
var MAX_PATTERN_SIZE = 3000; // 10in @ 300dpi shall be enough
|
||||
|
||||
var boundsWidth = bounds[2] - bounds[0];
|
||||
var boundsHeight = bounds[3] - bounds[1];
|
||||
var offsetX = Math.floor(bounds[0]);
|
||||
var offsetY = Math.floor(bounds[1]);
|
||||
var boundsWidth = Math.ceil(bounds[2]) - offsetX;
|
||||
var boundsHeight = Math.ceil(bounds[3]) - offsetY;
|
||||
|
||||
var width = Math.min(Math.ceil(Math.abs(boundsWidth * combinesScale[0] *
|
||||
EXPECTED_SCALE)), MAX_PATTERN_SIZE);
|
||||
var height = Math.min(Math.ceil(Math.abs(boundsHeight * combinesScale[1] *
|
||||
EXPECTED_SCALE)), MAX_PATTERN_SIZE);
|
||||
var scaleX = width / boundsWidth;
|
||||
var scaleY = height / boundsHeight;
|
||||
|
||||
var tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
|
||||
var tmpCtx = tmpCanvas.context;
|
||||
if (backgroundColor) {
|
||||
tmpCtx.fillStyle = makeCssRgb(backgroundColor);
|
||||
tmpCtx.fillRect(0, 0, width, height);
|
||||
}
|
||||
var scaleX = boundsWidth / width;
|
||||
var scaleY = boundsHeight / height;
|
||||
|
||||
var context = {
|
||||
coords: coords,
|
||||
colors: colors,
|
||||
offsetX: -bounds[0],
|
||||
offsetY: -bounds[1],
|
||||
scaleX: scaleX,
|
||||
scaleY: scaleY
|
||||
offsetX: -offsetX,
|
||||
offsetY: -offsetY,
|
||||
scaleX: 1 / scaleX,
|
||||
scaleY: 1 / scaleY
|
||||
};
|
||||
|
||||
var data = tmpCtx.getImageData(0, 0, width, height);
|
||||
for (var i = 0; i < figures.length; i++) {
|
||||
drawFigure(data, figures[i], context);
|
||||
}
|
||||
tmpCtx.putImageData(data, 0, 0);
|
||||
var canvas;
|
||||
if (WebGLUtils.isEnabled) {
|
||||
canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
|
||||
figures, context);
|
||||
|
||||
return {canvas: tmpCanvas.canvas, scaleX: 1 / scaleX, scaleY: 1 / scaleY};
|
||||
// https://bugzilla.mozilla.org/show_bug.cgi?id=972126
|
||||
var tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
|
||||
tmpCanvas.context.drawImage(canvas, 0, 0);
|
||||
canvas = tmpCanvas.canvas;
|
||||
} else {
|
||||
var tmpCanvas = CachedCanvases.getCanvas('mesh', width, height, false);
|
||||
var tmpCtx = tmpCanvas.context;
|
||||
|
||||
var data = tmpCtx.createImageData(width, height);
|
||||
if (backgroundColor) {
|
||||
var bytes = data.data;
|
||||
for (var i = 0, ii = bytes.length; i < ii; i += 4) {
|
||||
bytes[i] = backgroundColor[0];
|
||||
bytes[i + 1] = backgroundColor[1];
|
||||
bytes[i + 2] = backgroundColor[2];
|
||||
bytes[i + 3] = 255;
|
||||
}
|
||||
}
|
||||
for (var i = 0; i < figures.length; i++) {
|
||||
drawFigure(data, figures[i], context);
|
||||
}
|
||||
tmpCtx.putImageData(data, 0, 0);
|
||||
canvas = tmpCanvas.canvas;
|
||||
}
|
||||
|
||||
return {canvas: canvas, offsetX: offsetX, offsetY: offsetY,
|
||||
scaleX: scaleX, scaleY: scaleY};
|
||||
}
|
||||
return createMeshCanvas;
|
||||
})();
|
||||
|
@ -221,7 +241,6 @@ ShadingIRs.Mesh = {
|
|||
|
||||
// Rasterizing on the main thread since sending/queue large canvases
|
||||
// might cause OOM.
|
||||
// TODO consider using WebGL or asm.js to perform rasterization
|
||||
var temporaryPatternCanvas = createMeshCanvas(bounds, combinedScale,
|
||||
coords, colors, figures, shadingFill ? null : background);
|
||||
|
||||
|
@ -232,7 +251,8 @@ ShadingIRs.Mesh = {
|
|||
}
|
||||
}
|
||||
|
||||
ctx.translate(bounds[0], bounds[1]);
|
||||
ctx.translate(temporaryPatternCanvas.offsetX,
|
||||
temporaryPatternCanvas.offsetY);
|
||||
ctx.scale(temporaryPatternCanvas.scaleX,
|
||||
temporaryPatternCanvas.scaleY);
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue