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