blob: 09ed6adf16068438ba64d20e99c2b4d03c5e205f [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.
#ifndef FLUTTER_DISPLAY_LIST_UTILS_DL_ACCUMULATION_RECT_H_
#define FLUTTER_DISPLAY_LIST_UTILS_DL_ACCUMULATION_RECT_H_
#include <functional>
#include "flutter/display_list/geometry/dl_geometry_types.h"
#include "flutter/display_list/geometry/dl_rtree.h"
#include "flutter/fml/logging.h"
namespace flutter {
// Utility class to collect bounds from a bunch of rectangles and points
// while also noting if there might be any overlap between any of the data
// point/rects. Note that the overlap protection is not sophisticated,
// simply noting if the new data intersects with the already accumulated
// bounds. This can successfully detect non-overlap of a linear sequence
// of non-overlapping objects, or even a cross of non-overlapping objects
// as long as they are built out from the center in the right order. True
// detection of non-overlapping objects would require much more time and/or
// space.
class AccumulationRect {
public:
AccumulationRect() { reset(); }
void accumulate(SkScalar x, SkScalar y);
void accumulate(SkPoint p) { accumulate(p.fX, p.fY); }
void accumulate(DlPoint p) { accumulate(p.x, p.y); }
void accumulate(SkRect r);
void accumulate(DlRect r) { accumulate(ToSkRect(r)); }
void accumulate(AccumulationRect& ar);
bool is_empty() const { return min_x_ >= max_x_ || min_y_ >= max_y_; }
bool is_not_empty() const { return min_x_ < max_x_ && min_y_ < max_y_; }
SkRect bounds() const;
void reset();
bool overlap_detected() const { return overlap_detected_; }
void record_overlapping_bounds() { overlap_detected_ = true; }
private:
DlScalar min_x_;
DlScalar min_y_;
DlScalar max_x_;
DlScalar max_y_;
bool overlap_detected_;
};
} // namespace flutter
#endif // FLUTTER_DISPLAY_LIST_UTILS_DL_ACCUMULATION_RECT_H_