2 * (C) 1999-2003 Lars Knoll (knoll@kde.org)
3 * Copyright (C) 2004, 2005, 2006 Apple Computer, Inc.
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.
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.
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.
22 #include "CSSProperty.h"
24 #include "CSSPropertyNames.h"
25 #include "PlatformString.h"
26 #include "RenderStyleConstants.h"
30 String CSSProperty::cssText() const
32 return String(getPropertyName(static_cast<CSSPropertyID>(id()))) + ": " + m_value->cssText() + (isImportant() ? " !important" : "") + "; ";
35 bool operator==(const CSSProperty& a, const CSSProperty& b)
37 return a.m_id == b.m_id && a.m_important == b.m_important && a.m_value == b.m_value;
40 enum LogicalBoxSide { BeforeSide, EndSide, AfterSide, StartSide };
41 enum PhysicalBoxSide { TopSide, RightSide, BottomSide, LeftSide };
43 static int resolveToPhysicalProperty(TextDirection direction, WritingMode writingMode, LogicalBoxSide logicalSide, const int* properties)
45 if (direction == LTR) {
46 if (writingMode == TopToBottomWritingMode) {
47 // The common case. The logical and physical box sides match.
48 // Left = Start, Right = End, Before = Top, After = Bottom
49 return properties[logicalSide];
52 if (writingMode == BottomToTopWritingMode) {
53 // Start = Left, End = Right, Before = Bottom, After = Top.
54 switch (logicalSide) {
56 return properties[LeftSide];
58 return properties[RightSide];
60 return properties[BottomSide];
62 return properties[TopSide];
66 if (writingMode == LeftToRightWritingMode) {
67 // Start = Top, End = Bottom, Before = Left, After = Right.
68 switch (logicalSide) {
70 return properties[TopSide];
72 return properties[BottomSide];
74 return properties[LeftSide];
76 return properties[RightSide];
80 // Start = Top, End = Bottom, Before = Right, After = Left
81 switch (logicalSide) {
83 return properties[TopSide];
85 return properties[BottomSide];
87 return properties[RightSide];
89 return properties[LeftSide];
93 if (writingMode == TopToBottomWritingMode) {
94 // Start = Right, End = Left, Before = Top, After = Bottom
95 switch (logicalSide) {
97 return properties[RightSide];
99 return properties[LeftSide];
101 return properties[TopSide];
103 return properties[BottomSide];
107 if (writingMode == BottomToTopWritingMode) {
108 // Start = Right, End = Left, Before = Bottom, After = Top
109 switch (logicalSide) {
111 return properties[RightSide];
113 return properties[LeftSide];
115 return properties[BottomSide];
117 return properties[TopSide];
121 if (writingMode == LeftToRightWritingMode) {
122 // Start = Bottom, End = Top, Before = Left, After = Right
123 switch (logicalSide) {
125 return properties[BottomSide];
127 return properties[TopSide];
129 return properties[LeftSide];
131 return properties[RightSide];
135 // Start = Bottom, End = Top, Before = Right, After = Left
136 switch (logicalSide) {
138 return properties[BottomSide];
140 return properties[TopSide];
142 return properties[RightSide];
144 return properties[LeftSide];
148 enum LogicalExtent { LogicalWidth, LogicalHeight };
150 static int resolveToPhysicalProperty(WritingMode writingMode, LogicalExtent logicalSide, const int* properties)
152 if (writingMode == TopToBottomWritingMode || writingMode == BottomToTopWritingMode)
153 return properties[logicalSide];
154 return logicalSide == LogicalWidth ? properties[1] : properties[0];
157 int CSSProperty::resolveDirectionAwareProperty(int propertyID, TextDirection direction, WritingMode writingMode)
159 switch (static_cast<CSSPropertyID>(propertyID)) {
160 case CSSPropertyWebkitMarginEnd: {
161 const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft };
162 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
164 case CSSPropertyWebkitMarginStart: {
165 const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft };
166 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
168 case CSSPropertyWebkitMarginBefore: {
169 const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft };
170 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
172 case CSSPropertyWebkitMarginAfter: {
173 const int properties[4] = { CSSPropertyMarginTop, CSSPropertyMarginRight, CSSPropertyMarginBottom, CSSPropertyMarginLeft };
174 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
176 case CSSPropertyWebkitPaddingEnd: {
177 const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
178 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
180 case CSSPropertyWebkitPaddingStart: {
181 const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
182 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
184 case CSSPropertyWebkitPaddingBefore: {
185 const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
186 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
188 case CSSPropertyWebkitPaddingAfter: {
189 const int properties[4] = { CSSPropertyPaddingTop, CSSPropertyPaddingRight, CSSPropertyPaddingBottom, CSSPropertyPaddingLeft };
190 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
192 case CSSPropertyWebkitBorderEnd: {
193 const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft };
194 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
196 case CSSPropertyWebkitBorderStart: {
197 const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft };
198 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
200 case CSSPropertyWebkitBorderBefore: {
201 const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft };
202 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
204 case CSSPropertyWebkitBorderAfter: {
205 const int properties[4] = { CSSPropertyBorderTop, CSSPropertyBorderRight, CSSPropertyBorderBottom, CSSPropertyBorderLeft };
206 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
208 case CSSPropertyWebkitBorderEndColor: {
209 const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
210 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
212 case CSSPropertyWebkitBorderStartColor: {
213 const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
214 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
216 case CSSPropertyWebkitBorderBeforeColor: {
217 const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
218 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
220 case CSSPropertyWebkitBorderAfterColor: {
221 const int properties[4] = { CSSPropertyBorderTopColor, CSSPropertyBorderRightColor, CSSPropertyBorderBottomColor, CSSPropertyBorderLeftColor };
222 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
224 case CSSPropertyWebkitBorderEndStyle: {
225 const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
226 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
228 case CSSPropertyWebkitBorderStartStyle: {
229 const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
230 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
232 case CSSPropertyWebkitBorderBeforeStyle: {
233 const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
234 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
236 case CSSPropertyWebkitBorderAfterStyle: {
237 const int properties[4] = { CSSPropertyBorderTopStyle, CSSPropertyBorderRightStyle, CSSPropertyBorderBottomStyle, CSSPropertyBorderLeftStyle };
238 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
240 case CSSPropertyWebkitBorderEndWidth: {
241 const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
242 return resolveToPhysicalProperty(direction, writingMode, EndSide, properties);
244 case CSSPropertyWebkitBorderStartWidth: {
245 const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
246 return resolveToPhysicalProperty(direction, writingMode, StartSide, properties);
248 case CSSPropertyWebkitBorderBeforeWidth: {
249 const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
250 return resolveToPhysicalProperty(direction, writingMode, BeforeSide, properties);
252 case CSSPropertyWebkitBorderAfterWidth: {
253 const int properties[4] = { CSSPropertyBorderTopWidth, CSSPropertyBorderRightWidth, CSSPropertyBorderBottomWidth, CSSPropertyBorderLeftWidth };
254 return resolveToPhysicalProperty(direction, writingMode, AfterSide, properties);
256 case CSSPropertyWebkitLogicalWidth: {
257 const int properties[2] = { CSSPropertyWidth, CSSPropertyHeight };
258 return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
260 case CSSPropertyWebkitLogicalHeight: {
261 const int properties[2] = { CSSPropertyWidth, CSSPropertyHeight };
262 return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
264 case CSSPropertyWebkitMinLogicalWidth: {
265 const int properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight };
266 return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
268 case CSSPropertyWebkitMinLogicalHeight: {
269 const int properties[2] = { CSSPropertyMinWidth, CSSPropertyMinHeight };
270 return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
272 case CSSPropertyWebkitMaxLogicalWidth: {
273 const int properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight };
274 return resolveToPhysicalProperty(writingMode, LogicalWidth, properties);
276 case CSSPropertyWebkitMaxLogicalHeight: {
277 const int properties[2] = { CSSPropertyMaxWidth, CSSPropertyMaxHeight };
278 return resolveToPhysicalProperty(writingMode, LogicalHeight, properties);
285 } // namespace WebCore