[canvaskit] Refactor with getTotalMatrix

Follow up from https://skia-review.googlesource.com/c/skia/+/174843

Bug: skia:
Change-Id: I3b99d8550ecdf8085e11b6fbfbb304c857061149
Reviewed-on: https://skia-review.googlesource.com/c/175583
Reviewed-by: Florin Malita <fmalita@chromium.org>
This commit is contained in:
Kevin Lubick 2018-12-07 10:09:11 -05:00
parent 1646e7d715
commit 5d5723c1d8
4 changed files with 26 additions and 22 deletions

View File

@ -845,7 +845,7 @@
strokeWidth: 2,
testFn: (ctx, x, y) => ctx.isPointInStroke(x * SCALE, y * SCALE),
},
]
];
for (let canvas of [skcanvas, realCanvas]) {
let ctx = canvas.getContext('2d');

View File

@ -149,6 +149,13 @@ SkMatrix toSkMatrix(const SimpleMatrix& sm) {
sm.pers0 , sm.pers1 , sm.pers2);
}
SimpleMatrix toSimpleSkMatrix(const SkMatrix& sm) {
SimpleMatrix m {sm[0], sm[1], sm[2],
sm[3], sm[4], sm[5],
sm[6], sm[7], sm[8]};
return m;
}
struct SimpleImageInfo {
int width;
int height;
@ -640,6 +647,10 @@ EMSCRIPTEN_BINDINGS(Skia) {
}))
.function("drawVertices", select_overload<void (const sk_sp<SkVertices>&, SkBlendMode, const SkPaint&)>(&SkCanvas::drawVertices))
.function("flush", &SkCanvas::flush)
.function("getTotalMatrix", optional_override([](const SkCanvas& self)->SimpleMatrix {
SkMatrix m = self.getTotalMatrix();
return toSimpleSkMatrix(m);
}))
.function("_readPixels", optional_override([](SkCanvas& self, SimpleImageInfo di,
uintptr_t /* uint8_t* */ pPtr,
size_t dstRowBytes, int srcX, int srcY) {

View File

@ -77,9 +77,9 @@ var CanvasKit = {
SkCanvas: {
// public API (from C++ bindings)
clear: function() {},
concat: function() {},
clipRect: function() {},
clipPath: function() {},
clipRect: function() {},
concat: function() {},
drawImage: function() {},
drawImageRect: function() {},
drawPaint: function() {},
@ -89,6 +89,7 @@ var CanvasKit = {
drawText: function() {},
drawVertices: function() {},
flush: function() {},
getTotalMatrix: function() {},
restore: function() {},
rotate: function() {},
save: function() {},

View File

@ -275,7 +275,6 @@
var sx2 = pts[2];
var sy2 = pts[3];
// Maybe refactor _scalefactor() on which this is taken?
var sx = currentTransform[0];
var sy = currentTransform[4];
var scaleFactor = (Math.abs(sx) + Math.abs(sy))/2;
@ -418,13 +417,13 @@
'f' : this._currentTransform[5],
};
},
// @param {DOMMatrix} matrix
set: function(matrix) {
if (matrix.a) {
// if we see a property named 'a', guess that b-f will
// also be there.
this._currentTransform = [matrix.a, matrix.c, matrix.e,
matrix.b, matrix.d, matrix.f,
0, 0, 1];
this.setTransform(matrix.a, matrix.b, matrix.c,
matrix.d, matrix.e, matrix.f);
}
}
});
@ -1268,7 +1267,8 @@
this._currentPath.transform(this._currentTransform);
var inverted = CanvasKit.SkMatrix.invert(this._currentTransform);
this._canvas.concat(inverted);
this._currentTransform = CanvasKit.SkMatrix.identity();
// This should be identity, modulo floating point drift.
this._currentTransform = this._canvas.getTotalMatrix();
}
this.restore = function() {
@ -1285,7 +1285,6 @@
);
this._currentPath.transform(combined);
this._currentTransform = newState.ctm;
this._lineDashList = newState.ldl;
this._strokeWidth = newState.sw;
this._paint.setStrokeWidth(this._strokeWidth);
@ -1306,8 +1305,9 @@
this._imageFilterQuality = newState.isq;
//TODO: font, textAlign, textBaseline, direction
// restores the clip
// restores the clip and ctm
this._canvas.restore();
this._currentTransform = this._canvas.getTotalMatrix();
}
this.rotate = function(radians) {
@ -1318,10 +1318,8 @@
// path so it cancels out when we apply the transform at draw time.
var inverted = CanvasKit.SkMatrix.rotated(-radians);
this._currentPath.transform(inverted);
this._currentTransform = CanvasKit.SkMatrix.multiply(
this._currentTransform,
CanvasKit.SkMatrix.rotated(radians));
this._canvas.rotate(radiansToDegrees(radians), 0, 0);
this._currentTransform = this._canvas.getTotalMatrix();
}
this.save = function() {
@ -1371,10 +1369,8 @@
// path so it cancels out when we apply the transform at draw time.
var inverted = CanvasKit.SkMatrix.scaled(1/sx, 1/sy);
this._currentPath.transform(inverted);
this._currentTransform = CanvasKit.SkMatrix.multiply(
this._currentTransform,
CanvasKit.SkMatrix.scaled(sx, sy));
this._canvas.scale(sx, sy);
this._currentTransform = this._canvas.getTotalMatrix();
}
this.setLineDash = function(dashes) {
@ -1514,10 +1510,8 @@
// path so it cancels out when we apply the transform at draw time.
var inverted = CanvasKit.SkMatrix.translated(-dx, -dy);
this._currentPath.transform(inverted);
this._currentTransform = CanvasKit.SkMatrix.multiply(
this._currentTransform,
CanvasKit.SkMatrix.translated(dx, dy));
this._canvas.translate(dx, dy);
this._currentTransform = this._canvas.getTotalMatrix();
}
this.transform = function(a, b, c, d, e, f) {
@ -1529,9 +1523,7 @@
var inverted = CanvasKit.SkMatrix.invert(newTransform);
this._currentPath.transform(inverted);
this._canvas.concat(newTransform);
this._currentTransform = CanvasKit.SkMatrix.multiply(
this._currentTransform,
newTransform);
this._currentTransform = this._canvas.getTotalMatrix();
}
// Not supported operations (e.g. for Web only)