blob: c0b6a48829f3de9a69ce4dfd269cfb5ed1d87de7 [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "flutter/display_list/utils/dl_accumulation_rect.h"
namespace flutter {
void AccumulationRect::accumulate(SkScalar x, SkScalar y) {
if (!std::isfinite(x) || !std::isfinite(y)) {
return;
}
if (x >= min_x_ && x < max_x_ && y >= min_y_ && y < max_y_) {
record_overlapping_bounds();
return;
}
if (min_x_ > x) {
min_x_ = x;
}
if (min_y_ > y) {
min_y_ = y;
}
if (max_x_ < x) {
max_x_ = x;
}
if (max_y_ < y) {
max_y_ = y;
}
}
void AccumulationRect::accumulate(SkRect r) {
if (r.isEmpty()) {
return;
}
if (r.fLeft < max_x_ && r.fRight > min_x_ && //
r.fTop < max_y_ && r.fBottom > min_y_) {
record_overlapping_bounds();
}
if (min_x_ > r.fLeft) {
min_x_ = r.fLeft;
}
if (min_y_ > r.fTop) {
min_y_ = r.fTop;
}
if (max_x_ < r.fRight) {
max_x_ = r.fRight;
}
if (max_y_ < r.fBottom) {
max_y_ = r.fBottom;
}
}
void AccumulationRect::accumulate(AccumulationRect& ar) {
if (ar.is_empty()) {
return;
}
if (ar.min_x_ < max_x_ && ar.max_x_ > min_x_ && //
ar.min_y_ < max_y_ && ar.max_y_ > min_y_) {
record_overlapping_bounds();
}
if (min_x_ > ar.min_x_) {
min_x_ = ar.min_x_;
}
if (min_y_ > ar.min_y_) {
min_y_ = ar.min_y_;
}
if (max_x_ < ar.max_x_) {
max_x_ = ar.max_x_;
}
if (max_y_ < ar.max_y_) {
max_y_ = ar.max_y_;
}
}
SkRect AccumulationRect::bounds() const {
return (max_x_ >= min_x_ && max_y_ >= min_y_)
? SkRect::MakeLTRB(min_x_, min_y_, max_x_, max_y_)
: SkRect::MakeEmpty();
}
void AccumulationRect::reset() {
min_x_ = std::numeric_limits<SkScalar>::infinity();
min_y_ = std::numeric_limits<SkScalar>::infinity();
max_x_ = -std::numeric_limits<SkScalar>::infinity();
max_y_ = -std::numeric_limits<SkScalar>::infinity();
overlap_detected_ = false;
}
} // namespace flutter