b1ebbb19bc
Fixes release-cpu build issue, un-revert cl 289733 Color space arguments accepted at surface creation, paint, gradient, and other call sites. Works correctly only when chrome happens to be rendering itself in the same color space the canvaskit user has chosen, there's not yet end to end color management of canvases supported in browsers. readPixels not yet working due to possible chrome bug. Reviewed-on: https://skia-review.googlesource.com/c/skia/+/289733 Commit-Queue: Nathaniel Nifong <nifong@google.com> Reviewed-by: Kevin Lubick <kjlubick@google.com> Change-Id: I65ce1c643dac57e14b8476f598c96b12b7e040ce Reviewed-on: https://skia-review.googlesource.com/c/skia/+/291896
92 lines
3.6 KiB
JavaScript
92 lines
3.6 KiB
JavaScript
// Adds compile-time JS functions to augment the CanvasKit interface.
|
|
// Specifically, anything that should only be on the CPU version of canvaskit.
|
|
(function(CanvasKit){
|
|
CanvasKit._extraInitializations = CanvasKit._extraInitializations || [];
|
|
CanvasKit._extraInitializations.push(function() {
|
|
// Takes in an html id or a canvas element
|
|
CanvasKit.MakeSWCanvasSurface = function(idOrElement) {
|
|
var canvas = idOrElement;
|
|
if (canvas.tagName !== 'CANVAS') {
|
|
canvas = document.getElementById(idOrElement);
|
|
if (!canvas) {
|
|
throw 'Canvas with id ' + idOrElement + ' was not found';
|
|
}
|
|
}
|
|
// Maybe better to use clientWidth/height. See:
|
|
// https://webglfundamentals.org/webgl/lessons/webgl-anti-patterns.html
|
|
var surface = CanvasKit.MakeSurface(canvas.width, canvas.height);
|
|
if (surface) {
|
|
surface._canvas = canvas;
|
|
}
|
|
return surface;
|
|
};
|
|
|
|
// Don't over-write the MakeCanvasSurface set by gpu.js if it exists.
|
|
if (!CanvasKit.MakeCanvasSurface) {
|
|
CanvasKit.MakeCanvasSurface = CanvasKit.MakeSWCanvasSurface;
|
|
}
|
|
|
|
// Note that color spaces are currently not supported in CPU surfaces. due to the limitation
|
|
// canvas.getContext('2d').putImageData imposes a limitatin of using an RGBA_8888 color type.
|
|
// TODO(nifong): support WGC color spaces while still using an RGBA_8888 color type when
|
|
// on a cpu backend.
|
|
CanvasKit.MakeSurface = function(width, height) {
|
|
/* @dict */
|
|
var imageInfo = {
|
|
'width': width,
|
|
'height': height,
|
|
'colorType': CanvasKit.ColorType.RGBA_8888,
|
|
// Since we are sending these pixels directly into the HTML canvas,
|
|
// (and those pixels are un-premultiplied, i.e. straight r,g,b,a)
|
|
'alphaType': CanvasKit.AlphaType.Unpremul,
|
|
'colorSpace': CanvasKit.SkColorSpace.SRGB,
|
|
}
|
|
var pixelLen = width * height * 4; // it's 8888, so 4 bytes per pixel
|
|
// Allocate the buffer of pixels to be drawn into.
|
|
var pixelPtr = CanvasKit._malloc(pixelLen);
|
|
|
|
var surface = this._getRasterDirectSurface(imageInfo, pixelPtr, width*4);
|
|
if (surface) {
|
|
surface._canvas = null;
|
|
surface._width = width;
|
|
surface._height = height;
|
|
surface._pixelLen = pixelLen;
|
|
|
|
surface._pixelPtr = pixelPtr;
|
|
// rasterDirectSurface does not initialize the pixels, so we clear them
|
|
// to transparent black.
|
|
surface.getCanvas().clear(CanvasKit.TRANSPARENT);
|
|
}
|
|
return surface;
|
|
};
|
|
|
|
CanvasKit.SkSurface.prototype.flush = function() {
|
|
this._flush();
|
|
// Do we have an HTML canvas to write the pixels to?
|
|
// We will not if this a GPU build or a raster surface, for example.
|
|
if (this._canvas) {
|
|
var pixels = new Uint8ClampedArray(CanvasKit.HEAPU8.buffer, this._pixelPtr, this._pixelLen);
|
|
var imageData = new ImageData(pixels, this._width, this._height);
|
|
|
|
this._canvas.getContext('2d').putImageData(imageData, 0, 0);
|
|
}
|
|
};
|
|
|
|
// Call dispose() instead of delete to clean up the underlying memory
|
|
CanvasKit.SkSurface.prototype.dispose = function() {
|
|
if (this._pixelPtr) {
|
|
CanvasKit._free(this._pixelPtr);
|
|
}
|
|
this.delete();
|
|
}
|
|
|
|
CanvasKit.currentContext = CanvasKit.currentContext || function() {
|
|
// no op if this is a cpu-only build.
|
|
};
|
|
|
|
CanvasKit.setCurrentContext = CanvasKit.setCurrentContext || function() {
|
|
// no op if this is a cpu-only build.
|
|
};
|
|
});
|
|
}(Module)); // When this file is loaded in, the high level object is "Module";
|