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 "SkSVGRenderContext.h"
     10 #include "SkSVGTransformableNode.h"
     11 #include "SkSVGValue.h"
     12 
     13 SkSVGTransformableNode::SkSVGTransformableNode(SkSVGTag tag)
     14     : INHERITED(tag)
     15     , fTransform(SkMatrix::I()) { }
     16 
     17 
     18 bool SkSVGTransformableNode::onPrepareToRender(SkSVGRenderContext* ctx) const {
     19     if (!fTransform.value().isIdentity()) {
     20         ctx->canvas()->save();
     21         ctx->canvas()->concat(fTransform);
     22     }
     23 
     24     return this->INHERITED::onPrepareToRender(ctx);
     25 }
     26 
     27 void SkSVGTransformableNode::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) {
     28     switch (attr) {
     29     case SkSVGAttribute::kTransform:
     30         if (const auto* transform = v.as<SkSVGTransformValue>()) {
     31             this->setTransform(*transform);
     32         }
     33         break;
     34     default:
     35         this->INHERITED::onSetAttribute(attr, v);
     36         break;
     37     }
     38 }
     39 
     40 void SkSVGTransformableNode::mapToParent(SkPath* path) const {
     41     if (fTransform.value().isIdentity()) {
     42         return;
     43     }
     44 
     45     SkMatrix inv;
     46     if (!fTransform.value().invert(&inv)) {
     47         return;
     48     }
     49 
     50     path->transform(inv);
     51 }
     52