1/*
2 * Copyright (C) 1999 Antti Koivisto (koivisto@kde.org)
3 * Copyright (C) 2004, 2005, 2006, 2007, 2008, 2009, 2010 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
22#include "config.h"
23#include "StyleRareInheritedData.h"
24
25#include "CursorList.h"
26#include "QuotesData.h"
27#include "RenderStyle.h"
28#include "RenderStyleConstants.h"
29#include "ShadowData.h"
30#include "StyleImage.h"
31
32namespace WebCore {
33
34struct SameSizeAsStyleRareInheritedData : public RefCounted<SameSizeAsStyleRareInheritedData> {
35    void* styleImage;
36    Color firstColor;
37    float firstFloat;
38    Color colors[5];
39    void* ownPtrs[1];
40    AtomicString atomicStrings[5];
41    void* refPtrs[2];
42    Length lengths[1];
43    float secondFloat;
44    unsigned m_bitfields[2];
45    short pagedMediaShorts[2];
46    unsigned unsigneds[1];
47    short hyphenationShorts[3];
48
49#if ENABLE(CSS_IMAGE_RESOLUTION)
50    float imageResolutionFloats;
51#endif
52
53#if ENABLE(TOUCH_EVENTS)
54    Color touchColors;
55#endif
56
57#if ENABLE(CSS_VARIABLES)
58    void* variableDataRefs[1];
59#endif
60};
61
62COMPILE_ASSERT(sizeof(StyleRareInheritedData) == sizeof(SameSizeAsStyleRareInheritedData), StyleRareInheritedData_should_bit_pack);
63
64StyleRareInheritedData::StyleRareInheritedData()
65    : listStyleImage(RenderStyle::initialListStyleImage())
66    , textStrokeWidth(RenderStyle::initialTextStrokeWidth())
67    , indent(RenderStyle::initialTextIndent())
68    , m_effectiveZoom(RenderStyle::initialZoom())
69    , widows(RenderStyle::initialWidows())
70    , orphans(RenderStyle::initialOrphans())
71    , m_hasAutoWidows(true)
72    , m_hasAutoOrphans(true)
73    , textSecurity(RenderStyle::initialTextSecurity())
74    , userModify(READ_ONLY)
75    , wordBreak(RenderStyle::initialWordBreak())
76    , overflowWrap(RenderStyle::initialOverflowWrap())
77    , nbspMode(NBNORMAL)
78    , lineBreak(LineBreakAuto)
79    , resize(RenderStyle::initialResize())
80    , userSelect(RenderStyle::initialUserSelect())
81    , colorSpace(ColorSpaceDeviceRGB)
82    , speak(SpeakNormal)
83    , hyphens(HyphensManual)
84    , textEmphasisFill(TextEmphasisFillFilled)
85    , textEmphasisMark(TextEmphasisMarkNone)
86    , textEmphasisPosition(TextEmphasisPositionOver)
87    , m_textOrientation(TextOrientationVerticalRight)
88#if ENABLE(CSS3_TEXT)
89    , m_textIndentLine(RenderStyle::initialTextIndentLine())
90    , m_textIndentType(RenderStyle::initialTextIndentType())
91#endif
92    , m_lineBoxContain(RenderStyle::initialLineBoxContain())
93#if ENABLE(CSS_IMAGE_ORIENTATION)
94    , m_imageOrientation(RenderStyle::initialImageOrientation())
95#endif
96    , m_imageRendering(RenderStyle::initialImageRendering())
97    , m_lineSnap(RenderStyle::initialLineSnap())
98    , m_lineAlign(RenderStyle::initialLineAlign())
99#if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
100    , useTouchOverflowScrolling(RenderStyle::initialUseTouchOverflowScrolling())
101#endif
102#if ENABLE(CSS_IMAGE_RESOLUTION)
103    , m_imageResolutionSource(RenderStyle::initialImageResolutionSource())
104    , m_imageResolutionSnap(RenderStyle::initialImageResolutionSnap())
105#endif
106#if ENABLE(CSS3_TEXT)
107    , m_textAlignLast(RenderStyle::initialTextAlignLast())
108    , m_textJustify(RenderStyle::initialTextJustify())
109    , m_textUnderlinePosition(RenderStyle::initialTextUnderlinePosition())
110#endif // CSS3_TEXT
111    , m_rubyPosition(RenderStyle::initialRubyPosition())
112    , hyphenationLimitBefore(-1)
113    , hyphenationLimitAfter(-1)
114    , hyphenationLimitLines(-1)
115    , m_lineGrid(RenderStyle::initialLineGrid())
116    , m_tabSize(RenderStyle::initialTabSize())
117#if ENABLE(CSS_IMAGE_RESOLUTION)
118    , m_imageResolution(RenderStyle::initialImageResolution())
119#endif
120#if ENABLE(TOUCH_EVENTS)
121    , tapHighlightColor(RenderStyle::initialTapHighlightColor())
122#endif
123{
124#if ENABLE(CSS_VARIABLES)
125    m_variables.init();
126#endif
127}
128
129StyleRareInheritedData::StyleRareInheritedData(const StyleRareInheritedData& o)
130    : RefCounted<StyleRareInheritedData>()
131    , listStyleImage(o.listStyleImage)
132    , textStrokeColor(o.textStrokeColor)
133    , textStrokeWidth(o.textStrokeWidth)
134    , textFillColor(o.textFillColor)
135    , textEmphasisColor(o.textEmphasisColor)
136    , visitedLinkTextStrokeColor(o.visitedLinkTextStrokeColor)
137    , visitedLinkTextFillColor(o.visitedLinkTextFillColor)
138    , visitedLinkTextEmphasisColor(o.visitedLinkTextEmphasisColor)
139    , textShadow(o.textShadow ? adoptPtr(new ShadowData(*o.textShadow)) : nullptr)
140    , highlight(o.highlight)
141    , cursorData(o.cursorData)
142    , indent(o.indent)
143    , m_effectiveZoom(o.m_effectiveZoom)
144    , widows(o.widows)
145    , orphans(o.orphans)
146    , m_hasAutoWidows(o.m_hasAutoWidows)
147    , m_hasAutoOrphans(o.m_hasAutoOrphans)
148    , textSecurity(o.textSecurity)
149    , userModify(o.userModify)
150    , wordBreak(o.wordBreak)
151    , overflowWrap(o.overflowWrap)
152    , nbspMode(o.nbspMode)
153    , lineBreak(o.lineBreak)
154    , resize(o.resize)
155    , userSelect(o.userSelect)
156    , colorSpace(o.colorSpace)
157    , speak(o.speak)
158    , hyphens(o.hyphens)
159    , textEmphasisFill(o.textEmphasisFill)
160    , textEmphasisMark(o.textEmphasisMark)
161    , textEmphasisPosition(o.textEmphasisPosition)
162    , m_textOrientation(o.m_textOrientation)
163#if ENABLE(CSS3_TEXT)
164    , m_textIndentLine(o.m_textIndentLine)
165    , m_textIndentType(o.m_textIndentType)
166#endif
167    , m_lineBoxContain(o.m_lineBoxContain)
168#if ENABLE(CSS_IMAGE_ORIENTATION)
169    , m_imageOrientation(o.m_imageOrientation)
170#endif
171    , m_imageRendering(o.m_imageRendering)
172    , m_lineSnap(o.m_lineSnap)
173    , m_lineAlign(o.m_lineAlign)
174#if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
175    , useTouchOverflowScrolling(o.useTouchOverflowScrolling)
176#endif
177#if ENABLE(CSS_IMAGE_RESOLUTION)
178    , m_imageResolutionSource(o.m_imageResolutionSource)
179    , m_imageResolutionSnap(o.m_imageResolutionSnap)
180#endif
181#if ENABLE(CSS3_TEXT)
182    , m_textAlignLast(o.m_textAlignLast)
183    , m_textJustify(o.m_textJustify)
184    , m_textUnderlinePosition(o.m_textUnderlinePosition)
185#endif // CSS3_TEXT
186    , m_rubyPosition(o.m_rubyPosition)
187    , hyphenationString(o.hyphenationString)
188    , hyphenationLimitBefore(o.hyphenationLimitBefore)
189    , hyphenationLimitAfter(o.hyphenationLimitAfter)
190    , hyphenationLimitLines(o.hyphenationLimitLines)
191    , locale(o.locale)
192    , textEmphasisCustomMark(o.textEmphasisCustomMark)
193    , m_lineGrid(o.m_lineGrid)
194    , m_tabSize(o.m_tabSize)
195#if ENABLE(CSS_IMAGE_RESOLUTION)
196    , m_imageResolution(o.m_imageResolution)
197#endif
198#if ENABLE(TOUCH_EVENTS)
199    , tapHighlightColor(o.tapHighlightColor)
200#endif
201#if ENABLE(CSS_VARIABLES)
202    , m_variables(o.m_variables)
203#endif
204{
205}
206
207StyleRareInheritedData::~StyleRareInheritedData()
208{
209}
210
211static bool cursorDataEquivalent(const CursorList* c1, const CursorList* c2)
212{
213    if (c1 == c2)
214        return true;
215    if ((!c1 && c2) || (c1 && !c2))
216        return false;
217    return (*c1 == *c2);
218}
219
220static bool quotesDataEquivalent(const QuotesData* q1, const QuotesData* q2)
221{
222    if (q1 == q2)
223        return true;
224    if ((!q1 && q2) || (q1 && !q2))
225        return false;
226    return (*q1 == *q2);
227}
228
229bool StyleRareInheritedData::operator==(const StyleRareInheritedData& o) const
230{
231    return textStrokeColor == o.textStrokeColor
232        && textStrokeWidth == o.textStrokeWidth
233        && textFillColor == o.textFillColor
234        && textEmphasisColor == o.textEmphasisColor
235        && visitedLinkTextStrokeColor == o.visitedLinkTextStrokeColor
236        && visitedLinkTextFillColor == o.visitedLinkTextFillColor
237        && visitedLinkTextEmphasisColor == o.visitedLinkTextEmphasisColor
238#if ENABLE(TOUCH_EVENTS)
239        && tapHighlightColor == o.tapHighlightColor
240#endif
241        && shadowDataEquivalent(o)
242        && highlight == o.highlight
243        && cursorDataEquivalent(cursorData.get(), o.cursorData.get())
244        && indent == o.indent
245        && m_effectiveZoom == o.m_effectiveZoom
246        && widows == o.widows
247        && orphans == o.orphans
248        && m_hasAutoWidows == o.m_hasAutoWidows
249        && m_hasAutoOrphans == o.m_hasAutoOrphans
250        && textSecurity == o.textSecurity
251        && userModify == o.userModify
252        && wordBreak == o.wordBreak
253        && overflowWrap == o.overflowWrap
254        && nbspMode == o.nbspMode
255        && lineBreak == o.lineBreak
256#if ENABLE(ACCELERATED_OVERFLOW_SCROLLING)
257        && useTouchOverflowScrolling == o.useTouchOverflowScrolling
258#endif
259        && resize == o.resize
260        && userSelect == o.userSelect
261        && colorSpace == o.colorSpace
262        && speak == o.speak
263        && hyphens == o.hyphens
264        && hyphenationLimitBefore == o.hyphenationLimitBefore
265        && hyphenationLimitAfter == o.hyphenationLimitAfter
266        && hyphenationLimitLines == o.hyphenationLimitLines
267        && textEmphasisFill == o.textEmphasisFill
268        && textEmphasisMark == o.textEmphasisMark
269        && textEmphasisPosition == o.textEmphasisPosition
270        && m_textOrientation == o.m_textOrientation
271#if ENABLE(CSS3_TEXT)
272        && m_textIndentLine == o.m_textIndentLine
273        && m_textIndentType == o.m_textIndentType
274#endif
275        && m_lineBoxContain == o.m_lineBoxContain
276        && hyphenationString == o.hyphenationString
277        && locale == o.locale
278        && textEmphasisCustomMark == o.textEmphasisCustomMark
279        && quotesDataEquivalent(quotes.get(), o.quotes.get())
280        && m_tabSize == o.m_tabSize
281        && m_lineGrid == o.m_lineGrid
282#if ENABLE(CSS_IMAGE_ORIENTATION)
283        && m_imageOrientation == o.m_imageOrientation
284#endif
285        && m_imageRendering == o.m_imageRendering
286#if ENABLE(CSS_IMAGE_RESOLUTION)
287        && m_imageResolutionSource == o.m_imageResolutionSource
288        && m_imageResolutionSnap == o.m_imageResolutionSnap
289        && m_imageResolution == o.m_imageResolution
290#endif
291#if ENABLE(CSS3_TEXT)
292        && m_textAlignLast == o.m_textAlignLast
293        && m_textJustify == o.m_textJustify
294        && m_textUnderlinePosition == o.m_textUnderlinePosition
295#endif // CSS3_TEXT
296        && m_rubyPosition == o.m_rubyPosition
297        && m_lineSnap == o.m_lineSnap
298#if ENABLE(CSS_VARIABLES)
299        && m_variables == o.m_variables
300#endif
301        && m_lineAlign == o.m_lineAlign
302        && StyleImage::imagesEquivalent(listStyleImage.get(), o.listStyleImage.get());
303}
304
305bool StyleRareInheritedData::shadowDataEquivalent(const StyleRareInheritedData& o) const
306{
307    if ((!textShadow && o.textShadow) || (textShadow && !o.textShadow))
308        return false;
309    if (textShadow && o.textShadow && (*textShadow != *o.textShadow))
310        return false;
311    return true;
312}
313
314} // namespace WebCore
315