15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/* 25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2003, 2006 Apple Computer, Inc. All rights reserved. 35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2005 Nokia. All rights reserved. 45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2008 Eric Seidel <eric@webkit.org> 55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Redistribution and use in source and binary forms, with or without 75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modification, are permitted provided that the following conditions 85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * are met: 95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 1. Redistributions of source code must retain the above copyright 105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer. 115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 2. Redistributions in binary form must reproduce the above copyright 125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * notice, this list of conditions and the following disclaimer in the 135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * documentation and/or other materials provided with the distribution. 145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * 155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY 165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR 195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */ 275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifndef FloatSize_h 295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#define FloatSize_h 305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/platform/graphics/IntPoint.h" 327757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch#include "wtf/MathExtras.h" 335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 3553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(DARWIN) 365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct CGSize CGSize; 375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#ifdef NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES 395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct CGSize NSSize; 405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#else 415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)typedef struct _NSSize NSSize; 425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore { 465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class IntSize; 485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class LayoutSize; 495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)class FloatSize { 515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)public: 525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize() : m_width(0), m_height(0) { } 535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize(float width, float height) : m_width(width), m_height(height) { } 545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize(const IntSize&); 555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize(const LayoutSize&); 565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) static FloatSize narrowPrecision(double width, double height); 585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float width() const { return m_width; } 605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float height() const { return m_height; } 615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setWidth(float width) { m_width = width; } 635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void setHeight(float height) { m_height = height; } 645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isEmpty() const { return m_width <= 0 || m_height <= 0; } 665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isZero() const; 675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) bool isExpressibleAsIntSize() const; 685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float aspectRatio() const { return m_width / m_height; } 705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void expand(float width, float height) 725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_width += width; 745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height += height; 755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void scale(float s) { scale(s, s); } 785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) void scale(float scaleX, float scaleY) 805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_width *= scaleX; 825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height *= scaleY; 835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize expandedTo(const FloatSize& other) const 865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(m_width > other.m_width ? m_width : other.m_width, 885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height > other.m_height ? m_height : other.m_height); 895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize shrunkTo(const FloatSize& other) const 925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(m_width < other.m_width ? m_width : other.m_width, 945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) m_height < other.m_height ? m_height : other.m_height); 955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float diagonalLength() const; 985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float diagonalLengthSquared() const 995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return m_width * m_width + m_height * m_height; 1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) FloatSize transposedSize() const 1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) { 1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(m_height, m_width); 1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) } 1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 10853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if OS(DARWIN) 1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit FloatSize(const CGSize&); // don't do this implicitly since it's lossy 1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator CGSize() const; 11153e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#if !defined(NSGEOMETRY_TYPES_SAME_AS_CGGEOMETRY_TYPES) 1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) explicit FloatSize(const NSSize &); // don't do this implicitly since it's lossy 1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) operator NSSize() const; 1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif 11553e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#endif 1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)private: 1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) float m_width, m_height; 1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}; 1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline FloatSize& operator+=(FloatSize& a, const FloatSize& b) 1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setWidth(a.width() + b.width()); 1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setHeight(a.height() + b.height()); 1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline FloatSize& operator-=(FloatSize& a, const FloatSize& b) 1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setWidth(a.width() - b.width()); 1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) a.setHeight(a.height() - b.height()); 1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a; 1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline FloatSize operator+(const FloatSize& a, const FloatSize& b) 1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(a.width() + b.width(), a.height() + b.height()); 1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline FloatSize operator-(const FloatSize& a, const FloatSize& b) 1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(a.width() - b.width(), a.height() - b.height()); 1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline FloatSize operator-(const FloatSize& size) 1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return FloatSize(-size.width(), -size.height()); 1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 150926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline FloatSize operator*(const FloatSize& a, const float b) 151926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 152926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return FloatSize(a.width() * b, a.height() * b); 153926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 154926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 155926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)inline FloatSize operator*(const float a, const FloatSize& b) 156926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles){ 157926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) return FloatSize(a * b.width(), a * b.height()); 158926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)} 159926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles) 1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator==(const FloatSize& a, const FloatSize& b) 1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.width() == b.width() && a.height() == b.height(); 1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline bool operator!=(const FloatSize& a, const FloatSize& b) 1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return a.width() != b.width() || a.height() != b.height(); 1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize roundedIntSize(const FloatSize& p) 1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(clampToInteger(roundf(p.width())), clampToInteger(roundf(p.height()))); 1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize flooredIntSize(const FloatSize& p) 1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(clampToInteger(floorf(p.width())), clampToInteger(floorf(p.height()))); 1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntSize expandedIntSize(const FloatSize& p) 1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntSize(clampToInteger(ceilf(p.width())), clampToInteger(ceilf(p.height()))); 1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)inline IntPoint flooredIntPoint(const FloatSize& p) 1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){ 1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) return IntPoint(clampToInteger(floorf(p.width())), clampToInteger(floorf(p.height()))); 1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} 1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore 1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) 1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#endif // FloatSize_h 193