Pass Aspect Ratio to RenderStyle
[WebKit-https.git] / Source / WebCore / css / CSSValue.h
1 /*
2  * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3  * Copyright (C) 2004, 2005, 2006, 2007, 2008 Apple Inc. All rights reserved.
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 CSSValue_h
22 #define CSSValue_h
23
24 #include "KURLHash.h"
25 #include <wtf/ListHashSet.h>
26 #include <wtf/RefCounted.h>
27 #include <wtf/RefPtr.h>
28
29 namespace WebCore {
30
31 class CSSStyleSheet;
32
33 typedef int ExceptionCode;
34
35 class CSSValue : public RefCounted<CSSValue> {
36 public:
37     enum Type {
38         CSS_INHERIT = 0,
39         CSS_PRIMITIVE_VALUE = 1,
40         CSS_VALUE_LIST = 2,
41         CSS_CUSTOM = 3,
42         CSS_INITIAL = 4
43
44     };
45
46     // Override RefCounted's deref() to ensure operator delete is called on
47     // the appropriate subclass type.
48     void deref()
49     {
50         if (derefBase())
51             destroy();
52     }
53
54     Type cssValueType() const;
55
56     String cssText() const;
57     void setCssText(const String&, ExceptionCode&) { } // FIXME: Not implemented.
58
59     bool isPrimitiveValue() const { return m_isPrimitive; }
60     bool isValueList() const { return m_isList; }
61
62     bool isAspectRatioValue() const { return m_classType == AspectRatioClass; }
63     bool isBorderImageValue() const { return m_classType == BorderImageClass; }
64     bool isBorderImageSliceValue() const { return m_classType == BorderImageSliceClass; }
65     bool isCursorImageValue() const { return m_classType == CursorImageClass; }
66     bool isFontFamilyValue() const { return m_classType == FontFamilyClass; }
67     bool isFontFeatureValue() const { return m_classType == FontFeatureClass; }
68     bool isFontValue() const { return m_classType == FontClass; }
69     bool isImageGeneratorValue() const { return m_classType == CanvasClass || m_classType == CrossfadeClass || m_classType == LinearGradientClass || m_classType == RadialGradientClass; }
70     bool isImageValue() const { return m_classType == ImageClass || m_classType == CursorImageClass; }
71     bool isImplicitInitialValue() const { return m_classType == InitialClass && m_isImplicit; }
72     bool isInheritedValue() const { return m_classType == InheritedClass; }
73     bool isInitialValue() const { return m_classType == InitialClass; }
74     bool isReflectValue() const { return m_classType == ReflectClass; }
75     bool isShadowValue() const { return m_classType == ShadowClass; }
76     bool isTimingFunctionValue() const { return m_classType == CubicBezierTimingFunctionClass || m_classType == LinearTimingFunctionClass || m_classType == StepsTimingFunctionClass; }
77     bool isWebKitCSSTransformValue() const { return m_classType == WebKitCSSTransformClass; }
78     bool isCSSLineBoxContainValue() const { return m_classType == LineBoxContainClass; }
79     bool isFlexValue() const { return m_classType == FlexClass; }
80 #if ENABLE(CSS_FILTERS)
81     bool isWebKitCSSFilterValue() const { return m_classType == WebKitCSSFilterClass; }
82 #if ENABLE(CSS_SHADERS)
83     bool isWebKitCSSShaderValue() const { return m_classType == WebKitCSSShaderClass; }
84 #endif
85 #endif // ENABLE(CSS_FILTERS)
86 #if ENABLE(SVG)
87     bool isSVGColor() const { return m_classType == SVGColorClass || m_classType == SVGPaintClass; }
88     bool isSVGPaint() const { return m_classType == SVGPaintClass; }
89 #endif
90
91     void addSubresourceStyleURLs(ListHashSet<KURL>&, const CSSStyleSheet*);
92
93 protected:
94
95     enum ClassType {
96         AspectRatioClass,
97         BorderImageClass,
98         BorderImageSliceClass,
99         CanvasClass,
100         CursorImageClass,
101         FontFamilyClass,
102         FontFeatureClass,
103         FontClass,
104         FontFaceSrcClass,
105         FunctionClass,
106         LinearGradientClass,
107         RadialGradientClass,
108         CrossfadeClass,
109         ImageClass,
110         InheritedClass,
111         InitialClass,
112         PrimitiveClass,
113         ReflectClass,
114         ShadowClass,
115         LinearTimingFunctionClass,
116         CubicBezierTimingFunctionClass,
117         StepsTimingFunctionClass,
118         UnicodeRangeClass,
119         ValueListClass,
120         WebKitCSSTransformClass,
121         LineBoxContainClass,
122         FlexClass,
123 #if ENABLE(CSS_FILTERS)
124         WebKitCSSFilterClass,
125 #if ENABLE(CSS_SHADERS)
126         WebKitCSSShaderClass,
127 #endif
128 #endif // ENABLE(CSS_FILTERS)
129 #if ENABLE(SVG)
130         SVGColorClass,
131         SVGPaintClass,
132 #endif
133     };
134
135     ClassType classType() const { return static_cast<ClassType>(m_classType); }
136
137     explicit CSSValue(ClassType classType)
138         : m_primitiveUnitType(0)
139         , m_hasCachedCSSText(false)
140         , m_isQuirkValue(false)
141         , m_isImplicit(false)
142         , m_classType(classType)
143         , m_isPrimitive(isPrimitiveType(classType))
144         , m_isList(isListType(classType))
145     {
146     }
147
148     // NOTE: This class is non-virtual for memory and performance reasons.
149     // Don't go making it virtual again unless you know exactly what you're doing!
150
151     ~CSSValue() { }
152
153 private:
154     static bool isPrimitiveType(ClassType type)
155     {
156         return type == PrimitiveClass
157             || type == ImageClass
158             || type == CursorImageClass
159             || type == FontFamilyClass;
160     }
161
162     static bool isListType(ClassType type)
163     {
164         return type == ValueListClass
165 #if ENABLE(CSS_FILTERS)
166             || type == WebKitCSSFilterClass
167 #endif
168             || type == WebKitCSSTransformClass;
169     }
170
171     void destroy();
172
173 protected:
174     // The bits in this section are only used by specific subclasses but kept here
175     // to maximize struct packing.
176
177     // CSSPrimitiveValue bits:
178     unsigned m_primitiveUnitType : 7; // CSSPrimitiveValue::UnitTypes
179     mutable bool m_hasCachedCSSText : 1;
180     bool m_isQuirkValue : 1;
181
182     // CSSInitialValue bits:
183     bool m_isImplicit : 1;
184
185 private:
186     unsigned m_classType : 5; // ClassType
187     bool m_isPrimitive : 1;
188     bool m_isList : 1;
189 };
190
191 } // namespace WebCore
192
193 #endif // CSSValue_h