Placeholders implementation + unit tests

Change-Id: I4e87a6927cbd6ef087b72aaa4b2155c1859589b3
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/235677
Reviewed-by: Ben Wagner <bungeman@google.com>
Commit-Queue: Julia Lavrova <jlavrova@google.com>
diff --git a/modules/skparagraph/src/ParagraphCache.cpp b/modules/skparagraph/src/ParagraphCache.cpp
index 465b9bc..80da392 100644
--- a/modules/skparagraph/src/ParagraphCache.cpp
+++ b/modules/skparagraph/src/ParagraphCache.cpp
@@ -58,9 +58,13 @@
         }
     }
     for (auto& ts : key.fTextStyles) {
-        hash = mix(hash, SkGoodHash()(ts.fStyle.getLetterSpacing()));
-        hash = mix(hash, SkGoodHash()(ts.fStyle.getWordSpacing()));
-        hash = mix(hash, SkGoodHash()(ts.fRange));
+        if (!ts.fStyle.isPlaceholder()) {
+            hash = mix(hash, SkGoodHash()(ts.fStyle.getLetterSpacing()));
+            hash = mix(hash, SkGoodHash()(ts.fStyle.getWordSpacing()));
+            hash = mix(hash, SkGoodHash()(ts.fRange));
+        } else {
+            // TODO: cache placeholders
+        }
     }
     hash = mix(hash, SkGoodHash()(key.fText));
     return hash;
@@ -99,17 +103,24 @@
     for (size_t i = 0; i < a.fTextStyles.size(); ++i) {
         auto& tsa = a.fTextStyles[i];
         auto& tsb = b.fTextStyles[i];
-        if (tsa.fStyle.getLetterSpacing() != tsb.fStyle.getLetterSpacing()) {
+        if (!(tsa.fStyle == tsb.fStyle)) {
             return false;
         }
-        if (tsa.fStyle.getWordSpacing() != tsb.fStyle.getWordSpacing()) {
-            return false;
-        }
-        if (tsa.fRange.width() != tsb.fRange.width()) {
-            return false;
-        }
-        if (tsa.fRange.start != tsb.fRange.start) {
-            return false;
+        if (!tsa.fStyle.isPlaceholder()) {
+            if (tsa.fStyle.getLetterSpacing() != tsb.fStyle.getLetterSpacing()) {
+                return false;
+            }
+            if (tsa.fStyle.getWordSpacing() != tsb.fStyle.getWordSpacing()) {
+                return false;
+            }
+            if (tsa.fRange.width() != tsb.fRange.width()) {
+                return false;
+            }
+            if (tsa.fRange.start != tsb.fRange.start) {
+                return false;
+            }
+        } else {
+            // TODO: compare placeholders
         }
     }