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)
41c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
43197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch#if !ERROR_DISABLED
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); }
719e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit(float value) { m_value = clampTo<int>(value * kFixedPointDenominator); }
729e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    LayoutUnit(double value) { m_value = clampTo<int>(value * kFixedPointDenominator); }
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
223197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch    ALWAYS_INLINE void setValue(int value)
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
225197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_value = saturatedSet(value, kLayoutUnitFractionalBits);
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
227197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    inline void setValue(unsigned value)
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    {
230197021e6b966cfb06891637935ef33fff06433d1Ben Murdoch        m_value = saturatedSet(value, kLayoutUnitFractionalBits);
2315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    int m_value;
2345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)};
2355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, const LayoutUnit& b)
2375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() <= b.rawValue();
2395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, float b)
2425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() <= b;
2445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const LayoutUnit& a, int b)
2475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a <= LayoutUnit(b);
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const float a, const LayoutUnit& b)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a <= b.toFloat();
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<=(const int a, const LayoutUnit& b)
2575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) <= b;
2595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, const LayoutUnit& b)
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() >= b.rawValue();
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, int b)
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a >= LayoutUnit(b);
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const float a, const LayoutUnit& b)
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a >= b.toFloat();
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const LayoutUnit& a, float b)
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() >= b;
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>=(const int a, const LayoutUnit& b)
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) >= b;
2845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, const LayoutUnit& b)
2875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() < b.rawValue();
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, int b)
2925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a < LayoutUnit(b);
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, float b)
2975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() < b;
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const LayoutUnit& a, double b)
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() < b;
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const int a, const LayoutUnit& b)
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) < b;
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator<(const float a, const LayoutUnit& b)
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a < b.toFloat();
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, const LayoutUnit& b)
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() > b.rawValue();
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, double b)
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() > b;
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, float b)
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() > b;
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const LayoutUnit& a, int b)
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > LayoutUnit(b);
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const int a, const LayoutUnit& b)
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) > b;
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const float a, const LayoutUnit& b)
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > b.toFloat();
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator>(const double a, const LayoutUnit& b)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a > b.toDouble();
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, const LayoutUnit& b)
3525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() != b.rawValue();
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, float b)
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a != LayoutUnit(b);
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const int a, const LayoutUnit& b)
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) != b;
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const LayoutUnit& a, int b)
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a != LayoutUnit(b);
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, const LayoutUnit& b)
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.rawValue() == b.rawValue();
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, int b)
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a == LayoutUnit(b);
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const int a, const LayoutUnit& b)
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) == b;
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const LayoutUnit& a, float b)
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() == b;
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const float a, const LayoutUnit& b)
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a == b.toFloat();
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For multiplication that's prone to overflow, this bounds it to LayoutUnit::max() and ::min()
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit boundedMultiply(const LayoutUnit& a, const LayoutUnit& b)
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
39953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    int64_t result = static_cast<int64_t>(a.rawValue()) * static_cast<int64_t>(b.rawValue()) / kFixedPointDenominator;
400926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int32_t high = static_cast<int32_t>(result >> 32);
401926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    int32_t low = static_cast<int32_t>(result);
402926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    uint32_t saturated = (static_cast<uint32_t>(a.rawValue() ^ b.rawValue()) >> 31) + std::numeric_limits<int>::max();
403926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    // If the higher 32 bits does not match the lower 32 with sign extension the operation overflowed.
404926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    if (high != low >> 31)
405926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)        result = saturated;
406926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
408926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    returnVal.setRawValue(static_cast<int>(result));
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, const LayoutUnit& b)
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return boundedMultiply(a, b);
41553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)}
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator*(const LayoutUnit& a, double b)
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() * b;
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator*(const LayoutUnit& a, float b)
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() * b;
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, int b)
4285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * LayoutUnit(b);
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
432926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned short b)
433926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
434926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
435926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
436926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned b)
4385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * LayoutUnit(b);
4405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
442926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned long b)
443926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
444926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
445926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
446926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
447926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(const LayoutUnit& a, unsigned long long b)
448926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
449926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a * LayoutUnit(b);
450926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
451926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
452926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned short a, const LayoutUnit& b)
453926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
454926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
455926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
456926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(unsigned a, const LayoutUnit& b)
4585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) * b;
4605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
462926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned long a, const LayoutUnit& b)
463926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
464926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
465926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
466926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
467926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator*(unsigned long long a, const LayoutUnit& b)
468926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
469926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) * b;
470926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
471926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
4725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator*(const int a, const LayoutUnit& b)
4735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) * b;
4755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator*(const float a, const LayoutUnit& b)
4785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * b.toFloat();
4805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator*(const double a, const LayoutUnit& b)
4835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a * b.toDouble();
4855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, const LayoutUnit& b)
4885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
49053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    long long rawVal = static_cast<long long>(kFixedPointDenominator) * a.rawValue() / b.rawValue();
491926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    returnVal.setRawValue(clampTo<int>(rawVal));
4925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
49302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch}
4945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator/(const LayoutUnit& a, float b)
4965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() / b;
4985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator/(const LayoutUnit& a, double b)
5015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() / b;
5035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, int b)
5065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / LayoutUnit(b);
5085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
510926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned short b)
511926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
512926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
513926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
514926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned b)
5165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / LayoutUnit(b);
5185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
520926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned long b)
521926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
522926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
523926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
524926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
525926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(const LayoutUnit& a, unsigned long long b)
526926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
527926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return a / LayoutUnit(b);
528926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
529926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator/(const float a, const LayoutUnit& b)
5315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / b.toFloat();
5335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator/(const double a, const LayoutUnit& b)
5365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a / b.toDouble();
5385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(const int a, const LayoutUnit& b)
5415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) / b;
5435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
545926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned short a, const LayoutUnit& b)
546926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
547926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
548926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
549926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
5505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator/(unsigned a, const LayoutUnit& b)
5515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) / b;
5535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
555926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned long a, const LayoutUnit& b)
556926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
557926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
558926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
559926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
560926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline LayoutUnit operator/(unsigned long long a, const LayoutUnit& b)
561926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){
562926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    return LayoutUnit(a) / b;
563926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)}
564926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)
565d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ALWAYS_INLINE LayoutUnit operator+(const LayoutUnit& a, const LayoutUnit& b)
5665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
5685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(saturatedAddition(a.rawValue(), b.rawValue()));
5695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
5705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator+(const LayoutUnit& a, int b)
5735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + LayoutUnit(b);
5755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator+(const LayoutUnit& a, float b)
5785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() + b;
5805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator+(const LayoutUnit& a, double b)
5835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toDouble() + b;
5855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator+(const int a, const LayoutUnit& b)
5885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) + b;
5905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator+(const float a, const LayoutUnit& b)
5935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + b.toFloat();
5955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
5965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
5975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline double operator+(const double a, const LayoutUnit& b)
5985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a + b.toDouble();
6005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
602d6cdb82654e8f3343a693ca752d5c4cee0324e17Torne (Richard Coles)ALWAYS_INLINE LayoutUnit operator-(const LayoutUnit& a, const LayoutUnit& b)
6035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(saturatedSubtraction(a.rawValue(), b.rawValue()));
6065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a, int b)
6105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - LayoutUnit(b);
6125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a, unsigned b)
6155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - LayoutUnit(b);
6175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator-(const LayoutUnit& a, float b)
6205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a.toFloat() - b;
6225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const int a, const LayoutUnit& b)
6255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) - b;
6275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float operator-(const float a, const LayoutUnit& b)
6305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a - b.toFloat();
6325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator-(const LayoutUnit& a)
6355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(-a.rawValue());
6385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// For returning the remainder after a division with integer results.
6425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit intMod(const LayoutUnit& a, const LayoutUnit& b)
6435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This calculates the modulo so that: a = static_cast<int>(a / b) * b + intMod(a, b).
6455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
6465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    returnVal.setRawValue(a.rawValue() % b.rawValue());
6475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(const LayoutUnit& a, const LayoutUnit& b)
6515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // This calculates the modulo so that: a = (a / b) * b + a % b.
6535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit returnVal;
65453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    long long rawVal = (static_cast<long long>(kFixedPointDenominator) * a.rawValue()) % b.rawValue();
65553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)    returnVal.setRawValue(rawVal / kFixedPointDenominator);
6565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return returnVal;
6575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(const LayoutUnit& a, int b)
6605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a % LayoutUnit(b);
6625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit operator%(int a, const LayoutUnit& b)
6655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LayoutUnit(a) % b;
6675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, const LayoutUnit& b)
6705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a.setRawValue(saturatedAddition(a.rawValue(), b.rawValue()));
6725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, int b)
6765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator+=(LayoutUnit& a, float b)
6825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator+=(float& a, const LayoutUnit& b)
6885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a + b;
6905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, int b)
6945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
6955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
6965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
6975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
6985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
6995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, const LayoutUnit& b)
7005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a.setRawValue(saturatedSubtraction(a.rawValue(), b.rawValue()));
7025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator-=(LayoutUnit& a, float b)
7065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
7085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator-=(float& a, const LayoutUnit& b)
7125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a - b;
7145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator*=(LayoutUnit& a, const LayoutUnit& b)
7185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operator*=(LayoutUnit& a, int b) is supported by the operator above plus LayoutUnit(int).
7235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator*=(LayoutUnit& a, float b)
7255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator*=(float& a, const LayoutUnit& b)
7315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a * b;
7335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator/=(LayoutUnit& a, const LayoutUnit& b)
7375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)// operator/=(LayoutUnit& a, int b) is supported by the operator above plus LayoutUnit(int).
7425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit& operator/=(LayoutUnit& a, float b)
7445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline float& operator/=(float& a, const LayoutUnit& b)
7505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    a = a / b;
7525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return a;
7535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
75502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochinline int snapSizeToPixel(LayoutUnit size, LayoutUnit location)
7565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    LayoutUnit fraction = location.fraction();
7585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (fraction + size).round() - fraction.round();
7595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int roundToInt(LayoutUnit value)
7625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.round();
7645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline int floorToInt(LayoutUnit value)
7675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.floor();
7695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit absoluteValue(const LayoutUnit& value)
7725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.abs();
7745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline LayoutUnit layoutMod(const LayoutUnit& numerator, const LayoutUnit& denominator)
7775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return numerator % denominator;
7795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool isIntegerValue(const LayoutUnit value)
7825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
7835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return value.toInt() == value;
7845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
7855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
786d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)inline LayoutUnit clampToLayoutUnit(LayoutUnit value, LayoutUnit min, LayoutUnit max)
787d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles){
788d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value >= max)
789d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return max;
790d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    if (value <= min)
791d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)        return min;
792d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)    return value;
793d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)}
794d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)
795c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
7965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
7975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // LayoutUnit_h
798