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