Index: dm/DMSrcSink.cpp |
diff --git a/dm/DMSrcSink.cpp b/dm/DMSrcSink.cpp |
index e35bbad24e6c0981cbc9ab9a5c2c1f7937a2a7d8..00338028b09ffe4942fd67694f4ae047e27ee384 100644 |
--- a/dm/DMSrcSink.cpp |
+++ b/dm/DMSrcSink.cpp |
@@ -1032,30 +1032,57 @@ Name SKPSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } |
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ |
#if defined(SK_XML) |
-// Should we try to use the SVG intrinsic size instead? |
-static const SkSize kSVGSize = SkSize::Make(1000, 1000); |
+// Used when the image doesn't have an intrinsic size. |
+static const SkSize kDefaultSVGSize = SkSize::Make(1000, 1000); |
-SVGSrc::SVGSrc(Path path) : fPath(path) {} |
+// Used to force-scale tiny fixed-size images. |
+static const SkSize kMinimumSVGSize = SkSize::Make(128, 128); |
-Error SVGSrc::draw(SkCanvas* canvas) const { |
- SkFILEStream stream(fPath.c_str()); |
- if (!stream.isValid()) { |
- return SkStringPrintf("Unable to open file: %s", fPath.c_str()); |
- } |
+SVGSrc::SVGSrc(Path path) : fPath(path), fScale(1) {} |
- sk_sp<SkSVGDOM> dom = SkSVGDOM::MakeFromStream(stream); |
- if (!dom) { |
- return SkStringPrintf("Unable to parse file: %s", fPath.c_str()); |
- } |
+Error SVGSrc::ensureDom() const { |
+ if (!fDom) { |
+ SkFILEStream stream(fPath.c_str()); |
+ if (!stream.isValid()) { |
+ return SkStringPrintf("Unable to open file: %s", fPath.c_str()); |
+ } |
+ fDom = SkSVGDOM::MakeFromStream(stream); |
+ if (!fDom) { |
+ return SkStringPrintf("Unable to parse file: %s", fPath.c_str()); |
+ } |
- dom->setContainerSize(kSVGSize); |
- dom->render(canvas); |
+ const SkSize& sz = fDom->containerSize(); |
+ if (sz.isEmpty()) { |
+ // no intrinsic size |
+ fDom->setContainerSize(kDefaultSVGSize); |
+ } else { |
+ fScale = SkTMax(1.f, SkTMax(kMinimumSVGSize.width() / sz.width(), |
+ kMinimumSVGSize.height() / sz.height())); |
+ } |
+ } |
return ""; |
} |
+Error SVGSrc::draw(SkCanvas* canvas) const { |
+ Error err = this->ensureDom(); |
+ if (err.isEmpty()) { |
+ SkAutoCanvasRestore acr(canvas, true); |
+ canvas->scale(fScale, fScale); |
+ fDom->render(canvas); |
+ } |
+ |
+ return err; |
+} |
+ |
SkISize SVGSrc::size() const { |
- return kSVGSize.toRound(); |
+ Error err = this->ensureDom(); |
+ if (!err.isEmpty()) { |
+ return SkISize::Make(0, 0); |
+ } |
+ |
+ return SkSize::Make(fDom->containerSize().width() * fScale, |
+ fDom->containerSize().height() * fScale).toRound(); |
} |
Name SVGSrc::name() const { return SkOSPath::Basename(fPath.c_str()); } |