summaryrefslogtreecommitdiff
path: root/Source/WebCore/svg/SVGLength.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'Source/WebCore/svg/SVGLength.cpp')
-rw-r--r--Source/WebCore/svg/SVGLength.cpp417
1 files changed, 0 insertions, 417 deletions
diff --git a/Source/WebCore/svg/SVGLength.cpp b/Source/WebCore/svg/SVGLength.cpp
deleted file mode 100644
index 0a2284896..000000000
--- a/Source/WebCore/svg/SVGLength.cpp
+++ /dev/null
@@ -1,417 +0,0 @@
-/*
- * Copyright (C) 2004, 2005, 2006 Nikolas Zimmermann <zimmermann@kde.org>
- * Copyright (C) 2004, 2005, 2006, 2007 Rob Buis <buis@kde.org>
- * Copyright (C) 2007 Apple Inc. All rights reserved.
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public License
- * along with this library; see the file COPYING.LIB. If not, write to
- * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
-#include "config.h"
-
-#if ENABLE(SVG)
-#include "SVGLength.h"
-
-#include "CSSHelper.h"
-#include "CSSPrimitiveValue.h"
-#include "ExceptionCode.h"
-#include "ExceptionCodePlaceholder.h"
-#include "FloatConversion.h"
-#include "SVGNames.h"
-#include "SVGParserUtilities.h"
-
-#include <wtf/MathExtras.h>
-#include <wtf/text/WTFString.h>
-
-namespace WebCore {
-
-// Helper functions
-static inline unsigned int storeUnit(SVGLengthMode mode, SVGLengthType type)
-{
- return (mode << 4) | type;
-}
-
-static inline SVGLengthMode extractMode(unsigned int unit)
-{
- unsigned int mode = unit >> 4;
- return static_cast<SVGLengthMode>(mode);
-}
-
-static inline SVGLengthType extractType(unsigned int unit)
-{
- unsigned int mode = unit >> 4;
- unsigned int type = unit ^ (mode << 4);
- return static_cast<SVGLengthType>(type);
-}
-
-static inline String lengthTypeToString(SVGLengthType type)
-{
- switch (type) {
- case LengthTypeUnknown:
- case LengthTypeNumber:
- return "";
- case LengthTypePercentage:
- return "%";
- case LengthTypeEMS:
- return "em";
- case LengthTypeEXS:
- return "ex";
- case LengthTypePX:
- return "px";
- case LengthTypeCM:
- return "cm";
- case LengthTypeMM:
- return "mm";
- case LengthTypeIN:
- return "in";
- case LengthTypePT:
- return "pt";
- case LengthTypePC:
- return "pc";
- }
-
- ASSERT_NOT_REACHED();
- return String();
-}
-
-inline SVGLengthType stringToLengthType(const UChar*& ptr, const UChar* end)
-{
- if (ptr == end)
- return LengthTypeNumber;
-
- const UChar firstChar = *ptr;
-
- if (++ptr == end)
- return firstChar == '%' ? LengthTypePercentage : LengthTypeUnknown;
-
- const UChar secondChar = *ptr;
-
- if (++ptr != end)
- return LengthTypeUnknown;
-
- if (firstChar == 'e' && secondChar == 'm')
- return LengthTypeEMS;
- if (firstChar == 'e' && secondChar == 'x')
- return LengthTypeEXS;
- if (firstChar == 'p' && secondChar == 'x')
- return LengthTypePX;
- if (firstChar == 'c' && secondChar == 'm')
- return LengthTypeCM;
- if (firstChar == 'm' && secondChar == 'm')
- return LengthTypeMM;
- if (firstChar == 'i' && secondChar == 'n')
- return LengthTypeIN;
- if (firstChar == 'p' && secondChar == 't')
- return LengthTypePT;
- if (firstChar == 'p' && secondChar == 'c')
- return LengthTypePC;
-
- return LengthTypeUnknown;
-}
-
-SVGLength::SVGLength(SVGLengthMode mode, const String& valueAsString)
- : m_valueInSpecifiedUnits(0)
- , m_unit(storeUnit(mode, LengthTypeNumber))
-{
- setValueAsString(valueAsString, IGNORE_EXCEPTION);
-}
-
-SVGLength::SVGLength(const SVGLengthContext& context, float value, SVGLengthMode mode, SVGLengthType unitType)
- : m_valueInSpecifiedUnits(0)
- , m_unit(storeUnit(mode, unitType))
-{
- setValue(value, context, ASSERT_NO_EXCEPTION);
-}
-
-SVGLength::SVGLength(const SVGLength& other)
- : m_valueInSpecifiedUnits(other.m_valueInSpecifiedUnits)
- , m_unit(other.m_unit)
-{
-}
-
-void SVGLength::setValueAsString(const String& valueAsString, SVGLengthMode mode, ExceptionCode& ec)
-{
- m_valueInSpecifiedUnits = 0;
- m_unit = storeUnit(mode, LengthTypeNumber);
- setValueAsString(valueAsString, ec);
-}
-
-bool SVGLength::operator==(const SVGLength& other) const
-{
- return m_unit == other.m_unit
- && m_valueInSpecifiedUnits == other.m_valueInSpecifiedUnits;
-}
-
-bool SVGLength::operator!=(const SVGLength& other) const
-{
- return !operator==(other);
-}
-
-SVGLength SVGLength::construct(SVGLengthMode mode, const String& valueAsString, SVGParsingError& parseError, SVGLengthNegativeValuesMode negativeValuesMode)
-{
- ExceptionCode ec = 0;
- SVGLength length(mode);
-
- length.setValueAsString(valueAsString, ec);
-
- if (ec)
- parseError = ParsingAttributeFailedError;
- else if (negativeValuesMode == ForbidNegativeLengths && length.valueInSpecifiedUnits() < 0)
- parseError = NegativeValueForbiddenError;
-
- return length;
-}
-
-SVGLengthType SVGLength::unitType() const
-{
- return extractType(m_unit);
-}
-
-SVGLengthMode SVGLength::unitMode() const
-{
- return extractMode(m_unit);
-}
-
-float SVGLength::value(const SVGLengthContext& context) const
-{
- return value(context, IGNORE_EXCEPTION);
-}
-
-float SVGLength::value(const SVGLengthContext& context, ExceptionCode& ec) const
-{
- return context.convertValueToUserUnits(m_valueInSpecifiedUnits, extractMode(m_unit), extractType(m_unit), ec);
-}
-
-void SVGLength::setValue(const SVGLengthContext& context, float value, SVGLengthMode mode, SVGLengthType unitType, ExceptionCode& ec)
-{
- m_unit = storeUnit(mode, unitType);
- setValue(value, context, ec);
-}
-
-void SVGLength::setValue(float value, const SVGLengthContext& context, ExceptionCode& ec)
-{
- // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed
- if (extractType(m_unit) == LengthTypePercentage)
- value = value / 100;
-
- ec = 0;
- float convertedValue = context.convertValueFromUserUnits(value, extractMode(m_unit), extractType(m_unit), ec);
- if (!ec)
- m_valueInSpecifiedUnits = convertedValue;
-}
-float SVGLength::valueAsPercentage() const
-{
- // 100% = 100.0 instead of 1.0 for historical reasons, this could eventually be changed
- if (extractType(m_unit) == LengthTypePercentage)
- return m_valueInSpecifiedUnits / 100;
-
- return m_valueInSpecifiedUnits;
-}
-
-void SVGLength::setValueAsString(const String& string, ExceptionCode& ec)
-{
- if (string.isEmpty())
- return;
-
- float convertedNumber = 0;
- const UChar* ptr = string.deprecatedCharacters();
- const UChar* end = ptr + string.length();
-
- if (!parseNumber(ptr, end, convertedNumber, false)) {
- ec = SYNTAX_ERR;
- return;
- }
-
- SVGLengthType type = stringToLengthType(ptr, end);
- ASSERT(ptr <= end);
- if (type == LengthTypeUnknown) {
- ec = SYNTAX_ERR;
- return;
- }
-
- m_unit = storeUnit(extractMode(m_unit), type);
- m_valueInSpecifiedUnits = convertedNumber;
-}
-
-String SVGLength::valueAsString() const
-{
- return String::number(m_valueInSpecifiedUnits) + lengthTypeToString(extractType(m_unit));
-}
-
-void SVGLength::newValueSpecifiedUnits(unsigned short type, float value, ExceptionCode& ec)
-{
- if (type == LengthTypeUnknown || type > LengthTypePC) {
- ec = NOT_SUPPORTED_ERR;
- return;
- }
-
- m_unit = storeUnit(extractMode(m_unit), static_cast<SVGLengthType>(type));
- m_valueInSpecifiedUnits = value;
-}
-
-void SVGLength::convertToSpecifiedUnits(unsigned short type, const SVGLengthContext& context, ExceptionCode& ec)
-{
- if (type == LengthTypeUnknown || type > LengthTypePC) {
- ec = NOT_SUPPORTED_ERR;
- return;
- }
-
- float valueInUserUnits = value(context, ec);
- if (ec)
- return;
-
- unsigned int originalUnitAndType = m_unit;
- m_unit = storeUnit(extractMode(m_unit), static_cast<SVGLengthType>(type));
- setValue(valueInUserUnits, context, ec);
- if (!ec)
- return;
-
- // Eventually restore old unit and type
- m_unit = originalUnitAndType;
-}
-
-SVGLength SVGLength::fromCSSPrimitiveValue(CSSPrimitiveValue* value)
-{
- ASSERT(value);
-
- SVGLengthType svgType;
- switch (value->primitiveType()) {
- case CSSPrimitiveValue::CSS_NUMBER:
- svgType = LengthTypeNumber;
- break;
- case CSSPrimitiveValue::CSS_PERCENTAGE:
- svgType = LengthTypePercentage;
- break;
- case CSSPrimitiveValue::CSS_EMS:
- svgType = LengthTypeEMS;
- break;
- case CSSPrimitiveValue::CSS_EXS:
- svgType = LengthTypeEXS;
- break;
- case CSSPrimitiveValue::CSS_PX:
- svgType = LengthTypePX;
- break;
- case CSSPrimitiveValue::CSS_CM:
- svgType = LengthTypeCM;
- break;
- case CSSPrimitiveValue::CSS_MM:
- svgType = LengthTypeMM;
- break;
- case CSSPrimitiveValue::CSS_IN:
- svgType = LengthTypeIN;
- break;
- case CSSPrimitiveValue::CSS_PT:
- svgType = LengthTypePT;
- break;
- case CSSPrimitiveValue::CSS_PC:
- svgType = LengthTypePC;
- break;
- case CSSPrimitiveValue::CSS_UNKNOWN:
- default:
- svgType = LengthTypeUnknown;
- break;
- };
-
- if (svgType == LengthTypeUnknown)
- return SVGLength();
-
- ExceptionCode ec = 0;
- SVGLength length;
- length.newValueSpecifiedUnits(svgType, value->getFloatValue(), ec);
- if (ec)
- return SVGLength();
-
- return length;
-}
-
-PassRefPtr<CSSPrimitiveValue> SVGLength::toCSSPrimitiveValue(const SVGLength& length)
-{
- CSSPrimitiveValue::UnitTypes cssType = CSSPrimitiveValue::CSS_UNKNOWN;
- switch (length.unitType()) {
- case LengthTypeUnknown:
- break;
- case LengthTypeNumber:
- cssType = CSSPrimitiveValue::CSS_NUMBER;
- break;
- case LengthTypePercentage:
- cssType = CSSPrimitiveValue::CSS_PERCENTAGE;
- break;
- case LengthTypeEMS:
- cssType = CSSPrimitiveValue::CSS_EMS;
- break;
- case LengthTypeEXS:
- cssType = CSSPrimitiveValue::CSS_EXS;
- break;
- case LengthTypePX:
- cssType = CSSPrimitiveValue::CSS_PX;
- break;
- case LengthTypeCM:
- cssType = CSSPrimitiveValue::CSS_CM;
- break;
- case LengthTypeMM:
- cssType = CSSPrimitiveValue::CSS_MM;
- break;
- case LengthTypeIN:
- cssType = CSSPrimitiveValue::CSS_IN;
- break;
- case LengthTypePT:
- cssType = CSSPrimitiveValue::CSS_PT;
- break;
- case LengthTypePC:
- cssType = CSSPrimitiveValue::CSS_PC;
- break;
- };
-
- return CSSPrimitiveValue::create(length.valueInSpecifiedUnits(), cssType);
-}
-
-SVGLengthMode SVGLength::lengthModeForAnimatedLengthAttribute(const QualifiedName& attrName)
-{
- typedef HashMap<QualifiedName, SVGLengthMode> LengthModeForLengthAttributeMap;
- DEFINE_STATIC_LOCAL(LengthModeForLengthAttributeMap, s_lengthModeMap, ());
-
- if (s_lengthModeMap.isEmpty()) {
- s_lengthModeMap.set(SVGNames::xAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::yAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::cxAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::cyAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::dxAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::dyAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::fxAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::fyAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::rAttr, LengthModeOther);
- s_lengthModeMap.set(SVGNames::widthAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::heightAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::x1Attr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::x2Attr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::y1Attr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::y2Attr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::refXAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::refYAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::markerWidthAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::markerHeightAttr, LengthModeHeight);
- s_lengthModeMap.set(SVGNames::textLengthAttr, LengthModeWidth);
- s_lengthModeMap.set(SVGNames::startOffsetAttr, LengthModeWidth);
- }
-
- if (s_lengthModeMap.contains(attrName))
- return s_lengthModeMap.get(attrName);
-
- return LengthModeOther;
-}
-
-}
-
-#endif