// Copyright (c) 2012 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.

#include "cobalt/layout/rect_layout_unit.h"

#include <algorithm>

#include "base/logging.h"
#include "base/stringprintf.h"
#include "cobalt/layout/insets_layout_unit.h"
#include "cobalt/layout/layout_unit.h"
#include "cobalt/layout/point_layout_unit.h"
#include "cobalt/layout/size_layout_unit.h"
#include "cobalt/layout/vector2d_layout_unit.h"
#include "cobalt/math/rect_base_impl.h"
#include "cobalt/math/safe_integer_conversions.h"

namespace cobalt {
namespace layout {

typedef class math::RectBase<RectLayoutUnit, PointLayoutUnit, SizeLayoutUnit,
                             InsetsLayoutUnit, Vector2dLayoutUnit,
                             LayoutUnit> RectBaseT;

bool RectLayoutUnit::IsExpressibleAsRect() const {
  return math::IsExpressibleAsInt(x().toFloat()) &&
         math::IsExpressibleAsInt(y().toFloat()) &&
         math::IsExpressibleAsInt(width().toFloat()) &&
         math::IsExpressibleAsInt(height().toFloat()) &&
         math::IsExpressibleAsInt(right().toFloat()) &&
         math::IsExpressibleAsInt(bottom().toFloat());
}

std::string RectLayoutUnit::ToString() const {
  return base::StringPrintf("%s %s", origin().ToString().c_str(),
                            size().ToString().c_str());
}

RectLayoutUnit IntersectRects(const RectLayoutUnit& a,
                              const RectLayoutUnit& b) {
  RectLayoutUnit result = a;
  result.Intersect(b);
  return result;
}

RectLayoutUnit UnionRects(const RectLayoutUnit& a, const RectLayoutUnit& b) {
  RectLayoutUnit result = a;
  result.Union(b);
  return result;
}

RectLayoutUnit SubtractRects(const RectLayoutUnit& a, const RectLayoutUnit& b) {
  RectLayoutUnit result = a;
  result.Subtract(b);
  return result;
}

RectLayoutUnit BoundingRect(const PointLayoutUnit& p1,
                            const PointLayoutUnit& p2) {
  LayoutUnit rx(std::min(p1.x(), p2.x()));
  LayoutUnit ry(std::min(p1.y(), p2.y()));
  LayoutUnit rr(std::max(p1.x(), p2.x()));
  LayoutUnit rb(std::max(p1.y(), p2.y()));
  return RectLayoutUnit(rx, ry, rr - rx, rb - ry);
}

}  // namespace layout
}  // namespace cobalt

namespace cobalt {
namespace math {

template class math::RectBase<layout::RectLayoutUnit, layout::PointLayoutUnit,
                              layout::SizeLayoutUnit, layout::InsetsLayoutUnit,
                              layout::Vector2dLayoutUnit, layout::LayoutUnit>;

}  // namespace math
}  // namespace cobalt
