18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (C) 1999-2003 Lars Knoll (knoll@kde.org)
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2004, 2005, 2006, 2008 Apple Inc. All rights reserved.
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Alexey Proskuryakov <ap@webkit.org>
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is free software; you can redistribute it and/or
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modify it under the terms of the GNU Library General Public
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * License as published by the Free Software Foundation; either
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * version 2 of the License, or (at your option) any later version.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * This library is distributed in the hope that it will be useful,
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * but WITHOUT ANY WARRANTY; without even the implied warranty of
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Library General Public License for more details.
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * You should have received a copy of the GNU Library General Public License
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * along with this library; see the file COPYING.LIB.  If not, write to
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Boston, MA 02110-1301, USA.
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CSSPrimitiveValue_h
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CSSPrimitiveValue_h
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CSSValue.h"
260bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch#include "Color.h"
27dd8bb3de4f353a81954234999f1fea748aee2ea9Ben Murdoch#include <wtf/Forward.h>
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <wtf/PassRefPtr.h>
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore {
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Counter;
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass DashboardRegion;
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Pair;
350bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdochclass RGBColor;
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass Rect;
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass RenderStyle;
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstruct Length;
408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
415abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merricktemplate<typename T, T max, T min> inline T roundForImpreciseConversion(double value)
425abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick{
435abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // Dimension calculations are imprecise, often resulting in values of e.g.
445abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // 44.99998.  We need to go ahead and round if we're really close to the
455abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    // next integer value.
465abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    value += (value < 0) ? -0.01 : +0.01;
475abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick    return ((value > max) || (value < min)) ? 0 : static_cast<T>(value);
485abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick}
495abb8606fa57c3ebfc8b3c3dbc3fa4a25d2ae306Iain Merrick
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass CSSPrimitiveValue : public CSSValue {
518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    enum UnitTypes {
538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_UNKNOWN = 0,
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_NUMBER = 1,
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PERCENTAGE = 2,
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_EMS = 3,
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_EXS = 4,
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PX = 5,
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_CM = 6,
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_MM = 7,
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_IN = 8,
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PT = 9,
638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PC = 10,
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_DEG = 11,
658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_RAD = 12,
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_GRAD = 13,
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_MS = 14,
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_S = 15,
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_HZ = 16,
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_KHZ = 17,
718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_DIMENSION = 18,
728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_STRING = 19,
738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_URI = 20,
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_IDENT = 21,
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_ATTR = 22,
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_COUNTER = 23,
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_RECT = 24,
788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_RGBCOLOR = 25,
798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PAIR = 100, // We envision this being exposed as a means of getting computed style values for pairs (border-spacing/radius, background-position, etc.)
808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_DASHBOARD_REGION = 101, // FIXME: Dashboard region should not be a primitive value.
818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_UNICODE_RANGE = 102,
828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // These next types are just used internally to allow us to translate back and forth from CSSPrimitiveValues to CSSParserValues.
848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PARSER_OPERATOR = 103,
858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        CSS_PARSER_INTEGER = 104,
866b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSS_PARSER_HEXCOLOR = 105,
878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        // This is used internally for unknown identifiers
896b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSS_PARSER_IDENTIFIER = 106,
90635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
910bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch        // These are from CSS3 Values and Units, but that isn't a finished standard yet
926b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        CSS_TURN = 107,
9381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        CSS_REMS = 108,
9481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch
9581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        // This is used internally for counter names (as opposed to counter values)
9681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch        CSS_COUNTER_NAME = 109
978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    };
988f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian
996b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    // This enum follows the CSSParser::Units enum augmented with UNIT_FREQUENCY for frequencies.
1006b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    enum UnitCategory {
1016b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UNumber,
1026b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UPercent,
1036b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        ULength,
1046b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UAngle,
1056b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UTime,
1066b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UFrequency,
1076b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner        UOther
1086b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    };
1096b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
1100bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    static bool isUnitTypeLength(int type) { return (type > CSSPrimitiveValue::CSS_PERCENTAGE && type < CSSPrimitiveValue::CSS_DEG) ||
1110bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch                                                    type == CSSPrimitiveValue::CSS_REMS; }
1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
11381bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<CSSPrimitiveValue> createIdentifier(int identifier) { return adoptRef(new CSSPrimitiveValue(identifier)); }
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<CSSPrimitiveValue> createColor(unsigned rgbValue) { return adoptRef(new CSSPrimitiveValue(rgbValue)); }
11581bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<CSSPrimitiveValue> create(double value, UnitTypes type) { return adoptRef(new CSSPrimitiveValue(value, type)); }
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    static PassRefPtr<CSSPrimitiveValue> create(const String& value, UnitTypes type) { return adoptRef(new CSSPrimitiveValue(value, type)); }
117635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename T> static PassRefPtr<CSSPrimitiveValue> create(T value)
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    {
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        return adoptRef(new CSSPrimitiveValue(value));
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    }
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual ~CSSPrimitiveValue();
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void cleanup();
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    unsigned short primitiveType() const { return m_type; }
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    /*
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * computes a length in pixels out of the given CSSValue. Need the RenderStyle to get
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * the fontinfo in case val is defined in em or ex.
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     *
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * The metrics have to be a bit different for screen and printer output.
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * For screen output we assume 1 inch == 72 px, for printer we assume 300 dpi
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     *
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * this is screen/printer dependent, so we probably need a config option for this,
1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     * and some tool to calibrate.
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project     */
1390bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int computeLengthInt(RenderStyle* currStyle, RenderStyle* rootStyle);
1400bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int computeLengthInt(RenderStyle* currStyle, RenderStyle* rootStyle, double multiplier);
1410bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int computeLengthIntForLength(RenderStyle* currStyle, RenderStyle* rootStyle);
1420bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    int computeLengthIntForLength(RenderStyle* currStyle, RenderStyle* rootStyle, double multiplier);
1430bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    short computeLengthShort(RenderStyle* currStyle, RenderStyle* rootStyle);
1440bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    short computeLengthShort(RenderStyle* currStyle, RenderStyle* rootStyle, double multiplier);
1450bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    float computeLengthFloat(RenderStyle* currStyle, RenderStyle* rootStyle, bool computingFontSize = false);
1460bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    float computeLengthFloat(RenderStyle* currStyle, RenderStyle* rootStyle, double multiplier, bool computingFontSize = false);
1470bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    double computeLengthDouble(RenderStyle* currentStyle, RenderStyle* rootStyle, double multiplier = 1.0, bool computingFontSize = false);
1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // use with care!!!
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setPrimitiveType(unsigned short type) { m_type = type; }
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1526b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    double getDoubleValue(unsigned short unitType, ExceptionCode&) const;
1536b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    double getDoubleValue(unsigned short unitType) const;
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    double getDoubleValue() const { return m_value.num; }
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setFloatValue(unsigned short unitType, double floatValue, ExceptionCode&);
1576b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    float getFloatValue(unsigned short unitType, ExceptionCode& ec) const { return static_cast<float>(getDoubleValue(unitType, ec)); }
1586b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    float getFloatValue(unsigned short unitType) const { return static_cast<float>(getDoubleValue(unitType)); }
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    float getFloatValue() const { return static_cast<float>(m_value.num); }
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1616b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int getIntValue(unsigned short unitType, ExceptionCode& ec) const { return static_cast<int>(getDoubleValue(unitType, ec)); }
1626b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int getIntValue(unsigned short unitType) const { return static_cast<int>(getDoubleValue(unitType)); }
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    int getIntValue() const { return static_cast<int>(m_value.num); }
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void setStringValue(unsigned short stringType, const String& stringValue, ExceptionCode&);
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String getStringValue(ExceptionCode&) const;
1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    String getStringValue() const;
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Counter* getCounterValue(ExceptionCode&) const;
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Counter* getCounterValue() const { return m_type != CSS_COUNTER ? 0 : m_value.counter; }
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Rect* getRectValue(ExceptionCode&) const;
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Rect* getRectValue() const { return m_type != CSS_RECT ? 0 : m_value.rect; }
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
175231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block    PassRefPtr<RGBColor> getRGBColorValue(ExceptionCode&) const;
1760bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    RGBA32 getRGBA32Value() const { return m_type != CSS_RGBCOLOR ? 0 : m_value.rgbcolor; }
1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Pair* getPairValue(ExceptionCode&) const;
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    Pair* getPairValue() const { return m_type != CSS_PAIR ? 0 : m_value.pair; }
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    DashboardRegion* getDashboardRegionValue() const { return m_type != CSS_DASHBOARD_REGION ? 0 : m_value.region; }
1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1836b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    int getIdent() const;
1840bf48ef3be53ddaa52bbead65dfd75bf90e7a2b5Ben Murdoch    template<typename T> inline operator T() const; // Defined in CSSPrimitiveValueMappings.h
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool parseString(const String&, bool = false);
1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual String cssText() const;
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isQuirkValue() { return false; }
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project    virtual void addSubresourceStyleURLs(ListHashSet<KURL>&, const CSSStyleSheet*);
192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprotected:
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // FIXME: int vs. unsigned overloading is too subtle to distinguish the color and identifier cases.
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue(int ident);
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue(double, UnitTypes);
1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue(const String&, UnitTypes);
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue();
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue(unsigned color); // RGB value
2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    CSSPrimitiveValue(const Length&);
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename T> CSSPrimitiveValue(T); // Defined in CSSPrimitiveValueMappings.h
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename T> CSSPrimitiveValue(T* val) { init(PassRefPtr<T>(val)); }
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename T> CSSPrimitiveValue(PassRefPtr<T> val) { init(val); }
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static void create(int); // compile-time guard
2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    static void create(unsigned); // compile-time guard
2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    template<typename T> operator T*(); // compile-time guard
2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
21206ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static PassRefPtr<CSSPrimitiveValue> createUncachedIdentifier(int identifier);
21306ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static PassRefPtr<CSSPrimitiveValue> createUncachedColor(unsigned rgbValue);
21406ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen    static PassRefPtr<CSSPrimitiveValue> createUncached(double value, UnitTypes type);
21506ea8e899e48f1f2f396b70e63fae369f2f23232Kristian Monsen
2166b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    static UnitTypes canonicalUnitTypeForCategory(UnitCategory category);
2176b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner
2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void init(PassRefPtr<Counter>);
2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void init(PassRefPtr<Rect>);
2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void init(PassRefPtr<Pair>);
2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void init(PassRefPtr<DashboardRegion>); // FIXME: Dashboard region should not be a primitive value.
2226b70adc33054f8aee8c54d0f460458a9df11b8a5Russell Brenner    bool getDoubleValueInternal(UnitTypes targetUnitType, double* result) const;
2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual bool isPrimitiveValue() const { return true; }
2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    virtual unsigned short cssValueType() const;
2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2286c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    int m_type : 31;
2296c2af9490927c3c5959b5cb07461b646f8b32f6cKristian Monsen    mutable unsigned m_hasCachedCSSText : 1;
2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    union {
2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        int ident;
2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        double num;
2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        StringImpl* string;
2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Counter* counter;
2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Rect* rect;
2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        unsigned rgbcolor;
2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        Pair* pair;
2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        DashboardRegion* region;
2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    } m_value;
2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore
2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // CSSPrimitiveValue_h
245