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

#include "modules/sksg/include/SkSGRect.h"

#include "include/core/SkCanvas.h"
#include "include/core/SkPaint.h"
#include "include/core/SkPath.h"

namespace sksg {

Rect::Rect(const SkRect& rect) : fRect(rect) {}

void Rect::onClip(SkCanvas* canvas, bool antiAlias) const {
    canvas->clipRect(fRect, SkClipOp::kIntersect, antiAlias);
}

void Rect::onDraw(SkCanvas* canvas, const SkPaint& paint) const {
    canvas->drawRect(fRect, paint);
}

bool Rect::onContains(const SkPoint& p) const {
    return fRect.contains(p.x(), p.y());
}

SkRect Rect::onRevalidate(InvalidationController*, const SkMatrix&) {
    SkASSERT(this->hasInval());

    return fRect;
}

SkPath Rect::onAsPath() const {
    return SkPath::Rect(fRect, this->getDirection(), this->getInitialPointIndex());
}

RRect::RRect(const SkRRect& rr) : fRRect(rr) {}

void RRect::onClip(SkCanvas* canvas, bool antiAlias) const {
    canvas->clipRRect(fRRect, SkClipOp::kIntersect, antiAlias);
}

void RRect::onDraw(SkCanvas* canvas, const SkPaint& paint) const {
    canvas->drawRRect(fRRect, paint);
}

bool RRect::onContains(const SkPoint& p) const {
    if (!fRRect.rect().contains(p.x(), p.y())) {
        return false;
    }

    if (fRRect.isRect()) {
        return true;
    }

    // TODO: no SkRRect::contains(x, y)
    return fRRect.contains(SkRect::MakeLTRB(p.x() - SK_ScalarNearlyZero,
                                            p.y() - SK_ScalarNearlyZero,
                                            p.x() + SK_ScalarNearlyZero,
                                            p.y() + SK_ScalarNearlyZero));
}

SkRect RRect::onRevalidate(InvalidationController*, const SkMatrix&) {
    SkASSERT(this->hasInval());

    return fRRect.getBounds();
}

SkPath RRect::onAsPath() const {
    return SkPath::RRect(fRRect, this->getDirection(), this->getInitialPointIndex());
}

} // namespace sksg
