Skip to content

Commit 3ef77dd

Browse files
reed-at-googleSkia Commit-Bot
authored andcommitted
clean up public m44 and camera api
saveCamera() is no longer experimental In a separate CL, will stage changes to concat virtual to take M44. Change-Id: Iaf37ce2f24ab1223c54aeb1e79eaebf18f87fece Reviewed-on: https://skia-review.googlesource.com/c/skia/+/281589 Reviewed-by: Brian Osman <[email protected]> Commit-Queue: Mike Reed <[email protected]>
1 parent 6d3bc29 commit 3ef77dd

20 files changed

+95
-124
lines changed

bench/GameBench.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -368,7 +368,7 @@ class CanvasMatrixBench : public Benchmark {
368368
case kScale_Type: canvas->scale(1.0001f, 0.9999f); break;
369369
case k2x3_Type: canvas->concat(m); break;
370370
case k3x3_Type: canvas->concat(m); break;
371-
case k4x4_Type: canvas->concat44(m4); break;
371+
case k4x4_Type: canvas->concat(m4); break;
372372
}
373373
}
374374
canvas->restore();

bench/Matrix44Bench.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ class M4Bench : public Benchmark {
2121
for (auto& v : value) {
2222
v = rand.nextF();
2323
}
24-
fM1.setColMajor(value + 0);
25-
fM2.setColMajor(value + 16);
24+
fM1 = SkM44::ColMajor(value + 0);
25+
fM2 = SkM44::ColMajor(value + 16);
2626
}
2727

