Simplify SkStrike ctor

Allow a SkStrike to be created with a descriptor and a context.
Metrics can be passed in to support the diff canvas.

Change-Id: I981f929ccb6d6391b1d205cba8aaa96f8df4932c
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/270197
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Herb Derby <herb@google.com>
diff --git a/src/core/SkStrike.cpp b/src/core/SkStrike.cpp
index 8331c46..c1b2bc4 100644
--- a/src/core/SkStrike.cpp
+++ b/src/core/SkStrike.cpp
@@ -16,13 +16,24 @@
 #include "src/core/SkEnumerate.h"
 #include <cctype>
 
+static SkFontMetrics use_or_generate_metrics(
+        const SkFontMetrics* metrics, SkScalerContext* context) {
+    SkFontMetrics answer;
+    if (metrics) {
+        answer = *metrics;
+    } else {
+        context->getFontMetrics(&answer);
+    }
+    return answer;
+}
+
 SkStrike::SkStrike(
     const SkDescriptor& desc,
     std::unique_ptr<SkScalerContext> scaler,
-    const SkFontMetrics& fontMetrics)
+    const SkFontMetrics* fontMetrics)
         : fDesc{desc}
         , fScalerContext{std::move(scaler)}
-        , fFontMetrics{fontMetrics}
+        , fFontMetrics{use_or_generate_metrics(fontMetrics, fScalerContext.get())}
         , fRoundingSpec{fScalerContext->isSubpixel(),
                         fScalerContext->computeAxisAlignmentForHText()} {
     SkASSERT(fScalerContext != nullptr);
diff --git a/src/core/SkStrike.h b/src/core/SkStrike.h
index 7abf96a..638e5a4 100644
--- a/src/core/SkStrike.h
+++ b/src/core/SkStrike.h
@@ -37,7 +37,7 @@
 public:
     SkStrike(const SkDescriptor& desc,
              std::unique_ptr<SkScalerContext> scaler,
-             const SkFontMetrics&);
+             const SkFontMetrics* metrics = nullptr);
 
     // Return a glyph.  Create it if it doesn't exist, and initialize with the prototype.
     SkGlyph* glyphFromPrototype(const SkGlyphPrototype& p, void* image = nullptr) SK_EXCLUDES(fMu);
diff --git a/src/core/SkStrikeCache.cpp b/src/core/SkStrikeCache.cpp
index 98733f7..ecc95f5 100644
--- a/src/core/SkStrikeCache.cpp
+++ b/src/core/SkStrikeCache.cpp
@@ -22,7 +22,7 @@
     Node(SkStrikeCache* strikeCache,
          const SkDescriptor& desc,
          std::unique_ptr<SkScalerContext> scaler,
-         const SkFontMetrics& metrics,
+         const SkFontMetrics* metrics,
          std::unique_ptr<SkStrikePinner> pinner)
             : fStrikeCache{strikeCache}
             , fStrike{desc, std::move(scaler), metrics}
@@ -277,14 +277,7 @@
         std::unique_ptr<SkScalerContext> scaler,
         SkFontMetrics* maybeMetrics,
         std::unique_ptr<SkStrikePinner> pinner) -> Node* {
-    SkFontMetrics fontMetrics;
-    if (maybeMetrics != nullptr) {
-        fontMetrics = *maybeMetrics;
-    } else {
-        scaler->getFontMetrics(&fontMetrics);
-    }
-
-    return new Node{this, desc, std::move(scaler), fontMetrics, std::move(pinner)};
+    return new Node{this, desc, std::move(scaler), maybeMetrics, std::move(pinner)};
 }
 
 void SkStrikeCache::purgeAll() {