// Copyright 2014 The Chromium 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 CC_BASE_SIMPLE_ENCLOSED_REGION_H_
#define CC_BASE_SIMPLE_ENCLOSED_REGION_H_

#include <stddef.h>

#include <string>

#include "cc/base/cc_export.h"
#include "ui/gfx/geometry/rect.h"

namespace cc {

class Region;

// A constant-sized approximation of a Region. The SimpleEnclosedRegion may
// exclude points in its approximation (may have false negatives) but will never
// include a point that would not be in the actual Region (no false positives).
class CC_EXPORT SimpleEnclosedRegion {
 public:
  SimpleEnclosedRegion() : rect_() {}
  SimpleEnclosedRegion(const SimpleEnclosedRegion& region)
      : rect_(region.rect_) {}
  explicit SimpleEnclosedRegion(const gfx::Rect& rect) : rect_(rect) {}
  SimpleEnclosedRegion(int x, int y, int w, int h) : rect_(x, y, w, h) {}
  SimpleEnclosedRegion(int w, int h) : rect_(w, h) {}
  explicit SimpleEnclosedRegion(const Region& region);
  ~SimpleEnclosedRegion();

  const SimpleEnclosedRegion& operator=(const gfx::Rect& rect) {
    rect_ = rect;
    return *this;
  }
  const SimpleEnclosedRegion& operator=(const SimpleEnclosedRegion& region) {
    rect_ = region.rect_;
    return *this;
  }

  bool IsEmpty() const { return rect_.IsEmpty(); }
  void Clear() { rect_ = gfx::Rect(); }
  size_t GetRegionComplexity() const { return rect_.IsEmpty() ? 0 : 1; }

  bool Contains(const gfx::Point& point) const { return rect_.Contains(point); }
  bool Contains(const gfx::Rect& rect) const { return rect_.Contains(rect); }
  bool Contains(const SimpleEnclosedRegion& region) const {
    return rect_.Contains(region.rect_);
  }

  bool Intersects(const gfx::Rect& rect) const {
    return rect_.Intersects(rect);
  }
  bool Intersects(const SimpleEnclosedRegion& region) const {
    return rect_.Intersects(region.rect_);
  }

  void Subtract(const gfx::Rect& sub_rect);
  void Subtract(const SimpleEnclosedRegion& sub_region) {
    Subtract(sub_region.rect_);
  }
  void Union(const gfx::Rect& new_rect);
  void Union(const SimpleEnclosedRegion& new_region) {
    Union(new_region.rect_);
  }
  void Intersect(const gfx::Rect& in_rect) { return rect_.Intersect(in_rect); }
  void Intersect(const SimpleEnclosedRegion& in_region) {
    Intersect(in_region.rect_);
  }

  bool Equals(const SimpleEnclosedRegion& other) const {
    bool both_empty = rect_.IsEmpty() && other.rect_.IsEmpty();
    return both_empty || rect_ == other.rect_;
  }

  gfx::Rect bounds() const { return rect_; }

  // The value of |i| must be less than GetRegionComplexity().
  gfx::Rect GetRect(size_t i) const;

  std::string ToString() const { return rect_.ToString(); }

 private:
  gfx::Rect rect_;
};

inline bool operator==(const SimpleEnclosedRegion& a,
                       const SimpleEnclosedRegion& b) {
  return a.Equals(b);
}

inline bool operator!=(const SimpleEnclosedRegion& a,
                       const SimpleEnclosedRegion& b) {
  return !(a == b);
}

inline SimpleEnclosedRegion SubtractSimpleEnclosedRegions(
    const SimpleEnclosedRegion& a,
    const SimpleEnclosedRegion& b) {
  SimpleEnclosedRegion result = a;
  result.Subtract(b);
  return result;
}

inline SimpleEnclosedRegion IntersectSimpleEnclosedRegions(
    const SimpleEnclosedRegion& a,
    const SimpleEnclosedRegion& b) {
  SimpleEnclosedRegion result = a;
  result.Intersect(b);
  return result;
}

inline SimpleEnclosedRegion UnionSimpleEnclosedRegions(
    const SimpleEnclosedRegion& a,
    const SimpleEnclosedRegion& b) {
  SimpleEnclosedRegion result = a;
  result.Union(b);
  return result;
}

}  // namespace cc

#endif  // CC_BASE_SIMPLE_ENCLOSED_REGION_H_
