123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Adds compile-time JS functions to augment the CanvasKit interface.
- // Specifically, anything that should only be on the GPU version of canvaskit.
- (function(CanvasKit){
- CanvasKit._extraInitializations = CanvasKit._extraInitializations || [];
- CanvasKit._extraInitializations.push(function() {
- function get(obj, attr, defaultValue) {
- if (obj && obj.hasOwnProperty(attr)) {
- return obj[attr];
- }
- return defaultValue;
- }
- function makeWebGLContext(canvas, attrs) {
- // These defaults come from the emscripten _emscripten_webgl_create_context
- var contextAttributes = {
- alpha: get(attrs, 'alpha', 1),
- depth: get(attrs, 'depth', 1),
- stencil: get(attrs, 'stencil', 0),
- antialias: get(attrs, 'antialias', 1),
- premultipliedAlpha: get(attrs, 'premultipliedAlpha', 1),
- preserveDrawingBuffer: get(attrs, 'preserveDrawingBuffer', 0),
- preferLowPowerToHighPerformance: get(attrs, 'preferLowPowerToHighPerformance', 0),
- failIfMajorPerformanceCaveat: get(attrs, 'failIfMajorPerformanceCaveat', 0),
- majorVersion: get(attrs, 'majorVersion', 1),
- minorVersion: get(attrs, 'minorVersion', 0),
- enableExtensionsByDefault: get(attrs, 'enableExtensionsByDefault', 1),
- explicitSwapControl: get(attrs, 'explicitSwapControl', 0),
- renderViaOffscreenBackBuffer: get(attrs, 'renderViaOffscreenBackBuffer', 0),
- };
- if (!canvas) {
- SkDebug('null canvas passed into makeWebGLContext');
- return 0;
- }
- // This check is from the emscripten version
- if (contextAttributes['explicitSwapControl']) {
- SkDebug('explicitSwapControl is not supported');
- return 0;
- }
- // GL is an enscripten provided helper
- // See https://github.com/emscripten-core/emscripten/blob/incoming/src/library_webgl.js
- return GL.createContext(canvas, contextAttributes);
- }
- CanvasKit.GetWebGLContext = function(canvas, attrs) {
- return makeWebGLContext(canvas, attrs);
- };
- // arg can be of types:
- // - String - in which case it is interpreted as an id of a
- // canvas element.
- // - HTMLCanvasElement - in which the provided canvas element will
- // be used directly.
- // Width and height can be provided to override those on the canvas
- // element, or specify a height for when a context is provided.
- CanvasKit.MakeWebGLCanvasSurface = function(arg, width, height) {
- var canvas = arg;
- if (canvas.tagName !== 'CANVAS') {
- canvas = document.getElementById(arg);
- if (!canvas) {
- throw 'Canvas with id ' + arg + ' was not found';
- }
- }
- // we are ok with all the defaults
- var ctx = this.GetWebGLContext(canvas);
- if (!ctx || ctx < 0) {
- throw 'failed to create webgl context: err ' + ctx;
- }
- if (!canvas && (!width || !height)) {
- throw 'height and width must be provided with context';
- }
- var grcontext = this.MakeGrContext(ctx);
- // Bump the default resource cache limit.
- var RESOURCE_CACHE_BYTES = 256 * 1024 * 1024;
- grcontext.setResourceCacheLimitBytes(RESOURCE_CACHE_BYTES);
- // Maybe better to use clientWidth/height. See:
- // https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html
- var surface = this.MakeOnScreenGLSurface(grcontext,
- width || canvas.width,
- height || canvas.height);
- if (!surface) {
- SkDebug('falling back from GPU implementation to a SW based one');
- // we need to throw away the old canvas (which was locked to
- // a webGL context) and create a new one so we can
- var newCanvas = canvas.cloneNode(true);
- var parent = canvas.parentNode;
- parent.replaceChild(newCanvas, canvas);
- // add a class so the user can detect that it was replaced.
- newCanvas.classList.add('ck-replaced');
- return CanvasKit.MakeSWCanvasSurface(newCanvas);
- }
- surface._context = ctx;
- surface.grContext = grcontext;
- return surface;
- };
- // Default to trying WebGL first.
- CanvasKit.MakeCanvasSurface = CanvasKit.MakeWebGLCanvasSurface;
- });
- }(Module)); // When this file is loaded in, the high level object is "Module";
|