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