15c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)/*
25c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
35c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
45c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Copyright (C) 2007 Apple Inc. All rights reserved.
55c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
65c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is free software; you can redistribute it and/or
75c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * modify it under the terms of the GNU Library General Public
85c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * License as published by the Free Software Foundation; either
95c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * version 2 of the License, or (at your option) any later version.
105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * This library is distributed in the hope that it will be useful,
125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * but WITHOUT ANY WARRANTY; without even the implied warranty of
135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Library General Public License for more details.
155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) *
165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * You should have received a copy of the GNU Library General Public License
175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * along with this library; see the file COPYING.LIB.  If not, write to
185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) * Boston, MA 02110-1301, USA.
205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles) */
215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "config.h"
235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2453e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGLength.h"
255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)#include "SVGNames.h"
27df95704c49daea886ddad70775bda23618d6274dBen Murdoch#include "bindings/v8/ExceptionStatePlaceholder.h"
2853e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/css/CSSPrimitiveValue.h"
2953e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/dom/ExceptionCode.h"
3053e740f4a82e17f3ae59772501622dc354e42336Torne (Richard Coles)#include "core/svg/SVGParserUtilities.h"
31591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/MathExtras.h"
32591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch#include "wtf/text/WTFString.h"
335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)namespace WebCore {
355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
369bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static inline SVGLengthMode toSVGLengthMode(unsigned short mode)
379bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
389bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(mode >= LengthModeWidth && mode <= LengthModeOther);
399bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return static_cast<SVGLengthMode>(mode);
409bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
419bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
429bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)static inline SVGLengthType toSVGLengthType(unsigned short type)
439bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles){
449bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    ASSERT(type >= LengthTypeUnknown && type <= LengthTypePC);
459bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return static_cast<SVGLengthType>(type);
469bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)}
479bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)
485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline unsigned int storeUnit(SVGLengthMode mode, SVGLengthType type)
495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return (mode << 4) | type;
515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline SVGLengthMode extractMode(unsigned int unit)
545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
5502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    unsigned int mode = unit >> 4;
569bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return toSVGLengthMode(mode);
575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline SVGLengthType extractType(unsigned int unit)
605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned int mode = unit >> 4;
625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    unsigned int type = unit ^ (mode << 4);
639bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    return toSVGLengthType(type);
645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)static inline String lengthTypeToString(SVGLengthType type)
675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (type) {
695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeUnknown:
705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeNumber:
7102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        return "";
725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePercentage:
735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "%";
745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeEMS:
755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "em";
765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeEXS:
775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "ex";
785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePX:
795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "px";
805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeCM:
815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "cm";
825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeMM:
835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "mm";
845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeIN:
855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "in";
865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePT:
875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "pt";
885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePC:
895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return "pc";
905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT_NOT_REACHED();
935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String();
945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
96591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochtemplate<typename CharType>
97591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic SVGLengthType stringToLengthType(const CharType*& ptr, const CharType* end)
985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (ptr == end)
1005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeNumber;
1015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const UChar firstChar = *ptr;
1035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (++ptr == end)
1055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return firstChar == '%' ? LengthTypePercentage : LengthTypeUnknown;
1065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    const UChar secondChar = *ptr;
1085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (++ptr != end)
1105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeUnknown;
1115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'e' && secondChar == 'm')
1135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeEMS;
1145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'e' && secondChar == 'x')
1155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeEXS;
1165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'p' && secondChar == 'x')
1175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypePX;
1185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'c' && secondChar == 'm')
1195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeCM;
1205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'm' && secondChar == 'm')
1215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeMM;
1225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'i' && secondChar == 'n')
1235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypeIN;
1245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'p' && secondChar == 't')
1255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypePT;
1265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (firstChar == 'p' && secondChar == 'c')
1275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return LengthTypePC;
1285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LengthTypeUnknown;
1305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLength::SVGLength(SVGLengthMode mode, const String& valueAsString)
1335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_valueInSpecifiedUnits(0)
1345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_unit(storeUnit(mode, LengthTypeNumber))
1355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1361fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    setValueAsString(valueAsString, IGNORE_EXCEPTION);
1375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLength::SVGLength(const SVGLengthContext& context, float value, SVGLengthMode mode, SVGLengthType unitType)
1405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_valueInSpecifiedUnits(0)
1415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_unit(storeUnit(mode, unitType))
1425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1431fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    setValue(value, context, ASSERT_NO_EXCEPTION);
1445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLength::SVGLength(const SVGLength& other)
1475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    : m_valueInSpecifiedUnits(other.m_valueInSpecifiedUnits)
1485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    , m_unit(other.m_unit)
1495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
15251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::setValueAsString(const String& valueAsString, SVGLengthMode mode, ExceptionState& exceptionState)
1535c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueInSpecifiedUnits = 0;
1555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_unit = storeUnit(mode, LengthTypeNumber);
15651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setValueAsString(valueAsString, exceptionState);
1575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGLength::operator==(const SVGLength& other) const
1605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_unit == other.m_unit
1625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        && m_valueInSpecifiedUnits == other.m_valueInSpecifiedUnits;
1635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)bool SVGLength::operator!=(const SVGLength& other) const
1665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return !operator==(other);
1685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLength SVGLength::construct(SVGLengthMode mode, const String& valueAsString, SVGParsingError& parseError, SVGLengthNegativeValuesMode negativeValuesMode)
1715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
17251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
1735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength length(mode);
1745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    length.setValueAsString(valueAsString, exceptionState);
1765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
17751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
1785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parseError = ParsingAttributeFailedError;
1795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    else if (negativeValuesMode == ForbidNegativeLengths && length.valueInSpecifiedUnits() < 0)
1805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        parseError = NegativeValueForbiddenError;
1815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return length;
1835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLengthType SVGLength::unitType() const
1865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return extractType(m_unit);
1885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLengthMode SVGLength::unitMode() const
1915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return extractMode(m_unit);
1935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
1955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float SVGLength::value(const SVGLengthContext& context) const
1965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
1971fad5ca6c42d689812b66fc493992aa6d747a6fbBen Murdoch    return value(context, IGNORE_EXCEPTION);
1985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
1995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)float SVGLength::value(const SVGLengthContext& context, ExceptionState& exceptionState) const
2015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
20251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    return context.convertValueToUserUnits(m_valueInSpecifiedUnits, extractMode(m_unit), extractType(m_unit), exceptionState);
2035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
20551b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::setValue(const SVGLengthContext& context, float value, SVGLengthMode mode, SVGLengthType unitType, ExceptionState& exceptionState)
2065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_unit = storeUnit(mode, unitType);
20851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setValue(value, context, exceptionState);
2095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::setValue(float value, const SVGLengthContext& context, ExceptionState& exceptionState)
2125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed
2145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (extractType(m_unit) == LengthTypePercentage)
2155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        value = value / 100;
2165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
21751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    float convertedValue = context.convertValueFromUserUnits(value, extractMode(m_unit), extractType(m_unit), exceptionState);
21851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!exceptionState.hadException())
2195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        m_valueInSpecifiedUnits = convertedValue;
2205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)float SVGLength::valueAsPercentage() const
2225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed
2245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (extractType(m_unit) == LengthTypePercentage)
2255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return m_valueInSpecifiedUnits / 100;
2265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return m_valueInSpecifiedUnits;
2285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
230591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochtemplate<typename CharType>
231591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdochstatic bool parseValueInternal(const String& string, float& convertedNumber, SVGLengthType& type)
232591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch{
233591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const CharType* ptr = string.getCharacters<CharType>();
234591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    const CharType* end = ptr + string.length();
235591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
236591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!parseNumber(ptr, end, convertedNumber, false))
237591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
238591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
239591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    type = stringToLengthType(ptr, end);
240591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    ASSERT(ptr <= end);
241591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (type == LengthTypeUnknown)
242591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        return false;
243591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
244591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    return true;
245591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch}
246591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch
24751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::setValueAsString(const String& string, ExceptionState& exceptionState)
2485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (string.isEmpty())
2505c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2525c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    float convertedNumber = 0;
253591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    SVGLengthType type = LengthTypeUnknown;
2545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
255591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    bool success = string.is8Bit() ?
256591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        parseValueInternal<LChar>(string, convertedNumber, type) :
257591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch        parseValueInternal<UChar>(string, convertedNumber, type);
2585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
259591b958dee2cf159d33a0b931e6231072eaf38d5Ben Murdoch    if (!success) {
26051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        exceptionState.throwUninformativeAndGenericDOMException(SyntaxError);
2615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_unit = storeUnit(extractMode(m_unit), type);
2655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueInSpecifiedUnits = convertedNumber;
2665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)String SVGLength::valueAsString() const
2695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return String::number(m_valueInSpecifiedUnits) + lengthTypeToString(extractType(m_unit));
2715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
27351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::newValueSpecifiedUnits(unsigned short type, float value, ExceptionState& exceptionState)
2745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type == LengthTypeUnknown || type > LengthTypePC) {
27651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        exceptionState.throwUninformativeAndGenericDOMException(NotSupportedError);
2775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
2809bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_unit = storeUnit(extractMode(m_unit), toSVGLengthType(type));
2815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_valueInSpecifiedUnits = value;
2825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
2835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
28451b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)void SVGLength::convertToSpecifiedUnits(unsigned short type, const SVGLengthContext& context, ExceptionState& exceptionState)
2855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
2865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (type == LengthTypeUnknown || type > LengthTypePC) {
28751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)        exceptionState.throwUninformativeAndGenericDOMException(NotSupportedError);
2885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
2905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29151b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    float valueInUserUnits = value(context, exceptionState);
29251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
2935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
2945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
29502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch    unsigned int originalUnitAndType = m_unit;
2969bbd2f5e390b01907d97ecffde80aa1b06113aacTorne (Richard Coles)    m_unit = storeUnit(extractMode(m_unit), toSVGLengthType(type));
29751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    setValue(valueInUserUnits, context, exceptionState);
29851b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (!exceptionState.hadException())
2995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return;
3005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    // Eventually restore old unit and type
3025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    m_unit = originalUnitAndType;
3035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3045c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLength SVGLength::fromCSSPrimitiveValue(CSSPrimitiveValue* value)
3065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    ASSERT(value);
3085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLengthType svgType;
3105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (value->primitiveType()) {
3115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_NUMBER:
3125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeNumber;
3135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PERCENTAGE:
3155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypePercentage;
3165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_EMS:
3185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeEMS;
3195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_EXS:
3215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeEXS;
3225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PX:
3245c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypePX;
3255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_CM:
3275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeCM;
3285c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_MM:
3305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeMM;
3315c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_IN:
3335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeIN;
3345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PT:
3365c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypePT;
3375c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3385c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_PC:
3395c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypePC;
3405c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3415c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case CSSPrimitiveValue::CSS_UNKNOWN:
3425c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    default:
3435c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        svgType = LengthTypeUnknown;
3445c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3455c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
3465c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3475c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (svgType == LengthTypeUnknown)
3485c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return SVGLength();
3495c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
35051b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    TrackExceptionState exceptionState;
3515c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    SVGLength length;
35251b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    length.newValueSpecifiedUnits(svgType, value->getFloatValue(), exceptionState);
35351b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)    if (exceptionState.hadException())
3545c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return SVGLength();
3555c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3565c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return length;
3575c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3585c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3595c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)PassRefPtr<CSSPrimitiveValue> SVGLength::toCSSPrimitiveValue(const SVGLength& length)
3605c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
3615c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    CSSPrimitiveValue::UnitTypes cssType = CSSPrimitiveValue::CSS_UNKNOWN;
3625c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    switch (length.unitType()) {
3635c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeUnknown:
3645c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3655c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeNumber:
3665c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_NUMBER;
3675c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3685c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePercentage:
3695c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_PERCENTAGE;
3705c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3715c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeEMS:
3725c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_EMS;
3735c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3745c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeEXS:
3755c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_EXS;
3765c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3775c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePX:
3785c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_PX;
3795c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3805c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeCM:
3815c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_CM;
3825c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3835c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeMM:
3845c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_MM;
3855c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3865c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypeIN:
3875c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_IN;
3885c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3895c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePT:
3905c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_PT;
3915c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3925c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    case LengthTypePC:
3935c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        cssType = CSSPrimitiveValue::CSS_PC;
3945c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        break;
3955c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    };
3965c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
3975c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return CSSPrimitiveValue::create(length.valueInSpecifiedUnits(), cssType);
3985c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
3995c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4005c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)SVGLengthMode SVGLength::lengthModeForAnimatedLengthAttribute(const QualifiedName& attrName)
4015c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles){
4025c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    typedef HashMap<QualifiedName, SVGLengthMode> LengthModeForLengthAttributeMap;
4035c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    DEFINE_STATIC_LOCAL(LengthModeForLengthAttributeMap, s_lengthModeMap, ());
40402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4055c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (s_lengthModeMap.isEmpty()) {
4065c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::xAttr, LengthModeWidth);
4075c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::yAttr, LengthModeHeight);
4085c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::cxAttr, LengthModeWidth);
4095c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::cyAttr, LengthModeHeight);
4105c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::dxAttr, LengthModeWidth);
4115c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::dyAttr, LengthModeHeight);
4125c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::fxAttr, LengthModeWidth);
4135c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::fyAttr, LengthModeHeight);
4145c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::rAttr, LengthModeOther);
4155c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::widthAttr, LengthModeWidth);
4165c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::heightAttr, LengthModeHeight);
4175c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::x1Attr, LengthModeWidth);
4185c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::x2Attr, LengthModeWidth);
4195c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::y1Attr, LengthModeHeight);
4205c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::y2Attr, LengthModeHeight);
4215c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::refXAttr, LengthModeWidth);
4225c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::refYAttr, LengthModeHeight);
4235c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::markerWidthAttr, LengthModeWidth);
42402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch        s_lengthModeMap.set(SVGNames::markerHeightAttr, LengthModeHeight);
4255c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::textLengthAttr, LengthModeWidth);
4265c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        s_lengthModeMap.set(SVGNames::startOffsetAttr, LengthModeWidth);
4275c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    }
42802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4295c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    if (s_lengthModeMap.contains(attrName))
4305c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)        return s_lengthModeMap.get(attrName);
43102772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch
4325c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)    return LengthModeOther;
4335c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
4345c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)
4355c87bf8b86a7c82ef50fb7a89697d8e02e2553beTorne (Richard Coles)}
436