Fix analytic shadows when rotated 180 degrees.

A 180 degree rotation matrix is functionally like a scale matrix, but
the elements are negative. To compensate for this, we use abs().

Bug: b/137547660
Change-Id: Ib0e7449872523af024e7de9005b9bb70743e04b5
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/229394
Commit-Queue: Jim Van Verth <jvanverth@google.com>
Reviewed-by: Robert Phillips <robertphillips@google.com>
diff --git a/gm/shadowutils.cpp b/gm/shadowutils.cpp
index a9cdc59..2d4e91e 100644
--- a/gm/shadowutils.cpp
+++ b/gm/shadowutils.cpp
@@ -96,6 +96,7 @@
     m->postScale(1.2f, 0.8f, 25.f, 25.f);
     for (auto& m : matrices) {
         for (int flags : { kNone_ShadowFlag, kTransparentOccluder_ShadowFlag }) {
+            int pathCounter = 0;
             for (const auto& path : paths) {
                 SkRect postMBounds = path.getBounds();
                 m.mapRect(&postMBounds);
@@ -112,6 +113,11 @@
                 canvas->save();
                 canvas->concat(m);
 
+                // flip a couple of paths to test 180° rotation
+                if (kTransparentOccluder_ShadowFlag == flags && 0 == pathCounter % 3) {
+                    canvas->save();
+                    canvas->rotate(180, 25, 25);
+                }
                 if (kDebugColorNoOccluders == mode || kDebugColorOccluders == mode) {
                     draw_shadow(canvas, path, kHeight, SK_ColorRED, lightPos, kLightR,
                                 true, flags);
@@ -143,11 +149,15 @@
                     paint.setStyle(SkPaint::kFill_Style);
                 }
                 canvas->drawPath(path, paint);
+                if (kTransparentOccluder_ShadowFlag == flags && 0 == pathCounter % 3) {
+                    canvas->restore();
+                }
                 canvas->restore();
 
                 canvas->translate(dx, 0);
                 x += dx;
                 dy = SkTMax(dy, postMBounds.height() + kPad + kHeight);
+                ++pathCounter;
             }
         }
     }
diff --git a/src/gpu/GrRenderTargetContext.cpp b/src/gpu/GrRenderTargetContext.cpp
index d23a0b9..4ccb62b 100644
--- a/src/gpu/GrRenderTargetContext.cpp
+++ b/src/gpu/GrRenderTargetContext.cpp
@@ -1139,7 +1139,7 @@
 
     // 1/scale
     SkScalar devToSrcScale = viewMatrix.isScaleTranslate() ?
-        SkScalarInvert(viewMatrix[SkMatrix::kMScaleX]) :
+        SkScalarInvert(SkScalarAbs(viewMatrix[SkMatrix::kMScaleX])) :
         sk_float_rsqrt(viewMatrix[SkMatrix::kMScaleX] * viewMatrix[SkMatrix::kMScaleX] +
                        viewMatrix[SkMatrix::kMSkewX] * viewMatrix[SkMatrix::kMSkewX]);