SkSVGNode.cpp revision e932d4b3a99905a6272c5574f21ac651632f4e82
1/*
2 * Copyright 2016 Google Inc.
3 *
4 * Use of this source code is governed by a BSD-style license that can be
5 * found in the LICENSE file.
6 */
7
8#include "SkCanvas.h"
9#include "SkMatrix.h"
10#include "SkSVGNode.h"
11#include "SkSVGRenderContext.h"
12#include "SkSVGValue.h"
13#include "SkTLazy.h"
14
15SkSVGNode::SkSVGNode(SkSVGTag t) : fTag(t) { }
16
17SkSVGNode::~SkSVGNode() { }
18
19void SkSVGNode::render(const SkSVGRenderContext& ctx) const {
20    SkSVGRenderContext localContext(ctx);
21
22    if (this->onPrepareToRender(&localContext)) {
23        this->onRender(localContext);
24    }
25}
26
27bool SkSVGNode::asPaint(const SkSVGRenderContext& ctx, SkPaint* paint) const {
28    SkSVGRenderContext localContext(ctx);
29
30    return this->onPrepareToRender(&localContext) && this->onAsPaint(localContext, paint);
31}
32
33bool SkSVGNode::onPrepareToRender(SkSVGRenderContext* ctx) const {
34    ctx->applyPresentationAttributes(fPresentationAttributes,
35                                     this->hasChildren() ? 0 : SkSVGRenderContext::kLeaf);
36    return true;
37}
38
39void SkSVGNode::setAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
40    this->onSetAttribute(attr, v);
41}
42
43void SkSVGNode::setFill(const SkSVGPaint& svgPaint) {
44    fPresentationAttributes.fFill.set(svgPaint);
45}
46
47void SkSVGNode::setFillOpacity(const SkSVGNumberType& opacity) {
48    fPresentationAttributes.fFillOpacity.set(
49        SkSVGNumberType(SkTPin<SkScalar>(opacity.value(), 0, 1)));
50}
51
52void SkSVGNode::setFillRule(const SkSVGFillRule& fillRule) {
53    fPresentationAttributes.fFillRule.set(fillRule);
54}
55
56void SkSVGNode::setOpacity(const SkSVGNumberType& opacity) {
57    fPresentationAttributes.fOpacity.set(
58        SkSVGNumberType(SkTPin<SkScalar>(opacity.value(), 0, 1)));
59}
60
61void SkSVGNode::setStroke(const SkSVGPaint& svgPaint) {
62    fPresentationAttributes.fStroke.set(svgPaint);
63}
64
65void SkSVGNode::setStrokeOpacity(const SkSVGNumberType& opacity) {
66    fPresentationAttributes.fStrokeOpacity.set(
67        SkSVGNumberType(SkTPin<SkScalar>(opacity.value(), 0, 1)));
68}
69
70void SkSVGNode::setStrokeWidth(const SkSVGLength& strokeWidth) {
71    fPresentationAttributes.fStrokeWidth.set(strokeWidth);
72}
73
74void SkSVGNode::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
75    switch (attr) {
76    case SkSVGAttribute::kFill:
77        if (const SkSVGPaintValue* paint = v.as<SkSVGPaintValue>()) {
78            this->setFill(*paint);
79        }
80        break;
81    case SkSVGAttribute::kFillOpacity:
82        if (const SkSVGNumberValue* opacity = v.as<SkSVGNumberValue>()) {
83            this->setFillOpacity(*opacity);
84        }
85        break;
86    case SkSVGAttribute::kFillRule:
87        if (const SkSVGFillRuleValue* fillRule = v.as<SkSVGFillRuleValue>()) {
88            this->setFillRule(*fillRule);
89        }
90        break;
91    case SkSVGAttribute::kOpacity:
92        if (const SkSVGNumberValue* opacity = v.as<SkSVGNumberValue>()) {
93            this->setOpacity(*opacity);
94        }
95        break;
96    case SkSVGAttribute::kStroke:
97        if (const SkSVGPaintValue* paint = v.as<SkSVGPaintValue>()) {
98            this->setStroke(*paint);
99        }
100        break;
101    case SkSVGAttribute::kStrokeOpacity:
102        if (const SkSVGNumberValue* opacity = v.as<SkSVGNumberValue>()) {
103            this->setStrokeOpacity(*opacity);
104        }
105        break;
106    case SkSVGAttribute::kStrokeLineCap:
107        if (const SkSVGLineCapValue* lineCap = v.as<SkSVGLineCapValue>()) {
108            fPresentationAttributes.fStrokeLineCap.set(*lineCap);
109        }
110        break;
111    case SkSVGAttribute::kStrokeLineJoin:
112        if (const SkSVGLineJoinValue* lineJoin = v.as<SkSVGLineJoinValue>()) {
113            fPresentationAttributes.fStrokeLineJoin.set(*lineJoin);
114        }
115        break;
116    case SkSVGAttribute::kStrokeWidth:
117        if (const SkSVGLengthValue* strokeWidth = v.as<SkSVGLengthValue>()) {
118            this->setStrokeWidth(*strokeWidth);
119        }
120        break;
121    default:
122        SkDebugf("attribute ID <%d> ignored for node <%d>\n", attr, fTag);
123        break;
124    }
125}
126