/*
 * Copyright 2016 Google Inc.
 *
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

#include "modules/svg/include/SkSVGContainer.h"

#include "include/core/SkPath.h"
#include "include/pathops/SkPathOps.h"
#include "include/private/SkAssert.h"

#include <utility>
class SkSVGRenderContext;

SkSVGContainer::SkSVGContainer(SkSVGTag t) : INHERITED(t) { }

void SkSVGContainer::appendChild(sk_sp<SkSVGNode> node) {
    SkASSERT(node);
    fChildren.push_back(std::move(node));
}

bool SkSVGContainer::hasChildren() const {
    return !fChildren.empty();
}

void SkSVGContainer::onRender(const SkSVGRenderContext& ctx) const {
    for (int i = 0; i < fChildren.size(); ++i) {
        fChildren[i]->render(ctx);
    }
}

SkPath SkSVGContainer::onAsPath(const SkSVGRenderContext& ctx) const {
    SkPath path;

    for (int i = 0; i < fChildren.size(); ++i) {
        const SkPath childPath = fChildren[i]->asPath(ctx);

        if (auto result = Op(path, childPath, kUnion_SkPathOp)) {
            path = *result;
        }
    }

    return this->mapToParent(path);
}

SkRect SkSVGContainer::onTransformableObjectBoundingBox(const SkSVGRenderContext& ctx) const {
    SkRect bounds = SkRect::MakeEmpty();

    for (int i = 0; i < fChildren.size(); ++i) {
        const SkRect childBounds = fChildren[i]->objectBoundingBox(ctx);
        bounds.join(childBounds);
    }

    return bounds;
}
