Fixed GPU perlin noise shaders under rotation.

Note that this does not fix perspective rendering, which it
turns out is broken under CPU also... so at least the behavior
is consistent between the two now.

Bug: skia:8250
Change-Id: I35187c9a9bcf403f61348a33ef1623afeec2e73e
Reviewed-on: https://skia-review.googlesource.com/c/182966
Reviewed-by: Brian Salomon <bsalomon@google.com>
Commit-Queue: Ethan Nicholas <ethannicholas@google.com>
diff --git a/src/shaders/SkPerlinNoiseShader.cpp b/src/shaders/SkPerlinNoiseShader.cpp
index b0d464b..6e90011a 100644
--- a/src/shaders/SkPerlinNoiseShader.cpp
+++ b/src/shaders/SkPerlinNoiseShader.cpp
@@ -98,14 +98,15 @@
                      SkScalar baseFrequencyX, SkScalar baseFrequencyY,
                      const SkMatrix& matrix)
         {
-            SkVector vec[2] = {
-                { SkScalarInvert(baseFrequencyX),   SkScalarInvert(baseFrequencyY)  },
-                { SkIntToScalar(tileSize.fWidth),   SkIntToScalar(tileSize.fHeight) },
-            };
-            matrix.mapVectors(vec, 2);
+            SkVector tileVec;
+            matrix.mapVector(SkIntToScalar(tileSize.fWidth), SkIntToScalar(tileSize.fHeight),
+                             &tileVec);
 
-            fBaseFrequency.set(SkScalarInvert(vec[0].fX), SkScalarInvert(vec[0].fY));
-            fTileSize.set(SkScalarRoundToInt(vec[1].fX), SkScalarRoundToInt(vec[1].fY));
+            SkSize scale;
+            matrix.decomposeScale(&scale, nullptr);
+            fBaseFrequency.set(baseFrequencyX * SkScalarInvert(scale.width()),
+                               baseFrequencyY * SkScalarInvert(scale.height()));
+            fTileSize.set(SkScalarRoundToInt(tileVec.fX), SkScalarRoundToInt(tileVec.fY));
             this->init(seed);
             if (!fTileSize.isEmpty()) {
                 this->stitch();
@@ -1404,7 +1405,7 @@
     SkASSERT(args.fContext);
 
     const auto localMatrix = this->totalLocalMatrix(args.fPreLocalMatrix, args.fPostLocalMatrix);
-    const auto matrix = SkMatrix::Concat(*args.fViewMatrix, *localMatrix);
+    const auto paintMatrix = SkMatrix::Concat(*args.fViewMatrix, *localMatrix);
 
     // Either we don't stitch tiles, either we have a valid tile size
     SkASSERT(!fStitchTiles || !fTileSize.isEmpty());
@@ -1414,7 +1415,7 @@
                                                                   fSeed,
                                                                   fBaseFrequencyX,
                                                                   fBaseFrequencyY,
-                                                                  matrix);
+                                                                  paintMatrix);
 
     SkMatrix m = *args.fViewMatrix;
     m.setTranslateX(-localMatrix->getTranslateX() + SK_Scalar1);