862b7633339c790ab823ee6f1d8434c381323257
[WebKit-https.git] / WebCore / rendering / style / RenderStyle.cpp
1 /*
2  * Copyright (C) 1999 Antti Koivisto (koivisto@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
22 #include "config.h"
23 #include "RenderStyle.h"
24
25 #include "CachedImage.h"
26 #include "CSSStyleSelector.h"
27 #include "FontSelector.h"
28 #include "RenderArena.h"
29 #include "RenderObject.h"
30 #include "StyleImage.h"
31
32 namespace WebCore {
33
34 static RenderStyle* defaultStyle;
35
36 StyleSurroundData::StyleSurroundData()
37     : margin(Fixed)
38     , padding(Fixed)
39 {
40 }
41
42 StyleSurroundData::StyleSurroundData(const StyleSurroundData& o)
43     : RefCounted<StyleSurroundData>()
44     , offset(o.offset)
45     , margin(o.margin)
46     , padding(o.padding)
47     , border(o.border)
48 {
49 }
50
51 bool StyleSurroundData::operator==(const StyleSurroundData& o) const
52 {
53     return offset == o.offset && margin == o.margin && padding == o.padding && border == o.border;
54 }
55
56 StyleBoxData::StyleBoxData()
57     : z_index(0)
58     , z_auto(true)
59     , boxSizing(CONTENT_BOX)
60 {
61     // Initialize our min/max widths/heights.
62     min_width = min_height = RenderStyle::initialMinSize();
63     max_width = max_height = RenderStyle::initialMaxSize();
64 }
65
66 StyleBoxData::StyleBoxData(const StyleBoxData& o)
67     : RefCounted<StyleBoxData>()
68     , width(o.width)
69     , height(o.height)
70     , min_width(o.min_width)
71     , max_width(o.max_width)
72     , min_height(o.min_height)
73     , max_height(o.max_height)
74     , z_index(o.z_index)
75     , z_auto(o.z_auto)
76     , boxSizing(o.boxSizing)
77 {
78 }
79
80 bool StyleBoxData::operator==(const StyleBoxData& o) const
81 {
82     return width == o.width &&
83            height == o.height &&
84            min_width == o.min_width &&
85            max_width == o.max_width &&
86            min_height == o.min_height &&
87            max_height == o.max_height &&
88            z_index == o.z_index &&
89            z_auto == o.z_auto &&
90            boxSizing == o.boxSizing;
91 }
92
93 StyleVisualData::StyleVisualData()
94     : hasClip(false)
95     , textDecoration(RenderStyle::initialTextDecoration())
96     , counterIncrement(0)
97     , counterReset(0)
98     , m_zoom(RenderStyle::initialZoom())
99 {
100 }
101
102 StyleVisualData::~StyleVisualData()
103 {
104 }
105
106 StyleVisualData::StyleVisualData(const StyleVisualData& o)
107     : RefCounted<StyleVisualData>()
108     , clip(o.clip)
109     , hasClip(o.hasClip)
110     , textDecoration(o.textDecoration)
111     , counterIncrement(o.counterIncrement)
112     , counterReset(o.counterReset)
113     , m_zoom(RenderStyle::initialZoom())
114 {
115 }
116
117 FillLayer::FillLayer(EFillLayerType type)
118     : m_image(FillLayer::initialFillImage(type))
119     , m_xPosition(FillLayer::initialFillXPosition(type))
120     , m_yPosition(FillLayer::initialFillYPosition(type))
121     , m_attachment(FillLayer::initialFillAttachment(type))
122     , m_clip(FillLayer::initialFillClip(type))
123     , m_origin(FillLayer::initialFillOrigin(type))
124     , m_repeat(FillLayer::initialFillRepeat(type))
125     , m_composite(FillLayer::initialFillComposite(type))
126     , m_size(FillLayer::initialFillSize(type))
127     , m_imageSet(false)
128     , m_attachmentSet(false)
129     , m_clipSet(false)
130     , m_originSet(false)
131     , m_repeatSet(false)
132     , m_xPosSet(false)
133     , m_yPosSet(false)
134     , m_compositeSet(type == MaskFillLayer)
135     , m_sizeSet(false)
136     , m_type(type)
137     , m_next(0)
138 {
139 }
140
141 FillLayer::FillLayer(const FillLayer& o)
142     : m_image(o.m_image)
143     , m_xPosition(o.m_xPosition)
144     , m_yPosition(o.m_yPosition)
145     , m_attachment(o.m_attachment)
146     , m_clip(o.m_clip)
147     , m_origin(o.m_origin)
148     , m_repeat(o.m_repeat)
149     , m_composite(o.m_composite)
150     , m_size(o.m_size)
151     , m_imageSet(o.m_imageSet)
152     , m_attachmentSet(o.m_attachmentSet)
153     , m_clipSet(o.m_clipSet)
154     , m_originSet(o.m_originSet)
155     , m_repeatSet(o.m_repeatSet)
156     , m_xPosSet(o.m_xPosSet)
157     , m_yPosSet(o.m_yPosSet)
158     , m_compositeSet(o.m_compositeSet)
159     , m_sizeSet(o.m_sizeSet)
160     , m_type(o.m_type)
161     , m_next(o.m_next ? new FillLayer(*o.m_next) : 0)
162 {
163 }
164
165 FillLayer::~FillLayer()
166 {
167     delete m_next;
168 }
169
170 FillLayer& FillLayer::operator=(const FillLayer& o)
171 {
172     if (m_next != o.m_next) {
173         delete m_next;
174         m_next = o.m_next ? new FillLayer(*o.m_next) : 0;
175     }
176
177     m_image = o.m_image;
178     m_xPosition = o.m_xPosition;
179     m_yPosition = o.m_yPosition;
180     m_attachment = o.m_attachment;
181     m_clip = o.m_clip;
182     m_composite = o.m_composite;
183     m_origin = o.m_origin;
184     m_repeat = o.m_repeat;
185     m_size = o.m_size;
186
187     m_imageSet = o.m_imageSet;
188     m_attachmentSet = o.m_attachmentSet;
189     m_clipSet = o.m_clipSet;
190     m_compositeSet = o.m_compositeSet;
191     m_originSet = o.m_originSet;
192     m_repeatSet = o.m_repeatSet;
193     m_xPosSet = o.m_xPosSet;
194     m_yPosSet = o.m_yPosSet;
195     m_sizeSet = o.m_sizeSet;
196     
197     m_type = o.m_type;
198
199     return *this;
200 }
201
202 bool FillLayer::operator==(const FillLayer& o) const
203 {
204     // We do not check the "isSet" booleans for each property, since those are only used during initial construction
205     // to propagate patterns into layers.  All layer comparisons happen after values have all been filled in anyway.
206     return StyleImage::imagesEquivalent(m_image.get(), o.m_image.get()) && m_xPosition == o.m_xPosition && m_yPosition == o.m_yPosition &&
207            m_attachment == o.m_attachment && m_clip == o.m_clip && 
208            m_composite == o.m_composite && m_origin == o.m_origin && m_repeat == o.m_repeat &&
209            m_size.width == o.m_size.width && m_size.height == o.m_size.height && m_type == o.m_type &&
210            ((m_next && o.m_next) ? *m_next == *o.m_next : m_next == o.m_next);
211 }
212
213 void FillLayer::fillUnsetProperties()
214 {
215     FillLayer* curr;
216     for (curr = this; curr && curr->isImageSet(); curr = curr->next()) { }
217     if (curr && curr != this) {
218         // We need to fill in the remaining values with the pattern specified.
219         for (FillLayer* pattern = this; curr; curr = curr->next()) {
220             curr->m_image = pattern->m_image;
221             pattern = pattern->next();
222             if (pattern == curr || !pattern)
223                 pattern = this;
224         }
225     }
226     
227     for (curr = this; curr && curr->isXPositionSet(); curr = curr->next()) { }
228     if (curr && curr != this) {
229         // We need to fill in the remaining values with the pattern specified.
230         for (FillLayer* pattern = this; curr; curr = curr->next()) {
231             curr->m_xPosition = pattern->m_xPosition;
232             pattern = pattern->next();
233             if (pattern == curr || !pattern)
234                 pattern = this;
235         }
236     }
237     
238     for (curr = this; curr && curr->isYPositionSet(); curr = curr->next()) { }
239     if (curr && curr != this) {
240         // We need to fill in the remaining values with the pattern specified.
241         for (FillLayer* pattern = this; curr; curr = curr->next()) {
242             curr->m_yPosition = pattern->m_yPosition;
243             pattern = pattern->next();
244             if (pattern == curr || !pattern)
245                 pattern = this;
246         }
247     }
248     
249     for (curr = this; curr && curr->isAttachmentSet(); curr = curr->next()) { }
250     if (curr && curr != this) {
251         // We need to fill in the remaining values with the pattern specified.
252         for (FillLayer* pattern = this; curr; curr = curr->next()) {
253             curr->m_attachment = pattern->m_attachment;
254             pattern = pattern->next();
255             if (pattern == curr || !pattern)
256                 pattern = this;
257         }
258     }
259     
260     for (curr = this; curr && curr->isClipSet(); curr = curr->next()) { }
261     if (curr && curr != this) {
262         // We need to fill in the remaining values with the pattern specified.
263         for (FillLayer* pattern = this; curr; curr = curr->next()) {
264             curr->m_clip = pattern->m_clip;
265             pattern = pattern->next();
266             if (pattern == curr || !pattern)
267                 pattern = this;
268         }
269     }
270
271     for (curr = this; curr && curr->isCompositeSet(); curr = curr->next()) { }
272     if (curr && curr != this) {
273         // We need to fill in the remaining values with the pattern specified.
274         for (FillLayer* pattern = this; curr; curr = curr->next()) {
275             curr->m_composite = pattern->m_composite;
276             pattern = pattern->next();
277             if (pattern == curr || !pattern)
278                 pattern = this;
279         }
280     }
281
282     for (curr = this; curr && curr->isOriginSet(); curr = curr->next()) { }
283     if (curr && curr != this) {
284         // We need to fill in the remaining values with the pattern specified.
285         for (FillLayer* pattern = this; curr; curr = curr->next()) {
286             curr->m_origin = pattern->m_origin;
287             pattern = pattern->next();
288             if (pattern == curr || !pattern)
289                 pattern = this;
290         }
291     }
292
293     for (curr = this; curr && curr->isRepeatSet(); curr = curr->next()) { }
294     if (curr && curr != this) {
295         // We need to fill in the remaining values with the pattern specified.
296         for (FillLayer* pattern = this; curr; curr = curr->next()) {
297             curr->m_repeat = pattern->m_repeat;
298             pattern = pattern->next();
299             if (pattern == curr || !pattern)
300                 pattern = this;
301         }
302     }
303     
304     for (curr = this; curr && curr->isSizeSet(); curr = curr->next()) { }
305     if (curr && curr != this) {
306         // We need to fill in the remaining values with the pattern specified.
307         for (FillLayer* pattern = this; curr; curr = curr->next()) {
308             curr->m_size = pattern->m_size;
309             pattern = pattern->next();
310             if (pattern == curr || !pattern)
311                 pattern = this;
312         }
313     }
314 }
315
316 void FillLayer::cullEmptyLayers()
317 {
318     FillLayer* next;
319     for (FillLayer* p = this; p; p = next) {
320         next = p->m_next;
321         if (next && !next->isImageSet() &&
322             !next->isXPositionSet() && !next->isYPositionSet() &&
323             !next->isAttachmentSet() && !next->isClipSet() &&
324             !next->isCompositeSet() && !next->isOriginSet() &&
325             !next->isRepeatSet() && !next->isSizeSet()) {
326             delete next;
327             p->m_next = 0;
328             break;
329         }
330     }
331 }
332
333 bool FillLayer::containsImage(StyleImage* s) const
334 {
335     if (!s)
336         return false;
337     if (m_image && *s == *m_image)
338         return true;
339     if (m_next)
340         return m_next->containsImage(s);
341     return false;
342 }
343
344 StyleBackgroundData::StyleBackgroundData()
345 : m_background(BackgroundFillLayer)
346 {
347 }
348
349 StyleBackgroundData::StyleBackgroundData(const StyleBackgroundData& o)
350     : RefCounted<StyleBackgroundData>()
351     , m_background(o.m_background)
352     , m_color(o.m_color)
353     , m_outline(o.m_outline)
354 {
355 }
356
357 bool StyleBackgroundData::operator==(const StyleBackgroundData& o) const
358 {
359     return m_background == o.m_background && m_color == o.m_color && m_outline == o.m_outline;
360 }
361
362 StyleMarqueeData::StyleMarqueeData()
363     : increment(RenderStyle::initialMarqueeIncrement())
364     , speed(RenderStyle::initialMarqueeSpeed())
365     , loops(RenderStyle::initialMarqueeLoopCount())
366     , behavior(RenderStyle::initialMarqueeBehavior())
367     , direction(RenderStyle::initialMarqueeDirection())
368 {
369 }
370
371 StyleMarqueeData::StyleMarqueeData(const StyleMarqueeData& o)
372     : RefCounted<StyleMarqueeData>()
373     , increment(o.increment)
374     , speed(o.speed)
375     , loops(o.loops)
376     , behavior(o.behavior)
377     , direction(o.direction) 
378 {
379 }
380
381 bool StyleMarqueeData::operator==(const StyleMarqueeData& o) const
382 {
383     return increment == o.increment && speed == o.speed && direction == o.direction &&
384            behavior == o.behavior && loops == o.loops;
385 }
386
387 StyleFlexibleBoxData::StyleFlexibleBoxData()
388     : flex(RenderStyle::initialBoxFlex())
389     , flex_group(RenderStyle::initialBoxFlexGroup())
390     , ordinal_group(RenderStyle::initialBoxOrdinalGroup())
391     , align(RenderStyle::initialBoxAlign())
392     , pack(RenderStyle::initialBoxPack())
393     , orient(RenderStyle::initialBoxOrient())
394     , lines(RenderStyle::initialBoxLines())
395 {
396 }
397
398 StyleFlexibleBoxData::StyleFlexibleBoxData(const StyleFlexibleBoxData& o)
399     : RefCounted<StyleFlexibleBoxData>()
400     , flex(o.flex)
401     , flex_group(o.flex_group)
402     , ordinal_group(o.ordinal_group)
403     , align(o.align)
404     , pack(o.pack)
405     , orient(o.orient)
406     , lines(o.lines)
407 {
408 }
409
410 bool StyleFlexibleBoxData::operator==(const StyleFlexibleBoxData& o) const
411 {
412     return flex == o.flex && flex_group == o.flex_group &&
413            ordinal_group == o.ordinal_group && align == o.align &&
414            pack == o.pack && orient == o.orient && lines == o.lines;
415 }
416
417 StyleMultiColData::StyleMultiColData()
418     : m_width(0)
419     , m_count(RenderStyle::initialColumnCount())
420     , m_gap(0)
421     , m_autoWidth(true)
422     , m_autoCount(true)
423     , m_normalGap(true)
424     , m_breakBefore(RenderStyle::initialPageBreak())
425     , m_breakAfter(RenderStyle::initialPageBreak())
426     , m_breakInside(RenderStyle::initialPageBreak())
427 {
428 }
429
430 StyleMultiColData::StyleMultiColData(const StyleMultiColData& o)
431     : RefCounted<StyleMultiColData>()
432     , m_width(o.m_width)
433     , m_count(o.m_count)
434     , m_gap(o.m_gap)
435     , m_rule(o.m_rule)
436     , m_autoWidth(o.m_autoWidth)
437     , m_autoCount(o.m_autoCount)
438     , m_normalGap(o.m_normalGap)
439     , m_breakBefore(o.m_breakBefore)
440     , m_breakAfter(o.m_breakAfter)
441     , m_breakInside(o.m_breakInside)
442 {
443 }
444
445 bool StyleMultiColData::operator==(const StyleMultiColData& o) const
446 {
447     return m_width == o.m_width && m_count == o.m_count && m_gap == o.m_gap &&
448            m_rule == o.m_rule && m_breakBefore == o.m_breakBefore && 
449            m_autoWidth == o.m_autoWidth && m_autoCount == o.m_autoCount && m_normalGap == o.m_normalGap &&
450            m_breakAfter == o.m_breakAfter && m_breakInside == o.m_breakInside;
451 }
452
453 StyleTransformData::StyleTransformData()
454     : m_operations(RenderStyle::initialTransform())
455     , m_x(RenderStyle::initialTransformOriginX())
456     , m_y(RenderStyle::initialTransformOriginY())
457 {
458 }
459
460 StyleTransformData::StyleTransformData(const StyleTransformData& o)
461     : RefCounted<StyleTransformData>()
462     , m_operations(o.m_operations)
463     , m_x(o.m_x)
464     , m_y(o.m_y)
465 {
466 }
467
468 bool StyleTransformData::operator==(const StyleTransformData& o) const
469 {
470     return m_x == o.m_x && m_y == o.m_y && m_operations == o.m_operations;
471 }
472
473 bool TransformOperations::operator==(const TransformOperations& o) const
474 {
475     if (m_operations.size() != o.m_operations.size())
476         return false;
477         
478     unsigned s = m_operations.size();
479     for (unsigned i = 0; i < s; i++) {
480         if (*m_operations[i] != *o.m_operations[i])
481             return false;
482     }
483     
484     return true;
485 }
486
487 PassRefPtr<TransformOperation> ScaleTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
488 {
489     if (from && !from->isScaleOperation())
490         return this;
491     
492     if (blendToIdentity)
493         return ScaleTransformOperation::create(m_x + (1. - m_x) * progress, m_y + (1. - m_y) * progress);
494     
495     const ScaleTransformOperation* fromOp = static_cast<const ScaleTransformOperation*>(from);
496     double fromX = fromOp ? fromOp->m_x : 1.;
497     double fromY = fromOp ? fromOp->m_y : 1.;
498     return ScaleTransformOperation::create(fromX + (m_x - fromX) * progress, fromY + (m_y - fromY) * progress);
499 }
500
501 PassRefPtr<TransformOperation> RotateTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
502 {
503     if (from && !from->isRotateOperation())
504         return this;
505     
506     if (blendToIdentity)
507         return RotateTransformOperation::create(m_angle - m_angle * progress);
508     
509     const RotateTransformOperation* fromOp = static_cast<const RotateTransformOperation*>(from);
510     double fromAngle = fromOp ? fromOp->m_angle : 0;
511     return RotateTransformOperation::create(fromAngle + (m_angle - fromAngle) * progress);
512 }
513
514 PassRefPtr<TransformOperation> SkewTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
515 {
516     if (from && !from->isSkewOperation())
517         return this;
518     
519     if (blendToIdentity)
520         return SkewTransformOperation::create(m_angleX - m_angleX * progress, m_angleY - m_angleY * progress);
521     
522     const SkewTransformOperation* fromOp = static_cast<const SkewTransformOperation*>(from);
523     double fromAngleX = fromOp ? fromOp->m_angleX : 0;
524     double fromAngleY = fromOp ? fromOp->m_angleY : 0;
525     return SkewTransformOperation::create(fromAngleX + (m_angleX - fromAngleX) * progress, fromAngleY + (m_angleY - fromAngleY) * progress);
526 }
527
528 PassRefPtr<TransformOperation> TranslateTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
529 {
530     if (from && !from->isTranslateOperation())
531         return this;
532     
533     if (blendToIdentity)
534         return TranslateTransformOperation::create(Length(m_x.type()).blend(m_x, progress), Length(m_y.type()).blend(m_y, progress));
535
536     const TranslateTransformOperation* fromOp = static_cast<const TranslateTransformOperation*>(from);
537     Length fromX = fromOp ? fromOp->m_x : Length(m_x.type());
538     Length fromY = fromOp ? fromOp->m_y : Length(m_y.type());
539     return TranslateTransformOperation::create(m_x.blend(fromX, progress), m_y.blend(fromY, progress));
540 }
541
542 PassRefPtr<TransformOperation> MatrixTransformOperation::blend(const TransformOperation* from, double progress, bool blendToIdentity)
543 {
544     if (from && !from->isMatrixOperation())
545         return this;
546     
547     if (blendToIdentity)
548         return MatrixTransformOperation::create(m_a * (1. - progress) + progress,
549                                             m_b * (1. - progress),
550                                             m_c * (1. - progress),
551                                             m_d * (1. - progress) + progress,
552                                             m_e * (1. - progress),
553                                             m_f * (1. - progress));
554
555     const MatrixTransformOperation* fromOp = static_cast<const MatrixTransformOperation*>(from);
556     double fromA = fromOp ? fromOp->m_a : 1.;
557     double fromB = fromOp ? fromOp->m_b : 0;
558     double fromC = fromOp ? fromOp->m_c : 0;
559     double fromD = fromOp ? fromOp->m_d : 1.;
560     double fromE = fromOp ? fromOp->m_e : 0;
561     double fromF = fromOp ? fromOp->m_f : 0;
562     
563     return MatrixTransformOperation::create(fromA + (m_a - fromA) * progress,
564                                         fromB + (m_b - fromB) * progress,
565                                         fromC + (m_c - fromC) * progress,
566                                         fromD + (m_d - fromD) * progress,
567                                         fromE + (m_e - fromE) * progress,
568                                         fromF + (m_f - fromF) * progress);
569 }
570
571 bool KeyframeList::operator==(const KeyframeList& o) const
572 {
573     if (m_keyframes.size() != o.m_keyframes.size())
574         return false;
575
576     Vector<KeyframeValue>::const_iterator it2 = o.m_keyframes.begin();
577     for (Vector<KeyframeValue>::const_iterator it1 = m_keyframes.begin(); it1 != m_keyframes.end(); ++it1) {
578         if (it1->key != it2->key)
579             return false;
580         const RenderStyle& style1 = it1->style;
581         const RenderStyle& style2 = it2->style;
582         if (!(style1 == style2))
583             return false;
584         ++it2;
585     }
586
587     return true;
588 }
589
590 void
591 KeyframeList::insert(float inKey, const RenderStyle& inStyle)
592 {
593     if (inKey < 0 || inKey > 1)
594         return;
595
596     for (size_t i = 0; i < m_keyframes.size(); ++i) {
597         if (m_keyframes[i].key == inKey) {
598             m_keyframes[i].style = inStyle;
599             return;
600         }
601         if (m_keyframes[i].key > inKey) {
602             // insert before
603             m_keyframes.insert(i, KeyframeValue());
604             m_keyframes[i].key = inKey;
605             m_keyframes[i].style = inStyle;
606             return;
607         }
608     }
609     
610     // append
611     m_keyframes.append(KeyframeValue());
612     m_keyframes[m_keyframes.size()-1].key = inKey;
613     m_keyframes[m_keyframes.size()-1].style = inStyle;
614 }
615
616 Animation::Animation()
617     : m_delay(RenderStyle::initialAnimationDelay())
618     , m_direction(RenderStyle::initialAnimationDirection())
619     , m_duration(RenderStyle::initialAnimationDuration())
620     , m_iterationCount(RenderStyle::initialAnimationIterationCount())
621     , m_name(RenderStyle::initialAnimationName())
622     , m_property(RenderStyle::initialAnimationProperty())
623     , m_timingFunction(RenderStyle::initialAnimationTimingFunction())
624     , m_playState(RenderStyle::initialAnimationPlayState())
625     , m_delaySet(false)
626     , m_directionSet(false)
627     , m_durationSet(false)
628     , m_iterationCountSet(false)
629     , m_nameSet(false)
630     , m_playStateSet(false)
631     , m_propertySet(false)
632     , m_timingFunctionSet(false)
633     , m_isNone(false)
634 {
635 }
636
637 Animation::Animation(const Animation& o)
638     : RefCounted<Animation>()
639     , m_delay(o.m_delay)
640     , m_direction(o.m_direction)
641     , m_duration(o.m_duration)
642     , m_iterationCount(o.m_iterationCount)
643     , m_name(o.m_name)
644     , m_property(o.m_property)
645     , m_timingFunction(o.m_timingFunction)
646     , m_playState(o.m_playState)
647     , m_delaySet(o.m_delaySet)
648     , m_directionSet(o.m_directionSet)
649     , m_durationSet(o.m_durationSet)
650     , m_iterationCountSet(o.m_iterationCountSet)
651     , m_nameSet(o.m_nameSet)
652     , m_playStateSet(o.m_playStateSet)
653     , m_propertySet(o.m_propertySet)
654     , m_timingFunctionSet(o.m_timingFunctionSet)
655     , m_isNone(o.m_isNone)
656 {
657 }
658
659 Animation& Animation::operator=(const Animation& o)
660 {
661     m_delay = o.m_delay;
662     m_direction = o.m_direction;
663     m_duration = o.m_duration;
664     m_iterationCount = o.m_iterationCount;
665     m_name = o.m_name;
666     m_playState = o.m_playState;
667     m_property = o.m_property;
668     m_timingFunction = o.m_timingFunction;
669
670     m_delaySet = o.m_delaySet;
671     m_directionSet = o.m_directionSet;
672     m_durationSet = o.m_durationSet;
673     m_iterationCountSet = o.m_iterationCountSet;
674     m_nameSet = o.m_nameSet;
675     m_playStateSet = o.m_playStateSet;
676     m_propertySet = o.m_propertySet;
677     m_timingFunctionSet = o.m_timingFunctionSet;
678
679     m_isNone = o.m_isNone;
680
681     return *this;
682 }
683
684 bool Animation::animationsMatch(const Animation* o, bool matchPlayStates /* = true */) const
685 {
686     if (!o)
687         return false;
688     
689     bool result = m_delay == o->m_delay &&
690                   m_direction == o->m_direction &&
691                   m_duration == o->m_duration &&
692                   m_iterationCount == o->m_iterationCount &&
693                   m_name == o->m_name &&
694                   m_property == o->m_property && 
695                   m_timingFunction == o->m_timingFunction &&
696                   m_delaySet == o->m_delaySet &&
697                   m_directionSet == o->m_directionSet &&
698                   m_durationSet == o->m_durationSet &&
699                   m_iterationCountSet == o->m_iterationCountSet &&
700                   m_nameSet == o->m_nameSet &&
701                   m_propertySet == o->m_propertySet &&
702                   m_timingFunctionSet == o->m_timingFunctionSet &&
703                   m_isNone == o->m_isNone;
704
705     if (!result)
706         return false;
707
708     if (matchPlayStates && (m_playState != o->m_playState || m_playStateSet != o->m_playStateSet))
709         return false;
710
711     // now check keyframes
712     if ((m_keyframeList.get() && !o->m_keyframeList.get()) || (!m_keyframeList.get() && o->m_keyframeList.get()))
713         return false;
714     if (!(m_keyframeList.get()))
715         return true;
716     return *m_keyframeList == *o->m_keyframeList;
717 }
718
719 #define FILL_UNSET_PROPERTY(test, propGet, propSet) \
720 for (i = 0; i < size() && (*this)[i]->test(); ++i) { } \
721 if (i < size() && i != 0) { \
722     for (size_t j = 0; i < size(); ++i, ++j) \
723         (*this)[i]->propSet((*this)[j]->propGet()); \
724 }
725
726 void AnimationList::fillUnsetProperties()
727 {
728     size_t i;
729     FILL_UNSET_PROPERTY(isDelaySet, delay, setDelay);
730     FILL_UNSET_PROPERTY(isDirectionSet, direction, setDirection);
731     FILL_UNSET_PROPERTY(isDurationSet, duration, setDuration);
732     FILL_UNSET_PROPERTY(isIterationCountSet, iterationCount, setIterationCount);
733     FILL_UNSET_PROPERTY(isPlayStateSet, playState, setPlayState);
734     FILL_UNSET_PROPERTY(isNameSet, name, setName);
735     FILL_UNSET_PROPERTY(isTimingFunctionSet, timingFunction, setTimingFunction);
736     FILL_UNSET_PROPERTY(isPropertySet, property, setProperty);
737 }
738
739 bool AnimationList::operator==(const AnimationList& o) const
740 {
741     if (size() != o.size())
742         return false;
743     for (size_t i = 0; i < size(); ++i)
744         if (*at(i) != *o.at(i))
745             return false;
746     return true;
747 }
748
749 StyleRareNonInheritedData::StyleRareNonInheritedData()
750     : lineClamp(RenderStyle::initialLineClamp())
751     , opacity(RenderStyle::initialOpacity())
752     , m_content(0)
753     , m_counterDirectives(0)
754     , userDrag(RenderStyle::initialUserDrag())
755     , textOverflow(RenderStyle::initialTextOverflow())
756     , marginTopCollapse(MCOLLAPSE)
757     , marginBottomCollapse(MCOLLAPSE)
758     , matchNearestMailBlockquoteColor(RenderStyle::initialMatchNearestMailBlockquoteColor())
759     , m_appearance(RenderStyle::initialAppearance())
760     , m_borderFit(RenderStyle::initialBorderFit())
761     , m_boxShadow(0)
762     , m_animations(0)
763     , m_transitions(0)
764     , m_mask(FillLayer(MaskFillLayer))
765 #if ENABLE(XBL)
766     , bindingURI(0)
767 #endif
768 {
769 }
770
771 StyleRareNonInheritedData::StyleRareNonInheritedData(const StyleRareNonInheritedData& o)
772     : RefCounted<StyleRareNonInheritedData>()
773     , lineClamp(o.lineClamp)
774     , opacity(o.opacity)
775     , flexibleBox(o.flexibleBox)
776     , marquee(o.marquee)
777     , m_multiCol(o.m_multiCol)
778     , m_transform(o.m_transform)
779     , m_content(0)
780     , m_counterDirectives(0)
781     , userDrag(o.userDrag)
782     , textOverflow(o.textOverflow)
783     , marginTopCollapse(o.marginTopCollapse)
784     , marginBottomCollapse(o.marginBottomCollapse)
785     , matchNearestMailBlockquoteColor(o.matchNearestMailBlockquoteColor)
786     , m_appearance(o.m_appearance)
787     , m_borderFit(o.m_borderFit)
788     , m_boxShadow(o.m_boxShadow ? new ShadowData(*o.m_boxShadow) : 0)
789     , m_boxReflect(o.m_boxReflect)
790     , m_animations(o.m_animations ? new AnimationList(*o.m_animations) : 0)
791     , m_transitions(o.m_transitions ? new AnimationList(*o.m_transitions) : 0)
792     , m_mask(o.m_mask)
793     , m_maskBoxImage(o.m_maskBoxImage)
794 #if ENABLE(XBL)
795     , bindingURI(o.bindingURI ? o.bindingURI->copy() : 0)
796 #endif
797 {
798 }
799
800 StyleRareNonInheritedData::~StyleRareNonInheritedData()
801 {
802 }
803
804 #if ENABLE(XBL)
805 bool StyleRareNonInheritedData::bindingsEquivalent(const StyleRareNonInheritedData& o) const
806 {
807     if (this == &o) return true;
808     if (!bindingURI && o.bindingURI || bindingURI && !o.bindingURI)
809         return false;
810     if (bindingURI && o.bindingURI && (*bindingURI != *o.bindingURI))
811         return false;
812     return true;
813 }
814 #endif
815
816 bool StyleRareNonInheritedData::operator==(const StyleRareNonInheritedData& o) const
817 {
818     return lineClamp == o.lineClamp
819 #if ENABLE(DASHBOARD_SUPPORT)
820         && m_dashboardRegions == o.m_dashboardRegions
821 #endif
822         && opacity == o.opacity
823         && flexibleBox == o.flexibleBox
824         && marquee == o.marquee
825         && m_multiCol == o.m_multiCol
826         && m_transform == o.m_transform
827         && m_content == o.m_content
828         && m_counterDirectives == o.m_counterDirectives
829         && userDrag == o.userDrag
830         && textOverflow == o.textOverflow
831         && marginTopCollapse == o.marginTopCollapse
832         && marginBottomCollapse == o.marginBottomCollapse
833         && matchNearestMailBlockquoteColor == o.matchNearestMailBlockquoteColor
834         && m_appearance == o.m_appearance
835         && m_borderFit == o.m_borderFit
836         && shadowDataEquivalent(o)
837         && reflectionDataEquivalent(o)
838         && animationDataEquivalent(o)
839         && transitionDataEquivalent(o)
840         && m_mask == o.m_mask
841         && m_maskBoxImage == o.m_maskBoxImage
842 #if ENABLE(XBL)
843         && bindingsEquivalent(o)
844 #endif
845         ;
846 }
847
848 bool StyleRareNonInheritedData::shadowDataEquivalent(const StyleRareNonInheritedData& o) const
849 {
850     if (!m_boxShadow && o.m_boxShadow || m_boxShadow && !o.m_boxShadow)
851         return false;
852     if (m_boxShadow && o.m_boxShadow && (*m_boxShadow != *o.m_boxShadow))
853         return false;
854     return true;
855 }
856
857 bool StyleRareNonInheritedData::reflectionDataEquivalent(const StyleRareNonInheritedData& o) const
858 {
859     if (m_boxReflect != o.m_boxReflect) {
860         if (!m_boxReflect || !o.m_boxReflect)
861             return false;
862         return *m_boxReflect == *o.m_boxReflect;
863     }
864     return true;
865
866 }
867
868 void StyleRareNonInheritedData::updateKeyframes(const CSSStyleSelector* styleSelector)
869 {
870     if (m_animations) {
871         for (size_t i = 0; i < m_animations->size(); ++i) {
872             if ((*m_animations)[i]->isValidAnimation()) {
873                 // When keyframes have been parsed, execute this code.
874                 // RefPtr<KeyframeList> keyframe = styleSelector->findKeyframeRule((*m_animations)[i]->name());
875                 // (*m_animations)[i]->setAnimationKeyframe(keyframe);
876             }
877         }
878     }
879 }
880
881 bool StyleRareNonInheritedData::animationDataEquivalent(const StyleRareNonInheritedData& o) const
882 {
883     if (!m_animations && o.m_animations || m_animations && !o.m_animations)
884         return false;
885     if (m_animations && o.m_animations && (*m_animations != *o.m_animations))
886         return false;
887     return true;
888 }
889
890 bool StyleRareNonInheritedData::transitionDataEquivalent(const StyleRareNonInheritedData& o) const
891 {
892     if (!m_transitions && o.m_transitions || m_transitions && !o.m_transitions)
893         return false;
894     if (m_transitions && o.m_transitions && (*m_transitions != *o.m_transitions))
895         return false;
896     return true;
897 }
898
899 StyleRareInheritedData::StyleRareInheritedData()
900     : textStrokeWidth(RenderStyle::initialTextStrokeWidth())
901     , textShadow(0)
902     , textSecurity(RenderStyle::initialTextSecurity())
903     , userModify(READ_ONLY)
904     , wordBreak(RenderStyle::initialWordBreak())
905     , wordWrap(RenderStyle::initialWordWrap())
906     , nbspMode(NBNORMAL)
907     , khtmlLineBreak(LBNORMAL)
908     , textSizeAdjust(RenderStyle::initialTextSizeAdjust())
909     , resize(RenderStyle::initialResize())
910     , userSelect(RenderStyle::initialUserSelect())
911 {
912 }
913
914 StyleRareInheritedData::StyleRareInheritedData(const StyleRareInheritedData& o)
915     : RefCounted<StyleRareInheritedData>()
916     , textStrokeColor(o.textStrokeColor)
917     , textStrokeWidth(o.textStrokeWidth)
918     , textFillColor(o.textFillColor)
919     , textShadow(o.textShadow ? new ShadowData(*o.textShadow) : 0)
920     , highlight(o.highlight)
921     , textSecurity(o.textSecurity)
922     , userModify(o.userModify)
923     , wordBreak(o.wordBreak)
924     , wordWrap(o.wordWrap)
925     , nbspMode(o.nbspMode)
926     , khtmlLineBreak(o.khtmlLineBreak)
927     , textSizeAdjust(o.textSizeAdjust)
928     , resize(o.resize)
929     , userSelect(o.userSelect)
930 {
931 }
932
933 StyleRareInheritedData::~StyleRareInheritedData()
934 {
935     delete textShadow;
936 }
937
938 bool StyleRareInheritedData::operator==(const StyleRareInheritedData& o) const
939 {
940     return textStrokeColor == o.textStrokeColor
941         && textStrokeWidth == o.textStrokeWidth
942         && textFillColor == o.textFillColor
943         && shadowDataEquivalent(o)
944         && highlight == o.highlight
945         && textSecurity == o.textSecurity
946         && userModify == o.userModify
947         && wordBreak == o.wordBreak
948         && wordWrap == o.wordWrap
949         && nbspMode == o.nbspMode
950         && khtmlLineBreak == o.khtmlLineBreak
951         && textSizeAdjust == o.textSizeAdjust
952         && userSelect == o.userSelect;
953 }
954
955 bool StyleRareInheritedData::shadowDataEquivalent(const StyleRareInheritedData& o) const
956 {
957     if (!textShadow && o.textShadow || textShadow && !o.textShadow)
958         return false;
959     if (textShadow && o.textShadow && (*textShadow != *o.textShadow))
960         return false;
961     return true;
962 }
963
964 StyleInheritedData::StyleInheritedData()
965     : indent(RenderStyle::initialTextIndent())
966     , line_height(RenderStyle::initialLineHeight())
967     , list_style_image(RenderStyle::initialListStyleImage())
968     , color(RenderStyle::initialColor())
969     , m_effectiveZoom(RenderStyle::initialZoom())
970     , horizontal_border_spacing(RenderStyle::initialHorizontalBorderSpacing())
971     , vertical_border_spacing(RenderStyle::initialVerticalBorderSpacing())
972     , widows(RenderStyle::initialWidows())
973     , orphans(RenderStyle::initialOrphans())
974     , page_break_inside(RenderStyle::initialPageBreak())
975 {
976 }
977
978 StyleInheritedData::~StyleInheritedData()
979 {
980 }
981
982 StyleInheritedData::StyleInheritedData(const StyleInheritedData& o)
983     : RefCounted<StyleInheritedData>()
984     , indent(o.indent)
985     , line_height(o.line_height)
986     , list_style_image(o.list_style_image)
987     , cursorData(o.cursorData)
988     , font(o.font)
989     , color(o.color)
990     , m_effectiveZoom(o.m_effectiveZoom)
991     , horizontal_border_spacing(o.horizontal_border_spacing)
992     , vertical_border_spacing(o.vertical_border_spacing)
993     , widows(o.widows)
994     , orphans(o.orphans)
995     , page_break_inside(o.page_break_inside)
996 {
997 }
998
999 static bool cursorDataEquivalent(const CursorList* c1, const CursorList* c2)
1000 {
1001     if (c1 == c2)
1002         return true;
1003     if (!c1 && c2 || c1 && !c2)
1004         return false;
1005     return (*c1 == *c2);
1006 }
1007
1008 bool StyleInheritedData::operator==(const StyleInheritedData& o) const
1009 {
1010     return
1011         indent == o.indent &&
1012         line_height == o.line_height &&
1013         StyleImage::imagesEquivalent(list_style_image.get(), o.list_style_image.get()) &&
1014         cursorDataEquivalent(cursorData.get(), o.cursorData.get()) &&
1015         font == o.font &&
1016         color == o.color &&
1017         m_effectiveZoom == o.m_effectiveZoom &&
1018         horizontal_border_spacing == o.horizontal_border_spacing &&
1019         vertical_border_spacing == o.vertical_border_spacing &&
1020         widows == o.widows &&
1021         orphans == o.orphans &&
1022         page_break_inside == o.page_break_inside;
1023 }
1024
1025 static inline bool operator!=(const CounterContent& a, const CounterContent& b)
1026 {
1027     return a.identifier() != b.identifier()
1028         || a.listStyle() != b.listStyle()
1029         || a.separator() != b.separator();
1030 }
1031
1032 // ----------------------------------------------------------
1033
1034 void* RenderStyle::operator new(size_t sz, RenderArena* renderArena) throw()
1035 {
1036     return renderArena->allocate(sz);
1037 }
1038
1039 void RenderStyle::operator delete(void* ptr, size_t sz)
1040 {
1041     // Stash size where destroy can find it.
1042     *(size_t *)ptr = sz;
1043 }
1044
1045 void RenderStyle::arenaDelete(RenderArena *arena)
1046 {
1047     RenderStyle *ps = pseudoStyle;
1048     RenderStyle *prev = 0;
1049     
1050     while (ps) {
1051         prev = ps;
1052         ps = ps->pseudoStyle;
1053         // to prevent a double deletion.
1054         // this works only because the styles below aren't really shared
1055         // Dirk said we need another construct as soon as these are shared
1056         prev->pseudoStyle = 0;
1057         prev->deref(arena);
1058     }
1059     delete this;
1060     
1061     // Recover the size left there for us by operator delete and free the memory.
1062     arena->free(*(size_t *)this, this);
1063 }
1064
1065 inline RenderStyle *initDefaultStyle()
1066 {
1067     if (!defaultStyle)
1068         defaultStyle = ::new RenderStyle(true);
1069     return defaultStyle;
1070 }
1071
1072 RenderStyle::RenderStyle()
1073     : box(initDefaultStyle()->box)
1074     , visual(defaultStyle->visual)
1075     , background(defaultStyle->background)
1076     , surround(defaultStyle->surround)
1077     , rareNonInheritedData(defaultStyle->rareNonInheritedData)
1078     , rareInheritedData(defaultStyle->rareInheritedData)
1079     , inherited(defaultStyle->inherited)
1080     , pseudoStyle(0)
1081     , m_pseudoState(PseudoUnknown)
1082     , m_affectedByAttributeSelectors(false)
1083     , m_unique(false)
1084     , m_affectedByEmpty(false)
1085     , m_emptyState(false)
1086     , m_childrenAffectedByFirstChildRules(false)
1087     , m_childrenAffectedByLastChildRules(false)
1088     , m_childrenAffectedByDirectAdjacentRules(false)
1089     , m_childrenAffectedByForwardPositionalRules(false)
1090     , m_childrenAffectedByBackwardPositionalRules(false)
1091     , m_firstChildState(false)
1092     , m_lastChildState(false)
1093     , m_childIndex(0)
1094     , m_ref(0)
1095 #if ENABLE(SVG)
1096     , m_svgStyle(defaultStyle->m_svgStyle)
1097 #endif
1098 {
1099     setBitDefaults(); // Would it be faster to copy this from the default style?
1100 }
1101
1102 RenderStyle::RenderStyle(bool)
1103     : pseudoStyle(0)
1104     , m_pseudoState(PseudoUnknown)
1105     , m_affectedByAttributeSelectors(false)
1106     , m_unique(false)
1107     , m_affectedByEmpty(false)
1108     , m_emptyState(false)
1109     , m_childrenAffectedByFirstChildRules(false)
1110     , m_childrenAffectedByLastChildRules(false)
1111     , m_childrenAffectedByDirectAdjacentRules(false)
1112     , m_childrenAffectedByForwardPositionalRules(false)
1113     , m_childrenAffectedByBackwardPositionalRules(false)
1114     , m_firstChildState(false)
1115     , m_lastChildState(false)
1116     , m_childIndex(0)
1117     , m_ref(1)
1118 {
1119     setBitDefaults();
1120
1121     box.init();
1122     visual.init();
1123     background.init();
1124     surround.init();
1125     rareNonInheritedData.init();
1126     rareNonInheritedData.access()->flexibleBox.init();
1127     rareNonInheritedData.access()->marquee.init();
1128     rareNonInheritedData.access()->m_multiCol.init();
1129     rareNonInheritedData.access()->m_transform.init();
1130     rareInheritedData.init();
1131     inherited.init();
1132     
1133 #if ENABLE(SVG)
1134     m_svgStyle.init();
1135 #endif
1136 }
1137
1138 RenderStyle::RenderStyle(const RenderStyle& o)
1139     : inherited_flags(o.inherited_flags)
1140     , noninherited_flags(o.noninherited_flags)
1141     , box(o.box)
1142     , visual(o.visual)
1143     , background(o.background)
1144     , surround(o.surround)
1145     , rareNonInheritedData(o.rareNonInheritedData)
1146     , rareInheritedData(o.rareInheritedData)
1147     , inherited(o.inherited)
1148     , pseudoStyle(0)
1149     , m_pseudoState(o.m_pseudoState)
1150     , m_affectedByAttributeSelectors(false)
1151     , m_unique(false)
1152     , m_affectedByEmpty(false)
1153     , m_emptyState(false)
1154     , m_childrenAffectedByFirstChildRules(false)
1155     , m_childrenAffectedByLastChildRules(false)
1156     , m_childrenAffectedByDirectAdjacentRules(false)
1157     , m_childrenAffectedByForwardPositionalRules(false)
1158     , m_childrenAffectedByBackwardPositionalRules(false)
1159     , m_firstChildState(false)
1160     , m_lastChildState(false)
1161     , m_childIndex(0)
1162     , m_ref(0)
1163 #if ENABLE(SVG)
1164     , m_svgStyle(o.m_svgStyle)
1165 #endif
1166 {
1167 }
1168
1169 void RenderStyle::inheritFrom(const RenderStyle* inheritParent)
1170 {
1171     rareInheritedData = inheritParent->rareInheritedData;
1172     inherited = inheritParent->inherited;
1173     inherited_flags = inheritParent->inherited_flags;
1174 #if ENABLE(SVG)
1175     if (m_svgStyle != inheritParent->m_svgStyle)
1176         m_svgStyle.access()->inheritFrom(inheritParent->m_svgStyle.get());
1177 #endif
1178 }
1179
1180 RenderStyle::~RenderStyle()
1181 {
1182 }
1183
1184 bool RenderStyle::operator==(const RenderStyle& o) const
1185 {
1186     // compare everything except the pseudoStyle pointer
1187     return inherited_flags == o.inherited_flags &&
1188             noninherited_flags == o.noninherited_flags &&
1189             box == o.box &&
1190             visual == o.visual &&
1191             background == o.background &&
1192             surround == o.surround &&
1193             rareNonInheritedData == o.rareNonInheritedData &&
1194             rareInheritedData == o.rareInheritedData &&
1195             inherited == o.inherited
1196 #if ENABLE(SVG)
1197             && m_svgStyle == o.m_svgStyle
1198 #endif
1199             ;
1200 }
1201
1202 bool RenderStyle::isStyleAvailable() const
1203 {
1204     return this != CSSStyleSelector::styleNotYetAvailable();
1205 }
1206
1207 static inline int pseudoBit(RenderStyle::PseudoId pseudo)
1208 {
1209     return 1 << (pseudo - 1);
1210 }
1211
1212 bool RenderStyle::hasPseudoStyle(PseudoId pseudo) const
1213 {
1214     ASSERT(pseudo > NOPSEUDO);
1215     ASSERT(pseudo < FIRST_INTERNAL_PSEUDOID);
1216     return pseudoBit(pseudo) & noninherited_flags._pseudoBits;
1217 }
1218
1219 void RenderStyle::setHasPseudoStyle(PseudoId pseudo)
1220 {
1221     ASSERT(pseudo > NOPSEUDO);
1222     ASSERT(pseudo < FIRST_INTERNAL_PSEUDOID);
1223     noninherited_flags._pseudoBits |= pseudoBit(pseudo);
1224 }
1225
1226 RenderStyle* RenderStyle::getPseudoStyle(PseudoId pid)
1227 {
1228     if (!pseudoStyle || styleType() != NOPSEUDO)
1229         return 0;
1230     RenderStyle* ps = pseudoStyle;
1231     while (ps && ps->styleType() != pid)
1232         ps = ps->pseudoStyle;
1233     return ps;
1234 }
1235
1236 void RenderStyle::addPseudoStyle(RenderStyle* pseudo)
1237 {
1238     if (!pseudo)
1239         return;
1240     pseudo->ref();
1241     pseudo->pseudoStyle = pseudoStyle;
1242     pseudoStyle = pseudo;
1243 }
1244
1245 bool RenderStyle::inheritedNotEqual(RenderStyle* other) const
1246 {
1247     return inherited_flags != other->inherited_flags ||
1248            inherited != other->inherited ||
1249 #if ENABLE(SVG)
1250            m_svgStyle->inheritedNotEqual(other->m_svgStyle.get()) ||
1251 #endif
1252            rareInheritedData != other->rareInheritedData;
1253 }
1254
1255 bool positionedObjectMoved(const LengthBox& a, const LengthBox& b)
1256 {
1257     // If any unit types are different, then we can't guarantee
1258     // that this was just a movement.
1259     if (a.left.type() != b.left.type() ||
1260         a.right.type() != b.right.type() ||
1261         a.top.type() != b.top.type() ||
1262         a.bottom.type() != b.bottom.type())
1263         return false;
1264         
1265     // Only one unit can be non-auto in the horizontal direction and
1266     // in the vertical direction.  Otherwise the adjustment of values
1267     // is changing the size of the box.
1268     if (!a.left.isIntrinsicOrAuto() && !a.right.isIntrinsicOrAuto())
1269         return false;
1270     if (!a.top.isIntrinsicOrAuto() && !a.bottom.isIntrinsicOrAuto())
1271         return false;
1272         
1273     // One of the units is fixed or percent in both directions and stayed
1274     // that way in the new style.  Therefore all we are doing is moving.
1275     return true;
1276 }
1277
1278 /*
1279   compares two styles. The result gives an idea of the action that
1280   needs to be taken when replacing the old style with a new one.
1281
1282   CbLayout: The containing block of the object needs a relayout.
1283   Layout: the RenderObject needs a relayout after the style change
1284   Visible: The change is visible, but no relayout is needed
1285   NonVisible: The object does need neither repaint nor relayout after
1286        the change.
1287
1288   ### TODO:
1289   A lot can be optimised here based on the display type, lots of
1290   optimisations are unimplemented, and currently result in the
1291   worst case result causing a relayout of the containing block.
1292 */
1293 RenderStyle::Diff RenderStyle::diff(const RenderStyle* other) const
1294 {
1295 #if ENABLE(SVG)
1296     // This is horribly inefficient.  Eventually we'll have to integrate
1297     // this more directly by calling: Diff svgDiff = svgStyle->diff(other)
1298     // and then checking svgDiff and returning from the appropriate places below.
1299     if (m_svgStyle != other->m_svgStyle)
1300         return Layout;
1301 #endif
1302
1303     if (box->width != other->box->width ||
1304         box->min_width != other->box->min_width ||
1305         box->max_width != other->box->max_width ||
1306         box->height != other->box->height ||
1307         box->min_height != other->box->min_height ||
1308         box->max_height != other->box->max_height)
1309         return Layout;
1310     
1311     if (box->vertical_align != other->box->vertical_align || noninherited_flags._vertical_align != other->noninherited_flags._vertical_align)
1312         return Layout;
1313     
1314     if (box->boxSizing != other->box->boxSizing)
1315         return Layout;
1316     
1317     if (surround->margin != other->surround->margin)
1318         return Layout;
1319         
1320     if (surround->padding != other->surround->padding)
1321         return Layout;
1322     
1323     if (rareNonInheritedData.get() != other->rareNonInheritedData.get()) {
1324         if (rareNonInheritedData->m_appearance != other->rareNonInheritedData->m_appearance ||
1325             rareNonInheritedData->marginTopCollapse != other->rareNonInheritedData->marginTopCollapse ||
1326             rareNonInheritedData->marginBottomCollapse != other->rareNonInheritedData->marginBottomCollapse ||
1327             rareNonInheritedData->lineClamp != other->rareNonInheritedData->lineClamp ||
1328             rareNonInheritedData->textOverflow != other->rareNonInheritedData->textOverflow)
1329             return Layout;
1330         
1331         if (rareNonInheritedData->flexibleBox.get() != other->rareNonInheritedData->flexibleBox.get() &&
1332             *rareNonInheritedData->flexibleBox.get() != *other->rareNonInheritedData->flexibleBox.get())
1333             return Layout;
1334         
1335         if (!rareNonInheritedData->shadowDataEquivalent(*other->rareNonInheritedData.get()))
1336             return Layout;
1337
1338         if (!rareNonInheritedData->reflectionDataEquivalent(*other->rareNonInheritedData.get()))
1339             return Layout;
1340     
1341         if (rareNonInheritedData->m_multiCol.get() != other->rareNonInheritedData->m_multiCol.get() &&
1342             *rareNonInheritedData->m_multiCol.get() != *other->rareNonInheritedData->m_multiCol.get())
1343             return Layout;
1344         
1345         if (rareNonInheritedData->m_transform.get() != other->rareNonInheritedData->m_transform.get() &&
1346             *rareNonInheritedData->m_transform.get() != *other->rareNonInheritedData->m_transform.get())
1347             return Layout;
1348
1349 #if ENABLE(DASHBOARD_SUPPORT)
1350         // If regions change, trigger a relayout to re-calc regions.
1351         if (rareNonInheritedData->m_dashboardRegions != other->rareNonInheritedData->m_dashboardRegions)
1352             return Layout;
1353 #endif
1354     }
1355
1356     if (rareInheritedData.get() != other->rareInheritedData.get()) {
1357         if (rareInheritedData->highlight != other->rareInheritedData->highlight ||
1358             rareInheritedData->textSizeAdjust != other->rareInheritedData->textSizeAdjust ||
1359             rareInheritedData->wordBreak != other->rareInheritedData->wordBreak ||
1360             rareInheritedData->wordWrap != other->rareInheritedData->wordWrap ||
1361             rareInheritedData->nbspMode != other->rareInheritedData->nbspMode ||
1362             rareInheritedData->khtmlLineBreak != other->rareInheritedData->khtmlLineBreak ||
1363             rareInheritedData->textSecurity != other->rareInheritedData->textSecurity)
1364             return Layout;
1365         
1366         if (!rareInheritedData->shadowDataEquivalent(*other->rareInheritedData.get()))
1367             return Layout;
1368             
1369         if (textStrokeWidth() != other->textStrokeWidth())
1370             return Layout;
1371     }
1372
1373     if (inherited->indent != other->inherited->indent ||
1374         inherited->line_height != other->inherited->line_height ||
1375         inherited->list_style_image != other->inherited->list_style_image ||
1376         inherited->font != other->inherited->font ||
1377         inherited->horizontal_border_spacing != other->inherited->horizontal_border_spacing ||
1378         inherited->vertical_border_spacing != other->inherited->vertical_border_spacing ||
1379         inherited_flags._box_direction != other->inherited_flags._box_direction ||
1380         inherited_flags._visuallyOrdered != other->inherited_flags._visuallyOrdered ||
1381         inherited_flags._htmlHacks != other->inherited_flags._htmlHacks ||
1382         noninherited_flags._position != other->noninherited_flags._position ||
1383         noninherited_flags._floating != other->noninherited_flags._floating ||
1384         noninherited_flags._originalDisplay != other->noninherited_flags._originalDisplay)
1385         return Layout;
1386
1387    
1388     if (((int)noninherited_flags._effectiveDisplay) >= TABLE) {
1389         if (inherited_flags._border_collapse != other->inherited_flags._border_collapse ||
1390             inherited_flags._empty_cells != other->inherited_flags._empty_cells ||
1391             inherited_flags._caption_side != other->inherited_flags._caption_side ||
1392             noninherited_flags._table_layout != other->noninherited_flags._table_layout)
1393             return Layout;
1394         
1395         // In the collapsing border model, 'hidden' suppresses other borders, while 'none'
1396         // does not, so these style differences can be width differences.
1397         if (inherited_flags._border_collapse &&
1398             (borderTopStyle() == BHIDDEN && other->borderTopStyle() == BNONE ||
1399              borderTopStyle() == BNONE && other->borderTopStyle() == BHIDDEN ||
1400              borderBottomStyle() == BHIDDEN && other->borderBottomStyle() == BNONE ||
1401              borderBottomStyle() == BNONE && other->borderBottomStyle() == BHIDDEN ||
1402              borderLeftStyle() == BHIDDEN && other->borderLeftStyle() == BNONE ||
1403              borderLeftStyle() == BNONE && other->borderLeftStyle() == BHIDDEN ||
1404              borderRightStyle() == BHIDDEN && other->borderRightStyle() == BNONE ||
1405              borderRightStyle() == BNONE && other->borderRightStyle() == BHIDDEN))
1406             return Layout;
1407     }
1408
1409     if (noninherited_flags._effectiveDisplay == LIST_ITEM) {
1410         if (inherited_flags._list_style_type != other->inherited_flags._list_style_type ||
1411             inherited_flags._list_style_position != other->inherited_flags._list_style_position)
1412             return Layout;
1413     }
1414
1415     if (inherited_flags._text_align != other->inherited_flags._text_align ||
1416         inherited_flags._text_transform != other->inherited_flags._text_transform ||
1417         inherited_flags._direction != other->inherited_flags._direction ||
1418         inherited_flags._white_space != other->inherited_flags._white_space ||
1419         noninherited_flags._clear != other->noninherited_flags._clear)
1420         return Layout;
1421
1422     // Overflow returns a layout hint.
1423     if (noninherited_flags._overflowX != other->noninherited_flags._overflowX ||
1424         noninherited_flags._overflowY != other->noninherited_flags._overflowY)
1425         return Layout;
1426  
1427     // If our border widths change, then we need to layout.  Other changes to borders
1428     // only necessitate a repaint.
1429     if (borderLeftWidth() != other->borderLeftWidth() ||
1430         borderTopWidth() != other->borderTopWidth() ||
1431         borderBottomWidth() != other->borderBottomWidth() ||
1432         borderRightWidth() != other->borderRightWidth())
1433         return Layout;
1434
1435     // If the counter directives change, trigger a relayout to re-calculate counter values and rebuild the counter node tree.
1436     const CounterDirectiveMap* mapA = rareNonInheritedData->m_counterDirectives.get();
1437     const CounterDirectiveMap* mapB = other->rareNonInheritedData->m_counterDirectives.get();
1438     if (!(mapA == mapB || (mapA && mapB && *mapA == *mapB)))
1439         return Layout;
1440     if (visual->counterIncrement != other->visual->counterIncrement ||
1441         visual->counterReset != other->visual->counterReset)
1442         return Layout;
1443
1444     if (inherited->m_effectiveZoom != other->inherited->m_effectiveZoom)
1445         return Layout;
1446
1447     // Make sure these left/top/right/bottom checks stay below all layout checks and above
1448     // all visible checks.
1449     if (position() != StaticPosition) {
1450         if (surround->offset != other->surround->offset) {
1451              // Optimize for the case where a positioned layer is moving but not changing size.
1452             if (position() == AbsolutePosition && positionedObjectMoved(surround->offset, other->surround->offset))
1453                 return LayoutPositionedMovementOnly;
1454
1455             // FIXME: We will need to do a bit of work in RenderObject/Box::setStyle before we
1456             // can stop doing a layout when relative positioned objects move.  In particular, we'll need
1457             // to update scrolling positions and figure out how to do a repaint properly of the updated layer.
1458             //if (other->position() == RelativePosition)
1459             //    return RepaintLayer;
1460             //else
1461                 return Layout;
1462         } else if (box->z_index != other->box->z_index || box->z_auto != other->box->z_auto ||
1463                  visual->clip != other->visual->clip || visual->hasClip != other->visual->hasClip)
1464             return RepaintLayer;
1465     }
1466
1467     if (rareNonInheritedData->opacity != other->rareNonInheritedData->opacity ||
1468         rareNonInheritedData->m_mask != other->rareNonInheritedData->m_mask ||
1469         rareNonInheritedData->m_maskBoxImage != other->rareNonInheritedData->m_maskBoxImage)
1470         return RepaintLayer;
1471
1472     if (inherited->color != other->inherited->color ||
1473         inherited_flags._visibility != other->inherited_flags._visibility ||
1474         inherited_flags._text_decorations != other->inherited_flags._text_decorations ||
1475         inherited_flags._force_backgrounds_to_white != other->inherited_flags._force_backgrounds_to_white ||
1476         surround->border != other->surround->border ||
1477         *background.get() != *other->background.get() ||
1478         visual->textDecoration != other->visual->textDecoration ||
1479         rareInheritedData->userModify != other->rareInheritedData->userModify ||
1480         rareInheritedData->userSelect != other->rareInheritedData->userSelect ||
1481         rareNonInheritedData->userDrag != other->rareNonInheritedData->userDrag ||
1482         rareNonInheritedData->m_borderFit != other->rareNonInheritedData->m_borderFit ||
1483         rareInheritedData->textFillColor != other->rareInheritedData->textFillColor ||
1484         rareInheritedData->textStrokeColor != other->rareInheritedData->textStrokeColor)
1485         return Repaint;
1486
1487     // Cursors are not checked, since they will be set appropriately in response to mouse events,
1488     // so they don't need to cause any repaint or layout.
1489
1490     // Animations don't need to be checked either.  We always set the new style on the RenderObject, so we will get a chance to fire off
1491     // the resulting transition properly.
1492     return Equal;
1493 }
1494
1495 void RenderStyle::setClip( Length top, Length right, Length bottom, Length left )
1496 {
1497     StyleVisualData *data = visual.access();
1498     data->clip.top = top;
1499     data->clip.right = right;
1500     data->clip.bottom = bottom;
1501     data->clip.left = left;
1502 }
1503
1504 void RenderStyle::addCursor(CachedImage* image, const IntPoint& hotSpot)
1505 {
1506     CursorData data;
1507     data.cursorImage = image;
1508     data.hotSpot = hotSpot;
1509     if (!inherited.access()->cursorData)
1510         inherited.access()->cursorData = CursorList::create();
1511     inherited.access()->cursorData->append(data);
1512 }
1513
1514 void RenderStyle::setCursorList(PassRefPtr<CursorList> other)
1515 {
1516     inherited.access()->cursorData = other;
1517 }
1518
1519 void RenderStyle::clearCursorList()
1520 {
1521     inherited.access()->cursorData = CursorList::create();
1522 }
1523
1524 bool RenderStyle::contentDataEquivalent(const RenderStyle* otherStyle) const
1525 {
1526     ContentData* c1 = rareNonInheritedData->m_content.get();
1527     ContentData* c2 = otherStyle->rareNonInheritedData->m_content.get();
1528
1529     while (c1 && c2) {
1530         if (c1->m_type != c2->m_type)
1531             return false;
1532
1533         switch (c1->m_type) {
1534             case CONTENT_NONE:
1535                 break;
1536             case CONTENT_TEXT:
1537                 if (!equal(c1->m_content.m_text, c2->m_content.m_text))
1538                     return false;
1539                 break;
1540             case CONTENT_OBJECT:
1541                 if (!StyleImage::imagesEquivalent(c1->m_content.m_image, c2->m_content.m_image))
1542                     return false;
1543                 break;
1544             case CONTENT_COUNTER:
1545                 if (*c1->m_content.m_counter != *c2->m_content.m_counter)
1546                     return false;
1547                 break;
1548         }
1549
1550         c1 = c1->m_next;
1551         c2 = c2->m_next;
1552     }
1553
1554     return !c1 && !c2;
1555 }
1556
1557 void RenderStyle::clearContent()
1558 {
1559     if (rareNonInheritedData->m_content)
1560         rareNonInheritedData->m_content->clear();
1561 }
1562
1563 void RenderStyle::setContent(PassRefPtr<StyleImage> image, bool add)
1564 {
1565     if (!image)
1566         return; // The object is null. Nothing to do. Just bail.
1567
1568     OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
1569     ContentData* lastContent = content.get();
1570     while (lastContent && lastContent->m_next)
1571         lastContent = lastContent->m_next;
1572
1573     bool reuseContent = !add;
1574     ContentData* newContentData;
1575     if (reuseContent && content) {
1576         content->clear();
1577         newContentData = content.release();
1578     } else
1579         newContentData = new ContentData;
1580
1581     if (lastContent && !reuseContent)
1582         lastContent->m_next = newContentData;
1583     else
1584         content.set(newContentData);
1585
1586     newContentData->m_content.m_image = image.releaseRef();
1587     newContentData->m_type = CONTENT_OBJECT;
1588 }
1589
1590 void RenderStyle::setContent(StringImpl* s, bool add)
1591 {
1592     if (!s)
1593         return; // The string is null. Nothing to do. Just bail.
1594     
1595     OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
1596     ContentData* lastContent = content.get();
1597     while (lastContent && lastContent->m_next)
1598         lastContent = lastContent->m_next;
1599
1600     bool reuseContent = !add;
1601     if (add && lastContent) {
1602         if (lastContent->m_type == CONTENT_TEXT) {
1603             // We can augment the existing string and share this ContentData node.
1604             StringImpl* oldStr = lastContent->m_content.m_text;
1605             String newStr = oldStr;
1606             newStr.append(s);
1607             newStr.impl()->ref();
1608             oldStr->deref();
1609             lastContent->m_content.m_text = newStr.impl();
1610             return;
1611         }
1612     }
1613
1614     ContentData* newContentData = 0;
1615     if (reuseContent && content) {
1616         content->clear();
1617         newContentData = content.release();
1618     } else
1619         newContentData = new ContentData;
1620     
1621     if (lastContent && !reuseContent)
1622         lastContent->m_next = newContentData;
1623     else
1624         content.set(newContentData);
1625     
1626     newContentData->m_content.m_text = s;
1627     newContentData->m_content.m_text->ref();
1628     newContentData->m_type = CONTENT_TEXT;
1629 }
1630
1631 void RenderStyle::setContent(CounterContent* c, bool add)
1632 {
1633     if (!c)
1634         return;
1635
1636     OwnPtr<ContentData>& content = rareNonInheritedData.access()->m_content;
1637     ContentData* lastContent = content.get();
1638     while (lastContent && lastContent->m_next)
1639         lastContent = lastContent->m_next;
1640
1641     bool reuseContent = !add;
1642     ContentData* newContentData = 0;
1643     if (reuseContent && content) {
1644         content->clear();
1645         newContentData = content.release();
1646     } else
1647         newContentData = new ContentData;
1648
1649     if (lastContent && !reuseContent)
1650         lastContent->m_next = newContentData;
1651     else
1652         content.set(newContentData);
1653
1654     newContentData->m_content.m_counter = c;
1655     newContentData->m_type = CONTENT_COUNTER;
1656 }
1657
1658 void ContentData::clear()
1659 {
1660     switch (m_type) {
1661         case CONTENT_NONE:
1662             break;
1663         case CONTENT_OBJECT:
1664             m_content.m_image->deref();
1665             break;
1666         case CONTENT_TEXT:
1667             m_content.m_text->deref();
1668             break;
1669         case CONTENT_COUNTER:
1670             delete m_content.m_counter;
1671             break;
1672     }
1673
1674     ContentData* n = m_next;
1675     m_type = CONTENT_NONE;
1676     m_next = 0;
1677
1678     // Reverse the list so we can delete without recursing.
1679     ContentData* last = 0;
1680     ContentData* c;
1681     while ((c = n)) {
1682         n = c->m_next;
1683         c->m_next = last;
1684         last = c;
1685     }
1686     for (c = last; c; c = n) {
1687         n = c->m_next;
1688         c->m_next = 0;
1689         delete c;
1690     }
1691 }
1692
1693 void RenderStyle::applyTransform(AffineTransform& transform, const IntSize& borderBoxSize, bool includeTransformOrigin) const
1694 {
1695     // transform-origin brackets the transform with translate operations.
1696     // Optimize for the case where the only transform is a translation, since the transform-origin is irrelevant
1697     // in that case.
1698     bool applyTransformOrigin = false;
1699     unsigned s = rareNonInheritedData->m_transform->m_operations.size();
1700     unsigned i;
1701     if (includeTransformOrigin) {
1702         for (i = 0; i < s; i++) {
1703             if (!rareNonInheritedData->m_transform->m_operations[i]->isTranslateOperation()) {
1704                 applyTransformOrigin = true;
1705                 break;
1706             }
1707         }
1708     }
1709     
1710     if (applyTransformOrigin)
1711         transform.translate(transformOriginX().calcFloatValue(borderBoxSize.width()), transformOriginY().calcFloatValue(borderBoxSize.height()));
1712     
1713     for (i = 0; i < s; i++)
1714         rareNonInheritedData->m_transform->m_operations[i]->apply(transform, borderBoxSize);
1715         
1716     if (applyTransformOrigin)
1717         transform.translate(-transformOriginX().calcFloatValue(borderBoxSize.width()), -transformOriginY().calcFloatValue(borderBoxSize.height()));
1718 }
1719
1720 #if ENABLE(XBL)
1721 BindingURI::BindingURI(StringImpl* uri) 
1722     : m_next(0)
1723
1724     m_uri = uri;
1725     if (uri)
1726         uri->ref();
1727 }
1728
1729 BindingURI::~BindingURI()
1730 {
1731     if (m_uri)
1732         m_uri->deref();
1733     delete m_next;
1734 }
1735
1736 BindingURI* BindingURI::copy()
1737 {
1738     BindingURI* newBinding = new BindingURI(m_uri);
1739     if (next()) {
1740         BindingURI* nextCopy = next()->copy();
1741         newBinding->setNext(nextCopy);
1742     }
1743     
1744     return newBinding;
1745 }
1746
1747 bool BindingURI::operator==(const BindingURI& o) const
1748 {
1749     if ((m_next && !o.m_next) || (!m_next && o.m_next) ||
1750         (m_next && o.m_next && *m_next != *o.m_next))
1751         return false;
1752     
1753     if (m_uri == o.m_uri)
1754         return true;
1755     if (!m_uri || !o.m_uri)
1756         return false;
1757     
1758     return String(m_uri) == String(o.m_uri);
1759 }
1760
1761 void RenderStyle::addBindingURI(StringImpl* uri)
1762 {
1763     BindingURI* binding = new BindingURI(uri);
1764     if (!bindingURIs())
1765         SET_VAR(rareNonInheritedData, bindingURI, binding)
1766     else 
1767         for (BindingURI* b = bindingURIs(); b; b = b->next()) {
1768             if (!b->next())
1769                 b->setNext(binding);
1770         }
1771 }
1772 #endif
1773
1774 void RenderStyle::setTextShadow(ShadowData* val, bool add)
1775 {
1776     StyleRareInheritedData* rareData = rareInheritedData.access(); 
1777     if (!add) {
1778         delete rareData->textShadow;
1779         rareData->textShadow = val;
1780         return;
1781     }
1782
1783     val->next = rareData->textShadow;
1784     rareData->textShadow = val;
1785 }
1786
1787 void RenderStyle::setBoxShadow(ShadowData* shadowData, bool add)
1788 {
1789     StyleRareNonInheritedData* rareData = rareNonInheritedData.access(); 
1790     if (!add) {
1791         rareData->m_boxShadow.set(shadowData);
1792         return;
1793     }
1794
1795     shadowData->next = rareData->m_boxShadow.release();
1796     rareData->m_boxShadow.set(shadowData);
1797 }
1798
1799 ShadowData::ShadowData(const ShadowData& o)
1800     : x(o.x)
1801     , y(o.y)
1802     , blur(o.blur)
1803     , color(o.color)
1804 {
1805     next = o.next ? new ShadowData(*o.next) : 0;
1806 }
1807
1808 bool ShadowData::operator==(const ShadowData& o) const
1809 {
1810     if ((next && !o.next) || (!next && o.next) ||
1811         (next && o.next && *next != *o.next))
1812         return false;
1813     
1814     return x == o.x && y == o.y && blur == o.blur && color == o.color;
1815 }
1816
1817 bool operator==(const CounterDirectives& a, const CounterDirectives& b)
1818 {
1819     if (a.m_reset != b.m_reset || a.m_increment != b.m_increment)
1820         return false;
1821     if (a.m_reset && a.m_resetValue != b.m_resetValue)
1822         return false;
1823     if (a.m_increment && a.m_incrementValue != b.m_incrementValue)
1824         return false;
1825     return true;
1826 }
1827
1828 const CounterDirectiveMap* RenderStyle::counterDirectives() const
1829 {
1830     return rareNonInheritedData->m_counterDirectives.get();
1831 }
1832
1833 CounterDirectiveMap& RenderStyle::accessCounterDirectives()
1834 {
1835     OwnPtr<CounterDirectiveMap>& map = rareNonInheritedData.access()->m_counterDirectives;
1836     if (!map)
1837         map.set(new CounterDirectiveMap);
1838     return *map.get();
1839 }
1840
1841 #if ENABLE(DASHBOARD_SUPPORT)
1842 const Vector<StyleDashboardRegion>& RenderStyle::initialDashboardRegions()
1843
1844     static Vector<StyleDashboardRegion> emptyList;
1845     return emptyList;
1846 }
1847
1848 const Vector<StyleDashboardRegion>& RenderStyle::noneDashboardRegions()
1849
1850     static Vector<StyleDashboardRegion> noneList;
1851     static bool noneListInitialized = false;
1852     
1853     if (!noneListInitialized) {
1854         StyleDashboardRegion region;
1855         region.label = "";
1856         region.offset.top  = Length();
1857         region.offset.right = Length();
1858         region.offset.bottom = Length();
1859         region.offset.left = Length();
1860         region.type = StyleDashboardRegion::None;
1861         noneList.append (region);
1862         noneListInitialized = true;
1863     }
1864     return noneList;
1865 }
1866 #endif
1867
1868 void RenderStyle::adjustAnimations()
1869 {
1870     AnimationList* animationList = rareNonInheritedData->m_animations.get();
1871     if (!animationList)
1872         return;
1873
1874     // get rid of empty transitions and anything beyond them
1875     for (size_t i = 0; i < animationList->size(); ++i) {
1876         if ((*animationList)[i]->isEmpty()) {
1877             animationList->resize(i);
1878             break;
1879         }
1880     }
1881
1882     if (animationList->isEmpty()) {
1883         clearAnimations();
1884         return;
1885     }
1886
1887     // Repeat patterns into layers that don't have some properties set.
1888     animationList->fillUnsetProperties();
1889 }
1890
1891 void RenderStyle::adjustTransitions()
1892 {
1893     AnimationList* transitionList = rareNonInheritedData->m_transitions.get();
1894     if (!transitionList)
1895         return;
1896
1897     // get rid of empty transitions and anything beyond them
1898     for (size_t i = 0; i < transitionList->size(); ++i) {
1899         if ((*transitionList)[i]->isEmpty()) {
1900             transitionList->resize(i);
1901             break;
1902         }
1903     }
1904
1905     if (transitionList->isEmpty()) {
1906         clearTransitions();
1907         return;
1908     }
1909
1910     // Repeat patterns into layers that don't have some properties set.
1911     transitionList->fillUnsetProperties();
1912         
1913     // Make sure there are no duplicate properties. This is an O(n^2) algorithm
1914     // but the lists tend to be very short, so it is probably ok
1915     for (size_t i = 0; i < transitionList->size(); ++i) {
1916         for (size_t j = i+1; j < transitionList->size(); ++j) {
1917             if ((*transitionList)[i]->property() == (*transitionList)[j]->property()) {
1918                 // toss i
1919                 transitionList->remove(i);
1920                 j = i;
1921             }
1922         }
1923     }
1924 }
1925
1926 AnimationList* RenderStyle::accessAnimations()
1927 {
1928     if (!rareNonInheritedData.access()->m_animations)
1929         rareNonInheritedData.access()->m_animations.set(new AnimationList());
1930     return rareNonInheritedData->m_animations.get();
1931 }
1932
1933 AnimationList* RenderStyle::accessTransitions()
1934 {
1935     if (!rareNonInheritedData.access()->m_transitions)
1936         rareNonInheritedData.access()->m_transitions.set(new AnimationList());
1937     return rareNonInheritedData->m_transitions.get();
1938 }
1939
1940 const Animation* RenderStyle::transitionForProperty(int property)
1941 {
1942     if (transitions()) {
1943         for (size_t i = 0; i < transitions()->size(); ++i) {
1944             const Animation* p = (*transitions())[i].get();
1945             if (p->property() == cAnimateAll || p->property() == property) {
1946                 return p;
1947             }
1948         }
1949     }
1950     return 0;
1951 }
1952
1953 void RenderStyle::setBlendedFontSize(int size)
1954 {
1955     FontDescription desc(fontDescription());
1956     desc.setSpecifiedSize(size);
1957     desc.setComputedSize(size);
1958     setFontDescription(desc);
1959     font().update(font().fontSelector());
1960 }
1961
1962 }