Make converting from 4x4 to 3x3 explicit

Change-Id: I4d190d6831cb517d5e9f22b3f872013367bddc08
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/264856
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/bench/GameBench.cpp b/bench/GameBench.cpp
index 036fed0..e2cca8e 100644
--- a/bench/GameBench.cpp
+++ b/bench/GameBench.cpp
@@ -367,7 +367,7 @@
                     case kScale_Type:     canvas->scale(1.0001f, 0.9999f); break;
                     case k2x3_Type:       canvas->concat(m); break;
                     case k3x3_Type:       canvas->concat(m); break;
-                    case k4x4_Type:       canvas->concat(m4); break;
+                    case k4x4_Type:       canvas->experimental_concat44(m4); break;
                 }
             }
             canvas->restore();
diff --git a/gm/3d.cpp b/gm/3d.cpp
index 3bbed2d..efdb080 100644
--- a/gm/3d.cpp
+++ b/gm/3d.cpp
@@ -51,7 +51,7 @@
     SkMatrix44 m;
     m.setRotateDegreesAbout(0, 1, 0, 30);
 
-    canvas->concat(make_ctm(info, m, {300, 300}));
+    canvas->experimental_concat44(make_ctm(info, m, {300, 300}));
 
     canvas->translate(150, 150);
     SkPaint paint;
diff --git a/include/core/SkCanvas.h b/include/core/SkCanvas.h
index 43b53f4..fee4cae 100644
--- a/include/core/SkCanvas.h
+++ b/include/core/SkCanvas.h
@@ -880,7 +880,7 @@
     */
     void concat(const SkMatrix& matrix);
 
-    void experimental_concat(const SkMatrix44&);
+    void experimental_concat44(const SkMatrix44&);
     void experimental_concat44(const SkScalar[]); // column-major
 
     /** Replaces SkMatrix with matrix.
diff --git a/include/core/SkMatrix44.h b/include/core/SkMatrix44.h
index 94fcdf3..4290c28 100644
--- a/include/core/SkMatrix44.h
+++ b/include/core/SkMatrix44.h
@@ -188,6 +188,8 @@
      */
     SkMatrix44(const SkMatrix&);
     SkMatrix44& operator=(const SkMatrix& src);
