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