diff options
Diffstat (limited to 'experimental/svg/model/SkSVGDOM.cpp')
-rw-r--r-- | experimental/svg/model/SkSVGDOM.cpp | 29 |
1 files changed, 23 insertions, 6 deletions
diff --git a/experimental/svg/model/SkSVGDOM.cpp b/experimental/svg/model/SkSVGDOM.cpp index f467c5e6d0..c9745f1730 100644 --- a/experimental/svg/model/SkSVGDOM.cpp +++ b/experimental/svg/model/SkSVGDOM.cpp @@ -384,26 +384,29 @@ sk_sp<SkSVGNode> construct_svg_node(const SkDOM& dom, const ConstructionContext& } // anonymous namespace -SkSVGDOM::SkSVGDOM(const SkSize& containerSize) - : fContainerSize(containerSize) { +SkSVGDOM::SkSVGDOM() + : fContainerSize(SkSize::Make(0, 0)) { } -sk_sp<SkSVGDOM> SkSVGDOM::MakeFromDOM(const SkDOM& xmlDom, const SkSize& containerSize) { - sk_sp<SkSVGDOM> dom = sk_make_sp<SkSVGDOM>(containerSize); +sk_sp<SkSVGDOM> SkSVGDOM::MakeFromDOM(const SkDOM& xmlDom) { + sk_sp<SkSVGDOM> dom = sk_make_sp<SkSVGDOM>(); ConstructionContext ctx(&dom->fIDMapper); dom->fRoot = construct_svg_node(xmlDom, ctx, xmlDom.getRootNode()); + // Reset the default container size to match the intrinsic SVG size. + dom->setContainerSize(dom->intrinsicSize()); + return dom; } -sk_sp<SkSVGDOM> SkSVGDOM::MakeFromStream(SkStream& svgStream, const SkSize& containerSize) { +sk_sp<SkSVGDOM> SkSVGDOM::MakeFromStream(SkStream& svgStream) { SkDOM xmlDom; if (!xmlDom.build(svgStream)) { return nullptr; } - return MakeFromDOM(xmlDom, containerSize); + return MakeFromDOM(xmlDom); } void SkSVGDOM::render(SkCanvas* canvas) const { @@ -416,6 +419,20 @@ void SkSVGDOM::render(SkCanvas* canvas) const { } } +SkSize SkSVGDOM::intrinsicSize() const { + if (!fRoot || fRoot->tag() != SkSVGTag::kSvg) { + return SkSize::Make(0, 0); + } + + // Intrinsic sizes are never relative, so the viewport size is irrelevant. + const SkSVGLengthContext lctx(SkSize::Make(0, 0)); + return static_cast<const SkSVGSVG*>(fRoot.get())->intrinsicSize(lctx); +} + +const SkSize& SkSVGDOM::containerSize() const { + return fContainerSize; +} + void SkSVGDOM::setContainerSize(const SkSize& containerSize) { // TODO: inval fContainerSize = containerSize; |