15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (c) 2012, Google 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 are
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * met:
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions of source code must retain the above copyright
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Redistributions in binary form must reproduce the above
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * copyright notice, this list of conditions and the following disclaimer
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * in the documentation and/or other materials provided with the
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * distribution.
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *     * Neither the name of Google Inc. nor the names of its
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * contributors may be used to endorse or promote products derived from
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * this software without specific prior written permission.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef LayoutUnit_h
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define LayoutUnit_h
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include "wtf/Assertions.h"
35c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/MathExtras.h"
36c0e19a689c8ac22cdc96b291a8d33a5d3b0b34a4Torne (Richard Coles)#include "wtf/SaturatedArithmetic.h"
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits.h>
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include <limits>
398abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#include <stdlib.h>
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef NDEBUG
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define REPORT_OVERFLOW(doesOverflow) ((void)0)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define REPORT_OVERFLOW(doesOverflow) do \
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (!(doesOverflow)) { \
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        WTFReportError(__FILE__, __LINE__, WTF_PRETTY_FUNCTION, "!(%s)", #doesOverflow); \
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    } \
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)while (0)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
57f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic const int kLayoutUnitFractionalBits = 6;
58f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liustatic const int kFixedPointDenominator = 1 << kLayoutUnitFractionalBits;
59926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
6053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const int intMaxForLayoutUnit = INT_MAX / kFixedPointDenominator;
6153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)const int intMinForLayoutUnit = INT_MIN / kFixedPointDenominator;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class LayoutUnit {
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public:
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit() : m_value(0) { }
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit(int value) { setValue(value); }
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit(unsigned short value) { setValue(value); }
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit(unsigned value) { setValue(value); }
6953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    LayoutUnit(unsigned long value) { m_value = clampTo<int>(value * kFixedPointDenominator); }
7053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    LayoutUnit(unsigned long long value) { m_value = clampTo<int>(value * kFixedPointDenominator); }
7153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    LayoutUnit(float value) { m_value = clampTo<float>(value * kFixedPointDenominator, static_cast<float>(INT_MIN), static_cast<float>(INT_MAX)); }
7253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    LayoutUnit(double value) { m_value = clampTo<double>(value * kFixedPointDenominator, static_cast<double>(INT_MIN), static_cast<double>(INT_MAX)); }
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LayoutUnit fromFloatCeil(float value)
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit v;
7753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        v.m_value = clampToInteger(ceilf(value * kFixedPointDenominator));
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return v;
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LayoutUnit fromFloatFloor(float value)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit v;
8453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        v.m_value = clampToInteger(floorf(value * kFixedPointDenominator));
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return v;
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LayoutUnit fromFloatRound(float value)
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value >= 0)
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return clamp(value + epsilon() / 2.0f);
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return clamp(value - epsilon() / 2.0f);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int toInt() const { return m_value / kFixedPointDenominator; }
9653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    float toFloat() const { return static_cast<float>(m_value) / kFixedPointDenominator; }
9753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    double toDouble() const { return static_cast<double>(m_value) / kFixedPointDenominator; }
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float ceilToFloat() const
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        float floatValue = toFloat();
10153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (static_cast<int>(floatValue * kFixedPointDenominator) == m_value)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return floatValue;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (floatValue > 0)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return nextafterf(floatValue, std::numeric_limits<float>::max());
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return nextafterf(floatValue, std::numeric_limits<float>::min());
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned toUnsigned() const { REPORT_OVERFLOW(m_value >= 0); return toInt(); }
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator int() const { return toInt(); }
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator unsigned() const { return toUnsigned(); }
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator double() const { return toDouble(); }
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    operator bool() const { return m_value; }
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit operator++(int)
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
11653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m_value += kFixedPointDenominator;
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return *this;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline int rawValue() const { return m_value; }
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline void setRawValue(int value) { m_value = value; }
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    void setRawValue(long long value)
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        REPORT_OVERFLOW(value > std::numeric_limits<int>::min() && value < std::numeric_limits<int>::max());
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_value = static_cast<int>(value);
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit abs() const
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit returnValue;
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        returnValue.setRawValue(::abs(m_value));
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return returnValue;
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1348abfc5808a4e34d6e03867af8bc440dee641886fTorne (Richard Coles)#if OS(MACOSX)
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int wtf_ceil() const
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int ceil() const
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
14053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (UNLIKELY(m_value >= INT_MAX - kFixedPointDenominator + 1))
141926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return intMaxForLayoutUnit;
14253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (m_value >= 0)
14453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            return (m_value + kFixedPointDenominator - 1) / kFixedPointDenominator;
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return toInt();
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
147d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)    ALWAYS_INLINE int round() const
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
149f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return saturatedAddition(rawValue(), kFixedPointDenominator / 2) >> kLayoutUnitFractionalBits;
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int floor() const
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
15453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        if (UNLIKELY(m_value <= INT_MIN + kFixedPointDenominator - 1))
155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)            return intMinForLayoutUnit;
15653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
157f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu        return m_value >> kLayoutUnitFractionalBits;
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit fraction() const
16102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    {
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Add the fraction to the size (as opposed to the full location) to avoid overflows.
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        // Compute fraction using the mod operator to preserve the sign of the value as it may affect rounding.
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit fraction;
16553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        fraction.setRawValue(rawValue() % kFixedPointDenominator);
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return fraction;
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
16993ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    bool mightBeSaturated() const
17093ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    {
17193ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)        return rawValue() == std::numeric_limits<int>::max()
17293ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)            || rawValue() == std::numeric_limits<int>::min();
17393ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)    }
17493ac45cfc74041c8ae536ce58a9534d46db2024eTorne (Richard Coles)
17553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    static float epsilon() { return 1.0f / kFixedPointDenominator; }
17653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)
1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const LayoutUnit max()
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit m;
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m.m_value = std::numeric_limits<int>::max();
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m;
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const LayoutUnit min()
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit m;
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m.m_value = std::numeric_limits<int>::min();
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m;
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Versions of max/min that are slightly smaller/larger than max/min() to allow for roinding without overflowing.
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const LayoutUnit nearlyMax()
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit m;
19453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m.m_value = std::numeric_limits<int>::max() - kFixedPointDenominator / 2;
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m;
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static const LayoutUnit nearlyMin()
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        LayoutUnit m;
20053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        m.m_value = std::numeric_limits<int>::min() + kFixedPointDenominator / 2;
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m;
2025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
20302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static LayoutUnit clamp(double value)
2055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return clampTo<LayoutUnit>(value, LayoutUnit::min(), LayoutUnit::max());
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private:
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isInBounds(int value)
2115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
21253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return ::abs(value) <= std::numeric_limits<int>::max() / kFixedPointDenominator;
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isInBounds(unsigned value)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
21653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return value <= static_cast<unsigned>(std::numeric_limits<int>::max()) / kFixedPointDenominator;
2175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    static bool isInBounds(double value)
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
22053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)        return ::fabs(value) <= std::numeric_limits<int>::max() / kFixedPointDenominator;
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
22202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline void setValue(int value)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value > intMaxForLayoutUnit)
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_value = std::numeric_limits<int>::max();
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else if (value < intMinForLayoutUnit)
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_value = std::numeric_limits<int>::min();
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
23053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            m_value = value * kFixedPointDenominator;
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline void setValue(unsigned value)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (value >= static_cast<unsigned>(intMaxForLayoutUnit))
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            m_value = std::numeric_limits<int>::max();
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        else
23753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)            m_value = value * kFixedPointDenominator;
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_value;
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, const LayoutUnit& b)
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() <= b.rawValue();
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, float b)
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() <= b;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, int b)
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a <= LayoutUnit(b);
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const float a, const LayoutUnit& b)
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a <= b.toFloat();
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const int a, const LayoutUnit& b)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) <= b;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, const LayoutUnit& b)
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() >= b.rawValue();
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, int b)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a >= LayoutUnit(b);
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const float a, const LayoutUnit& b)
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a >= b.toFloat();
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, float b)
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() >= b;
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const int a, const LayoutUnit& b)
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) >= b;
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, const LayoutUnit& b)
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() < b.rawValue();
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, int b)
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a < LayoutUnit(b);
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, float b)
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() < b;
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, double b)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() < b;
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const int a, const LayoutUnit& b)
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) < b;
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const float a, const LayoutUnit& b)
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a < b.toFloat();
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, const LayoutUnit& b)
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() > b.rawValue();
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, double b)
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() > b;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, float b)
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() > b;
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, int b)
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > LayoutUnit(b);
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const int a, const LayoutUnit& b)
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) > b;
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const float a, const LayoutUnit& b)
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > b.toFloat();
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const double a, const LayoutUnit& b)
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > b.toDouble();
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, const LayoutUnit& b)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() != b.rawValue();
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, float b)
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a != LayoutUnit(b);
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const int a, const LayoutUnit& b)
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) != b;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, int b)
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a != LayoutUnit(b);
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, const LayoutUnit& b)
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() == b.rawValue();
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, int b)
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a == LayoutUnit(b);
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const int a, const LayoutUnit& b)
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) == b;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, float b)
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() == b;
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const float a, const LayoutUnit& b)
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a == b.toFloat();
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For multiplication that's prone to overflow, this bounds it to LayoutUnit::max() and ::min()
4045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit boundedMultiply(const LayoutUnit& a, const LayoutUnit& b)
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
40653e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int64_t result = static_cast<int64_t>(a.rawValue()) * static_cast<int64_t>(b.rawValue()) / kFixedPointDenominator;
407926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int32_t high = static_cast<int32_t>(result >> 32);
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int32_t low = static_cast<int32_t>(result);
409926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uint32_t saturated = (static_cast<uint32_t>(a.rawValue() ^ b.rawValue()) >> 31) + std::numeric_limits<int>::max();
410926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the higher 32 bits does not match the lower 32 with sign extension the operation overflowed.
411926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (high != low >> 31)
412926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result = saturated;
413926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
415926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    returnVal.setRawValue(static_cast<int>(result));
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, const LayoutUnit& b)
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return boundedMultiply(a, b);
42253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator*(const LayoutUnit& a, double b)
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() * b;
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator*(const LayoutUnit& a, float b)
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() * b;
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, int b)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * LayoutUnit(b);
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
439926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned short b)
440926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
441926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned b)
4455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * LayoutUnit(b);
4475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned long b)
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned long long b)
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
457926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
458926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
459926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned short a, const LayoutUnit& b)
460926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
461926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(unsigned a, const LayoutUnit& b)
4655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) * b;
4675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned long a, const LayoutUnit& b)
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
472926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
473926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
474926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned long long a, const LayoutUnit& b)
475926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
476926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
477926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
478926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const int a, const LayoutUnit& b)
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) * b;
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator*(const float a, const LayoutUnit& b)
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * b.toFloat();
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator*(const double a, const LayoutUnit& b)
4905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * b.toDouble();
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, const LayoutUnit& b)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
49753e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    long long rawVal = static_cast<long long>(kFixedPointDenominator) * a.rawValue() / b.rawValue();
498926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    returnVal.setRawValue(clampTo<int>(rawVal));
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
50002772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch}
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator/(const LayoutUnit& a, float b)
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() / b;
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator/(const LayoutUnit& a, double b)
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() / b;
5105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, int b)
5135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / LayoutUnit(b);
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
517926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned short b)
518926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
519926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
521926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned b)
5235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / LayoutUnit(b);
5255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
527926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned long b)
528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
530926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
531926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
532926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned long long b)
533926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
534926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
535926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
536926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator/(const float a, const LayoutUnit& b)
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / b.toFloat();
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator/(const double a, const LayoutUnit& b)
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / b.toDouble();
5455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const int a, const LayoutUnit& b)
5485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) / b;
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
552926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned short a, const LayoutUnit& b)
553926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
554926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(unsigned a, const LayoutUnit& b)
5585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) / b;
5605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned long a, const LayoutUnit& b)
563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
564926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
565926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
566926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
567926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned long long a, const LayoutUnit& b)
568926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
569926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
570926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
571926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
572d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ALWAYS_INLINE LayoutUnit operator+(const LayoutUnit& a, const LayoutUnit& b)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(saturatedAddition(a.rawValue(), b.rawValue()));
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator+(const LayoutUnit& a, int b)
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + LayoutUnit(b);
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator+(const LayoutUnit& a, float b)
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() + b;
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator+(const LayoutUnit& a, double b)
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() + b;
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator+(const int a, const LayoutUnit& b)
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) + b;
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator+(const float a, const LayoutUnit& b)
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + b.toFloat();
6025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator+(const double a, const LayoutUnit& b)
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + b.toDouble();
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
609d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ALWAYS_INLINE LayoutUnit operator-(const LayoutUnit& a, const LayoutUnit& b)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(saturatedSubtraction(a.rawValue(), b.rawValue()));
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a, int b)
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - LayoutUnit(b);
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a, unsigned b)
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - LayoutUnit(b);
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator-(const LayoutUnit& a, float b)
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() - b;
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const int a, const LayoutUnit& b)
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) - b;
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator-(const float a, const LayoutUnit& b)
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - b.toFloat();
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a)
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(-a.rawValue());
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For returning the remainder after a division with integer results.
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit intMod(const LayoutUnit& a, const LayoutUnit& b)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This calculates the modulo so that: a = static_cast<int>(a / b) * b + intMod(a, b).
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(a.rawValue() % b.rawValue());
6545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(const LayoutUnit& a, const LayoutUnit& b)
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This calculates the modulo so that: a = (a / b) * b + a % b.
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
66153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    long long rawVal = (static_cast<long long>(kFixedPointDenominator) * a.rawValue()) % b.rawValue();
66253e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    returnVal.setRawValue(rawVal / kFixedPointDenominator);
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(const LayoutUnit& a, int b)
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a % LayoutUnit(b);
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(int a, const LayoutUnit& b)
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) % b;
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, const LayoutUnit& b)
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a.setRawValue(saturatedAddition(a.rawValue(), b.rawValue()));
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, int b)
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, float b)
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator+=(float& a, const LayoutUnit& b)
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, int b)
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, const LayoutUnit& b)
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a.setRawValue(saturatedSubtraction(a.rawValue(), b.rawValue()));
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, float b)
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator-=(float& a, const LayoutUnit& b)
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator*=(LayoutUnit& a, const LayoutUnit& b)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operator*=(LayoutUnit& a, int b) is supported by the operator above plus LayoutUnit(int).
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator*=(LayoutUnit& a, float b)
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator*=(float& a, const LayoutUnit& b)
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator/=(LayoutUnit& a, const LayoutUnit& b)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operator/=(LayoutUnit& a, int b) is supported by the operator above plus LayoutUnit(int).
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator/=(LayoutUnit& a, float b)
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator/=(float& a, const LayoutUnit& b)
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
76202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochinline int snapSizeToPixel(LayoutUnit size, LayoutUnit location)
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit fraction = location.fraction();
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (fraction + size).round() - fraction.round();
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int roundToInt(LayoutUnit value)
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.round();
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int floorToInt(LayoutUnit value)
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.floor();
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit absoluteValue(const LayoutUnit& value)
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.abs();
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit layoutMod(const LayoutUnit& numerator, const LayoutUnit& denominator)
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return numerator % denominator;
7865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isIntegerValue(const LayoutUnit value)
7895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.toInt() == value;
7915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)inline LayoutUnit clampToLayoutUnit(LayoutUnit value, LayoutUnit min, LayoutUnit max)
794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
795d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value >= max)
796d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return max;
797d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value <= min)
798d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return min;
799d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return value;
800d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
801d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
8025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
8035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
8045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // LayoutUnit_h
805