diff options
author | fmalita <fmalita@chromium.org> | 2016-08-08 11:38:55 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-08-08 11:38:55 -0700 |
commit | 397a517d1a5774653fcdd08172f9a6b5eea67621 (patch) | |
tree | ab9c9aaa4121a8033a29f259401bcecf7d178203 /experimental/svg/model/SkSVGRenderContext.h | |
parent | f621ff49a288978c272d5ae069a6a1c04c74642b (diff) |
[SVGDom] Add viewBox support
The main feature is <svg> viewBox and proper viewport support, but the CL
touches a few other things:
* refactor SkSVGRenderContext to auto-restore canvas state, and split the
presentation bits into a separate CoW SkSVGPresentationContext
* introduce SkSVGNode::onPrepareToRender(), as a way for nodes to push their
custom state before the actual onRender() call (instead of relying on
non-virtual SkSVGNode to know about all possible state bits)
* add a "Type" suffix to SVG types, to disambiguate (e.g. SkSVGRectType vs.
SkSVGRect)
R=robertphillips@google.com,stephana@google.com
GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2222793002
Review-Url: https://codereview.chromium.org/2222793002
Diffstat (limited to 'experimental/svg/model/SkSVGRenderContext.h')
-rw-r--r-- | experimental/svg/model/SkSVGRenderContext.h | 57 |
1 files changed, 46 insertions, 11 deletions
diff --git a/experimental/svg/model/SkSVGRenderContext.h b/experimental/svg/model/SkSVGRenderContext.h index 50a6d59e5e..47886d7cb0 100644 --- a/experimental/svg/model/SkSVGRenderContext.h +++ b/experimental/svg/model/SkSVGRenderContext.h @@ -8,11 +8,13 @@ #ifndef SkSVGRenderContext_DEFINED #define SkSVGRenderContext_DEFINED -#include "SkSize.h" #include "SkPaint.h" +#include "SkRect.h" +#include "SkSize.h" #include "SkTLazy.h" +#include "SkTypes.h" -class SkPaint; +class SkCanvas; class SkSVGLength; class SkSVGLengthContext { @@ -25,21 +27,22 @@ public: kOther, }; + const SkSize& viewPort() const { return fViewport; } void setViewPort(const SkSize& viewport) { fViewport = viewport; } SkScalar resolve(const SkSVGLength&, LengthType) const; + SkRect resolveRect(const SkSVGLength& x, const SkSVGLength& y, + const SkSVGLength& w, const SkSVGLength& h) const; private: SkSize fViewport; }; -class SkSVGRenderContext { +class SkSVGPresentationContext { public: - explicit SkSVGRenderContext(const SkSize& initialViewport); - SkSVGRenderContext(const SkSVGRenderContext&) = default; - SkSVGRenderContext& operator=(const SkSVGRenderContext&); - - const SkSVGLengthContext& lengthContext() const { return fLengthContext; } + SkSVGPresentationContext(); + SkSVGPresentationContext(const SkSVGPresentationContext&); + SkSVGPresentationContext& operator=(const SkSVGPresentationContext&); const SkPaint* fillPaint() const { return fFill.getMaybeNull(); } const SkPaint* strokePaint() const { return fStroke.getMaybeNull(); } @@ -48,12 +51,44 @@ public: void setStrokeColor(SkColor); private: + void initFrom(const SkSVGPresentationContext&); + SkPaint& ensureFill(); SkPaint& ensureStroke(); - SkSVGLengthContext fLengthContext; - SkTLazy<SkPaint> fFill; - SkTLazy<SkPaint> fStroke; + // TODO: convert to regular SkPaints and track explicit attribute values instead. + SkTLazy<SkPaint> fFill; + SkTLazy<SkPaint> fStroke; +}; + +class SkSVGRenderContext { +public: + SkSVGRenderContext(SkCanvas*, const SkSVGLengthContext&, const SkSVGPresentationContext&); + SkSVGRenderContext(const SkSVGRenderContext&); + ~SkSVGRenderContext(); + + const SkSVGLengthContext& lengthContext() const { return *fLengthContext; } + SkSVGLengthContext* writableLengthContext() { return fLengthContext.writable(); } + + const SkSVGPresentationContext& presentationContext() const { return *fPresentationContext; } + SkSVGPresentationContext* writablePresentationContext() { + return fPresentationContext.writable(); + } + + SkCanvas* canvas() const { return fCanvas; } + +private: + // Stack-only + void* operator new(size_t) = delete; + void* operator new(size_t, void*) = delete; + SkSVGRenderContext& operator=(const SkSVGRenderContext&) = delete; + + SkTCopyOnFirstWrite<SkSVGLengthContext> fLengthContext; + SkTCopyOnFirstWrite<SkSVGPresentationContext> fPresentationContext; + SkCanvas* fCanvas; + // The save count on 'fCanvas' at construction time. + // A restoreToCount() will be issued on destruction. + int fCanvasSaveCount; }; #endif // SkSVGRenderContext_DEFINED |