1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "ui/gfx/geometry/rect.h" 6 7#include <algorithm> 8 9#if defined(OS_WIN) 10#include <windows.h> 11#endif 12 13#include "base/logging.h" 14#include "base/strings/stringprintf.h" 15#include "ui/gfx/geometry/insets.h" 16#include "ui/gfx/geometry/rect_base_impl.h" 17 18namespace gfx { 19 20template class RectBase<Rect, Point, Size, Insets, Vector2d, int>; 21 22typedef class RectBase<Rect, Point, Size, Insets, Vector2d, int> RectBaseT; 23 24#if defined(OS_WIN) 25Rect::Rect(const RECT& r) 26 : RectBaseT(gfx::Point(r.left, r.top)) { 27 set_width(std::abs(r.right - r.left)); 28 set_height(std::abs(r.bottom - r.top)); 29} 30#elif defined(OS_MACOSX) 31Rect::Rect(const CGRect& r) 32 : RectBaseT(gfx::Point(r.origin.x, r.origin.y)) { 33 set_width(r.size.width); 34 set_height(r.size.height); 35} 36#endif 37 38#if defined(OS_WIN) 39RECT Rect::ToRECT() const { 40 RECT r; 41 r.left = x(); 42 r.right = right(); 43 r.top = y(); 44 r.bottom = bottom(); 45 return r; 46} 47#elif defined(OS_MACOSX) 48CGRect Rect::ToCGRect() const { 49 return CGRectMake(x(), y(), width(), height()); 50} 51#endif 52 53std::string Rect::ToString() const { 54 return base::StringPrintf("%s %s", 55 origin().ToString().c_str(), 56 size().ToString().c_str()); 57} 58 59Rect operator+(const Rect& lhs, const Vector2d& rhs) { 60 Rect result(lhs); 61 result += rhs; 62 return result; 63} 64 65Rect operator-(const Rect& lhs, const Vector2d& rhs) { 66 Rect result(lhs); 67 result -= rhs; 68 return result; 69} 70 71Rect IntersectRects(const Rect& a, const Rect& b) { 72 Rect result = a; 73 result.Intersect(b); 74 return result; 75} 76 77Rect UnionRects(const Rect& a, const Rect& b) { 78 Rect result = a; 79 result.Union(b); 80 return result; 81} 82 83Rect SubtractRects(const Rect& a, const Rect& b) { 84 Rect result = a; 85 result.Subtract(b); 86 return result; 87} 88 89Rect BoundingRect(const Point& p1, const Point& p2) { 90 int rx = std::min(p1.x(), p2.x()); 91 int ry = std::min(p1.y(), p2.y()); 92 int rr = std::max(p1.x(), p2.x()); 93 int rb = std::max(p1.y(), p2.y()); 94 return Rect(rx, ry, rr - rx, rb - ry); 95} 96 97} // namespace gfx 98