Index: experimental/svg/model/SkSVGRenderContext.h |
diff --git a/experimental/svg/model/SkSVGRenderContext.h b/experimental/svg/model/SkSVGRenderContext.h |
index 50a6d59e5e84ee109cbadc1e42d7fe294582f86f..47886d7cb0c35f75e284d1432a1138a112891ac4 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 |