Home | History | Annotate | Download | only in model
      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 "SkRect.h"
     10 #include "SkSVGRect.h"
     11 #include "SkSVGRenderContext.h"
     12 #include "SkSVGValue.h"
     13 
     14 SkSVGRect::SkSVGRect() : INHERITED(SkSVGTag::kRect) {}
     15 
     16 void SkSVGRect::setX(const SkSVGLength& x) {
     17     fX = x;
     18 }
     19 
     20 void SkSVGRect::setY(const SkSVGLength& y) {
     21     fY = y;
     22 }
     23 
     24 void SkSVGRect::setWidth(const SkSVGLength& w) {
     25     fWidth = w;
     26 }
     27 
     28 void SkSVGRect::setHeight(const SkSVGLength& h) {
     29     fHeight = h;
     30 }
     31 
     32 void SkSVGRect::setRx(const SkSVGLength& rx) {
     33     fRx = rx;
     34 }
     35 
     36 void SkSVGRect::setRy(const SkSVGLength& ry) {
     37     fRy = ry;
     38 }
     39 
     40 void SkSVGRect::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
     41     switch (attr) {
     42     case SkSVGAttribute::kX:
     43         if (const auto* x = v.as<SkSVGLengthValue>()) {
     44             this->setX(*x);
     45         }
     46         break;
     47     case SkSVGAttribute::kY:
     48         if (const auto* y = v.as<SkSVGLengthValue>()) {
     49             this->setY(*y);
     50         }
     51         break;
     52     case SkSVGAttribute::kWidth:
     53         if (const auto* w = v.as<SkSVGLengthValue>()) {
     54             this->setWidth(*w);
     55         }
     56         break;
     57     case SkSVGAttribute::kHeight:
     58         if (const auto* h = v.as<SkSVGLengthValue>()) {
     59             this->setHeight(*h);
     60         }
     61         break;
     62     case SkSVGAttribute::kRx:
     63         if (const auto* rx = v.as<SkSVGLengthValue>()) {
     64             this->setRx(*rx);
     65         }
     66         break;
     67     case SkSVGAttribute::kRy:
     68         if (const auto* ry = v.as<SkSVGLengthValue>()) {
     69             this->setRy(*ry);
     70         }
     71         break;
     72     default:
     73         this->INHERITED::onSetAttribute(attr, v);
     74     }
     75 }
     76 
     77 SkRRect SkSVGRect::resolve(const SkSVGLengthContext& lctx) const {
     78     const SkRect rect = lctx.resolveRect(fX, fY, fWidth, fHeight);
     79     const SkScalar rx = lctx.resolve(fRx, SkSVGLengthContext::LengthType::kHorizontal);
     80     const SkScalar ry = lctx.resolve(fRy, SkSVGLengthContext::LengthType::kVertical);
     81 
     82     return SkRRect::MakeRectXY(rect, rx ,ry);
     83 }
     84 
     85 void SkSVGRect::onDraw(SkCanvas* canvas, const SkSVGLengthContext& lctx,
     86                        const SkPaint& paint, SkPath::FillType) const {
     87     canvas->drawRRect(this->resolve(lctx), paint);
     88 }
     89 
     90 SkPath SkSVGRect::onAsPath(const SkSVGRenderContext& ctx) const {
     91     SkPath path;
     92     path.addRRect(this->resolve(ctx.lengthContext()));
     93 
     94     this->mapToParent(&path);
     95 
     96     return path;
     97 }
     98