Remove use of SkMatrixProvider in SkShaderBase::appendRootStages

Towards getting rid of SkMatrixProvider in favor of just using CTM
SkMatrices.

Bug: skia:14076
Change-Id: I6b6e0c11155ca72b6e4e7fe84e0edbb05dee34d9
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/635083
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Brian Osman <brianosman@google.com>
diff --git a/src/core/SkBlitter.cpp b/src/core/SkBlitter.cpp
index 9fb8e58..2b1de56 100644
--- a/src/core/SkBlitter.cpp
+++ b/src/core/SkBlitter.cpp
@@ -763,7 +763,7 @@
             }
         }
         if (auto blitter = SkCreateRasterPipelineBlitter(
-                    device, *paint, matrixProvider, alloc, clipShader, props)) {
+                    device, *paint, matrixProvider.localToDevice(), alloc, clipShader, props)) {
             return blitter;
         }
         if (!gUseSkVMBlitter) {
diff --git a/src/core/SkCoreBlitters.h b/src/core/SkCoreBlitters.h
index 75d3d27..63b4612 100644
--- a/src/core/SkCoreBlitters.h
+++ b/src/core/SkCoreBlitters.h
@@ -145,9 +145,12 @@
 
 ///////////////////////////////////////////////////////////////////////////////////////////////////
 
-SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
-                                         const SkMatrixProvider& matrixProvider, SkArenaAlloc*,
-                                         sk_sp<SkShader> clipShader, const SkSurfaceProps& props);
+SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&,
+                                         const SkPaint&,
+                                         const SkMatrix& ctm,
+                                         SkArenaAlloc*,
+                                         sk_sp<SkShader> clipShader,
+                                         const SkSurfaceProps& props);
 // Use this if you've pre-baked a shader pipeline, including modulating with paint alpha.
 SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap&, const SkPaint&,
                                          const SkRasterPipeline& shaderPipeline,
diff --git a/src/core/SkDraw_atlas.cpp b/src/core/SkDraw_atlas.cpp
index a6ff804..f5410c8 100644
--- a/src/core/SkDraw_atlas.cpp
+++ b/src/core/SkDraw_atlas.cpp
@@ -117,7 +117,7 @@
         SkStageRec rec = {&pipeline, &alloc, fDst.colorType(), fDst.colorSpace(), p, props};
         // We pass an identity matrix here rather than the CTM. The CTM gets folded into the
         // per-triangle matrix.
