Home | History | Annotate | Download | only in svg
      1 /*
      2  * Copyright (C) 2004, 2005, 2006, 2008 Nikolas Zimmermann <zimmermann (at) kde.org>
      3  * Copyright (C) 2004, 2005, 2006 Rob Buis <buis (at) kde.org>
      4  *
      5  * This library is free software; you can redistribute it and/or
      6  * modify it under the terms of the GNU Library General Public
      7  * License as published by the Free Software Foundation; either
      8  * version 2 of the License, or (at your option) any later version.
      9  *
     10  * This library is distributed in the hope that it will be useful,
     11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
     12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     13  * Library General Public License for more details.
     14  *
     15  * You should have received a copy of the GNU Library General Public License
     16  * along with this library; see the file COPYING.LIB.  If not, write to
     17  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
     18  * Boston, MA 02110-1301, USA.
     19  */
     20 
     21 #ifndef SVGLength_h
     22 #define SVGLength_h
     23 
     24 #if ENABLE(SVG)
     25 #include "ExceptionCode.h"
     26 #include "SVGPropertyTraits.h"
     27 
     28 namespace WebCore {
     29 
     30 class CSSPrimitiveValue;
     31 
     32 enum SVGLengthType {
     33     LengthTypeUnknown = 0,
     34     LengthTypeNumber = 1,
     35     LengthTypePercentage = 2,
     36     LengthTypeEMS = 3,
     37     LengthTypeEXS = 4,
     38     LengthTypePX = 5,
     39     LengthTypeCM = 6,
     40     LengthTypeMM = 7,
     41     LengthTypeIN = 8,
     42     LengthTypePT = 9,
     43     LengthTypePC = 10
     44 };
     45 
     46 enum SVGLengthMode {
     47     LengthModeWidth = 0,
     48     LengthModeHeight,
     49     LengthModeOther
     50 };
     51 
     52 class SVGElement;
     53 
     54 class SVGLength {
     55 public:
     56     // Forward declare these enums in the w3c naming scheme, for IDL generation
     57     enum {
     58         SVG_LENGTHTYPE_UNKNOWN = LengthTypeUnknown,
     59         SVG_LENGTHTYPE_NUMBER = LengthTypeNumber,
     60         SVG_LENGTHTYPE_PERCENTAGE = LengthTypePercentage,
     61         SVG_LENGTHTYPE_EMS = LengthTypeEMS,
     62         SVG_LENGTHTYPE_EXS = LengthTypeEXS,
     63         SVG_LENGTHTYPE_PX = LengthTypePX,
     64         SVG_LENGTHTYPE_CM = LengthTypeCM,
     65         SVG_LENGTHTYPE_MM = LengthTypeMM,
     66         SVG_LENGTHTYPE_IN = LengthTypeIN,
     67         SVG_LENGTHTYPE_PT = LengthTypePT,
     68         SVG_LENGTHTYPE_PC = LengthTypePC
     69     };
     70 
     71     SVGLength(SVGLengthMode mode = LengthModeOther, const String& valueAsString = String());
     72     SVGLength(const SVGLength&);
     73 
     74     SVGLengthType unitType() const;
     75 
     76     bool operator==(const SVGLength&) const;
     77     bool operator!=(const SVGLength&) const;
     78 
     79     float value(const SVGElement* context) const;
     80     float value(const SVGElement* context, ExceptionCode&) const;
     81     void setValue(float, const SVGElement* context, ExceptionCode&);
     82 
     83     float valueInSpecifiedUnits() const { return m_valueInSpecifiedUnits; }
     84     void setValueInSpecifiedUnits(float value) { m_valueInSpecifiedUnits = value; }
     85 
     86     float valueAsPercentage() const;
     87 
     88     String valueAsString() const;
     89     void setValueAsString(const String&, ExceptionCode&);
     90 
     91     void newValueSpecifiedUnits(unsigned short, float valueInSpecifiedUnits, ExceptionCode&);
     92     void convertToSpecifiedUnits(unsigned short, const SVGElement* context, ExceptionCode&);
     93 
     94     // Helper functions
     95     inline bool isRelative() const
     96     {
     97         SVGLengthType type = unitType();
     98         return type == LengthTypePercentage || type == LengthTypeEMS || type == LengthTypeEXS;
     99     }
    100 
    101     static SVGLength fromCSSPrimitiveValue(CSSPrimitiveValue*);
    102     static PassRefPtr<CSSPrimitiveValue> toCSSPrimitiveValue(const SVGLength&);
    103 
    104 private:
    105     bool determineViewport(const SVGElement* context, float& width, float& height) const;
    106 
    107     float convertValueFromPercentageToUserUnits(float value, const SVGElement* context, ExceptionCode&) const;
    108     float convertValueFromUserUnitsToPercentage(float value, const SVGElement* context, ExceptionCode&) const;
    109 
    110     float convertValueFromUserUnitsToEMS(float value, const SVGElement* context, ExceptionCode&) const;
    111     float convertValueFromEMSToUserUnits(float value, const SVGElement* context, ExceptionCode&) const;
    112 
    113     float convertValueFromUserUnitsToEXS(float value, const SVGElement* context, ExceptionCode&) const;
    114     float convertValueFromEXSToUserUnits(float value, const SVGElement* context, ExceptionCode&) const;
    115 
    116 private:
    117     float m_valueInSpecifiedUnits;
    118     unsigned int m_unit;
    119 };
    120 
    121 template<>
    122 struct SVGPropertyTraits<SVGLength> {
    123     static SVGLength initialValue() { return SVGLength(); }
    124     static String toString(const SVGLength& type) { return type.valueAsString(); }
    125 };
    126 
    127 
    128 } // namespace WebCore
    129 
    130 #endif // ENABLE(SVG)
    131 #endif // SVGLength_h
    132