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