Skip to content
This repository was archived by the owner on Feb 25, 2025. It is now read-only.

Commit be72801

Browse files
committed
Reland "[canvaskit] Replace RRect objects with TypedArrays."
This reverts commit 370de72. Reason for revert: Unrelated to breakage Original change's description: > Revert "[canvaskit] Replace RRect objects with TypedArrays." > > Revert submission 314622 > > Reason for revert: breaking wasm bots > Reverted Changes: > Ia1ba13814:[canvaskit] Replace RRect objects with TypedArrays... > Ib80b15e2d:[canvaskit] Change SkRects to be arrays, not objec... > I790b2d6fc:[canvaskit] Add drawRect4f as example 'fast path' ... > > Change-Id: I3912ffeb446b497e4e03a6260e51cae1e664bd83 > Reviewed-on: https://skia-review.googlesource.com/c/skia/+/314894 > Reviewed-by: Michael Ludwig <michaelludwig@google.com> TBR=kjlubick@google.com,michaelludwig@google.com,nifong@google.com # Not skipping CQ checks because this is a reland. Change-Id: I9b1e38fd36f635146b3b518142bbc4626007700f Reviewed-on: https://skia-review.googlesource.com/c/skia/+/315141 Reviewed-by: Kevin Lubick <kjlubick@google.com>
1 parent a66a9c3 commit be72801

File tree

6 files changed

+158
-115
lines changed

6 files changed

+158
-115
lines changed

modules/canvaskit/CHANGELOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88

9+
### Breaking
10+
- SkRRect (Rectangles with rounded corners) are no longer returned from `CanvasKit.RRectXY`
11+
nor accepted as JS objects. Instead, the format is 12 floats in either an array, a
12+
Float32Array or a piece of memory returned by CanvasKit.Malloc. The first 4 floats
13+
are the left, top, right, bottom numbers of the rectangle and then 4 sets of points
14+
starting in the upper left corner and going clockwise. This change allows for faster
15+
transfer between JS and WASM code.
16+
917
### Changed
1018
- We now compile CanvasKit with emsdk 2.0.0 when testing and deploying to npm.
1119
- WebGL interface creation is a little leaner in terms of code size and speed.

modules/canvaskit/canvaskit_bindings.cpp

Lines changed: 20 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,19 @@ SkColor4f ptrToSkColor4f(uintptr_t /* float* */ cPtr) {
106106
return color;
107107
}
108108

109+
SkRRect ptrToSkRRect(uintptr_t /* float* */ fPtr) {
110+
// In order, these floats should be 4 floats for the rectangle
111+
// (left, top, right, bottom) and then 8 floats for the radii
112+
// (upper left, upper right, lower right, lower left).
113+
const SkScalar* twelveFloats = reinterpret_cast<const SkScalar*>(fPtr);
114+
const SkRect rect = reinterpret_cast<const SkRect*>(twelveFloats)[0];
115+
const SkVector* radiiValues = reinterpret_cast<const SkVector*>(twelveFloats + 4);
116+
117+
SkRRect rr;
118+
rr.setRectRadii(rect, radiiValues);
119+
return rr;
120+
}
121+
109122
// Surface creation structs and helpers
110123
struct SimpleImageInfo {
111124
int width;
@@ -689,28 +702,6 @@ struct PosTan {
689702
SkScalar px, py, tx, ty;
690703
};
691704

692-
// SimpleRRect is simpler than passing a (complex) SkRRect over the wire to JS.
693-
struct SimpleRRect {
694-
SkRect rect;
695-
696-
SkScalar rx1;
697-
SkScalar ry1;
698-
SkScalar rx2;
699-
SkScalar ry2;
700-
SkScalar rx3;
701-
SkScalar ry3;
702-
SkScalar rx4;
703-
SkScalar ry4;
704-
};
705-
706-
SkRRect toRRect(const SimpleRRect& r) {
707-
SkVector fRadii[4] = {{r.rx1, r.ry1}, {r.rx2, r.ry2},
708-
{r.rx3, r.ry3}, {r.rx4, r.ry4}};
709-
SkRRect rr;
710-
rr.setRectRadii(r.rect, fRadii);
711-
return rr;
712-
}
713-
714705
// This function is private, we call it in interface.js
715706
void computeTonalColors(uintptr_t cPtrAmbi /* float * */, uintptr_t cPtrSpot /* float * */) {
716707
// private methods accepting colors take pointers to floats already copied into wasm memory.
@@ -1003,8 +994,8 @@ EMSCRIPTEN_BINDINGS(Skia) {
1003994
self.clear(ptrToSkColor4f(cPtr));
1004995
}))
1005996
.function("clipPath", select_overload<void (const SkPath&, SkClipOp, bool)>(&SkCanvas::clipPath))
1006-
.function("clipRRect", optional_override([](SkCanvas& self, const SimpleRRect& r, SkClipOp op, bool doAntiAlias) {
1007-
self.clipRRect(toRRect(r), op, doAntiAlias);
997+
.function("_clipRRect", optional_override([](SkCanvas& self, uintptr_t /* float* */ fPtr, SkClipOp op, bool doAntiAlias) {
998+
self.clipRRect(ptrToSkRRect(fPtr), op, doAntiAlias);
1008999
}))
10091000
.function("clipRect", select_overload<void (const SkRect&, SkClipOp, bool)>(&SkCanvas::clipRect))
10101001
.function("_concat", optional_override([](SkCanvas& self, uintptr_t /* SkScalar* */ mPtr) {
@@ -1042,8 +1033,9 @@ EMSCRIPTEN_BINDINGS(Skia) {
10421033
.function("drawColorInt", optional_override([](SkCanvas& self, SkColor color, SkBlendMode mode) {
10431034
self.drawColor(color, mode);
10441035
}))
1045-
.function("drawDRRect",optional_override([](SkCanvas& self, const SimpleRRect& o, const SimpleRRect& i, const SkPaint& paint) {
1046-
self.drawDRRect(toRRect(o), toRRect(i), paint);
1036+
.function("_drawDRRect",optional_override([](SkCanvas& self, uintptr_t /* float* */ outerPtr,
1037+
uintptr_t /* float* */ innerPtr, const SkPaint& paint) {
1038+
self.drawDRRect(ptrToSkRRect(outerPtr), ptrToSkRRect(innerPtr), paint);
10471039
}))
10481040
.function("drawAnimatedImage", optional_override([](SkCanvas& self, sk_sp<SkAnimatedImage>& aImg,
10491041
SkScalar x, SkScalar y)->void {
@@ -1082,8 +1074,8 @@ EMSCRIPTEN_BINDINGS(Skia) {
10821074
const SkPoint* pts = reinterpret_cast<const SkPoint*>(pptr);
10831075
self.drawPoints(mode, count, pts, paint);
10841076
}))
1085-
.function("drawRRect",optional_override([](SkCanvas& self, const SimpleRRect& r, const SkPaint& paint) {
1086-
self.drawRRect(toRRect(r), paint);
1077+
.function("_drawRRect",optional_override([](SkCanvas& self, uintptr_t /* float* */ fPtr, const SkPaint& paint) {
1078+
self.drawRRect(ptrToSkRRect(fPtr), paint);
10871079
}))
10881080
.function("drawRect", &SkCanvas::drawRect)
10891081
.function("drawRoundRect", &SkCanvas::drawRoundRect)
@@ -1858,17 +1850,6 @@ EMSCRIPTEN_BINDINGS(Skia) {
18581850
.field("fRight", &SkRect::fRight)
18591851
.field("fBottom", &SkRect::fBottom);
18601852

1861-
value_object<SimpleRRect>("SkRRect")
1862-
.field("rect", &SimpleRRect::rect)
1863-
.field("rx1", &SimpleRRect::rx1)
1864-
.field("ry1", &SimpleRRect::ry1)
1865-
.field("rx2", &SimpleRRect::rx2)
1866-
.field("ry2", &SimpleRRect::ry2)
1867-
.field("rx3", &SimpleRRect::rx3)
1868-
.field("ry3", &SimpleRRect::ry3)
1869-
.field("rx4", &SimpleRRect::rx4)
1870-
.field("ry4", &SimpleRRect::ry4);
1871-
18721853
value_object<SkIRect>("SkIRect")
18731854
.field("fLeft", &SkIRect::fLeft)
18741855
.field("fTop", &SkIRect::fTop)

modules/canvaskit/externs.js

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -185,13 +185,11 @@ var CanvasKit = {
185185
SkCanvas: {
186186
// public API (from C++ bindings)
187187
clipPath: function() {},
188-
clipRRect: function() {},
189188
clipRect: function() {},
190189
drawAnimatedImage: function() {},
191190
drawArc: function() {},
192191
drawCircle: function() {},
193192
drawColorInt: function() {},
194-
drawDRRect: function() {},
195193
drawImage: function() {},
196194
drawImageNine: function() {},
197195
drawImageRect: function() {},
@@ -201,7 +199,6 @@ var CanvasKit = {
201199
drawParagraph: function() {},
202200
drawPath: function() {},
203201
drawPicture: function() {},
204-
drawRRect: function() {},
205202
drawRect: function() {},
206203
drawRoundRect: function() {},
207204
drawText: function() {},
@@ -223,24 +220,38 @@ var CanvasKit = {
223220

224221
prototype: {
225222
clear: function() {},
223+
clipRRect: function() {},
224+
concat44: function() {}, // deprecated
225+
concat: function() {},
226+
drawAtlas: function() {},
226227
drawColor: function() {},
227228
drawColorComponents: function() {},
229+
drawDRRect: function() {},
230+
drawPoints: function() {},
231+
drawRRect: function() {},
228232
drawShadow: function() {},
233+
drawText: function() {},
234+
findMarkedCTM: function() {},
235+
getLocalToDevice: function() {},
236+
getTotalMatrix: function() {},
237+
readPixels: function() {},
238+
writePixels : function() {},
229239
},
230240

231241
// private API
232242
_clear: function() {},
243+
_clipRRect: function() {},
233244
_concat: function() {},
234245
_drawAtlas: function() {},
235246
_drawColor: function() {},
247+
_drawDRRect: function() {},
236248
_drawPoints: function() {},
249+
_drawRRect: function() {},
237250
_drawShadow: function() {},
238251
_drawSimpleText: function() {},
239-
_getLocalToCamera: function() {},
252+
_findMarkedCTM: function() {},
240253
_getLocalToDevice: function() {},
241-
_getLocalToWorld: function() {},
242254
_getTotalMatrix: function() {},
243-
_findMarkedCTM: function() {},
244255
_readPixels: function() {},
245256
_writePixels: function() {},
246257
delete: function() {},
@@ -932,19 +943,6 @@ CanvasKit.SkSurface.prototype.captureFrameAsSkPicture = function() {};
932943
CanvasKit.SkImage.prototype.encodeToData = function() {};
933944
CanvasKit.SkImage.prototype.makeShader = function() {};
934945

935-
CanvasKit.SkCanvas.prototype.concat = function() {};
936-
CanvasKit.SkCanvas.prototype.concat44 = function() {}; // deprecated
937-
CanvasKit.SkCanvas.prototype.drawAtlas = function() {};
938-
CanvasKit.SkCanvas.prototype.drawPoints = function() {};
939-
CanvasKit.SkCanvas.prototype.drawText = function() {};
940-
CanvasKit.SkCanvas.prototype.getLocalToCamera = function() {};
941-
CanvasKit.SkCanvas.prototype.getLocalToDevice = function() {};
942-
CanvasKit.SkCanvas.prototype.getLocalToWorld = function() {};
943-
CanvasKit.SkCanvas.prototype.getTotalMatrix = function() {};
944-
/** @return {Uint8Array} */
945-
CanvasKit.SkCanvas.prototype.readPixels = function() {};
946-
CanvasKit.SkCanvas.prototype.writePixels = function() {};
947-
948946
CanvasKit.SkFontMgr.prototype.MakeTypefaceFromData = function() {};
949947

950948
CanvasKit.SkFont.prototype.getWidths = function() {};

modules/canvaskit/helper.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -465,6 +465,18 @@ function copyColorFromWasm(colorPtr) {
465465
return rv;
466466
}
467467

468+
// These will be initialized after loading.
469+
var _scratchRRect;
470+
var _scratchRRectPtr = nullptr;
471+
472+
var _scratchRRect2;
473+
var _scratchRRect2Ptr = nullptr;
474+
475+
476+
function copyRRectToWasm(twelveFloats, ptr) {
477+
return copy1dArray(twelveFloats, "HEAPF32", ptr || _scratchRRectPtr);
478+
}
479+
468480
// Caching the Float32Arrays can save having to reallocate them
469481
// over and over again.
470482
var Float32ArrayCache = {};

0 commit comments

Comments
 (0)