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.
7bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    Copyright (C) 2013 Google, Inc. All rights reserved.
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is free software; you can redistribute it and/or
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    modify it under the terms of the GNU Library General Public
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    License as published by the Free Software Foundation; either
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    version 2 of the License, or (at your option) any later version.
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    This library is distributed in the hope that it will be useful,
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    but WITHOUT ANY WARRANTY; without even the implied warranty of
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Library General Public License for more details.
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    You should have received a copy of the GNU Library General Public License
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    along with this library; see the file COPYING.LIB.  If not, write to
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    Boston, MA 02110-1301, USA.
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)*/
245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
26bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "core/css/CSSLengthFunctions.h"
275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/rendering/RenderView.h"
291e202183a5dc46166763171984b285173f8585e5Torne (Richard Coles)#include "platform/LayoutUnit.h"
30bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/Length.h"
31bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)#include "platform/LengthFunctions.h"
325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int minimumIntValueForLength(const Length& length, LayoutUnit maximumValue, RenderView* renderView, bool roundPercentages)
365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<int>(minimumValueForLength(length, maximumValue, renderView, roundPercentages));
385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)int intValueForLength(const Length& length, LayoutUnit maximumValue, RenderView* renderView, bool roundPercentages)
415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return static_cast<int>(valueForLength(length, maximumValue, renderView, roundPercentages));
435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit minimumValueForLength(const Length& length, LayoutUnit maximumValue, RenderView* renderView, bool roundPercentages)
465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (length.type()) {
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Fixed:
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length.value();
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Percent:
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        if (roundPercentages)
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)            return static_cast<LayoutUnit>(round(maximumValue * length.percent() / 100.0f));
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (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.
5481a5157921f1d2a7ff6aae115bfe3c139b38a5c8Torne (Richard Coles)        return static_cast<float>(maximumValue * length.percent() / 100.0f);
555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Calculated:
565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length.nonNanCalculatedValue(maximumValue);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageWidth:
589bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return renderView ? renderView->viewportPercentageWidth(length.viewportPercentageLength()) : LayoutUnit(0);
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageHeight:
609bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return renderView ? renderView->viewportPercentageHeight(length.viewportPercentageLength()) : LayoutUnit(0);
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageMin:
629bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return renderView ? renderView->viewportPercentageMin(length.viewportPercentageLength()) : LayoutUnit(0);
63926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case ViewportPercentageMax:
649bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)        return renderView ? renderView->viewportPercentageMax(length.viewportPercentageLength()) : LayoutUnit(0);
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FillAvailable:
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Auto:
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Intrinsic:
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinIntrinsic:
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinContent:
715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MaxContent:
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FitContent:
737757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    case ExtendToZoom:
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Undefined:
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)LayoutUnit valueForLength(const Length& length, LayoutUnit maximumValue, RenderView* renderView, bool roundPercentages)
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (length.type()) {
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Fixed:
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Percent:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Calculated:
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageWidth:
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageHeight:
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageMin:
91926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case ViewportPercentageMax:
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return minimumValueForLength(length, maximumValue, renderView, roundPercentages);
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FillAvailable:
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Auto:
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return maximumValue;
965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Intrinsic:
975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinIntrinsic:
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinContent:
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MaxContent:
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FitContent:
1017757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    case ExtendToZoom:
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Undefined:
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
110bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)// This method has code duplicated in platform/LengthFunctions.cpp.
111bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)// Any changes here most likely also need to be applied there.
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float floatValueForLength(const Length& length, float maximumValue, RenderView* renderView)
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
114bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)    if (!renderView)
115bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return floatValueForLength(length, maximumValue);
116bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (length.type()) {
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Fixed:
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length.getFloatValue();
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Percent:
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return static_cast<float>(maximumValue * length.percent() / 100.0f);
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FillAvailable:
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Auto:
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return static_cast<float>(maximumValue);
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Calculated:
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return length.nonNanCalculatedValue(maximumValue);
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageWidth:
128bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<int>(renderView->viewportPercentageWidth(length.viewportPercentageLength()));
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageHeight:
130bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<int>(renderView->viewportPercentageHeight(length.viewportPercentageLength()));
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case ViewportPercentageMin:
132bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<int>(renderView->viewportPercentageMin(length.viewportPercentageLength()));
133926b001d589ce2f10facb93dd4b87578ea35a855Torne (Richard Coles)    case ViewportPercentageMax:
134bfe3590b1806e3ff18f46ee3af5d4b83078f305aTorne (Richard Coles)        return static_cast<int>(renderView->viewportPercentageMax(length.viewportPercentageLength()));
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Intrinsic:
1365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinIntrinsic:
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MinContent:
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case MaxContent:
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case FitContent:
1407757ec2eadfa2dd8ac2aeed0a4399e9b07ec38cbBen Murdoch    case ExtendToZoom:
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case Undefined:
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        ASSERT_NOT_REACHED();
1435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return 0;
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return 0;
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)} // namespace WebCore
150