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 "include/core/SkCanvas.h" 9 #include "modules/svg/include/SkSVGRenderContext.h" 10 #include "modules/svg/include/SkSVGTransformableNode.h" 11 #include "modules/svg/include/SkSVGValue.h" 12 SkSVGTransformableNode(SkSVGTag tag)13SkSVGTransformableNode::SkSVGTransformableNode(SkSVGTag tag) 14 : INHERITED(tag) 15 , fTransform(SkMatrix::I()) { } 16 17 onPrepareToRender(SkSVGRenderContext * ctx) const18bool SkSVGTransformableNode::onPrepareToRender(SkSVGRenderContext* ctx) const { 19 if (!fTransform.isIdentity()) { 20 ctx->saveOnce(); 21 ctx->canvas()->concat(fTransform); 22 } 23 24 return this->INHERITED::onPrepareToRender(ctx); 25 } 26 onSetAttribute(SkSVGAttribute attr,const SkSVGValue & v)27void 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 mapToParent(SkPath * path) const40void SkSVGTransformableNode::mapToParent(SkPath* path) const { 41 // transforms the path to parent node coordinates. 42 path->transform(fTransform); 43 } 44 mapToParent(SkRect * rect) const45void SkSVGTransformableNode::mapToParent(SkRect* rect) const { 46 *rect = fTransform.mapRect(*rect); 47 } 48