1*c8dee2aaSAndroid Build Coastguard Worker /* 2*c8dee2aaSAndroid Build Coastguard Worker * Copyright 2016 Google Inc. 3*c8dee2aaSAndroid Build Coastguard Worker * 4*c8dee2aaSAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license that can be 5*c8dee2aaSAndroid Build Coastguard Worker * found in the LICENSE file. 6*c8dee2aaSAndroid Build Coastguard Worker */ 7*c8dee2aaSAndroid Build Coastguard Worker 8*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGTransformableNode.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkCanvas.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkRect.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGAttribute.h" 13*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGRenderContext.h" 14*c8dee2aaSAndroid Build Coastguard Worker #include "modules/svg/include/SkSVGValue.h" 15*c8dee2aaSAndroid Build Coastguard Worker SkSVGTransformableNode(SkSVGTag tag)16*c8dee2aaSAndroid Build Coastguard WorkerSkSVGTransformableNode::SkSVGTransformableNode(SkSVGTag tag) 17*c8dee2aaSAndroid Build Coastguard Worker : INHERITED(tag) 18*c8dee2aaSAndroid Build Coastguard Worker , fTransform(SkMatrix::I()) { } 19*c8dee2aaSAndroid Build Coastguard Worker 20*c8dee2aaSAndroid Build Coastguard Worker onPrepareToRender(SkSVGRenderContext * ctx) const21*c8dee2aaSAndroid Build Coastguard Workerbool SkSVGTransformableNode::onPrepareToRender(SkSVGRenderContext* ctx) const { 22*c8dee2aaSAndroid Build Coastguard Worker if (!fTransform.isIdentity()) { 23*c8dee2aaSAndroid Build Coastguard Worker ctx->saveOnce(); 24*c8dee2aaSAndroid Build Coastguard Worker ctx->canvas()->concat(fTransform); 25*c8dee2aaSAndroid Build Coastguard Worker } 26*c8dee2aaSAndroid Build Coastguard Worker 27*c8dee2aaSAndroid Build Coastguard Worker return this->INHERITED::onPrepareToRender(ctx); 28*c8dee2aaSAndroid Build Coastguard Worker } 29*c8dee2aaSAndroid Build Coastguard Worker onSetAttribute(SkSVGAttribute attr,const SkSVGValue & v)30*c8dee2aaSAndroid Build Coastguard Workervoid SkSVGTransformableNode::onSetAttribute(SkSVGAttribute attr, const SkSVGValue& v) { 31*c8dee2aaSAndroid Build Coastguard Worker switch (attr) { 32*c8dee2aaSAndroid Build Coastguard Worker case SkSVGAttribute::kTransform: 33*c8dee2aaSAndroid Build Coastguard Worker if (const auto* transform = v.as<SkSVGTransformValue>()) { 34*c8dee2aaSAndroid Build Coastguard Worker this->setTransform(*transform); 35*c8dee2aaSAndroid Build Coastguard Worker } 36*c8dee2aaSAndroid Build Coastguard Worker break; 37*c8dee2aaSAndroid Build Coastguard Worker default: 38*c8dee2aaSAndroid Build Coastguard Worker this->INHERITED::onSetAttribute(attr, v); 39*c8dee2aaSAndroid Build Coastguard Worker break; 40*c8dee2aaSAndroid Build Coastguard Worker } 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker mapToParent(SkPath * path) const43*c8dee2aaSAndroid Build Coastguard Workervoid SkSVGTransformableNode::mapToParent(SkPath* path) const { 44*c8dee2aaSAndroid Build Coastguard Worker // transforms the path to parent node coordinates. 45*c8dee2aaSAndroid Build Coastguard Worker path->transform(fTransform); 46*c8dee2aaSAndroid Build Coastguard Worker } 47*c8dee2aaSAndroid Build Coastguard Worker mapToParent(SkRect * rect) const48*c8dee2aaSAndroid Build Coastguard Workervoid SkSVGTransformableNode::mapToParent(SkRect* rect) const { 49*c8dee2aaSAndroid Build Coastguard Worker *rect = fTransform.mapRect(*rect); 50*c8dee2aaSAndroid Build Coastguard Worker } 51