15b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita/* 25b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita * Copyright 2016 Google Inc. 35b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita * 45b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita * Use of this source code is governed by a BSD-style license that can be 55b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita * found in the LICENSE file. 65b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita */ 75b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita 85b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita#include "SkCanvas.h" 9e932d4b3a99905a6272c5574f21ac651632f4e82Florin Malita#include "SkTLazy.h" 105b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita#include "SkSVGRenderContext.h" 115b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita#include "SkSVGPoly.h" 125b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita#include "SkSVGValue.h" 135b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita 145b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalitaSkSVGPoly::SkSVGPoly(SkSVGTag t) : INHERITED(t) {} 155b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita 165b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalitavoid SkSVGPoly::setPoints(const SkSVGPointsType& pts) { 175b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita fPath.reset(); 185b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita fPath.addPoly(pts.value().begin(), 195b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita pts.value().count(), 205b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita this->tag() == SkSVGTag::kPolygon); // only polygons are auto-closed 215b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita} 225b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita 235b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalitavoid SkSVGPoly::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) { 245b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita switch (attr) { 255b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita case SkSVGAttribute::kPoints: 265b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita if (const auto* pts = v.as<SkSVGPointsValue>()) { 275b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita this->setPoints(*pts); 285b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita } 295b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita break; 305b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita default: 315b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita this->INHERITED::onSetAttribute(attr, v); 325b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita } 335b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita} 345b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita 35e932d4b3a99905a6272c5574f21ac651632f4e82Florin Malitavoid SkSVGPoly::onDraw(SkCanvas* canvas, const SkSVGLengthContext&, const SkPaint& paint, 36e932d4b3a99905a6272c5574f21ac651632f4e82Florin Malita SkPath::FillType fillType) const { 37e932d4b3a99905a6272c5574f21ac651632f4e82Florin Malita // the passed fillType follows inheritance rules and needs to be applied at draw time. 38e932d4b3a99905a6272c5574f21ac651632f4e82Florin Malita fPath.setFillType(fillType); 395b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita canvas->drawPath(fPath, paint); 405b31f321fcc3bb7f2ed7cf31ff4b03901228594bfmalita} 41ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita 42ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin MalitaSkPath SkSVGPoly::onAsPath(const SkSVGRenderContext& ctx) const { 43ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita // the computed fillType follows inheritance rules and needs to be applied at draw time. 44ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita fPath.setFillType(FillRuleToFillType(*ctx.presentationContext().fInherited.fFillRule.get())); 45ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita 46ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita SkPath path = fPath; 47ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita this->mapToParent(&path); 48ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita return path; 49ce8840e3842f3a702c5d7bf440ff730bdfaf8e70Florin Malita} 50