Avoid unnecessary saveLayer() in COLRv1 paint operations

Most of the COLRv1 paint operations only need the clip and matrix to be
kept on SkCanvas, only PaintComposite needs a full saveLayer().
Adjust calls accordingly.

Bug: skia:11851
Change-Id: I85b3c27495c78306457e17fea8062c957e2f3b05
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/395617
Auto-Submit: Dominik Röttsches <drott@chromium.org>
Commit-Queue: Ben Wagner <bungeman@google.com>
Reviewed-by: Ben Wagner <bungeman@google.com>
diff --git a/src/ports/SkFontHost_FreeType_common.cpp b/src/ports/SkFontHost_FreeType_common.cpp
index 2d2b765..31dec02 100644
--- a/src/ports/SkFontHost_FreeType_common.cpp
+++ b/src/ports/SkFontHost_FreeType_common.cpp
@@ -747,6 +747,7 @@
     // Keep track of failures to retrieve the FT_COLR_Paint from FreeType in the
     // recursion, cancel recursion when a paint retrieval fails.
     bool traverse_result = true;
+    SkAutoCanvasRestore autoRestore(canvas, true /* do_save */);
     switch (paint.format) {
         case FT_COLR_PAINTFORMAT_COLR_LAYERS: {
             FT_LayerIterator& layer_iterator = paint.u.colr_layers.layer_iterator;
@@ -758,45 +759,34 @@
             break;
         }
         case FT_COLR_PAINTFORMAT_GLYPH:
-            canvas->saveLayer(nullptr, nullptr);
             // Traverse / draw operation will clip layer.
             colrv1_draw_paint(canvas, palette, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.glyph.paint);
-            canvas->restore();
             break;
         case FT_COLR_PAINTFORMAT_COLR_GLYPH:
             traverse_result = colrv1_start_glyph(canvas, palette, face, paint.u.colr_glyph.glyphID,
                                                  FT_COLOR_NO_ROOT_TRANSFORM);
             break;
         case FT_COLR_PAINTFORMAT_TRANSFORMED:
-            canvas->saveLayer(nullptr, nullptr);
             // Traverse / draw operation will apply transform.
             colrv1_draw_paint(canvas, palette, face, paint);
             traverse_result =
                     colrv1_traverse_paint(canvas, palette, face, paint.u.transformed.paint);
-            canvas->restore();
             break;
-      case FT_COLR_PAINTFORMAT_TRANSLATE:
-            canvas->saveLayer(nullptr, nullptr);
+        case FT_COLR_PAINTFORMAT_TRANSLATE:
             // Traverse / draw operation will apply transform.
             colrv1_draw_paint(canvas, palette, face, paint);
-            traverse_result =
-                    colrv1_traverse_paint(canvas, palette, face, paint.u.translate.paint);
-            canvas->restore();
+            traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.translate.paint);
             break;
-      case FT_COLR_PAINTFORMAT_ROTATE:
-            canvas->saveLayer(nullptr, nullptr);
+        case FT_COLR_PAINTFORMAT_ROTATE:
             // Traverse / draw operation will apply transform.
             colrv1_draw_paint(canvas, palette, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.rotate.paint);
-            canvas->restore();
             break;
         case FT_COLR_PAINTFORMAT_SKEW:
-            canvas->saveLayer(nullptr, nullptr);
             // Traverse / draw operation will apply transform.
             colrv1_draw_paint(canvas, palette, face, paint);
             traverse_result = colrv1_traverse_paint(canvas, palette, face, paint.u.skew.paint);
-            canvas->restore();
             break;
         case FT_COLR_PAINTFORMAT_COMPOSITE: {
             traverse_result =