+
+    // TODO: make this explicit (will need to guard that change to update chrome, etc.
     operator SkMatrix() const;
 
     /**
diff --git a/modules/skottie/gm/3dgm.cpp b/modules/skottie/gm/3dgm.cpp
index 22a9357..f5b8ce1 100644
--- a/modules/skottie/gm/3dgm.cpp
+++ b/modules/skottie/gm/3dgm.cpp
@@ -33,7 +33,7 @@
 class SkMetaData;
 
 static SkMatrix operator*(const SkMatrix& a, const SkMatrix& b) {
-    SkMatrix44 c;
+    SkMatrix c;
     c.setConcat(a, b);
     return c;
 }
diff --git a/modules/sksg/include/SkSGTransform.h b/modules/sksg/include/SkSGTransform.h
index 90aaecc..da6b3c5 100644
--- a/modules/sksg/include/SkSGTransform.h
+++ b/modules/sksg/include/SkSGTransform.h
@@ -70,7 +70,7 @@
 
     bool is44() const override { return std::is_same<T, SkMatrix44>::value; }
 
-    SkMatrix   asMatrix  () const override { return fMatrix; }
+    SkMatrix   asMatrix  () const override { return SkMatrix(fMatrix); }
     SkMatrix44 asMatrix44() const override { return fMatrix; }
 
 private:
diff --git a/modules/sksg/src/SkSGTransform.cpp b/modules/sksg/src/SkSGTransform.cpp
index a2b79f1..9131dc0 100644
--- a/modules/sksg/src/SkSGTransform.cpp
+++ b/modules/sksg/src/SkSGTransform.cpp
@@ -47,7 +47,7 @@
 
     SkMatrix asMatrix() const override {
         SkASSERT(!this->hasInval());
-        return fComposed;
+        return SkMatrix(fComposed);
     }
 
     SkMatrix44 asMatrix44() const override {
@@ -93,7 +93,7 @@
 
     SkMatrix asMatrix() const override {
         SkASSERT(!this->hasInval());
-        return fInverted;
+        return SkMatrix(fInverted);
     }
 
     SkMatrix44 asMatrix44() const override {
diff --git a/samplecode/Sample3D.cpp b/samplecode/Sample3D.cpp
index df3fab1..1410fb6 100644
--- a/samplecode/Sample3D.cpp
+++ b/samplecode/Sample3D.cpp
@@ -227,7 +227,7 @@
         SkMatrix44 trans;
         trans.setTranslate(200, 200, 0);   // center of the rotation
 
-        canvas->concat(trans * fRot * m * inv(trans));
+        canvas->experimental_concat44(trans * fRot * m * inv(trans));
 
         if (!front(canvas->experimental_getLocalToDevice())) {
             return;
diff --git a/samplecode/SampleClip.cpp b/samplecode/SampleClip.cpp
index a25bd54..6b037c7 100644
--- a/samplecode/SampleClip.cpp
+++ b/samplecode/SampleClip.cpp
@@ -557,7 +557,7 @@
 
         if (fShowUnclipped) {
             canvas->save();
-            canvas->concat(mx);
+            canvas->experimental_concat44(mx);
             paint.setAlphaf(0.33f);
             canvas->drawPath(fPath, paint);
             paint.setAlphaf(1.f);
@@ -567,16 +567,16 @@
 
         SkColor planeColor = SK_ColorBLUE;
         SkPath clippedPath, *path = &fPath;
-        if (SkPathPriv::PerspectiveClip(fPath, mx, &clippedPath)) {
+        if (SkPathPriv::PerspectiveClip(fPath, SkMatrix(mx), &clippedPath)) {
             path = &clippedPath;
             planeColor = SK_ColorRED;
         }
         canvas->save();
-        canvas->concat(mx);
+        canvas->experimental_concat44(mx);
         canvas->drawPath(*path, paint);
         canvas->restore();
 
-        SkHalfPlane hpw = half_plane_w0(mx);
+        SkHalfPlane hpw = half_plane_w0(SkMatrix(mx));
         draw_halfplane(canvas, hpw, planeColor);
     }
 };
@@ -615,7 +615,7 @@
         SkPaint paint;
 
         canvas->save();
-        canvas->concat(this->get44({0, 0, 300, 300}));
+        canvas->experimental_concat44(this->get44({0, 0, 300, 300}));
 
         const SkPoint* tex = nullptr;
         const SkColor* col = nullptr;
diff --git a/src/core/SkCanvas.cpp b/src/core/SkCanvas.cpp
index 3f49f0c..f9d9621 100644
--- a/src/core/SkCanvas.cpp
+++ b/src/core/SkCanvas.cpp
@@ -736,7 +736,7 @@
 int SkCanvas::experimental_saveCamera(const SkMatrix44& projection, const SkMatrix44& camera) {
     // TODO: add a virtual for this, and update clients (e.g. chrome)
     int n = this->save();
-    this->concat(projection * camera);
+    this->experimental_concat44(projection * camera);
     fCameraStack.push_back(CameraRec(fMCRec, camera));
     return n;
 }
@@ -1516,7 +1516,7 @@
     this->didConcat44(m);
 }
 
-void SkCanvas::experimental_concat(const SkMatrix44& m) {
+void SkCanvas::experimental_concat44(const SkMatrix44& m) {
     this->experimental_concat44(m.values());
 }
 
diff --git a/src/gpu/gradients/generated/GrLinearGradientLayout.cpp b/src/gpu/gradients/generated/GrLinearGradientLayout.cpp
index b4da70d..2d5ae3a 100644
--- a/src/gpu/gradients/generated/GrLinearGradientLayout.cpp
+++ b/src/gpu/gradients/generated/GrLinearGradientLayout.cpp
@@ -85,5 +85,5 @@
         return nullptr;
     }
     matrix.postConcat(grad.getGradientMatrix());
-    return std::unique_ptr<GrFragmentProcessor>(new GrLinearGradientLayout(matrix));
+    return std::unique_ptr<GrFragmentProcessor>(new GrLinearGradientLayout(SkMatrix(matrix)));
 }
diff --git a/src/gpu/gradients/generated/GrLinearGradientLayout.h b/src/gpu/gradients/generated/GrLinearGradientLayout.h
index 1f711d9..c94cc79 100644
--- a/src/gpu/gradients/generated/GrLinearGradientLayout.h
+++ b/src/gpu/gradients/generated/GrLinearGradientLayout.h
@@ -31,7 +31,7 @@
     GrLinearGradientLayout(SkMatrix44 gradientMatrix)
             : INHERITED(kGrLinearGradientLayout_ClassID,
                         (OptimizationFlags)kPreservesOpaqueInput_OptimizationFlag)
-            , fCoordTransform0(gradientMatrix)
+            , fCoordTransform0(SkMatrix(gradientMatrix))
             , gradientMatrix(gradientMatrix) {
         this->addCoordTransform(&fCoordTransform0);
     }
diff --git a/src/gpu/gradients/generated/GrRadialGradientLayout.h b/src/gpu/gradients/generated/GrRadialGradientLayout.h
index 17a1b49..efbc014 100644
--- a/src/gpu/gradients/generated/GrRadialGradientLayout.h
+++ b/src/gpu/gradients/generated/GrRadialGradientLayout.h
@@ -31,7 +31,7 @@
     GrRadialGradientLayout(SkMatrix44 gradientMatrix)
             : INHERITED(kGrRadialGradientLayout_ClassID,
                         (OptimizationFlags)kPreservesOpaqueInput_OptimizationFlag)
-            , fCoordTransform0(gradientMatrix)
+            , fCoordTransform0(SkMatrix(gradientMatrix))
             , gradientMatrix(gradientMatrix) {
         this->addCoordTransform(&fCoordTransform0);
     }
diff --git a/src/gpu/gradients/generated/GrSweepGradientLayout.h b/src/gpu/gradients/generated/GrSweepGradientLayout.h
index 7703663..c35890a 100644
--- a/src/gpu/gradients/generated/GrSweepGradientLayout.h
+++ b/src/gpu/gradients/generated/GrSweepGradientLayout.h
@@ -33,7 +33,7 @@
     GrSweepGradientLayout(SkMatrix44 gradientMatrix, float bias, float scale)
             : INHERITED(kGrSweepGradientLayout_ClassID,
                         (OptimizationFlags)kPreservesOpaqueInput_OptimizationFlag)
-            , fCoordTransform0(gradientMatrix)
+            , fCoordTransform0(SkMatrix(gradientMatrix))
             , gradientMatrix(gradientMatrix)
             , bias(bias)
             , scale(scale) {
diff --git a/src/gpu/gradients/generated/GrTwoPointConicalGradientLayout.h b/src/gpu/gradients/generated/GrTwoPointConicalGradientLayout.h
index 878b8d2..740427b 100644
--- a/src/gpu/gradients/generated/GrTwoPointConicalGradientLayout.h
+++ b/src/gpu/gradients/generated/GrTwoPointConicalGradientLayout.h
@@ -42,7 +42,7 @@
                                     bool isNativelyFocal, SkPoint focalParams)
             : INHERITED(kGrTwoPointConicalGradientLayout_ClassID,
                         (OptimizationFlags)kNone_OptimizationFlags)
-            , fCoordTransform0(gradientMatrix)
+            , fCoordTransform0(SkMatrix(gradientMatrix))
             , gradientMatrix(gradientMatrix)
             , type(type)
             , isRadiusIncreasing(isRadiusIncreasing)
diff --git a/tests/Matrix44Test.cpp b/tests/Matrix44Test.cpp
index 3b73acd..e24decc 100644
--- a/tests/Matrix44Test.cpp
+++ b/tests/Matrix44Test.cpp
@@ -261,7 +261,7 @@
     for (int i = 0; i < 9; ++i) {
         rot.setRotateDegreesAbout(0, 0, -1, SkIntToScalar(common_angles[i]));
 
-        SkMatrix rot3x3 = rot;
+        SkMatrix rot3x3 = SkMatrix(rot);
         REPORTER_ASSERT(reporter, rot3x3.rectStaysRect());
     }
 }
@@ -535,7 +535,7 @@
     SkMatrix44 a44;
     a44.setRowMajor(values4x4);
 
-    SkMatrix a33 = a44;
+    SkMatrix a33 = SkMatrix(a44);
     SkMatrix expected33;
     for (int i = 0; i < 9; i++) expected33[i] = values3x3[i];
     REPORTER_ASSERT(reporter, expected33 == a33);