[canvaskit] Handle 4x4 matrix passing ourselves.
This reduces the skm44_concat benchmark from 2us to .35us, a 5x
speedup.
SkCanvas.concat now takes a 3x2, 3x3, or 4x4 matrix and upscales
them all to 4x4. This makes concat44 redundant.
Removes redundant null checks for matrices, since freeing(0)
in WASM is fine like it is in C++.
Change-Id: I44a776ffd0babb81d8a34f9d94ae4d7831d02b55
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/281721
Reviewed-by: Mike Reed <reed@google.com>
diff --git a/modules/canvaskit/interface.js b/modules/canvaskit/interface.js
index 21eff63..1687861 100644
--- a/modules/canvaskit/interface.js
+++ b/modules/canvaskit/interface.js
@@ -231,8 +231,8 @@
];
}
- // Functions for creating and manipulating 4x4 matrices. Accepted in place of SkM44 in canvas
- // methods, for the same reasons as the 3x3 matrices above.
+ // Functions for creating and manipulating (row-major) 4x4 matrices. Accepted in place of
+ // SkM44 in canvas methods, for the same reasons as the 3x3 matrices above.
// ported from C++ code in SkM44.cpp
CanvasKit.SkM44 = {};
// Create a 4x4 identity matrix
@@ -283,10 +283,10 @@
var m = CanvasKit.SkM44.identity();
// set each column's top three numbers
- stride(s, m, 4, 0, 0);
+ stride(s, m, 4, 0, 0);
stride(CanvasKit.SkVector.cross(s, f), m, 4, 1, 0);
stride(CanvasKit.SkVector.mulScalar(f, -1), m, 4, 2, 0);
- stride(eyeVec, m, 4, 3, 0);
+ stride(eyeVec, m, 4, 3, 0);
var m2 = CanvasKit.SkM44.invert(m);
if (m2 === null) {
@@ -808,7 +808,7 @@
CanvasKit.SkImage.prototype.makeShader = function(xTileMode, yTileMode, localMatrix) {
var localMatrixPtr = copy3x3MatrixToWasm(localMatrix);
var shader = this._makeShader(xTileMode, yTileMode, localMatrixPtr);
- localMatrixPtr && CanvasKit._free(localMatrixPtr);
+ CanvasKit._free(localMatrixPtr);
return shader;
}
@@ -852,12 +852,17 @@
return retVal;
}
+ // concat takes a 3x2, a 3x3, or a 4x4 matrix and upscales it (if needed) to 4x4. This is because
+ // under the hood, SkCanvas uses a 4x4 matrix.
CanvasKit.SkCanvas.prototype.concat = function(matr) {
- var matrPtr = copy3x3MatrixToWasm(matr);
+ var matrPtr = copy4x4MatrixToWasm(matr);
this._concat(matrPtr);
- matrPtr && CanvasKit._free(matrPtr);
+ CanvasKit._free(matrPtr);
}
+ // Deprecated - just use concat
+ CanvasKit.SkCanvas.prototype.concat44 = CanvasKit.SkCanvas.prototype.concat;
+
// atlas is an SkImage, e.g. from CanvasKit.MakeImageFromEncoded
// srcRects and dstXforms should be CanvasKit.SkRectBuilder and CanvasKit.RSXFormBuilder
// or just arrays of floats in groups of 4.
@@ -940,6 +945,31 @@
CanvasKit._free(ptr);
}
+ // getLocalToCamera returns a 4x4 matrix.
+ CanvasKit.SkCanvas.prototype.getLocalToCamera = function() {
+ var matrPtr = CanvasKit._malloc(16 * 4); // allocate space for the matrix
+ // _getLocalToCamera will copy the values into the pointer.
+ this._getLocalToCamera(matrPtr);
+ return copy4x4MatrixFromWasm(matrPtr);
+ }
+
+ // getLocalToDevice returns a 4x4 matrix.
+ CanvasKit.SkCanvas.prototype.getLocalToDevice = function() {
+ var matrPtr = CanvasKit._malloc(16 * 4); // allocate space for the matrix
+ // _getLocalToDevice will copy the values into the pointer.
+ this._getLocalToDevice(matrPtr);
+ return copy4x4MatrixFromWasm(matrPtr);
+ }
+
+ // getLocalToWorld returns a 4x4 matrix.
+ CanvasKit.SkCanvas.prototype.getLocalToWorld = function() {
+ var matrPtr = CanvasKit._malloc(16 * 4); // allocate space for the matrix
+ // _getLocalToWorld will copy the values into the pointer.
+ this._getLocalToWorld(matrPtr);
+ return copy4x4MatrixFromWasm(matrPtr);
+ }
+
+ // getTotalMatrix returns the current matrix as a 3x3 matrix.
CanvasKit.SkCanvas.prototype.getTotalMatrix = function() {
var matrPtr = CanvasKit._malloc(9 * 4); // allocate space for the matrix
// _getTotalMatrix will copy the values into the pointer.
@@ -982,6 +1012,14 @@
return pixels;
}
+ CanvasKit.SkCanvas.prototype.saveCamera = function(projection, camera) {
+ var pPtr = copy4x4MatrixToWasm(projection);
+ var cPtr = copy4x4MatrixToWasm(camera);
+ this._saveCamera(pPtr, cPtr);
+ CanvasKit._free(pPtr)
+ CanvasKit._free(cPtr);
+ }
+
// pixels is a TypedArray. No matter the input size, it will be treated as
// a Uint8Array (essentially, a byte array).
CanvasKit.SkCanvas.prototype.writePixels = function(pixels, srcWidth, srcHeight,
@@ -1025,7 +1063,7 @@
var matrPtr = copy3x3MatrixToWasm(matr);
var imgF = CanvasKit.SkImageFilter._MakeMatrixTransform(matrPtr, filterQuality, input);
- matrPtr && CanvasKit._free(matrPtr);
+ CanvasKit._free(matrPtr);
return imgF;
}
@@ -1099,7 +1137,7 @@
var lgs = CanvasKit._MakeLinearGradientShader(start, end, colorPtr, posPtr,
colors.length, mode, flags, localMatrixPtr);
- localMatrixPtr && CanvasKit._free(localMatrixPtr);
+ CanvasKit._free(localMatrixPtr);
CanvasKit._free(colorPtr);
CanvasKit._free(posPtr);
return lgs;
@@ -1114,7 +1152,7 @@
var rgs = CanvasKit._MakeRadialGradientShader(center, radius, colorPtr, posPtr,
colors.length, mode, flags, localMatrixPtr);
- localMatrixPtr && CanvasKit._free(localMatrixPtr);
+ CanvasKit._free(localMatrixPtr);
CanvasKit._free(colorPtr);
CanvasKit._free(posPtr);
return rgs;
@@ -1133,7 +1171,7 @@
startAngle, endAngle, flags,
localMatrixPtr);
- localMatrixPtr && CanvasKit._free(localMatrixPtr);
+ CanvasKit._free(localMatrixPtr);
CanvasKit._free(colorPtr);
CanvasKit._free(posPtr);
return sgs;
@@ -1150,7 +1188,7 @@
start, startRadius, end, endRadius,
colorPtr, posPtr, colors.length, mode, flags, localMatrixPtr);
- localMatrixPtr && CanvasKit._free(localMatrixPtr);
+ CanvasKit._free(localMatrixPtr);
CanvasKit._free(colorPtr);
CanvasKit._free(posPtr);
return rgs;