15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2006, 2009 Apple Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THE POSSIBILITY OF SUCH DAMAGE. 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h" 271e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/IntRect.h" 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/FloatRect.h" 301e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/geometry/LayoutRect.h" 31521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include "third_party/skia/include/core/SkRect.h" 32521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 33521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)#include <algorithm> 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink { 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect::IntRect(const FloatRect& r) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_location(clampToInteger(r.x()), clampToInteger(r.y())) 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_size(clampToInteger(r.width()), clampToInteger(r.height())) 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect::IntRect(const LayoutRect& r) 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) : m_location(r.x(), r.y()) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) , m_size(r.width(), r.height()) 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool IntRect::intersects(const IntRect& other) const 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Checking emptiness handles negative widths as well as zero. 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return !isEmpty() && !other.isEmpty() 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && x() < other.maxX() && other.x() < maxX() 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && y() < other.maxY() && other.y() < maxY(); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool IntRect::contains(const IntRect& other) const 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return x() <= other.x() && maxX() >= other.maxX() 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) && y() <= other.y() && maxY() >= other.maxY(); 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void IntRect::intersect(const IntRect& other) 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 651e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int left = std::max(x(), other.x()); 661e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int top = std::max(y(), other.y()); 671e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int right = std::min(maxX(), other.maxX()); 681e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int bottom = std::min(maxY(), other.maxY()); 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Return a clean empty rectangle for non-intersecting cases. 711e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) if (left >= right || top >= bottom) { 721e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) left = 0; 731e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) top = 0; 741e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) right = 0; 751e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) bottom = 0; 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 781e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_location.setX(left); 791e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_location.setY(top); 801e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_size.setWidth(right - left); 811e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_size.setHeight(bottom - top); 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void IntRect::unite(const IntRect& other) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handle empty special cases first. 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (other.isEmpty()) 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (isEmpty()) { 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *this = other; 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 941e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int left = std::min(x(), other.x()); 951e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int top = std::min(y(), other.y()); 961e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int right = std::max(maxX(), other.maxX()); 971e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int bottom = std::max(maxY(), other.maxY()); 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 991e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_location.setX(left); 1001e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_location.setY(top); 1011e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_size.setWidth(right - left); 1021e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) m_size.setHeight(bottom - top); 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void IntRect::uniteIfNonZero(const IntRect& other) 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) // Handle empty special cases first. 1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!other.width() && !other.height()) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (!width() && !height()) { 1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *this = other; 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return; 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1151e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int left = std::min(x(), other.x()); 1161e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int top = std::min(y(), other.y()); 1171e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int right = std::max(maxX(), other.maxX()); 1181e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles) int bottom = std::max(maxY(), other.maxY()); 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_location.setX(left); 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_location.setY(top); 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size.setWidth(right - left); 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size.setHeight(bottom - top); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)void IntRect::scale(float s) 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_location.setX((int)(x() * s)); 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_location.setY((int)(y() * s)); 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size.setWidth((int)(width() * s)); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_size.setHeight((int)(height() * s)); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline int distanceToInterval(int pos, int start, int end) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos < start) 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return start - pos; 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) if (pos > end) 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return end - pos; 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return 0; 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntSize IntRect::differenceToPoint(const IntPoint& point) const 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int xdistance = distanceToInterval(point.x(), x(), maxX()); 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) int ydistance = distanceToInterval(point.y(), y(), maxY()); 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(xdistance, ydistance); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 150521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)IntRect::operator SkIRect() const 151521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 152521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) SkIRect rect = { x(), y(), maxX(), maxY() }; 153521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return rect; 154521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 155521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 156521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)IntRect::operator SkRect() const 157521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles){ 158521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) SkRect rect; 159521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) rect.set(SkIntToScalar(x()), SkIntToScalar(y()), SkIntToScalar(maxX()), SkIntToScalar(maxY())); 160521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) return rect; 161521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles)} 162521d96ec04ace82590870fb04353ec4f82bb150fTorne (Richard Coles) 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)IntRect unionRect(const Vector<IntRect>& rects) 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) IntRect result; 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) size_t count = rects.size(); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) for (size_t i = 0; i < count; ++i) 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) result.unite(rects[i]); 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return result; 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 174323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#ifndef NDEBUG 175323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) // Prints the rect to the screen. 176323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)void IntRect::show() const 177323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles){ 178323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) LayoutRect(*this).show(); 179323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)} 180323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles)#endif 181323480423219ecd77329f8326dc5e0e3b50926d4Torne (Richard Coles) 182c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink 183