107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch/*
207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * Copyright (C) 2013 Adobe Systems Incorporated. All rights reserved.
307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *
407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * Redistribution and use in source and binary forms, with or without
507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * modification, are permitted provided that the following conditions
607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * are met:
707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *
807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * 1. Redistributions of source code must retain the above
907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *    copyright notice, this list of conditions and the following
1007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *    disclaimer.
1107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * 2. Redistributions in binary form must reproduce the above
1207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *    copyright notice, this list of conditions and the following
1307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *    disclaimer in the documentation and/or other materials
1407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *    provided with the distribution.
1507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch *
1607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER “AS IS” AND ANY
1707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE
2007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
2107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
2207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
2307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR
2507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
2607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch * SUCH DAMAGE.
2807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch */
2907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#ifndef FloatBoxExtent_h
3107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#define FloatBoxExtent_h
3207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#include "platform/geometry/FloatRect.h"
3407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
35c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
3607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
3707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochclass FloatBoxExtent {
3807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochpublic:
3907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FloatBoxExtent()
4007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        : m_top(0)
4107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_right(0)
4207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_bottom(0)
4307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_left(0)
4407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
4507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
4607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
4707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    FloatBoxExtent(float top, float right, float bottom, float left)
4807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        : m_top(top)
4907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_right(right)
5007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_bottom(bottom)
5107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        , m_left(left)
5207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
5307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
5407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float top() const { return m_top; }
5607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setTop(float top) { m_top = top; }
5707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
5807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float right() const { return m_right; }
5907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setRight(float right) { m_right = right; }
6007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float bottom() const { return m_bottom; }
6207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setBottom(float bottom) { m_bottom = bottom; }
6307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float left() const { return m_left; }
6507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void setLeft(float left) { m_left = left; }
6607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    bool isZero() const { return !left() && !right() && !top() && !bottom(); }
6807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
6907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void expandRect(FloatRect& rect) const
7007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
7107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        if (isZero())
7207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch            return;
7307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        rect.move(-left(), -top());
7507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        rect.expand(left() + right(), top() + bottom());
7607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
7707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
7807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void unite(const FloatBoxExtent& other)
7907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
8007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_top = std::min(m_top, other.top());
8107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_right = std::max(m_right, other.right());
8207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_bottom = std::max(m_bottom, other.bottom());
8307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_left = std::min(m_left, other.left());
8407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
8507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
8607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    void unite(const FloatRect& rect)
8707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    {
8807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_top = std::min(m_top, rect.y());
8907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_right = std::max(m_right, rect.maxX());
9007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_bottom = std::max(m_bottom, rect.maxY());
9107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        m_left = std::min(m_left, rect.x());
9207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    }
9307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
9407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochprivate:
9507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float m_top;
9607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float m_right;
9707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float m_bottom;
9807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    float m_left;
9907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch};
10007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
10107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochinline bool operator==(const FloatBoxExtent& a, const FloatBoxExtent& b)
10207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
10307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return a.top() == b.top()
10407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        && a.right() == b.right()
10507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        && a.bottom() == b.bottom()
10607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch        && a.left() == b.left();
10707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
10807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
10907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochinline bool operator!=(const FloatBoxExtent& a, const FloatBoxExtent& b)
11007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
11107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    return !(a == b);
11207a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
11307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
11407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdochinline void operator+=(FloatBoxExtent& a, const FloatBoxExtent& b)
11507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch{
11607a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    a.setTop(a.top() + b.top());
11707a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    a.setRight(a.right() + b.right());
11807a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    a.setBottom(a.bottom() + b.bottom());
11907a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch    a.setLeft(a.left() + b.left());
12007a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch}
12107a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
122c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
12307a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12407a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch
12507a852d8c1953036774d8f3b65d18dcfea3bb4a2Ben Murdoch#endif // FloatBoxExtent_h
126