Merge pull request #9095 from Snuffleupagus/WebGLFactory

Split the existing `WebGLUtils` in two classes, a private `WebGLUtils` and a public `WebGLContext`, and utilize the latter in the API to allow various code to access the methods of `WebGLUtils`
This commit is contained in:
Jonas Jenwald 2017-11-24 23:25:06 +01:00 committed by GitHub
commit 343f331b8b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 86 additions and 43 deletions

View File

@ -30,6 +30,7 @@ import { CanvasGraphics } from './canvas';
import globalScope from '../shared/global_scope';
import { Metadata } from './metadata';
import { PDFDataTransportStream } from './transport_stream';
import { WebGLContext } from './webgl';
var DEFAULT_RANGE_CHUNK_SIZE = 65536; // 2^16 = 65536
@ -820,6 +821,11 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
var renderingIntent = (params.intent === 'print' ? 'print' : 'display');
var canvasFactory = params.canvasFactory || new DOMCanvasFactory();
let webGLContext = new WebGLContext({
// TODO: When moving this parameter from `PDFJS` to {RenderParameters},
// change its name to `enableWebGL` instead.
enable: !getDefaultSetting('disableWebGL'),
});
if (!this.intentStates[renderingIntent]) {
this.intentStates[renderingIntent] = Object.create(null);
@ -870,7 +876,8 @@ var PDFPageProxy = (function PDFPageProxyClosure() {
this.commonObjs,
intentState.operatorList,
this.pageNumber,
canvasFactory);
canvasFactory,
webGLContext);
internalRenderTask.useRequestAnimationFrame = renderingIntent !== 'print';
if (!intentState.renderTasks) {
intentState.renderTasks = [];
@ -2174,7 +2181,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() {
let canvasInRendering = new WeakMap();
function InternalRenderTask(callback, params, objs, commonObjs, operatorList,
pageNumber, canvasFactory) {
pageNumber, canvasFactory, webGLContext) {
this.callback = callback;
this.params = params;
this.objs = objs;
@ -2183,6 +2190,8 @@ var InternalRenderTask = (function InternalRenderTaskClosure() {
this.operatorList = operatorList;
this.pageNumber = pageNumber;
this.canvasFactory = canvasFactory;
this.webGLContext = webGLContext;
this.running = false;
this.graphicsReadyCallback = null;
this.graphicsReady = false;
@ -2225,7 +2234,7 @@ var InternalRenderTask = (function InternalRenderTaskClosure() {
var params = this.params;
this.gfx = new CanvasGraphics(params.canvasContext, this.commonObjs,
this.objs, this.canvasFactory,
params.imageLayer);
this.webGLContext, params.imageLayer);
this.gfx.beginDrawing({
transform: params.transform,

View File

@ -18,7 +18,6 @@ import {
OPS, shadow, TextRenderingMode, Util, warn
} from '../shared/util';
import { getShadingPatternFromIR, TilingPattern } from './pattern_helper';
import { WebGLUtils } from './webgl';
// <canvas> contexts store most of the state we need natively.
// However, PDF needs a bit more state, which we store here.
@ -407,7 +406,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
var EXECUTION_STEPS = 10;
function CanvasGraphics(canvasCtx, commonObjs, objs, canvasFactory,
imageLayer) {
webGLContext, imageLayer) {
this.ctx = canvasCtx;
this.current = new CanvasExtraState();
this.stateStack = [];
@ -418,6 +417,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
this.commonObjs = commonObjs;
this.objs = objs;
this.canvasFactory = canvasFactory;
this.webGLContext = webGLContext;
this.imageLayer = imageLayer;
this.groupStack = [];
this.processingType3 = null;
@ -693,7 +693,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
}
}
function composeSMask(ctx, smask, layerCtx) {
function composeSMask(ctx, smask, layerCtx, webGLContext) {
var mask = smask.canvas;
var maskCtx = smask.context;
@ -701,9 +701,15 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
smask.offsetX, smask.offsetY);
var backdrop = smask.backdrop || null;
if (!smask.transferMap && WebGLUtils.isEnabled) {
var composed = WebGLUtils.composeSMask(layerCtx.canvas, mask,
{ subtype: smask.subtype, backdrop, });
if (!smask.transferMap && webGLContext.isEnabled) {
let composed = webGLContext.composeSMask({
layer: layerCtx.canvas,
mask,
properties: {
subtype: smask.subtype,
backdrop,
},
});
ctx.setTransform(1, 0, 0, 1, 0, 0);
ctx.drawImage(composed, smask.offsetX, smask.offsetY);
return;
@ -851,7 +857,7 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
}
this.cachedCanvases.clear();
WebGLUtils.clear();
this.webGLContext.clear();
if (this.imageLayer) {
this.imageLayer.endLayout();
@ -988,7 +994,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
this.groupLevel--;
this.ctx = this.groupStack.pop();
composeSMask(this.ctx, this.current.activeSMask, groupCtx);
composeSMask(this.ctx, this.current.activeSMask, groupCtx,
this.webGLContext);
this.ctx.restore();
this.ctx.save(); // save is needed since SMask will be resumed.
copyCtxState(groupCtx, this.ctx);
@ -1023,7 +1030,8 @@ var CanvasGraphics = (function CanvasGraphicsClosure() {
this.groupLevel--;
this.ctx = this.groupStack.pop();
composeSMask(this.ctx, this.current.activeSMask, groupCtx);
composeSMask(this.ctx, this.current.activeSMask, groupCtx,
this.webGLContext);
this.ctx.restore();
copyCtxState(groupCtx, this.ctx);
// Transform was changed in the SMask canvas, reflecting this change on

View File

@ -14,7 +14,6 @@
*/
import { FormatError, info, Util } from '../shared/util';
import { WebGLUtils } from './webgl';
var ShadingIRs = {};
@ -145,7 +144,7 @@ var createMeshCanvas = (function createMeshCanvasClosure() {
}
function createMeshCanvas(bounds, combinesScale, coords, colors, figures,
backgroundColor, cachedCanvases) {
backgroundColor, cachedCanvases, webGLContext) {
// we will increase scale on some weird factor to let antialiasing take
// care of "rough" edges
var EXPECTED_SCALE = 1.1;
@ -180,10 +179,14 @@ var createMeshCanvas = (function createMeshCanvasClosure() {
var paddedHeight = height + BORDER_SIZE * 2;
var canvas, tmpCanvas, i, ii;
if (WebGLUtils.isEnabled) {
canvas = WebGLUtils.drawFigures(width, height, backgroundColor,
figures, context);
if (webGLContext.isEnabled) {
canvas = webGLContext.drawFigures({
width,
height,
backgroundColor,
figures,
context,
});
// https://bugzilla.mozilla.org/show_bug.cgi?id=972126
tmpCanvas = cachedCanvases.getCanvas('mesh', paddedWidth, paddedHeight,
false);
@ -253,7 +256,7 @@ ShadingIRs.Mesh = {
// might cause OOM.
var temporaryPatternCanvas = createMeshCanvas(bounds, scale, coords,
colors, figures, shadingFill ? null : background,
owner.cachedCanvases);
owner.cachedCanvases, owner.webGLContext);
if (!shadingFill) {
ctx.setTransform.apply(ctx, owner.baseTransform);

View File

@ -14,9 +14,35 @@
*/
/* eslint-disable no-multi-str */
import { getDefaultSetting } from './dom_utils';
import { shadow } from '../shared/util';
class WebGLContext {
constructor({ enable = false, }) {
this._enabled = enable === true;
}
get isEnabled() {
let enabled = this._enabled;
if (enabled) {
enabled = WebGLUtils.tryInitGL();
}
return shadow(this, 'isEnabled', enabled);
}
composeSMask({ layer, mask, properties, }) {
return WebGLUtils.composeSMask(layer, mask, properties);
}
drawFigures({ width, height, backgroundColor, figures, context, }) {
return WebGLUtils.drawFigures(width, height, backgroundColor, figures,
context);
}
clear() {
WebGLUtils.cleanup();
}
}
var WebGLUtils = (function WebGLUtilsClosure() {
function loadShader(gl, code, shaderType) {
var shader = gl.createShader(shaderType);
@ -405,37 +431,34 @@ var WebGLUtils = (function WebGLUtilsClosure() {
return canvas;
}
function cleanup() {
if (smaskCache && smaskCache.canvas) {
smaskCache.canvas.width = 0;
smaskCache.canvas.height = 0;
}
if (figuresCache && figuresCache.canvas) {
figuresCache.canvas.width = 0;
figuresCache.canvas.height = 0;
}
smaskCache = null;
figuresCache = null;
}
return {
get isEnabled() {
if (getDefaultSetting('disableWebGL')) {
return false;
}
var enabled = false;
tryInitGL() {
try {
generateGL();
enabled = !!currentGL;
} catch (e) { }
return shadow(this, 'isEnabled', enabled);
return !!currentGL;
} catch (ex) { }
return false;
},
composeSMask,
drawFigures,
clear: cleanup,
cleanup() {
if (smaskCache && smaskCache.canvas) {
smaskCache.canvas.width = 0;
smaskCache.canvas.height = 0;
}
if (figuresCache && figuresCache.canvas) {
figuresCache.canvas.width = 0;
figuresCache.canvas.height = 0;
}
smaskCache = null;
figuresCache = null;
},
};
})();
export {
WebGLUtils,
WebGLContext,
};