Factor out COLRv1 transforms to separate function

Preparation for optimizing the case of PaintGlyph + PaintSolid /
PaintGradient so that the remainder of the colrv1_draw_paint() function
can be turned into configuring an SkPaint.

Perform canvas CTM concatenation at the end of the function instead of
in each individual case as before.

No functional changes.

Bug: 11851
Change-Id: I04a77134d406f1625efebd5f623cfdbcca19b7cb
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/396036
Commit-Queue: Dominik Röttsches <drott@chromium.org>
Commit-Queue: Ben Wagner <bungeman@google.com>
Auto-Submit: Dominik Röttsches <drott@chromium.org>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/src/ports/SkFontHost_FreeType_common.cpp b/src/ports/SkFontHost_FreeType_common.cpp
index 31dec02..072ded4 100644
--- a/src/ports/SkFontHost_FreeType_common.cpp
+++ b/src/ports/SkFontHost_FreeType_common.cpp
@@ -665,27 +665,39 @@
             canvas->drawPaint(paint);
             break;
         }
-        case FT_COLR_PAINTFORMAT_TRANSFORMED: {
-            SkMatrix transform = ToSkMatrix(colrv1_paint.u.transformed.affine);
+        case FT_COLR_PAINTFORMAT_TRANSFORMED:
+        case FT_COLR_PAINTFORMAT_TRANSLATE:
+        case FT_COLR_PAINTFORMAT_ROTATE:
+        case FT_COLR_PAINTFORMAT_SKEW:
+            SkASSERT(false);  // Transforms handled in colrv1_transform.
+            break;
+        default:
+            paint.setShader(nullptr);
+            paint.setColor(SK_ColorCYAN);
+            break;
+    }
+}
 
-            canvas->concat(transform);
+
+void colrv1_transform(SkCanvas* canvas, FT_Face face, FT_COLR_Paint colrv1_paint) {
+    SkMatrix transform;
+
+    switch (colrv1_paint.format) {
+        case FT_COLR_PAINTFORMAT_TRANSFORMED: {
+            transform = ToSkMatrix(colrv1_paint.u.transformed.affine);
             break;
         }
         case FT_COLR_PAINTFORMAT_TRANSLATE: {
-            SkMatrix translate = SkMatrix::Translate(
+            transform = SkMatrix::Translate(
                 SkFixedToScalar(colrv1_paint.u.translate.dx),
                 -SkFixedToScalar(colrv1_paint.u.translate.dy));
-
-            canvas->concat(translate);
             break;
         }
         case FT_COLR_PAINTFORMAT_ROTATE: {
-            SkMatrix rotation = SkMatrix::RotateDeg(
+            transform = SkMatrix::RotateDeg(
                     SkFixedToScalar(colrv1_paint.u.rotate.angle),
                     SkPoint::Make(SkFixedToScalar(colrv1_paint.u.rotate.center_x),
                                   -SkFixedToScalar(colrv1_paint.u.rotate.center_y)));
-
-            canvas->concat(rotation);
             break;
         }
         case FT_COLR_PAINTFORMAT_SKEW: {
@@ -717,18 +729,18 @@
                 tan_y, 1, 0,
                 0, 0, 1);
 
-            SkMatrix skew = translate_from_origin.postConcat(skew_x).postConcat(skew_y).postConcat(translate_to_origin);
-
-            canvas->concat(skew);
+            transform = translate_from_origin.postConcat(skew_x).postConcat(skew_y).postConcat(translate_to_origin);
             break;
         }
-        default:
-            paint.setShader(nullptr);
-            paint.setColor(SK_ColorCYAN);
-            break;
+        default: {
+            // Only transforms are handled in this function.
+            SkASSERT(false);
+        }
     }
+    canvas->concat(transform);
 }
 
+
 bool colrv1_start_glyph(SkCanvas* canvas,
                         const FT_Color* palette,
                         FT_Face ft_face,
@@ -768,24 +780,20 @@
                                                  FT_COLOR_NO_ROOT_TRANSFORM);
             break;
         case FT_COLR_PAINTFORMAT_TRANSFORMED:
-            // Traverse / draw operation will apply transform.
-            colrv1_draw_paint(canvas, palette, face, paint);
+            colrv1_transform(canvas, face, paint);
             traverse_result =
                     colrv1_traverse_paint(canvas, palette, face, paint.u.transformed.paint);
             break;
         case FT_COLR_PAINTFORMAT_TRANSLATE:
-            // Traverse / draw operation will apply transform.
-            colrv1_draw_paint(canvas, palette, face, paint);
+            colrv1_transform(canvas, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.translate.paint);
             break;
         case FT_COLR_PAINTFORMAT_ROTATE:
-            // Traverse / draw operation will apply transform.
-            colrv1_draw_paint(canvas, palette, face, paint);
+            colrv1_transform(canvas, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.rotate.paint);
             break;
         case FT_COLR_PAINTFORMAT_SKEW:
-            // Traverse / draw operation will apply transform.
-            colrv1_draw_paint(canvas, palette, face, paint);
+            colrv1_transform(canvas, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.skew.paint);
             break;
         case FT_COLR_PAINTFORMAT_COMPOSITE: {