2828
bool isSuitableFor(Backend backend) override {

gm/3d.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ static void do_draw(SkCanvas* canvas, SkColor color) {
5050

5151
SkM44 m = SkM44::Rotate({0, 1, 0}, SK_ScalarPI/6);
5252

53-
canvas->concat44(make_ctm(info, m, {300, 300}));
53+
canvas->concat(make_ctm(info, m, {300, 300}));
5454

5555
canvas->translate(150, 150);
5656
SkPaint paint;

gm/crbug_224618.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class CrBug224618GM : public skiagm::GM {
8888
SkM44::Translate(-radius, -radius); // center content
8989

9090
canvas->save();
91-
canvas->concat44(model);
91+
canvas->concat(model);
9292

9393
SkPaint fillPaint;
9494
fillPaint.setAntiAlias(true);

gm/postercircle.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ class PosterCircleGM : public skiagm::GM {
124124
* SkM44::Translate(0, ringY, 0)
125125
* SkM44::Rotate({0,1,0}, SkDegreesToRadians(yRotation))
126126
* SkM44::Translate(0, 0, kRingRadius);
127-
canvas->concat44(model);
127+
canvas->concat(model);
128128

129129
SkRect poster = SkRect::MakeLTRB(-0.5f * kPosterSize, -0.5f * kPosterSize,
130130
0.5f * kPosterSize, 0.5f * kPosterSize);

include/core/SkCanvas.h

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -756,8 +756,19 @@ class SK_API SkCanvas {
756756
*/
757757
int saveLayer(const SaveLayerRec& layerRec);
758758

759-
int experimental_saveCamera(const SkM44& projection, const SkM44& camera);
760-
int experimental_saveCamera(const SkScalar projection[16], const SkScalar camera[16]);
759+
/**
760+
* Save the matrix and clip state (just like save()), but then also concat
761+
* two more matrices: projection and camera. This call is logically similar to:
762+
* save()
763+
* concat(projection)
764+
* concat(camera)
765+
* However, these matrices are tracked by the canvas, so if any shader references
766+
* lights or normals, these can be properly transformed, as they will have access to
767+
* local-to-world and local-to-camera.
768+
*
769+
* returns the current save count (see getSaveCount()).
770+
*/
771+
int saveCamera(const SkM44& projection, const SkM44& camera);
761772

762773
/** Removes changes to SkMatrix and clip since SkCanvas state was
763774
last saved. The state is removed from the stack.
@@ -880,8 +891,13 @@ class SK_API SkCanvas {
880891
example: https://fiddle.skia.org/c/@Canvas_concat
881892
*/
882893
void concat(const SkMatrix& matrix);
883-
void concat44(const SkM44&);
884-
void concat44(const SkScalar[]); // column-major
894+
void concat(const SkM44&);
895+
896+
// DEPRECATED
897+
#if 1
898+
void concat44(const SkM44& m) { this->concat(m); }
899+
void concat44(const SkScalar cm[]) { this->concat(SkM44::ColMajor(cm)); }
900+
#endif
885901

886902
/** Replaces SkMatrix with matrix.
887903
Unlike concat(), any prior matrix state is overwritten.
@@ -2427,15 +2443,13 @@ class SK_API SkCanvas {
24272443
example: https://fiddle.skia.org/c/@Clip
24282444
*/
24292445
SkMatrix getTotalMatrix() const;
2446+
24302447
SkM44 getLocalToDevice() const; // entire matrix stack
2431-
void getLocalToDevice(SkScalar colMajor[16]) const;
24322448

2449+
// These will go away when we have formal access to these from SkSL
24332450
SkM44 experimental_getLocalToWorld() const; // up to but not including top-most camera
24342451
SkM44 experimental_getLocalToCamera() const; // up to and including top-most camera
24352452

2436-
void experimental_getLocalToWorld(SkScalar colMajor[16]) const;
2437-
void experimental_getLocalToCamera(SkScalar colMajor[16]) const;
2438-
24392453
///////////////////////////////////////////////////////////////////////////
24402454

24412455
// don't call

include/core/SkM44.h

Lines changed: 35 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -158,10 +158,10 @@ class SkM44 {
158158
SkScalar m2, SkScalar m6, SkScalar m10, SkScalar m14,
159159
SkScalar m3, SkScalar m7, SkScalar m11, SkScalar m15)
160160
{
161-
this->set44(m0, m4, m8, m12,
162-
m1, m5, m9, m13,
163-
m2, m6, m10, m14,
164-
m3, m7, m11, m15);
161+
fMat[0] = m0; fMat[4] = m4; fMat[8] = m8; fMat[12] = m12;
162+
fMat[1] = m1; fMat[5] = m5; fMat[9] = m9; fMat[13] = m13;
163+
fMat[2] = m2; fMat[6] = m6; fMat[10] = m10; fMat[14] = m14;
164+
fMat[3] = m3; fMat[7] = m7; fMat[11] = m11; fMat[15] = m15;
165165
}
166166

167167
static SkM44 Rows(const SkV4& r0, const SkV4& r1, const SkV4& r2, const SkV4& r3) {
@@ -181,6 +181,19 @@ class SkM44 {
181181
return m;
182182
}
183183

184+
static SkM44 RowMajor(const SkScalar r[16]) {
185+
return SkM44(r[ 0], r[ 1], r[ 2], r[ 3],
186+
r[ 4], r[ 5], r[ 6], r[ 7],
187+
r[ 8], r[ 9], r[10], r[11],
188+
r[12], r[13], r[14], r[15]);
189+
}
190+
static SkM44 ColMajor(const SkScalar c[16]) {
191+
return SkM44(c[0], c[4], c[ 8], c[12],
192+
c[1], c[5], c[ 9], c[13],
193+
c[2], c[6], c[10], c[14],
194+
c[3], c[7], c[11], c[15]);
195+
}
196+
184197
static SkM44 Translate(SkScalar x, SkScalar y, SkScalar z = 0) {
185198
return SkM44(1, 0, 0, x,
186199
0, 1, 0, y,
@@ -211,25 +224,6 @@ class SkM44 {
211224
}
212225
void getRowMajor(SkScalar v[]) const;
213226

214-
SkM44& setColMajor(const SkScalar v[]) {
215-
memcpy(fMat, v, sizeof(fMat));
216-
return *this;
217-
}
218-
SkM44& setRowMajor(const SkScalar v[]);
219-
220-
/* Parameters in same order as constructor.
221-
*/
222-
SkM44& set44(SkScalar m0, SkScalar m4, SkScalar m8, SkScalar m12,
223-
SkScalar m1, SkScalar m5, SkScalar m9, SkScalar m13,
224-
SkScalar m2, SkScalar m6, SkScalar m10, SkScalar m14,
225-
SkScalar m3, SkScalar m7, SkScalar m11, SkScalar m15) {
226-
fMat[0] = m0; fMat[4] = m4; fMat[8] = m8; fMat[12] = m12;
227-
fMat[1] = m1; fMat[5] = m5; fMat[9] = m9; fMat[13] = m13;
228-
fMat[2] = m2; fMat[6] = m6; fMat[10] = m10; fMat[14] = m14;
229-
fMat[3] = m3; fMat[7] = m7; fMat[11] = m11; fMat[15] = m15;
230-
return *this;
231-
}
232-
233227
SkScalar rc(int r, int c) const {
234228
SkASSERT(r >= 0 && r <= 3);
235229
SkASSERT(c >= 0 && c <= 3);
@@ -263,24 +257,27 @@ class SkM44 {
263257
}
264258

265259
SkM44& setIdentity() {
266-
return this->set44(1, 0, 0, 0,
267-
0, 1, 0, 0,
268-
0, 0, 1, 0,
269-
0, 0, 0, 1);
260+
*this = { 1, 0, 0, 0,
261+
0, 1, 0, 0,
262+
0, 0, 1, 0,
263+
0, 0, 0, 1 };
264+
return *this;
270265
}
271266

272267
SkM44& setTranslate(SkScalar x, SkScalar y, SkScalar z = 0) {
273-
return this->set44(1, 0, 0, x,
274-
0, 1, 0, y,
275-
0, 0, 1, z,
276-
0, 0, 0, 1);
268+
*this = { 1, 0, 0, x,
269+
0, 1, 0, y,
270+
0, 0, 1, z,
271+
0, 0, 0, 1 };
272+
return *this;
277273
}
278274

279275
SkM44& setScale(SkScalar x, SkScalar y, SkScalar z = 1) {
280-
return this->set44(x, 0, 0, 0,
281-
0, y, 0, 0,
282-
0, 0, z, 0,
283-
0, 0, 0, 1);
276+
*this = { x, 0, 0, 0,
277+
0, y, 0, 0,
278+
0, 0, z, 0,
279+
0, 0, 0, 1 };
280+
return *this;
284281
}
285282

286283
/**
@@ -311,18 +308,14 @@ class SkM44 {
311308
*/
312309
SkM44& setRotate(SkV3 axis, SkScalar radians);
313310

314-
SkM44& setConcat16(const SkM44& a, const SkScalar colMajor[16]);
315-
316-
SkM44& setConcat(const SkM44& a, const SkM44& b) {
317-
return this->setConcat16(a, b.fMat);
318-
}
311+
SkM44& setConcat(const SkM44& a, const SkM44& b);
319312

320313
friend SkM44 operator*(const SkM44& a, const SkM44& b) {
321314
return SkM44(a, b);
322315
}
323316

324-
SkM44& preConcat16(const SkScalar colMajor[16]) {
325-
return this->setConcat16(*this, colMajor);
317+
SkM44& preConcat(const SkM44& m) {
318+
return this->setConcat(*this, m);
326319
}
327320

328321
/** If this is invertible, return that in inverse and return true. If it is

modules/canvaskit/canvaskit_bindings.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1051,10 +1051,10 @@ EMSCRIPTEN_BINDINGS(Skia) {
10511051
// 4x4 matrix functions
10521052
.function("saveCamera", optional_override([](SkCanvas& self,
10531053
const SimpleM44& projection, const SimpleM44& camera) {
1054-
self.experimental_saveCamera(toSkM44(projection), toSkM44(camera));
1054+
self.saveCamera(toSkM44(projection), toSkM44(camera));
10551055
}))
10561056
.function("concat44", optional_override([](SkCanvas& self, const SimpleM44& m) {
1057-
self.concat44(toSkM44(m));
1057+
self.concat(toSkM44(m));
10581058
}))
10591059
.function("getLocalToDevice", optional_override([](const SkCanvas& self)->SimpleM44 {
10601060
SkM44 m = self.getLocalToDevice();

modules/sksg/src/SkSGTransform.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -179,7 +179,7 @@ TransformEffect::~TransformEffect() {
179179

180180
void TransformEffect::onRender(SkCanvas* canvas, const RenderContext* ctx) const {
181181
SkAutoCanvasRestore acr(canvas, true);
182-
canvas->concat44(TransformPriv::As<SkM44>(fTransform));
182+
canvas->concat(TransformPriv::As<SkM44>(fTransform));
183183

184184
this->INHERITED::onRender(canvas, ctx);
185185
}

samplecode/Sample3D.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,7 @@ class Sample3DView : public Sample {
9090

9191
// want "world" to be in our big coordinates (e.g. area), so apply this inverse
9292
// as part of our "camera".
93-
canvas->experimental_saveCamera(viewport * perspective, camera * inv(viewport));
93+
canvas->saveCamera(viewport * perspective, camera * inv(viewport));
9494
}
9595
};
9696

@@ -289,7 +289,7 @@ class SampleCubeBase : public Sample3DView {
289289
SkM44 trans = SkM44::Translate(200, 200, 0); // center of the rotation
290290
SkM44 m = fRotateAnimator.rotation() * fRotation * f.asM44(200);
291291

292-
canvas->concat44(trans * m * inv(trans));
292+
canvas->concat(trans * m * inv(trans));
293293
this->drawContent(canvas, f.fColor, index++, drawFront);
294294
}
295295
}

0 commit comments

Comments
 (0)