-        if (!as_SB(transformShader)->appendRootStages(rec, SkMatrixProvider{SkMatrix::I()})) {
+        if (!as_SB(transformShader)->appendRootStages(rec, SkMatrix::I())) {
             return false;
         }
 
diff --git a/src/core/SkDraw_vertices.cpp b/src/core/SkDraw_vertices.cpp
index c8d0cb9..da59139 100644
--- a/src/core/SkDraw_vertices.cpp
+++ b/src/core/SkDraw_vertices.cpp
@@ -412,8 +412,12 @@
         VertState::Proc vertProc = state.chooseProc(info.mode());
         SkSurfaceProps props = SkSurfacePropsCopyOrDefault(fProps);
 
-        auto blitter = SkCreateRasterPipelineBlitter(fDst, finalPaint, *matrixProvider,
-                                                     outerAlloc, fRC->clipShader(), props);
+        auto blitter = SkCreateRasterPipelineBlitter(fDst,
+                                                     finalPaint,
+                                                     matrixProvider->localToDevice(),
+                                                     outerAlloc,
+                                                     fRC->clipShader(),
+                                                     props);
         if (!blitter) {
             return false;
         }
diff --git a/src/core/SkRasterPipelineBlitter.cpp b/src/core/SkRasterPipelineBlitter.cpp
index a4975a1..6d73f60 100644
--- a/src/core/SkRasterPipelineBlitter.cpp
+++ b/src/core/SkRasterPipelineBlitter.cpp
@@ -92,7 +92,7 @@
 
 SkBlitter* SkCreateRasterPipelineBlitter(const SkPixmap& dst,
                                          const SkPaint& paint,
-                                         const SkMatrixProvider& matrixProvider,
+                                         const SkMatrix& ctm,
                                          SkArenaAlloc* alloc,
                                          sk_sp<SkShader> clipShader,
                                          const SkSurfaceProps& props) {
@@ -123,8 +123,7 @@
     bool is_opaque    = shader->isOpaque() && paintColor.fA == 1.0f;
     bool is_constant  = shader->isConstant();
 
-    if (shader->appendRootStages({&shaderPipeline, alloc, dstCT, dstCS, paint, props},
-                                 matrixProvider)) {
+    if (shader->appendRootStages({&shaderPipeline, alloc, dstCT, dstCS, paint, props}, ctm)) {
         if (paintColor.fA != 1.0f) {
             shaderPipeline.append(SkRasterPipelineOp::scale_1_float,
                                   alloc->make<float>(paintColor.fA));
@@ -176,7 +175,7 @@
         SkColorSpace* clipCS = nullptr;
         SkSurfaceProps props{}; // default OK; clipShader doesn't render text
         SkStageRec rec = {clipP, alloc, clipCT, clipCS, clipPaint, props};
-        if (as_SB(clipShader)->appendRootStages(rec, SkMatrixProvider{SkMatrix::I()})) {
+        if (as_SB(clipShader)->appendRootStages(rec, SkMatrix::I())) {
             struct Storage {
                 // large enough for highp (float) or lowp(U16)
                 float   fA[SkRasterPipeline_kMaxStride];
diff --git a/src/shaders/SkLocalMatrixShader.cpp b/src/shaders/SkLocalMatrixShader.cpp
index 8c77026..2ed34fb 100644
--- a/src/shaders/SkLocalMatrixShader.cpp
+++ b/src/shaders/SkLocalMatrixShader.cpp
@@ -163,7 +163,7 @@
     void flatten(SkWriteBuffer&) const override { SkASSERT(false); }
 
     bool appendStages(const SkStageRec& rec, const MatrixRec&) const override {
-        return as_SB(fProxyShader)->appendRootStages(rec, SkMatrixProvider(fCTM));
+        return as_SB(fProxyShader)->appendRootStages(rec, fCTM);
     }
 
     skvm::Color onProgram(skvm::Builder* p,
diff --git a/src/shaders/SkShader.cpp b/src/shaders/SkShader.cpp
index 541cb46..1fdc8cc 100644
--- a/src/shaders/SkShader.cpp
+++ b/src/shaders/SkShader.cpp
@@ -34,10 +34,7 @@
 
 SkShaderBase::~SkShaderBase() = default;
 
-SkShaderBase::MatrixRec::MatrixRec(const SkMatrixProvider& mp)
-        : fPendingMatrix(mp.localToDevice())
-        , fTotalMatrix(mp.localToDevice())
-        , fTotalMatrixIsValid(mp.localToDeviceHitsPixelCenters()) {}
+SkShaderBase::MatrixRec::MatrixRec(const SkMatrix& m) : fPendingMatrix(m), fTotalMatrix(m) {}
 
 std::optional<SkShaderBase::MatrixRec>
 SkShaderBase::MatrixRec::apply(const SkStageRec& rec, const SkMatrix& postInv) const {
@@ -156,8 +153,8 @@
                                tmx, tmy, sampling, lm);
 }
 
-bool SkShaderBase::appendRootStages(const SkStageRec& rec, const SkMatrixProvider& mp) const {
-    return this->appendStages(rec, MatrixRec(mp));
+bool SkShaderBase::appendRootStages(const SkStageRec& rec, const SkMatrix& ctm) const {
+    return this->appendStages(rec, MatrixRec(ctm));
 }
 
 bool SkShaderBase::appendStages(const SkStageRec& rec, const MatrixRec& mRec) const {
diff --git a/src/shaders/SkShaderBase.h b/src/shaders/SkShaderBase.h
index 5094e26..5e443f7 100644
--- a/src/shaders/SkShaderBase.h
+++ b/src/shaders/SkShaderBase.h
@@ -199,7 +199,7 @@
     public:
         MatrixRec() = default;
 
-        MatrixRec(const SkMatrixProvider&);
+        MatrixRec(const SkMatrix&);
 
         /**
          * Returns a new MatrixRec that represents the existing total and pending matrix
@@ -300,7 +300,7 @@
      * not yet been seeded.
      */
     SK_WARN_UNUSED_RESULT
-    bool appendRootStages(const SkStageRec& rec, const SkMatrixProvider&) const;
+    bool appendRootStages(const SkStageRec& rec, const SkMatrix& ctm) const;
 
     /**
      * Adds stages to implement this shader. To ensure that the correct input coords are present