15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 1999 Lars Knoll (knoll@kde.org)
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2011 Rik Cabanier (cabanier@adobe.com)
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Copyright (C) 2012 Motorola Mobility, Inc. All rights reserved.
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
24bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "config.h"
25bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/LengthFunctions.h"
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/LayoutUnit.h"
2809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)#include "platform/LengthSize.h"
295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
30c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)namespace blink {
315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)int intValueForLength(const Length& length, LayoutUnit maximumValue)
3309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
3409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return static_cast<int>(valueForLength(length, maximumValue));
3509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
3609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
37bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)float floatValueForLength(const Length& length, float maximumValue)
38bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles){
39bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    switch (length.type()) {
40bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case Fixed:
41bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return length.getFloatValue();
42bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case Percent:
43bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<float>(maximumValue * length.percent() / 100.0f);
44bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case FillAvailable:
45bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case Auto:
46bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<float>(maximumValue);
47bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case Calculated:
48bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return length.nonNanCalculatedValue(maximumValue);
4909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Intrinsic:
5009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MinIntrinsic:
5109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MinContent:
5209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MaxContent:
5309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case FitContent:
5409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case ExtendToZoom:
5509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceWidth:
5609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceHeight:
579e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case MaxSizeNone:
5809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT_NOT_REACHED();
5909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
6009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
6109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_NOT_REACHED();
6209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return 0;
6309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
6409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
6509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)LayoutUnit minimumValueForLength(const Length& length, LayoutUnit maximumValue)
6609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
6709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    switch (length.type()) {
6809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Fixed:
6909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return length.value();
7009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Percent:
7109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        // Don't remove the extra cast to float. It is needed for rounding on 32-bit Intel machines that use the FPU stack.
7209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return static_cast<float>(maximumValue * length.percent() / 100.0f);
7309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Calculated:
7409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return length.nonNanCalculatedValue(maximumValue);
7509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case FillAvailable:
7609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Auto:
77bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 0;
78bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case Intrinsic:
79bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case MinIntrinsic:
80bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case MinContent:
81bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case MaxContent:
82bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case FitContent:
83bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    case ExtendToZoom:
8409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceWidth:
8509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceHeight:
869e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case MaxSizeNone:
87bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        ASSERT_NOT_REACHED();
88bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return 0;
89bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    }
90bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    ASSERT_NOT_REACHED();
91bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    return 0;
92bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)}
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
9409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)LayoutUnit roundedMinimumValueForLength(const Length& length, LayoutUnit maximumValue)
9509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
9609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    if (length.type() == Percent)
9709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return static_cast<LayoutUnit>(round(maximumValue * length.percent() / 100.0f));
9809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return minimumValueForLength(length, maximumValue);
9909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
10009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
10109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)LayoutUnit valueForLength(const Length& length, LayoutUnit maximumValue)
10209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
10309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    switch (length.type()) {
10409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Fixed:
10509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Percent:
10609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Calculated:
10709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return minimumValueForLength(length, maximumValue);
10809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case FillAvailable:
10909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Auto:
11009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return maximumValue;
11109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case Intrinsic:
11209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MinIntrinsic:
11309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MinContent:
11409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case MaxContent:
11509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case FitContent:
11609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case ExtendToZoom:
11709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceWidth:
11809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    case DeviceHeight:
1199e12abdf8c3a23d52091ea54ebb6a04d327f9300Torne (Richard Coles)    case MaxSizeNone:
12009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        ASSERT_NOT_REACHED();
12109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)        return 0;
12209380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    }
12309380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    ASSERT_NOT_REACHED();
12409380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return 0;
12509380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
12609380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
12709380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)FloatSize floatSizeForLengthSize(const LengthSize& lengthSize, const FloatSize& boxSize)
12809380295ba73501a205346becac22c6978e4671dTorne (Richard Coles){
12909380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)    return FloatSize(floatValueForLength(lengthSize.width(), boxSize.width()), floatValueForLength(lengthSize.height(), boxSize.height()));
13009380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)}
13109380295ba73501a205346becac22c6978e4671dTorne (Richard Coles)
132c1847b1379d12d0e05df27436bf19a9b1bf12deaTorne (Richard Coles)} // namespace blink
133