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/SkSVGContainer.h" 9*c8dee2aaSAndroid Build Coastguard Worker 10*c8dee2aaSAndroid Build Coastguard Worker #include "include/core/SkPath.h" 11*c8dee2aaSAndroid Build Coastguard Worker #include "include/pathops/SkPathOps.h" 12*c8dee2aaSAndroid Build Coastguard Worker #include "include/private/base/SkAssert.h" 13*c8dee2aaSAndroid Build Coastguard Worker 14*c8dee2aaSAndroid Build Coastguard Worker #include <utility> 15*c8dee2aaSAndroid Build Coastguard Worker class SkSVGRenderContext; 16*c8dee2aaSAndroid Build Coastguard Worker SkSVGContainer(SkSVGTag t)17*c8dee2aaSAndroid Build Coastguard WorkerSkSVGContainer::SkSVGContainer(SkSVGTag t) : INHERITED(t) { } 18*c8dee2aaSAndroid Build Coastguard Worker appendChild(sk_sp<SkSVGNode> node)19*c8dee2aaSAndroid Build Coastguard Workervoid SkSVGContainer::appendChild(sk_sp<SkSVGNode> node) { 20*c8dee2aaSAndroid Build Coastguard Worker SkASSERT(node); 21*c8dee2aaSAndroid Build Coastguard Worker fChildren.push_back(std::move(node)); 22*c8dee2aaSAndroid Build Coastguard Worker } 23*c8dee2aaSAndroid Build Coastguard Worker hasChildren() const24*c8dee2aaSAndroid Build Coastguard Workerbool SkSVGContainer::hasChildren() const { 25*c8dee2aaSAndroid Build Coastguard Worker return !fChildren.empty(); 26*c8dee2aaSAndroid Build Coastguard Worker } 27*c8dee2aaSAndroid Build Coastguard Worker onRender(const SkSVGRenderContext & ctx) const28*c8dee2aaSAndroid Build Coastguard Workervoid SkSVGContainer::onRender(const SkSVGRenderContext& ctx) const { 29*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fChildren.size(); ++i) { 30*c8dee2aaSAndroid Build Coastguard Worker fChildren[i]->render(ctx); 31*c8dee2aaSAndroid Build Coastguard Worker } 32*c8dee2aaSAndroid Build Coastguard Worker } 33*c8dee2aaSAndroid Build Coastguard Worker onAsPath(const SkSVGRenderContext & ctx) const34*c8dee2aaSAndroid Build Coastguard WorkerSkPath SkSVGContainer::onAsPath(const SkSVGRenderContext& ctx) const { 35*c8dee2aaSAndroid Build Coastguard Worker SkPath path; 36*c8dee2aaSAndroid Build Coastguard Worker 37*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fChildren.size(); ++i) { 38*c8dee2aaSAndroid Build Coastguard Worker const SkPath childPath = fChildren[i]->asPath(ctx); 39*c8dee2aaSAndroid Build Coastguard Worker 40*c8dee2aaSAndroid Build Coastguard Worker Op(path, childPath, kUnion_SkPathOp, &path); 41*c8dee2aaSAndroid Build Coastguard Worker } 42*c8dee2aaSAndroid Build Coastguard Worker 43*c8dee2aaSAndroid Build Coastguard Worker this->mapToParent(&path); 44*c8dee2aaSAndroid Build Coastguard Worker return path; 45*c8dee2aaSAndroid Build Coastguard Worker } 46*c8dee2aaSAndroid Build Coastguard Worker onObjectBoundingBox(const SkSVGRenderContext & ctx) const47*c8dee2aaSAndroid Build Coastguard WorkerSkRect SkSVGContainer::onObjectBoundingBox(const SkSVGRenderContext& ctx) const { 48*c8dee2aaSAndroid Build Coastguard Worker SkRect bounds = SkRect::MakeEmpty(); 49*c8dee2aaSAndroid Build Coastguard Worker 50*c8dee2aaSAndroid Build Coastguard Worker for (int i = 0; i < fChildren.size(); ++i) { 51*c8dee2aaSAndroid Build Coastguard Worker const SkRect childBounds = fChildren[i]->objectBoundingBox(ctx); 52*c8dee2aaSAndroid Build Coastguard Worker bounds.join(childBounds); 53*c8dee2aaSAndroid Build Coastguard Worker } 54*c8dee2aaSAndroid Build Coastguard Worker 55*c8dee2aaSAndroid Build Coastguard Worker return bounds; 56*c8dee2aaSAndroid Build Coastguard Worker } 57