[svg] Add support for preserveAspectRatio
This fixes the aspect ratio for pretty much all tests.
Since we're going to rebaseline everything, also have dm use a white
background (to match other user agents).
Bug: skia:10842
Change-Id: Iab2afd61560af540539c216d1c3673f19fe0fe51
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/328982
Commit-Queue: Florin Malita <fmalita@chromium.org>
Commit-Queue: Florin Malita <fmalita@google.com>
Reviewed-by: Tyler Denniston <tdenniston@google.com>
diff --git a/modules/svg/src/SkSVGAttributeParser.cpp b/modules/svg/src/SkSVGAttributeParser.cpp
index 8cfc6c3..a56e8e7 100644
--- a/modules/svg/src/SkSVGAttributeParser.cpp
+++ b/modules/svg/src/SkSVGAttributeParser.cpp
@@ -821,3 +821,41 @@
return parsedValue && this->parseEOSToken();
}
+
+// https://www.w3.org/TR/SVG11/coords.html#PreserveAspectRatioAttribute
+bool SkSVGAttributeParser::parsePreserveAspectRatio(SkSVGPreserveAspectRatio* par) {
+ static constexpr std::tuple<const char*, SkSVGPreserveAspectRatio::Align> gAlignMap[] = {
+ { "none" , SkSVGPreserveAspectRatio::kNone },
+ { "xMinYMin", SkSVGPreserveAspectRatio::kXMinYMin },
+ { "xMidYMin", SkSVGPreserveAspectRatio::kXMidYMin },
+ { "xMaxYMin", SkSVGPreserveAspectRatio::kXMaxYMin },
+ { "xMinYMid", SkSVGPreserveAspectRatio::kXMinYMid },
+ { "xMidYMid", SkSVGPreserveAspectRatio::kXMidYMid },
+ { "xMaxYMid", SkSVGPreserveAspectRatio::kXMaxYMid },
+ { "xMinYMax", SkSVGPreserveAspectRatio::kXMinYMax },
+ { "xMidYMax", SkSVGPreserveAspectRatio::kXMidYMax },
+ { "xMaxYMax", SkSVGPreserveAspectRatio::kXMaxYMax },
+ };
+
+ static constexpr std::tuple<const char*, SkSVGPreserveAspectRatio::Scale> gScaleMap[] = {
+ { "meet" , SkSVGPreserveAspectRatio::kMeet },
+ { "slice", SkSVGPreserveAspectRatio::kSlice },
+ };
+
+ bool parsedValue = false;
+
+ // ignoring optional 'defer'
+ this->parseExpectedStringToken("defer");
+ this->parseWSToken();
+
+ if (this->parseEnumMap(gAlignMap, &par->fAlign)) {
+ parsedValue = true;
+
+ // optional scaling selector
+ this->parseWSToken();
+ this->parseEnumMap(gScaleMap, &par->fScale);
+ }
+
+ return parsedValue && this->parseEOSToken();
+}
+