Factor code to rotate a canvas about a point.

SkMatrix::scale and ::rotate take a point around which to scale or rotate.
Canvas lacks these helpers, so the code to rotate a canvas around a
point has been duplicated many times. Factor all of these
implementations into SkCanvas::rotate.

GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2142033002

Review-Url: https://codereview.chromium.org/2142033002
diff --git a/samplecode/SampleApp.cpp b/samplecode/SampleApp.cpp
index ffa507b..7afaa96 100644
--- a/samplecode/SampleApp.cpp
+++ b/samplecode/SampleApp.cpp
@@ -1372,9 +1372,7 @@
     if (fRotate) {
         SkScalar cx = this->width() / 2;
         SkScalar cy = this->height() / 2;
-        canvas->translate(cx, cy);
-        canvas->rotate(gAnimTimer.scaled(10));
-        canvas->translate(-cx, -cy);
+        canvas->rotate(gAnimTimer.scaled(10), cx, cy);
     }
 
     if (fPerspAnim) {
diff --git a/samplecode/SampleCircle.cpp b/samplecode/SampleCircle.cpp
index ff88ac4..f4e6cc9 100644
--- a/samplecode/SampleCircle.cpp
+++ b/samplecode/SampleCircle.cpp
@@ -87,17 +87,10 @@
         path->close();
     }
 
-    static void rotate(SkCanvas* canvas, SkScalar angle, SkScalar px, SkScalar py) {
-        canvas->translate(-px, -py);
-        canvas->rotate(angle);
-        canvas->translate(px, py);
-    }
-
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
         paint.setAntiAlias(true);
         paint.setStyle(SkPaint::kStroke_Style);
-//        canvas->drawCircle(250, 250, 220, paint);
         SkMatrix matrix;
         matrix.setScale(SkIntToScalar(100), SkIntToScalar(100));
         matrix.postTranslate(SkIntToScalar(200), SkIntToScalar(200));
diff --git a/samplecode/SampleDither.cpp b/samplecode/SampleDither.cpp
index 99b33f0..a1b751b 100644
--- a/samplecode/SampleDither.cpp
+++ b/samplecode/SampleDither.cpp
@@ -37,10 +37,7 @@
                                             colors, nullptr, SK_ARRAY_COUNT(colors)));
 
     SkAutoCanvasRestore acr(c, true);
-
-    c->translate(r.centerX(), r.centerY());
-    c->rotate(angle);
-    c->translate(-r.centerX(), -r.centerY());
+    c->rotate(angle, r.centerX(), r.centerY());
 
     SkRect bounds = r;
     r.inset(p.getStrokeWidth(), p.getStrokeWidth());
diff --git a/samplecode/SampleFontScalerTest.cpp b/samplecode/SampleFontScalerTest.cpp
index bd93097..2b4a46d 100644
--- a/samplecode/SampleFontScalerTest.cpp
+++ b/samplecode/SampleFontScalerTest.cpp
@@ -44,7 +44,6 @@
             fFaces[i] = SkTypeface::MakeFromName(
                 gFaces[i].fName, SkFontStyle::FromOldStyle(gFaces[i].fStyle));
         }
-//        this->setBGColor(0xFFDDDDDD);
     }
 
 protected:
@@ -57,12 +56,6 @@
         return this->INHERITED::onQuery(evt);
     }
 
-    static void rotate_about(SkCanvas* canvas, SkScalar degrees, SkScalar px, SkScalar py) {
-        canvas->translate(px, py);
-        canvas->rotate(degrees);
-        canvas->translate(-px, -py);
-    }
-
     virtual void onDrawContent(SkCanvas* canvas) {
         SkPaint paint;
 
@@ -100,7 +93,7 @@
                 SkAutoCanvasRestore acr(canvas, true);
                 canvas->translate(SkIntToScalar(50 + i * 230),
                                   SkIntToScalar(20));
-                rotate_about(canvas, SkIntToScalar(i * 5), x, y * 10);
+                canvas->rotate(SkIntToScalar(i * 5), x, y * 10);
 
                 {
                     SkPaint p;
diff --git a/samplecode/SampleHT.cpp b/samplecode/SampleHT.cpp
index d0cd3a5..50ea287 100644
--- a/samplecode/SampleHT.cpp
+++ b/samplecode/SampleHT.cpp
@@ -95,9 +95,7 @@
             fColor = floats_to_color(values);
 
             canvas->save();
-            canvas->translate(fR.centerX(), fR.centerY());
-            canvas->rotate(values[4]);
-            canvas->translate(-fR.centerX(), -fR.centerY());
+            canvas->rotate(values[4], fR.centerX(), fR.centerY());
 
             switch (res) {
                 case SkInterpolator::kFreezeEnd_Result: