diff options
author | 2016-08-03 10:21:11 -0700 | |
---|---|---|
committer | 2016-08-03 10:21:11 -0700 | |
commit | bffc2566872f99d378a1113d0a49ec9ee0d60b7a (patch) | |
tree | 3a7fab8b6206e99201b1ea817c95454f340260c8 /experimental/svg/model/SkSVGRenderContext.cpp | |
parent | 9e3d3d8b363edcdd81a13b2be046152c6bb839cd (diff) |
[SVGDom] Initial SVGLength support
Mostly plumb new length types, but also introduce a stateful parser,
rect shape and named color support.
R=reed@google.com,robertphillips@google.com,stephana@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2202053002
Review-Url: https://codereview.chromium.org/2202053002
Diffstat (limited to 'experimental/svg/model/SkSVGRenderContext.cpp')
-rw-r--r-- | experimental/svg/model/SkSVGRenderContext.cpp | 38 |
1 files changed, 37 insertions, 1 deletions
diff --git a/experimental/svg/model/SkSVGRenderContext.cpp b/experimental/svg/model/SkSVGRenderContext.cpp index 703606c528..38498d36c8 100644 --- a/experimental/svg/model/SkSVGRenderContext.cpp +++ b/experimental/svg/model/SkSVGRenderContext.cpp @@ -6,8 +6,44 @@ */ #include "SkSVGRenderContext.h" +#include "SkSVGTypes.h" -SkSVGRenderContext::SkSVGRenderContext() { } +namespace { + +SkScalar length_size_for_type(const SkSize& viewport, SkSVGLengthContext::LengthType t) { + switch (t) { + case SkSVGLengthContext::LengthType::kHorizontal: + return viewport.width(); + case SkSVGLengthContext::LengthType::kVertical: + return viewport.height(); + case SkSVGLengthContext::LengthType::kOther: + return SkScalarSqrt(viewport.width() * viewport.height()); + } + + SkASSERT(false); // Not reached. + return 0; +} + +} // anonymous ns + +SkScalar SkSVGLengthContext::resolve(const SkSVGLength& l, LengthType t) const { + switch (l.unit()) { + case SkSVGLength::Unit::kNumber: + return l.value(); + break; + case SkSVGLength::Unit::kPercentage: + return l.value() * length_size_for_type(fViewport, t) / 100; + break; + default: + SkDebugf("unsupported unit type: <%d>\n", l.unit()); + break; + } + + return 0; +} + +SkSVGRenderContext::SkSVGRenderContext(const SkSize& initialViewport) + : fLengthContext(initialViewport) {} SkSVGRenderContext& SkSVGRenderContext::operator=(const SkSVGRenderContext& other) { if (other.fFill.isValid()) { |