1/*
2    Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3    Copyright (C) 2006, 2008 Apple Inc. All rights reserved.
4    Copyright (C) 2011 Rik Cabanier (cabanier@adobe.com)
5    Copyright (C) 2011 Adobe Systems Incorporated. All rights reserved.
6    Copyright (C) 2012 Motorola Mobility, Inc. All rights reserved.
7
8    This library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU Library General Public
10    License as published by the Free Software Foundation; either
11    version 2 of the License, or (at your option) any later version.
12
13    This library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
16    Library General Public License for more details.
17
18    You should have received a copy of the GNU Library General Public License
19    along with this library; see the file COPYING.LIB.  If not, write to
20    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
21    Boston, MA 02110-1301, USA.
22*/
23
24#include "config.h"
25#include "platform/LengthFunctions.h"
26
27#include "platform/LayoutUnit.h"
28#include "platform/LengthSize.h"
29
30namespace blink {
31
32int intValueForLength(const Length& length, LayoutUnit maximumValue)
33{
34    return static_cast<int>(valueForLength(length, maximumValue));
35}
36
37float floatValueForLength(const Length& length, float maximumValue)
38{
39    switch (length.type()) {
40    case Fixed:
41        return length.getFloatValue();
42    case Percent:
43        return static_cast<float>(maximumValue * length.percent() / 100.0f);
44    case FillAvailable:
45    case Auto:
46        return static_cast<float>(maximumValue);
47    case Calculated:
48        return length.nonNanCalculatedValue(maximumValue);
49    case Intrinsic:
50    case MinIntrinsic:
51    case MinContent:
52    case MaxContent:
53    case FitContent:
54    case ExtendToZoom:
55    case DeviceWidth:
56    case DeviceHeight:
57    case MaxSizeNone:
58        ASSERT_NOT_REACHED();
59        return 0;
60    }
61    ASSERT_NOT_REACHED();
62    return 0;
63}
64
65LayoutUnit minimumValueForLength(const Length& length, LayoutUnit maximumValue)
66{
67    switch (length.type()) {
68    case Fixed:
69        return length.value();
70    case Percent:
71        // Don't remove the extra cast to float. It is needed for rounding on 32-bit Intel machines that use the FPU stack.
72        return static_cast<float>(maximumValue * length.percent() / 100.0f);
73    case Calculated:
74        return length.nonNanCalculatedValue(maximumValue);
75    case FillAvailable:
76    case Auto:
77        return 0;
78    case Intrinsic:
79    case MinIntrinsic:
80    case MinContent:
81    case MaxContent:
82    case FitContent:
83    case ExtendToZoom:
84    case DeviceWidth:
85    case DeviceHeight:
86    case MaxSizeNone:
87        ASSERT_NOT_REACHED();
88        return 0;
89    }
90    ASSERT_NOT_REACHED();
91    return 0;
92}
93
94LayoutUnit roundedMinimumValueForLength(const Length& length, LayoutUnit maximumValue)
95{
96    if (length.type() == Percent)
97        return static_cast<LayoutUnit>(round(maximumValue * length.percent() / 100.0f));
98    return minimumValueForLength(length, maximumValue);
99}
100
101LayoutUnit valueForLength(const Length& length, LayoutUnit maximumValue)
102{
103    switch (length.type()) {
104    case Fixed:
105    case Percent:
106    case Calculated:
107        return minimumValueForLength(length, maximumValue);
108    case FillAvailable:
109    case Auto:
110        return maximumValue;
111    case Intrinsic:
112    case MinIntrinsic:
113    case MinContent:
114    case MaxContent:
115    case FitContent:
116    case ExtendToZoom:
117    case DeviceWidth:
118    case DeviceHeight:
119    case MaxSizeNone:
120        ASSERT_NOT_REACHED();
121        return 0;
122    }
123    ASSERT_NOT_REACHED();
124    return 0;
125}
126
127FloatSize floatSizeForLengthSize(const LengthSize& lengthSize, const FloatSize& boxSize)
128{
129    return FloatSize(floatValueForLength(lengthSize.width(), boxSize.width()), floatValueForLength(lengthSize.height(), boxSize.height()));
130}
131
132} // namespace blink
133