15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)#include <limits> 6a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/logging.h" 87d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "base/strings/stringprintf.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "ui/gfx/geometry/rect_base.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// This file provides the implementation for RectBaese template and 125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// used to instantiate the base class for Rect and RectF classes. 134e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)#if !defined(GFX_IMPLEMENTATION) 145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#error "This file is intended for UI implementation only" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#endif 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Type> 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void AdjustAlongAxis(Type dst_origin, Type dst_size, Type* origin, Type* size) { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *size = std::min(dst_size, *size); 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (*origin < dst_origin) 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *origin = dst_origin; 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) else 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *origin = std::min(dst_origin + dst_size, *origin + *size) - *size; 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace gfx { 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(Type x, Type y, Type width, Type height) { 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_.SetPoint(x, y); 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_width(width); 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_height(height); 435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Inset(const InsetsClass& insets) { 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Inset(insets.left(), insets.top(), insets.right(), insets.bottom()); 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Inset(Type left, Type top, Type right, Type bottom) { 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_ += VectorClass(left, top); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_width(std::max(width() - left - right, static_cast<Type>(0))); 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) set_height(std::max(height() - top - bottom, static_cast<Type>(0))); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Offset(Type horizontal, Type vertical) { 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_ += VectorClass(horizontal, vertical); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator+=(const VectorClass& offset) { 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_ += offset; 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator-=(const VectorClass& offset) { 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) origin_ -= offset; 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) operator<(const Class& other) const { 1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (origin_ == other.origin_) { 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (width() == other.width()) { 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return height() < other.height(); 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return width() < other.width(); 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else { 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return origin_ < other.origin_; 1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Contains(Type point_x, Type point_y) const { 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (point_x >= x()) && (point_x < right()) && 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (point_y >= y()) && (point_y < bottom()); 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Contains(const Class& rect) const { 1415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (rect.x() >= x() && rect.right() <= right() && 1425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect.y() >= y() && rect.bottom() <= bottom()); 1435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Intersects(const Class& rect) const { 153868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) return !(IsEmpty() || rect.IsEmpty() || 154868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) rect.x() >= right() || rect.right() <= x() || 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rect.y() >= bottom() || rect.bottom() <= y()); 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Intersect(const Class& rect) { 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEmpty() || rect.IsEmpty()) { 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(0, 0, 0, 0); 1685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rx = std::max(x(), rect.x()); 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type ry = std::max(y(), rect.y()); 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rr = std::min(right(), rect.right()); 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rb = std::min(bottom(), rect.bottom()); 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rx >= rr || ry >= rb) 1775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rx = ry = rr = rb = 0; // non-intersecting 1785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(rx, ry, rr - rx, rb - ry); 1805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 1835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 1845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Union(const Class& rect) { 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (IsEmpty()) { 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) *this = rect; 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.IsEmpty()) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rx = std::min(x(), rect.x()); 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type ry = std::min(y(), rect.y()); 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rr = std::max(right(), rect.right()); 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rb = std::max(bottom(), rect.bottom()); 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(rx, ry, rr - rx, rb - ry); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 2065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 2075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 2085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 2125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Subtract(const Class& rect) { 2135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!Intersects(rect)) 2145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.Contains(*static_cast<const Class*>(this))) { 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(0, 0, 0, 0); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return; 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rx = x(); 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type ry = y(); 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rr = right(); 2235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type rb = bottom(); 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.y() <= y() && rect.bottom() >= bottom()) { 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // complete intersection in the y-direction 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.x() <= x()) { 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rx = rect.right(); 229868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (rect.right() >= right()) { 2305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rr = rect.x(); 2315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } else if (rect.x() <= x() && rect.right() >= right()) { 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // complete intersection in the x-direction 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (rect.y() <= y()) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ry = rect.bottom(); 236868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } else if (rect.bottom() >= bottom()) { 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) rb = rect.y(); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(rx, ry, rr - rx, rb - ry); 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdjustToFit(const Class& rect) { 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_x = x(); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_y = y(); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_width = width(); 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_height = height(); 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdjustAlongAxis(rect.x(), rect.width(), &new_x, &new_width); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdjustAlongAxis(rect.y(), rect.height(), &new_y, &new_height); 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(new_x, new_y, new_width, new_height); 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)PointClass RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type>::CenterPoint() const { 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return PointClass(x() + width() / 2, y() + height() / 2); 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 2755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 2775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 2785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ClampToCenteredSize(const SizeClass& size) { 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_width = std::min(width(), size.width()); 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_height = std::min(height(), size.height()); 2815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_x = x() + (width() - new_width) / 2; 2825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Type new_y = y() + (height() - new_height) / 2; 2835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SetRect(new_x, new_y, new_width, new_height); 2845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 2905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 2915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)void RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SplitVertically(Class* left_half, Class* right_half) const { 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(left_half); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) DCHECK(right_half); 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) left_half->SetRect(x(), y(), width() / 2, height()); 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) right_half->SetRect(left_half->right(), 2992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) y(), 3002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) width() - left_half->width(), 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) height()); 3025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)template<typename Class, 3055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename PointClass, 3065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename SizeClass, 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename InsetsClass, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename VectorClass, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) typename Type> 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 3115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SharesEdgeWith(const Class& rect) const { 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return (y() == rect.y() && height() == rect.height() && 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x() == rect.right() || right() == rect.x())) || 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (x() == rect.x() && width() == rect.width() && 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) (y() == rect.bottom() || bottom() == rect.y())); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 31868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)template<typename Class, 31968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename PointClass, 32068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename SizeClass, 32168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename InsetsClass, 32268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename VectorClass, 32368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) typename Type> 32468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 32568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) ManhattanDistanceToPoint(const PointClass& point) const { 32668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Type x_distance = std::max<Type>(0, std::max( 32768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) x() - point.x(), point.x() - right())); 32868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) Type y_distance = std::max<Type>(0, std::max( 32968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) y() - point.y(), point.y() - bottom())); 33068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 33168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) return x_distance + y_distance; 33268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 33368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 334a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)template<typename Class, 335a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typename PointClass, 336a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typename SizeClass, 337a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typename InsetsClass, 338a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typename VectorClass, 339a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) typename Type> 340a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)Type RectBase<Class, PointClass, SizeClass, InsetsClass, VectorClass, Type>:: 341a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ManhattanInternalDistance(const Class& rect) const { 342a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Class c(x(), y(), width(), height()); 343a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) c.Union(rect); 344a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 345a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) static const Type kEpsilon = std::numeric_limits<Type>::is_integer 346a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ? 1 347a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) : std::numeric_limits<Type>::epsilon(); 348a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 349a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Type x = std::max<Type>(0, c.width() - width() - rect.width() + kEpsilon); 350a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Type y = std::max<Type>(0, c.height() - height() - rect.height() + kEpsilon); 351a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) return x + y; 352a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles)} 353a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace gfx 355