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 "SkSVGCircle.h" 10 #include "SkSVGRenderContext.h" 11 #include "SkSVGValue.h" 12 13 SkSVGCircle::SkSVGCircle() : INHERITED(SkSVGTag::kCircle) {} 14 15 void SkSVGCircle::setCx(const SkSVGLength& cx) { 16 fCx = cx; 17 } 18 19 void SkSVGCircle::setCy(const SkSVGLength& cy) { 20 fCy = cy; 21 } 22 23 void SkSVGCircle::setR(const SkSVGLength& r) { 24 fR = r; 25 } 26 27 void SkSVGCircle::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) { 28 switch (attr) { 29 case SkSVGAttribute::kCx: 30 if (const auto* cx = v.as<SkSVGLengthValue>()) { 31 this->setCx(*cx); 32 } 33 break; 34 case SkSVGAttribute::kCy: 35 if (const auto* cy = v.as<SkSVGLengthValue>()) { 36 this->setCy(*cy); 37 } 38 break; 39 case SkSVGAttribute::kR: 40 if (const auto* r = v.as<SkSVGLengthValue>()) { 41 this->setR(*r); 42 } 43 break; 44 default: 45 this->INHERITED::onSetAttribute(attr, v); 46 } 47 } 48 49 std::tuple<SkPoint, SkScalar> SkSVGCircle::resolve(const SkSVGLengthContext& lctx) const { 50 const auto cx = lctx.resolve(fCx, SkSVGLengthContext::LengthType::kHorizontal); 51 const auto cy = lctx.resolve(fCy, SkSVGLengthContext::LengthType::kVertical); 52 const auto r = lctx.resolve(fR , SkSVGLengthContext::LengthType::kOther); 53 54 return std::make_tuple(SkPoint::Make(cx, cy), r); 55 } 56 void SkSVGCircle::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx, 57 const SkPaint& paint, SkPath::FillType) const { 58 SkPoint pos; 59 SkScalar r; 60 std::tie(pos, r) = this->resolve(lctx); 61 62 if (r > 0) { 63 canvas->drawCircle(pos.x(), pos.y(), r, paint); 64 } 65 } 66 67 SkPath SkSVGCircle::onAsPath(const SkSVGRenderContext& ctx) const { 68 SkPoint pos; 69 SkScalar r; 70 std::tie(pos, r) = this->resolve(ctx.lengthContext()); 71 72 SkPath path; 73 path.addCircle(pos.x(), pos.y(), r); 74 this->mapToParent(&path); 75 76 return path; 77 } 78