More dashboard region work.
[WebKit-https.git] / WebCore / khtml / rendering / render_style.h
1 /*
2  * This file is part of the DOM implementation for KDE.
3  *
4  * Copyright (C) 2000 Lars Knoll (knoll@kde.org)
5  *           (C) 2000 Antti Koivisto (koivisto@kde.org)
6  *           (C) 2000 Dirk Mueller (mueller@kde.org)
7  * Copyright (C) 2003 Apple Computer, Inc.
8  *
9  * This library is free software; you can redistribute it and/or
10  * modify it under the terms of the GNU Library General Public
11  * License as published by the Free Software Foundation; either
12  * version 2 of the License, or (at your option) any later version.
13  *
14  * This library is distributed in the hope that it will be useful,
15  * but WITHOUT ANY WARRANTY; without even the implied warranty of
16  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
17  * Library General Public License for more details.
18  *
19  * You should have received a copy of the GNU Library General Public License
20  * along with this library; see the file COPYING.LIB.  If not, write to
21  * the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
22  * Boston, MA 02111-1307, USA.
23  *
24  */
25 #ifndef RENDERSTYLE_H
26 #define RENDERSTYLE_H
27
28 /*
29  * WARNING:
30  * --------
31  *
32  * The order of the values in the enums have to agree with the order specified
33  * in cssvalues.in, otherwise some optimizations in the parser will fail,
34  * and produce invaliud results.
35  */
36
37 #include <qcolor.h>
38 #include <qfont.h>
39 #include <qfontmetrics.h>
40 #include <qlist.h>
41 #include <qpalette.h>
42 #include <qapplication.h>
43
44 #include "dom/dom_misc.h"
45 #include "misc/khtmllayout.h"
46 #include "misc/shared.h"
47 #include "rendering/font.h"
48
49 #include <assert.h>
50
51 #define SET_VAR(group,variable,value) \
52     if (!(group->variable == value)) \
53         group.access()->variable = value;
54
55 class RenderArena;
56
57 namespace DOM {
58     class DOMStringImpl;
59     class ShadowValueImpl;
60 }
61
62 namespace khtml {
63
64     class CachedImage;
65     class CachedObject;
66
67 template <class DATA>
68 class DataRef
69 {
70 public:
71
72     DataRef()
73     {
74         data=0;
75     }
76     DataRef( const DataRef<DATA> &d )
77     {
78         data = d.data;
79         data->ref();
80     }
81
82     ~DataRef()
83     {
84         if(data) data->deref();
85     }
86
87     const DATA* operator->() const
88     {
89         return data;
90     }
91
92     const DATA* get() const
93     {
94         return data;
95     }
96
97
98     DATA* access()
99     {
100         if (!data->hasOneRef())
101         {
102             data->deref();
103             data = new DATA(*data);
104             data->ref();
105         }
106         return data;
107     }
108
109     void init()
110     {
111         data = new DATA;
112         data->ref();
113     }
114
115     DataRef<DATA>& operator=(const DataRef<DATA>& d)
116     {
117         if (data==d.data)
118             return *this;
119         if (data)
120             data->deref();
121         data = d.data;
122
123         data->ref();
124
125         return *this;
126     }
127
128     bool operator == ( const DataRef<DATA> &o ) const {
129         return (*data == *(o.data) );
130     }
131     bool operator != ( const DataRef<DATA> &o ) const {
132         return (*data != *(o.data) );
133     }
134
135 private:
136     DATA* data;
137 };
138
139 enum PseudoState { PseudoUnknown, PseudoNone, PseudoAnyLink, PseudoLink, PseudoVisited};
140
141 //------------------------------------------------
142
143 //------------------------------------------------
144 // Box model attributes. Not inherited.
145
146 struct LengthBox
147 {
148     LengthBox()
149     {
150     }
151     LengthBox( LengthType t )
152         : left( t ), right ( t ), top( t ), bottom( t ) {}
153
154     Length left;
155     Length right;
156     Length top;
157     Length bottom;
158     Length& operator=(Length& len)
159     {
160         left=len;
161         right=len;
162         top=len;
163         bottom=len;
164         return len;
165     }
166
167     bool operator==(const LengthBox& o) const
168     {
169         return left==o.left && right==o.right && top==o.top && bottom==o.bottom;
170     }
171
172
173     bool nonZero() const { return left.value!=0 || right.value!=0 || top.value!=0 || bottom.value!=0; }
174 };
175
176
177
178 enum EPosition {
179     STATIC, RELATIVE, ABSOLUTE, FIXED
180 };
181
182 enum EFloat {
183     FNONE = 0, FLEFT, FRIGHT
184 };
185
186
187 //------------------------------------------------
188 // Border attributes. Not inherited.
189
190 // These have been defined in the order of their precedence for border-collapsing. Do
191 // not change this order!
192 enum EBorderStyle {
193     BNONE, BHIDDEN, INSET, GROOVE, RIDGE, OUTSET, DOTTED, DASHED, SOLID, DOUBLE
194 };
195
196
197 class BorderValue
198 {
199 public:
200     BorderValue()
201     {
202         width = 3; // medium is default value
203         style = BNONE;
204     }
205     QColor color;
206     unsigned short width : 12;
207     EBorderStyle style : 4;
208
209     bool nonZero() const
210     {
211       // rikkus: workaround for gcc 2.95.3
212       return width!=0 && !(style==BNONE);
213     }
214
215     bool isTransparent() const {
216         return color.isValid() && qAlpha(color.rgb()) == 0;
217     }
218     
219     bool operator==(const BorderValue& o) const
220     {
221         return width==o.width && style==o.style && color==o.color;
222     }
223
224     bool operator!=(const BorderValue& o) const
225     {
226         return !(*this == o);
227     }
228 };
229
230 class OutlineValue : public BorderValue
231 {
232 public:
233     OutlineValue()
234     {
235         _offset = 0;
236         _auto = false;
237     }
238     
239     int _offset;
240     bool _auto;
241 };
242
243 enum EBorderPrecedence { BOFF, BTABLE, BCOLGROUP, BCOL, BROWGROUP, BROW, BCELL };
244
245 struct CollapsedBorderValue
246 {
247     CollapsedBorderValue() :border(0), precedence(BOFF) {}
248     CollapsedBorderValue(const BorderValue* b, EBorderPrecedence p) :border(b), precedence(p) {}
249     
250     int width() const { return border && border->nonZero() ? border->width : 0; }
251     EBorderStyle style() const { return border ? border->style : BHIDDEN; }
252     bool exists() const { return border; }
253     QColor color() const { return border ? border->color : QColor(); }
254     bool isTransparent() const { return border ? border->isTransparent() : true; }
255     
256     bool operator==(const CollapsedBorderValue& o) const
257     {
258         if (!border) return !o.border;
259         if (!o.border) return false;
260         return *border == *o.border && precedence == o.precedence;
261     }
262     
263     const BorderValue* border;
264     EBorderPrecedence precedence;    
265 };
266
267 class BorderData
268 {
269 public:
270     BorderValue left;
271     BorderValue right;
272     BorderValue top;
273     BorderValue bottom;
274
275     bool hasBorder() const
276     {
277         return left.nonZero() || right.nonZero() || top.nonZero() || bottom.nonZero();
278     }
279
280     bool operator==(const BorderData& o) const
281     {
282         return left==o.left && right==o.right && top==o.top && bottom==o.bottom;
283     }
284
285 };
286
287 enum EMarginCollapse { MCOLLAPSE, MSEPARATE, MDISCARD };
288
289 class StyleSurroundData : public Shared<StyleSurroundData>
290 {
291 public:
292     StyleSurroundData();
293
294     StyleSurroundData(const StyleSurroundData& o );
295     bool operator==(const StyleSurroundData& o) const;
296     bool operator!=(const StyleSurroundData& o) const {
297         return !(*this == o);
298     }
299
300     LengthBox offset;
301     LengthBox margin;
302     LengthBox padding;
303     BorderData border;
304 };
305
306
307 //------------------------------------------------
308 // Box attributes. Not inherited.
309
310 class StyleBoxData : public Shared<StyleBoxData>
311 {
312 public:
313     StyleBoxData();
314
315     StyleBoxData(const StyleBoxData& o );
316
317
318     // copy and assignment
319 //    StyleBoxData(const StyleBoxData &other);
320 //    const StyleBoxData &operator = (const StyleBoxData &other);
321
322     bool operator==(const StyleBoxData& o) const;
323     bool operator!=(const StyleBoxData& o) const {
324         return !(*this == o);
325     }
326
327     Length width;
328     Length height;
329
330     Length min_width;
331     Length max_width;
332
333     Length min_height;
334     Length max_height;
335
336     Length vertical_align;
337
338     int z_index;
339     bool z_auto : 1;
340 };
341
342 //------------------------------------------------
343 // Dashboard region attributes. Not inherited.
344
345 #if APPLE_CHANGES
346 struct StyleDashboardRegion
347 {
348     QString label;
349     LengthBox offset;
350     int type;
351     
352     enum {
353         None,
354         Circle,
355         Rectangle
356     };
357
358     bool operator==(const StyleDashboardRegion& o) const
359     {
360         return type == o.type && offset == o.offset && label == o.label;
361     }
362 };
363 #endif
364
365 //------------------------------------------------
366 // Random visual rendering model attributes. Not inherited.
367
368 enum EOverflow {
369     OVISIBLE, OHIDDEN, OSCROLL, OAUTO, OMARQUEE, OOVERLAY
370 };
371
372 enum EVerticalAlign {
373     BASELINE, MIDDLE, SUB, SUPER, TEXT_TOP,
374     TEXT_BOTTOM, TOP, BOTTOM, BASELINE_MIDDLE, LENGTH
375 };
376
377 enum EClear{
378     CNONE = 0, CLEFT = 1, CRIGHT = 2, CBOTH = 3
379 };
380
381 enum ETableLayout {
382     TAUTO, TFIXED
383 };
384
385 enum EUnicodeBidi {
386     UBNormal, Embed, Override
387 };
388
389 class StyleVisualData : public Shared<StyleVisualData>
390 {
391 public:
392     StyleVisualData();
393
394     ~StyleVisualData();
395
396     StyleVisualData(const StyleVisualData& o );
397
398     bool operator==( const StyleVisualData &o ) const {
399         return ( clip == o.clip &&
400                  hasClip == o.hasClip &&
401                  colspan == o.colspan &&
402                  counter_increment == o.counter_increment &&
403                  counter_reset == o.counter_reset &&
404                  palette == o.palette && textDecoration == o.textDecoration);
405     }
406     bool operator!=( const StyleVisualData &o ) const {
407         return !(*this == o);
408     }
409
410     LengthBox clip;
411     bool hasClip : 1;
412     int textDecoration : 4; // Text decorations defined *only* by this element.
413     
414     short colspan; // for html, not a css2 attribute
415
416     short counter_increment; //ok, so these are not visual mode spesific
417     short counter_reset;     //can't go to inherited, since these are not inherited
418
419     QPalette palette;      //widget styling with IE attributes
420 };
421
422 //------------------------------------------------
423 enum EBackgroundRepeat {
424     REPEAT, REPEAT_X, REPEAT_Y, NO_REPEAT
425 };
426
427
428
429 class StyleBackgroundData : public Shared<StyleBackgroundData>
430 {
431 public:
432     StyleBackgroundData();
433     ~StyleBackgroundData() {}
434     StyleBackgroundData(const StyleBackgroundData& o );
435
436     bool operator==(const StyleBackgroundData& o) const;
437     bool operator!=(const StyleBackgroundData &o) const {
438         return !(*this == o);
439     }
440
441     QColor color;
442     CachedImage *image;
443
444     Length x_position;
445     Length y_position;
446     OutlineValue outline;
447 };
448
449 //------------------------------------------------
450 // CSS3 Marquee Properties
451
452 enum EMarqueeBehavior { MNONE, MSCROLL, MSLIDE, MALTERNATE, MUNFURL };
453 enum EMarqueeDirection { MAUTO = 0, MLEFT = 1, MRIGHT = -1, MUP = 2, MDOWN = -2, MFORWARD = 3, MBACKWARD = -3 };
454
455 class StyleMarqueeData : public Shared<StyleMarqueeData>
456 {
457 public:
458     StyleMarqueeData();
459     StyleMarqueeData(const StyleMarqueeData& o);
460     
461     bool operator==(const StyleMarqueeData& o) const;
462     bool operator!=(const StyleMarqueeData& o) const {
463         return !(*this == o);
464     }
465     
466     Length increment;
467     int speed;
468     
469     int loops; // -1 means infinite.
470     
471     EMarqueeBehavior behavior : 3;
472     EMarqueeDirection direction : 3;
473 };
474     
475 //------------------------------------------------
476 // CSS3 Flexible Box Properties
477
478 enum EBoxAlignment { BSTRETCH, BSTART, BCENTER, BEND, BJUSTIFY, BBASELINE };
479 enum EBoxOrient { HORIZONTAL, VERTICAL };
480 enum EBoxLines { SINGLE, MULTIPLE };
481 enum EBoxDirection { BNORMAL, BREVERSE };
482
483 class StyleFlexibleBoxData : public Shared<StyleFlexibleBoxData>
484 {
485 public:
486     StyleFlexibleBoxData();
487     StyleFlexibleBoxData(const StyleFlexibleBoxData& o);
488
489     bool operator==(const StyleFlexibleBoxData& o) const;
490     bool operator!=(const StyleFlexibleBoxData &o) const {
491         return !(*this == o);
492     }
493
494     float flex;
495     unsigned int flex_group;
496     unsigned int ordinal_group;
497
498     EBoxAlignment align : 3;
499     EBoxAlignment pack: 3;
500     EBoxOrient orient: 1;
501     EBoxLines lines : 1;
502 };
503
504 // This struct holds information about shadows for the text-shadow and box-shadow properties.
505 struct ShadowData {
506     ShadowData(int _x, int _y, int _blur, const QColor& _color)
507     :x(_x), y(_y), blur(_blur), color(_color), next(0) {}
508     ShadowData(const ShadowData& o);
509     
510     ~ShadowData() { delete next; }
511
512     bool operator==(const ShadowData& o) const;
513     bool operator!=(const ShadowData &o) const {
514         return !(*this == o);
515     }
516     
517     int x;
518     int y;
519     int blur;
520     QColor color;
521     ShadowData* next;
522 };
523
524 #ifndef KHTML_NO_XBL
525 struct BindingURI {
526     BindingURI(DOM::DOMStringImpl*);
527     ~BindingURI();
528
529     BindingURI* copy();
530
531     bool operator==(const BindingURI& o) const;
532     bool operator!=(const BindingURI& o) const {
533         return !(*this == o);
534     }
535     
536     BindingURI* next() { return m_next; }
537     void setNext(BindingURI* n) { m_next = n; }
538     
539     DOM::DOMStringImpl* uri() { return m_uri; }
540     
541     BindingURI* m_next;
542     DOM::DOMStringImpl* m_uri;
543 };
544 #endif
545
546 //------------------------------------------------
547 // CSS3 User Modify Properties
548
549 enum EUserModify {
550     READ_ONLY, READ_WRITE
551 };
552
553 // CSS3 User Drag Values
554
555 enum EUserDrag {
556     DRAG_AUTO, DRAG_NONE, DRAG_ELEMENT
557 };
558
559 // CSS3 User Select Values
560
561 enum EUserSelect {
562     SELECT_AUTO, SELECT_NONE, SELECT_TEXT
563 };
564
565 // This struct is for rarely used non-inherited CSS3 properties.  By grouping them together,
566 // we save space, and only allocate this object when someone actually uses
567 // a non-inherited CSS3 property.
568 class StyleCSS3NonInheritedData : public Shared<StyleCSS3NonInheritedData>
569 {
570 public:
571     StyleCSS3NonInheritedData();
572     ~StyleCSS3NonInheritedData();
573     StyleCSS3NonInheritedData(const StyleCSS3NonInheritedData& o);
574
575 #ifndef KHTML_NO_XBL
576     bool bindingsEquivalent(const StyleCSS3NonInheritedData& o) const;
577 #endif
578
579     bool operator==(const StyleCSS3NonInheritedData& o) const;
580     bool operator!=(const StyleCSS3NonInheritedData &o) const {
581         return !(*this == o);
582     }
583     
584 #if APPLE_CHANGES
585     int lineClamp;         // An Apple extension.  Not really CSS3 but not worth making a new struct over.
586 #endif
587     float opacity;         // Whether or not we're transparent.
588     DataRef<StyleFlexibleBoxData> flexibleBox; // Flexible box properties 
589     DataRef<StyleMarqueeData> marquee; // Marquee properties
590     EUserDrag userDrag : 2; // Whether or not a drag can be initiated by this element.
591     EUserSelect userSelect : 2;  // Whether or not the element is selectable.
592     bool textOverflow : 1; // Whether or not lines that spill out should be truncated with "..."
593     EMarginCollapse marginTopCollapse : 2;
594     EMarginCollapse marginBottomCollapse : 2;
595
596 #ifndef KHTML_NO_XBL
597     BindingURI* bindingURI; // The XBL binding URI list.
598 #endif
599 };
600
601 // This struct is for rarely used inherited CSS3 properties.  By grouping them together,
602 // we save space, and only allocate this object when someone actually uses
603 // an inherited CSS3 property.
604 class StyleCSS3InheritedData : public Shared<StyleCSS3InheritedData>
605 {
606 public:
607     StyleCSS3InheritedData();
608     ~StyleCSS3InheritedData();
609     StyleCSS3InheritedData(const StyleCSS3InheritedData& o);
610
611     bool operator==(const StyleCSS3InheritedData& o) const;
612     bool operator!=(const StyleCSS3InheritedData &o) const {
613         return !(*this == o);
614     }
615     bool shadowDataEquivalent(const StyleCSS3InheritedData& o) const;
616
617     ShadowData* textShadow;  // Our text shadow information for shadowed text drawing.
618     EUserModify userModify : 2; // Flag used for editing state
619 #if APPLE_CHANGES
620     bool textSizeAdjust : 1;    // An Apple extension.  Not really CSS3 but not worth making a new struct over.
621 #endif
622     
623 private:
624     StyleCSS3InheritedData &operator=(const StyleCSS3InheritedData &);
625 };
626
627 //------------------------------------------------
628 // Inherited attributes.
629 //
630
631 enum EWhiteSpace {
632     NORMAL, PRE, NOWRAP, KHTML_NOWRAP
633 };
634
635 enum ETextAlign {
636     TAAUTO, LEFT, RIGHT, CENTER, JUSTIFY, KHTML_LEFT, KHTML_RIGHT, KHTML_CENTER
637 };
638
639 enum ETextTransform {
640     CAPITALIZE, UPPERCASE, LOWERCASE, TTNONE
641 };
642
643 enum EDirection {
644     LTR, RTL
645 };
646
647 enum ETextDecoration {
648     TDNONE = 0x0 , UNDERLINE = 0x1, OVERLINE = 0x2, LINE_THROUGH= 0x4, BLINK = 0x8
649 };
650
651 enum EPageBreak {
652     PBAUTO, PBALWAYS, PBAVOID
653 };
654
655 class StyleInheritedData : public Shared<StyleInheritedData>
656 {
657 public:
658     StyleInheritedData();
659     ~StyleInheritedData();
660     StyleInheritedData(const StyleInheritedData& o );
661
662     bool operator==(const StyleInheritedData& o) const;
663     bool operator != ( const StyleInheritedData &o ) const {
664         return !(*this == o);
665     }
666
667     Length indent;
668     // could be packed in a short but doesn't
669     // make a difference currently because of padding
670     Length line_height;
671
672     CachedImage *style_image;
673     CachedImage *cursor_image;
674
675     khtml::Font font;
676     QColor color;
677     
678     short horizontal_border_spacing;
679     short vertical_border_spacing;
680     
681     // Paged media properties.
682     short widows;
683     short orphans;
684     EPageBreak page_break_inside : 2;
685 };
686
687
688 enum EEmptyCell {
689     SHOW, HIDE
690 };
691
692 enum ECaptionSide
693 {
694     CAPTOP, CAPBOTTOM, CAPLEFT, CAPRIGHT
695 };
696
697
698 enum EListStyleType {
699      DISC, CIRCLE, SQUARE, LDECIMAL, DECIMAL_LEADING_ZERO,
700      LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK,
701      LOWER_ALPHA, LOWER_LATIN, UPPER_ALPHA, UPPER_LATIN,
702      HEBREW, ARMENIAN, GEORGIAN, CJK_IDEOGRAPHIC,
703      HIRAGANA, KATAKANA, HIRAGANA_IROHA, KATAKANA_IROHA, LNONE
704 };
705
706 enum EListStylePosition { OUTSIDE, INSIDE };
707
708 enum EVisibility { VISIBLE, HIDDEN, COLLAPSE };
709
710 enum ECursor {
711     CURSOR_AUTO, CURSOR_CROSS, CURSOR_DEFAULT, CURSOR_POINTER, CURSOR_MOVE,
712     CURSOR_E_RESIZE, CURSOR_NE_RESIZE, CURSOR_NW_RESIZE, CURSOR_N_RESIZE, CURSOR_SE_RESIZE, CURSOR_SW_RESIZE,
713     CURSOR_S_RESIZE, CURSOR_W_RESIZE, CURSOR_TEXT, CURSOR_WAIT, CURSOR_HELP
714 };
715
716 enum ContentType {
717     CONTENT_NONE, CONTENT_OBJECT, CONTENT_TEXT, CONTENT_COUNTER
718 };
719
720 struct ContentData {
721     ContentData() :_contentType(CONTENT_NONE), _nextContent(0) {}
722     ~ContentData();
723     void clearContent();
724
725     ContentType contentType() { return _contentType; }
726
727     DOM::DOMStringImpl* contentText() { if (contentType() == CONTENT_TEXT) return _content.text; return 0; }
728     CachedObject* contentObject() { if (contentType() == CONTENT_OBJECT) return _content.object; return 0; }
729     
730     ContentType _contentType;
731
732     union {
733         CachedObject* object;
734         DOM::DOMStringImpl* text;
735         // counters...
736     } _content ;
737
738     ContentData* _nextContent;
739 };
740
741 //------------------------------------------------
742
743 enum EDisplay {
744     INLINE, BLOCK, LIST_ITEM, RUN_IN, COMPACT, INLINE_BLOCK,
745     TABLE, INLINE_TABLE, TABLE_ROW_GROUP,
746     TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_ROW,
747     TABLE_COLUMN_GROUP, TABLE_COLUMN, TABLE_CELL,
748     TABLE_CAPTION, BOX, INLINE_BOX, NONE
749 };
750
751 class RenderStyle
752 {
753     friend class CSSStyleSelector;
754 public:
755     static void cleanup();
756
757     // static pseudo styles. Dynamic ones are produced on the fly.
758     enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED };
759
760     void ref() { m_ref++;  }
761     void deref(RenderArena* arena) { 
762         if (m_ref) m_ref--; 
763         if (!m_ref)
764             arenaDelete(arena);
765     }
766     bool hasOneRef() { return m_ref==1; }
767     int refCount() const { return m_ref; }
768     
769     // Overloaded new operator.  Derived classes must override operator new
770     // in order to allocate out of the RenderArena.
771     void* operator new(size_t sz, RenderArena* renderArena) throw();    
772     
773     // Overridden to prevent the normal delete from being called.
774     void operator delete(void* ptr, size_t sz);
775     
776 private:
777     void arenaDelete(RenderArena *arena);
778
779 protected:
780
781 // !START SYNC!: Keep this in sync with the copy constructor in render_style.cpp
782
783     // inherit
784     struct InheritedFlags {
785         bool operator==( const InheritedFlags &other ) const {
786             return (_empty_cells == other._empty_cells) &&
787                    (_caption_side == other._caption_side) &&
788                    (_list_style_type == other._list_style_type) &&
789                    (_list_style_position == other._list_style_position) &&
790                    (_visibility == other._visibility) &&
791                    (_text_align == other._text_align) &&
792                    (_text_transform == other._text_transform) &&
793                    (_text_decorations == other._text_decorations) &&
794                    (_text_transform == other._text_transform) &&
795                    (_cursor_style == other._cursor_style) &&
796                    (_direction == other._direction) &&
797                    (_border_collapse == other._border_collapse) &&
798                    (_white_space == other._white_space) &&
799                    (_box_direction == other._box_direction) &&
800                    (_visuallyOrdered == other._visuallyOrdered) &&
801                    (_htmlHacks == other._htmlHacks) &&
802                    (_should_correct_text_color == other._should_correct_text_color);
803         }
804         
805         bool operator!=( const InheritedFlags &other ) const {
806             return !(*this == other);
807         }
808
809         EEmptyCell _empty_cells : 1 ;
810         ECaptionSide _caption_side : 2;
811         EListStyleType _list_style_type : 5 ;
812         EListStylePosition _list_style_position :1;
813         EVisibility _visibility : 2;
814         ETextAlign _text_align : 4;
815         ETextTransform _text_transform : 2;
816         int _text_decorations : 4;
817         ECursor _cursor_style : 4;
818         EDirection _direction : 1;
819         bool _border_collapse : 1 ;
820         EWhiteSpace _white_space : 2;
821         EBoxDirection _box_direction : 1; // CSS3 box_direction property (flexible box layout module)
822               // non CSS2 inherited
823               bool _visuallyOrdered : 1;
824               bool _htmlHacks :1;
825               bool _should_correct_text_color : 1;
826     } inherited_flags;
827
828 // don't inherit
829     struct NonInheritedFlags {
830         bool operator==( const NonInheritedFlags &other ) const {
831             return (_effectiveDisplay == other._effectiveDisplay) &&
832             (_originalDisplay == other._originalDisplay) &&
833             (_bg_repeat == other._bg_repeat) &&
834             (_overflow == other._overflow) &&
835             (_vertical_align == other._vertical_align) &&
836             (_clear == other._clear) &&
837             (_position == other._position) &&
838             (_floating == other._floating) &&
839             (_table_layout == other._table_layout) &&
840             (_page_break_before == other._page_break_before) &&
841             (_page_break_after == other._page_break_after) &&
842             (_styleType == other._styleType) &&
843             (_affectedByHover == other._affectedByHover) &&
844             (_affectedByActive == other._affectedByActive) &&
845             (_affectedByDrag == other._affectedByDrag) &&
846             (_pseudoBits == other._pseudoBits) &&
847             (_unicodeBidi == other._unicodeBidi);
848         }
849
850         bool operator!=( const NonInheritedFlags &other ) const {
851             return !(*this == other);
852         }
853         
854         EDisplay _effectiveDisplay : 5;
855         EDisplay _originalDisplay : 5;
856         EBackgroundRepeat _bg_repeat : 2;
857         bool _bg_attachment : 1;
858         EOverflow _overflow : 4 ;
859         EVerticalAlign _vertical_align : 4;
860         EClear _clear : 2;
861         EPosition _position : 2;
862         EFloat _floating : 2;
863         ETableLayout _table_layout : 1;
864         
865         EPageBreak _page_break_before : 2;
866         EPageBreak _page_break_after : 2;
867
868         PseudoId _styleType : 3;
869         bool _affectedByHover : 1;
870         bool _affectedByActive : 1;
871         bool _affectedByDrag : 1;
872         int _pseudoBits : 6;
873         EUnicodeBidi _unicodeBidi : 2;
874     } noninherited_flags;
875
876 // non-inherited attributes
877     DataRef<StyleBoxData> box;
878     DataRef<StyleVisualData> visual;
879     DataRef<StyleBackgroundData> background;
880     DataRef<StyleSurroundData> surround;
881     DataRef<StyleCSS3NonInheritedData> css3NonInheritedData;
882
883 #if APPLE_CHANGES
884     QValueList<StyleDashboardRegion> m_dashboardRegions;
885 #endif
886
887 // inherited attributes
888     DataRef<StyleCSS3InheritedData> css3InheritedData;
889     DataRef<StyleInheritedData> inherited;
890     
891 // list of associated pseudo styles
892     RenderStyle* pseudoStyle;
893     
894     // added this here, so we can get rid of the vptr in this class.
895     // makes up for the same size.
896     ContentData *content;
897
898     PseudoState m_pseudoState : 3;
899     bool m_affectedByAttributeSelectors : 1;
900     
901     int m_ref;
902     
903 // !END SYNC!
904
905 // static default style
906     static RenderStyle* _default;
907
908 protected:
909     void setBitDefaults()
910     {
911         inherited_flags._empty_cells = initialEmptyCells();
912         inherited_flags._caption_side = initialCaptionSide();
913         inherited_flags._list_style_type = initialListStyleType();
914         inherited_flags._list_style_position = initialListStylePosition();
915         inherited_flags._visibility = initialVisibility();
916         inherited_flags._text_align = initialTextAlign();
917         inherited_flags._text_transform = initialTextTransform();
918         inherited_flags._text_decorations = initialTextDecoration();
919         inherited_flags._cursor_style = initialCursor();
920         inherited_flags._direction = initialDirection();
921         inherited_flags._border_collapse = initialBorderCollapse();
922         inherited_flags._white_space = initialWhiteSpace();
923         inherited_flags._visuallyOrdered = false;
924         inherited_flags._htmlHacks=false;
925         inherited_flags._box_direction = initialBoxDirection();
926         inherited_flags._should_correct_text_color = false;
927         
928         noninherited_flags._effectiveDisplay = noninherited_flags._originalDisplay = initialDisplay();
929         noninherited_flags._bg_repeat = initialBackgroundRepeat();
930         noninherited_flags._bg_attachment = initialBackgroundAttachment();
931         noninherited_flags._overflow = initialOverflow();
932         noninherited_flags._vertical_align = initialVerticalAlign();
933         noninherited_flags._clear = initialClear();
934         noninherited_flags._position = initialPosition();
935         noninherited_flags._floating = initialFloating();
936         noninherited_flags._table_layout = initialTableLayout();
937         noninherited_flags._page_break_before = initialPageBreak();
938         noninherited_flags._page_break_after = initialPageBreak();
939         noninherited_flags._styleType = NOPSEUDO;
940         noninherited_flags._affectedByHover = false;
941         noninherited_flags._affectedByActive = false;
942         noninherited_flags._affectedByDrag = false;
943         noninherited_flags._pseudoBits = 0;
944         noninherited_flags._unicodeBidi = initialUnicodeBidi();
945     }
946
947 public:
948
949     RenderStyle();
950     // used to create the default style.
951     RenderStyle(bool);
952     RenderStyle(const RenderStyle&);
953
954     ~RenderStyle();
955
956     void inheritFrom(const RenderStyle* inheritParent);
957
958     PseudoId styleType() { return  noninherited_flags._styleType; }
959
960     RenderStyle* getPseudoStyle(PseudoId pi);
961     void addPseudoStyle(RenderStyle* pseudo);
962
963     bool affectedByHoverRules() const { return  noninherited_flags._affectedByHover; }
964     bool affectedByActiveRules() const { return  noninherited_flags._affectedByActive; }
965     bool affectedByDragRules() const { return  noninherited_flags._affectedByDrag; }
966
967     void setAffectedByHoverRules(bool b) {  noninherited_flags._affectedByHover = b; }
968     void setAffectedByActiveRules(bool b) {  noninherited_flags._affectedByActive = b; }
969     void setAffectedByDragRules(bool b) {  noninherited_flags._affectedByDrag = b; }
970  
971     bool operator==(const RenderStyle& other) const;
972     bool        isFloating() const { return !(noninherited_flags._floating == FNONE); }
973     bool        hasMargin() const { return surround->margin.nonZero(); }
974     bool        hasBorder() const { return surround->border.hasBorder(); }
975     bool        hasOffset() const { return surround->offset.nonZero(); }
976
977     bool visuallyOrdered() const { return inherited_flags._visuallyOrdered; }
978     void setVisuallyOrdered(bool b) {  inherited_flags._visuallyOrdered = b; }
979
980     bool isStyleAvailable() const;
981     
982     bool hasPseudoStyle(PseudoId pseudo) const;
983     void setHasPseudoStyle(PseudoId pseudo);
984     
985 // attribute getter methods
986
987     EDisplay    display() const { return noninherited_flags._effectiveDisplay; }
988     EDisplay    originalDisplay() const { return noninherited_flags._originalDisplay; }
989     
990     Length      left() const {  return surround->offset.left; }
991     Length      right() const {  return surround->offset.right; }
992     Length      top() const {  return surround->offset.top; }
993     Length      bottom() const {  return surround->offset.bottom; }
994
995     EPosition   position() const { return  noninherited_flags._position; }
996     EFloat      floating() const { return  noninherited_flags._floating; }
997
998     Length      width() const { return box->width; }
999     Length      height() const { return box->height; }
1000     Length      minWidth() const { return box->min_width; }
1001     Length      maxWidth() const { return box->max_width; }
1002     Length      minHeight() const { return box->min_height; }
1003     Length      maxHeight() const { return box->max_height; }
1004
1005     const BorderValue& borderLeft() const { return surround->border.left; }
1006     const BorderValue& borderRight() const { return surround->border.right; }
1007     const BorderValue& borderTop() const { return surround->border.top; }
1008     const BorderValue& borderBottom() const { return surround->border.bottom; }
1009
1010     unsigned short  borderLeftWidth() const
1011     { if( surround->border.left.style == BNONE || surround->border.left.style == BHIDDEN) return 0; return surround->border.left.width; }
1012     EBorderStyle    borderLeftStyle() const { return surround->border.left.style; }
1013     const QColor &  borderLeftColor() const { return surround->border.left.color; }
1014     bool borderLeftIsTransparent() const { return surround->border.left.isTransparent(); }
1015     unsigned short  borderRightWidth() const
1016     { if (surround->border.right.style == BNONE || surround->border.right.style == BHIDDEN) return 0; return surround->border.right.width; }
1017     EBorderStyle    borderRightStyle() const {  return surround->border.right.style; }
1018     const QColor &          borderRightColor() const {  return surround->border.right.color; }
1019     bool borderRightIsTransparent() const { return surround->border.right.isTransparent(); }
1020     unsigned short  borderTopWidth() const
1021     { if(surround->border.top.style == BNONE || surround->border.top.style == BHIDDEN) return 0; return surround->border.top.width; }
1022     EBorderStyle    borderTopStyle() const {return surround->border.top.style; }
1023     const QColor &  borderTopColor() const {  return surround->border.top.color; }
1024     bool borderTopIsTransparent() const { return surround->border.top.isTransparent(); }
1025     unsigned short  borderBottomWidth() const
1026     { if(surround->border.bottom.style == BNONE || surround->border.bottom.style == BHIDDEN) return 0; return surround->border.bottom.width; }
1027     EBorderStyle    borderBottomStyle() const {  return surround->border.bottom.style; }
1028     const QColor &          borderBottomColor() const {  return surround->border.bottom.color; }
1029     bool borderBottomIsTransparent() const { return surround->border.bottom.isTransparent(); }
1030     
1031     unsigned short outlineSize() const { return outlineWidth() + outlineOffset(); }
1032     unsigned short outlineWidth() const { if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline.width; }
1033     EBorderStyle    outlineStyle() const {  return background->outline.style; }
1034     bool outlineStyleIsAuto() const { return background->outline._auto; }
1035     const QColor &          outlineColor() const {  return background->outline.color; }
1036
1037     EOverflow overflow() const { return  noninherited_flags._overflow; }
1038     EVisibility visibility() const { return inherited_flags._visibility; }
1039     EVerticalAlign verticalAlign() const { return  noninherited_flags._vertical_align; }
1040     Length verticalAlignLength() const { return box->vertical_align; }
1041
1042     Length clipLeft() const { return visual->clip.left; }
1043     Length clipRight() const { return visual->clip.right; }
1044     Length clipTop() const { return visual->clip.top; }
1045     Length clipBottom() const { return visual->clip.bottom; }
1046     bool hasClip() const { return visual->hasClip; }
1047     
1048     EUnicodeBidi unicodeBidi() const { return noninherited_flags._unicodeBidi; }
1049
1050     EClear clear() const { return  noninherited_flags._clear; }
1051     ETableLayout tableLayout() const { return  noninherited_flags._table_layout; }
1052
1053     short colSpan() const { return visual->colspan; }
1054
1055     const QFont & font() const { return inherited->font.f; }
1056     // use with care. call font->update() after modifications
1057     const Font &htmlFont() { return inherited->font; }
1058     const QFontMetrics & fontMetrics() const { return inherited->font.fm; }
1059
1060     const QColor & color() const { return inherited->color; }
1061     Length textIndent() const { return inherited->indent; }
1062     ETextAlign textAlign() const { return inherited_flags._text_align; }
1063     ETextTransform textTransform() const { return inherited_flags._text_transform; }
1064     int textDecorationsInEffect() const { return inherited_flags._text_decorations; }
1065     int textDecoration() const { return visual->textDecoration; }
1066     int wordSpacing() const { return inherited->font.wordSpacing; }
1067     int letterSpacing() const { return inherited->font.letterSpacing; }
1068
1069     EDirection direction() const { return inherited_flags._direction; }
1070     Length lineHeight() const { return inherited->line_height; }
1071
1072     EWhiteSpace whiteSpace() const { return inherited_flags._white_space; }
1073
1074
1075     const QColor & backgroundColor() const { return background->color; }
1076     CachedImage *backgroundImage() const { return background->image; }
1077     EBackgroundRepeat backgroundRepeat() const { return  noninherited_flags._bg_repeat; }
1078     bool backgroundAttachment() const { return  noninherited_flags._bg_attachment; }
1079     Length backgroundXPosition() const { return background->x_position; }
1080     Length backgroundYPosition() const { return background->y_position; }
1081
1082     // returns true for collapsing borders, false for separate borders
1083     bool borderCollapse() const { return inherited_flags._border_collapse; }
1084     short horizontalBorderSpacing() const { return inherited->horizontal_border_spacing; }
1085     short verticalBorderSpacing() const { return inherited->vertical_border_spacing; }
1086     EEmptyCell emptyCells() const { return inherited_flags._empty_cells; }
1087     ECaptionSide captionSide() const { return inherited_flags._caption_side; }
1088
1089     short counterIncrement() const { return visual->counter_increment; }
1090     short counterReset() const { return visual->counter_reset; }
1091
1092     EListStyleType listStyleType() const { return inherited_flags._list_style_type; }
1093     CachedImage *listStyleImage() const { return inherited->style_image; }
1094     EListStylePosition listStylePosition() const { return inherited_flags._list_style_position; }
1095
1096     Length marginTop() const { return surround->margin.top; }
1097     Length marginBottom() const {  return surround->margin.bottom; }
1098     Length marginLeft() const {  return surround->margin.left; }
1099     Length marginRight() const {  return surround->margin.right; }
1100
1101     Length paddingTop() const {  return surround->padding.top; }
1102     Length paddingBottom() const {  return surround->padding.bottom; }
1103     Length paddingLeft() const { return surround->padding.left; }
1104     Length paddingRight() const {  return surround->padding.right; }
1105
1106     ECursor cursor() const { return inherited_flags._cursor_style; }
1107     
1108     CachedImage *cursorImage() const { return inherited->cursor_image; }
1109
1110     short widows() const { return inherited->widows; }
1111     short orphans() const { return inherited->orphans; }
1112     EPageBreak pageBreakInside() const { return inherited->page_break_inside; }
1113     EPageBreak pageBreakBefore() const { return noninherited_flags._page_break_before; }
1114     EPageBreak pageBreakAfter() const { return noninherited_flags._page_break_after; }
1115     
1116     // CSS3 Getter Methods
1117 #ifndef KHTML_NO_XBL
1118     BindingURI* bindingURIs() const { return css3NonInheritedData->bindingURI; }
1119 #endif
1120     int outlineOffset() const { 
1121         if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline._offset;
1122     }
1123     ShadowData* textShadow() const { return css3InheritedData->textShadow; }
1124     float opacity() { return css3NonInheritedData->opacity; }
1125     EBoxAlignment boxAlign() { return css3NonInheritedData->flexibleBox->align; }
1126     EBoxDirection boxDirection() { return inherited_flags._box_direction; }
1127     float boxFlex() { return css3NonInheritedData->flexibleBox->flex; }
1128     unsigned int boxFlexGroup() { return css3NonInheritedData->flexibleBox->flex_group; }
1129     EBoxLines boxLines() { return css3NonInheritedData->flexibleBox->lines; }
1130     unsigned int boxOrdinalGroup() { return css3NonInheritedData->flexibleBox->ordinal_group; }
1131     EBoxOrient boxOrient() { return css3NonInheritedData->flexibleBox->orient; }
1132     EBoxAlignment boxPack() { return css3NonInheritedData->flexibleBox->pack; }
1133     Length marqueeIncrement() { return css3NonInheritedData->marquee->increment; }
1134     int marqueeSpeed() { return css3NonInheritedData->marquee->speed; }
1135     int marqueeLoopCount() { return css3NonInheritedData->marquee->loops; }
1136     EMarqueeBehavior marqueeBehavior() { return css3NonInheritedData->marquee->behavior; }
1137     EMarqueeDirection marqueeDirection() { return css3NonInheritedData->marquee->direction; }
1138     EUserModify userModify() const { return css3InheritedData->userModify; }
1139     EUserDrag userDrag() const { return css3NonInheritedData->userDrag; }
1140     EUserSelect userSelect() const { return css3NonInheritedData->userSelect; }
1141     bool textOverflow() const { return css3NonInheritedData->textOverflow; }
1142     EMarginCollapse marginTopCollapse() const { return css3NonInheritedData->marginTopCollapse; }
1143     EMarginCollapse marginBottomCollapse() const { return css3NonInheritedData->marginBottomCollapse; }
1144     // End CSS3 Getters
1145
1146 #if APPLE_CHANGES
1147     // Apple-specific property getter methods
1148     int lineClamp() const { return css3NonInheritedData->lineClamp; }
1149     bool textSizeAdjust() const { return css3InheritedData->textSizeAdjust; }
1150 #endif
1151
1152 // attribute setter methods
1153
1154     void setDisplay(EDisplay v) {  noninherited_flags._effectiveDisplay = v; }
1155     void setOriginalDisplay(EDisplay v) {  noninherited_flags._originalDisplay = v; }
1156     void setPosition(EPosition v) {  noninherited_flags._position = v; }
1157     void setFloating(EFloat v) {  noninherited_flags._floating = v; }
1158
1159     void setLeft(Length v)  {  SET_VAR(surround,offset.left,v) }
1160     void setRight(Length v) {  SET_VAR(surround,offset.right,v) }
1161     void setTop(Length v)   {  SET_VAR(surround,offset.top,v) }
1162     void setBottom(Length v){  SET_VAR(surround,offset.bottom,v) }
1163
1164     void setWidth(Length v)  { SET_VAR(box,width,v) }
1165     void setHeight(Length v) { SET_VAR(box,height,v) }
1166
1167     void setMinWidth(Length v)  { SET_VAR(box,min_width,v) }
1168     void setMaxWidth(Length v)  { SET_VAR(box,max_width,v) }
1169     void setMinHeight(Length v) { SET_VAR(box,min_height,v) }
1170     void setMaxHeight(Length v) { SET_VAR(box,max_height,v) }
1171
1172 #if APPLE_CHANGES
1173     QValueList<StyleDashboardRegion> dashboardRegions() const { return m_dashboardRegions; }
1174     void setDashboardRegions(QValueList<StyleDashboardRegion> regions) { m_dashboardRegions = regions; }
1175     void setDashboardRegion (int type, QString label, Length t, Length r, Length b, Length l, bool append) {
1176         StyleDashboardRegion region;
1177         region.label = label;
1178         region.offset.top  = t;
1179         region.offset.right = r;
1180         region.offset.bottom = b;
1181         region.offset.left = l;
1182         region.type = type;
1183         if (!append) {
1184             m_dashboardRegions.clear ();
1185         }
1186         m_dashboardRegions.append (region);
1187     }
1188 #endif
1189
1190     void resetBorderTop() { SET_VAR(surround, border.top, BorderValue()) }
1191     void resetBorderRight() { SET_VAR(surround, border.right, BorderValue()) }
1192     void resetBorderBottom() { SET_VAR(surround, border.bottom, BorderValue()) }
1193     void resetBorderLeft() { SET_VAR(surround, border.left, BorderValue()) }
1194     void resetOutline() { SET_VAR(background, outline, OutlineValue()) }
1195     
1196     void setBorderLeftWidth(unsigned short v)   {  SET_VAR(surround,border.left.width,v) }
1197     void setBorderLeftStyle(EBorderStyle v)     {  SET_VAR(surround,border.left.style,v) }
1198     void setBorderLeftColor(const QColor & v)   {  SET_VAR(surround,border.left.color,v) }
1199     void setBorderRightWidth(unsigned short v)  {  SET_VAR(surround,border.right.width,v) }
1200     void setBorderRightStyle(EBorderStyle v)    {  SET_VAR(surround,border.right.style,v) }
1201     void setBorderRightColor(const QColor & v)  {  SET_VAR(surround,border.right.color,v) }
1202     void setBorderTopWidth(unsigned short v)    {  SET_VAR(surround,border.top.width,v) }
1203     void setBorderTopStyle(EBorderStyle v)      {  SET_VAR(surround,border.top.style,v) }
1204     void setBorderTopColor(const QColor & v)    {  SET_VAR(surround,border.top.color,v) }    
1205     void setBorderBottomWidth(unsigned short v) {  SET_VAR(surround,border.bottom.width,v) }
1206     void setBorderBottomStyle(EBorderStyle v)   {  SET_VAR(surround,border.bottom.style,v) }
1207     void setBorderBottomColor(const QColor & v) {  SET_VAR(surround,border.bottom.color,v) }
1208     void setOutlineWidth(unsigned short v) {  SET_VAR(background,outline.width,v) }
1209     void setOutlineStyle(EBorderStyle v, bool isAuto = false)   
1210     {  
1211         SET_VAR(background,outline.style,v)
1212         SET_VAR(background,outline._auto, isAuto)
1213     }
1214     void setOutlineColor(const QColor & v) {  SET_VAR(background,outline.color,v) }
1215
1216     void setOverflow(EOverflow v) {  noninherited_flags._overflow = v; }
1217     void setVisibility(EVisibility v) { inherited_flags._visibility = v; }
1218     void setVerticalAlign(EVerticalAlign v) { noninherited_flags._vertical_align = v; }
1219     void setVerticalAlignLength(Length l) { SET_VAR(box, vertical_align, l ) }
1220
1221     void setHasClip(bool b = true) { SET_VAR(visual,hasClip,b) }
1222     void setClipLeft(Length v) { SET_VAR(visual,clip.left,v) }
1223     void setClipRight(Length v) { SET_VAR(visual,clip.right,v) }
1224     void setClipTop(Length v) { SET_VAR(visual,clip.top,v) }
1225     void setClipBottom(Length v) { SET_VAR(visual,clip.bottom,v) }
1226     void setClip( Length top, Length right, Length bottom, Length left );
1227     
1228     void setUnicodeBidi( EUnicodeBidi b ) { noninherited_flags._unicodeBidi = b; }
1229
1230     void setClear(EClear v) {  noninherited_flags._clear = v; }
1231     void setTableLayout(ETableLayout v) {  noninherited_flags._table_layout = v; }
1232     void ssetColSpan(short v) { SET_VAR(visual,colspan,v) }
1233
1234     bool setFontDef(const khtml::FontDef & v) {
1235         // bah, this doesn't compare pointers. broken! (Dirk)
1236         if (!(inherited->font.fontDef == v)) {
1237             inherited.access()->font = Font( v, inherited->font.letterSpacing, inherited->font.wordSpacing );
1238             return true;
1239         }
1240         return false;
1241     }
1242
1243     void setColor(const QColor & v) { SET_VAR(inherited,color,v) }
1244     void setTextIndent(Length v) { SET_VAR(inherited,indent,v) }
1245     void setTextAlign(ETextAlign v) { inherited_flags._text_align = v; }
1246     void setTextTransform(ETextTransform v) { inherited_flags._text_transform = v; }
1247     void addToTextDecorationsInEffect(int v) { inherited_flags._text_decorations |= v; }
1248     void setTextDecorationsInEffect(int v) { inherited_flags._text_decorations = v; }
1249     void setTextDecoration(int v) { SET_VAR(visual, textDecoration, v); }
1250     void setDirection(EDirection v) { inherited_flags._direction = v; }
1251     void setLineHeight(Length v) { SET_VAR(inherited,line_height,v) }
1252
1253     void setWhiteSpace(EWhiteSpace v) { inherited_flags._white_space = v; }
1254
1255     void setWordSpacing(int v) { SET_VAR(inherited,font.wordSpacing,v) }
1256     void setLetterSpacing(int v) { SET_VAR(inherited,font.letterSpacing,v) }
1257
1258     void setBackgroundColor(const QColor & v) {  SET_VAR(background,color,v) }
1259     void setBackgroundImage(CachedImage *v) {  SET_VAR(background,image,v) }
1260     void setBackgroundRepeat(EBackgroundRepeat v) {  noninherited_flags._bg_repeat = v; }
1261     void setBackgroundAttachment(bool scroll) {  noninherited_flags._bg_attachment = scroll; }
1262     void setBackgroundXPosition(Length v) {  SET_VAR(background,x_position,v) }
1263     void setBackgroundYPosition(Length v) {  SET_VAR(background,y_position,v) }
1264
1265     void setBorderCollapse(bool collapse) { inherited_flags._border_collapse = collapse; }
1266     void setHorizontalBorderSpacing(short v) { SET_VAR(inherited,horizontal_border_spacing,v) }
1267     void setVerticalBorderSpacing(short v) { SET_VAR(inherited,vertical_border_spacing,v) }
1268     void setEmptyCells(EEmptyCell v) { inherited_flags._empty_cells = v; }
1269     void setCaptionSide(ECaptionSide v) { inherited_flags._caption_side = v; }
1270
1271
1272     void setCounterIncrement(short v) {  SET_VAR(visual,counter_increment,v) }
1273     void setCounterReset(short v) {  SET_VAR(visual,counter_reset,v) }
1274
1275     void setListStyleType(EListStyleType v) { inherited_flags._list_style_type = v; }
1276     void setListStyleImage(CachedImage *v) {  SET_VAR(inherited,style_image,v)}
1277     void setListStylePosition(EListStylePosition v) { inherited_flags._list_style_position = v; }
1278
1279     void resetMargin() { SET_VAR(surround, margin, LengthBox(Fixed)) }
1280     void setMarginTop(Length v)     {  SET_VAR(surround,margin.top,v) }
1281     void setMarginBottom(Length v)  {  SET_VAR(surround,margin.bottom,v) }
1282     void setMarginLeft(Length v)    {  SET_VAR(surround,margin.left,v) }
1283     void setMarginRight(Length v)   {  SET_VAR(surround,margin.right,v) }
1284
1285     void resetPadding() { SET_VAR(surround, padding, LengthBox(Variable)) }
1286     void setPaddingTop(Length v)    {  SET_VAR(surround,padding.top,v) }
1287     void setPaddingBottom(Length v) {  SET_VAR(surround,padding.bottom,v) }
1288     void setPaddingLeft(Length v)   {  SET_VAR(surround,padding.left,v) }
1289     void setPaddingRight(Length v)  {  SET_VAR(surround,padding.right,v) }
1290
1291     void setCursor( ECursor c ) { inherited_flags._cursor_style = c; }
1292     void setCursorImage( CachedImage *v ) { SET_VAR(inherited,cursor_image,v) }
1293
1294     bool shouldCorrectTextColor() const { return inherited_flags._should_correct_text_color; }
1295     void setShouldCorrectTextColor(bool b=true) { inherited_flags._should_correct_text_color = b; }
1296
1297     bool htmlHacks() const { return inherited_flags._htmlHacks; }
1298     void setHtmlHacks(bool b=true) { inherited_flags._htmlHacks = b; }
1299
1300     bool hasAutoZIndex() { return box->z_auto; }
1301     void setHasAutoZIndex() { SET_VAR(box, z_auto, true); SET_VAR(box, z_index, 0) }
1302     int zIndex() const { return box->z_index; }
1303     void setZIndex(int v) { SET_VAR(box, z_auto, false); SET_VAR(box, z_index, v) }
1304
1305     void setWidows(short w) { SET_VAR(inherited, widows, w); }
1306     void setOrphans(short o) { SET_VAR(inherited, orphans, o); }
1307     void setPageBreakInside(EPageBreak b) { SET_VAR(inherited, page_break_inside, b); }
1308     void setPageBreakBefore(EPageBreak b) { noninherited_flags._page_break_before = b; }
1309     void setPageBreakAfter(EPageBreak b) { noninherited_flags._page_break_after = b; }
1310     
1311     // CSS3 Setters
1312 #ifndef KHTML_NO_XBL
1313     void deleteBindingURIs() { 
1314         delete css3NonInheritedData->bindingURI; 
1315         SET_VAR(css3NonInheritedData, bindingURI, 0);
1316     }
1317     void inheritBindingURIs(BindingURI* other) {
1318         SET_VAR(css3NonInheritedData, bindingURI, other->copy());
1319     }
1320     void addBindingURI(DOM::DOMStringImpl* uri);
1321 #endif
1322     void setOutlineOffset(unsigned short v) {  SET_VAR(background,outline._offset,v) }
1323     void setTextShadow(ShadowData* val, bool add=false);
1324     void setOpacity(float f) { SET_VAR(css3NonInheritedData, opacity, f); }
1325     void setBoxAlign(EBoxAlignment a) { SET_VAR(css3NonInheritedData.access()->flexibleBox, align, a); }
1326     void setBoxDirection(EBoxDirection d) { inherited_flags._box_direction = d; }
1327     void setBoxFlex(float f) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex, f); }
1328     void setBoxFlexGroup(unsigned int fg) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex_group, fg); }
1329     void setBoxLines(EBoxLines l) { SET_VAR(css3NonInheritedData.access()->flexibleBox, lines, l); }
1330     void setBoxOrdinalGroup(unsigned int og) { SET_VAR(css3NonInheritedData.access()->flexibleBox, ordinal_group, og); }
1331     void setBoxOrient(EBoxOrient o) { SET_VAR(css3NonInheritedData.access()->flexibleBox, orient, o); }
1332     void setBoxPack(EBoxAlignment p) { SET_VAR(css3NonInheritedData.access()->flexibleBox, pack, p); }
1333     void setMarqueeIncrement(const Length& f) { SET_VAR(css3NonInheritedData.access()->marquee, increment, f); }
1334     void setMarqueeSpeed(int f) { SET_VAR(css3NonInheritedData.access()->marquee, speed, f); }
1335     void setMarqueeDirection(EMarqueeDirection d) { SET_VAR(css3NonInheritedData.access()->marquee, direction, d); }
1336     void setMarqueeBehavior(EMarqueeBehavior b) { SET_VAR(css3NonInheritedData.access()->marquee, behavior, b); }
1337     void setMarqueeLoopCount(int i) { SET_VAR(css3NonInheritedData.access()->marquee, loops, i); }
1338     void setUserModify(EUserModify u) { SET_VAR(css3InheritedData, userModify, u); }
1339     void setUserDrag(EUserDrag d) { SET_VAR(css3NonInheritedData, userDrag, d); }
1340     void setUserSelect(EUserSelect s) { SET_VAR(css3NonInheritedData, userSelect, s); }
1341     void setTextOverflow(bool b) { SET_VAR(css3NonInheritedData, textOverflow, b); }
1342     void setMarginTopCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginTopCollapse, c); }
1343     void setMarginBottomCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginBottomCollapse, c); }
1344     // End CSS3 Setters
1345    
1346 #if APPLE_CHANGES
1347     // Apple-specific property setters
1348     void setLineClamp(int c) { SET_VAR(css3NonInheritedData, lineClamp, c); }
1349     void setTextSizeAdjust(bool b) { SET_VAR(css3InheritedData, textSizeAdjust, b); }
1350 #endif
1351
1352     QPalette palette() const { return visual->palette; }
1353     void setPaletteColor(QPalette::ColorGroup g, QColorGroup::ColorRole r, const QColor& c);
1354     void resetPalette() // Called when the desktop color scheme changes.
1355     {
1356         const_cast<StyleVisualData *>(visual.get())->palette = QApplication::palette();
1357     }
1358
1359     ContentData* contentData() { return content; }
1360     bool contentDataEquivalent(RenderStyle* otherStyle);
1361     void setContent(DOM::DOMStringImpl* s, bool add = false);
1362     void setContent(CachedObject* o, bool add = false);
1363
1364     bool inheritedNotEqual( RenderStyle *other ) const;
1365
1366     enum Diff { Equal, NonVisible = Equal, Visible, Position, Layout, CbLayout };
1367     Diff diff( const RenderStyle *other ) const;
1368
1369     bool isDisplayReplacedType() {
1370         return display() == INLINE_BLOCK || display() == INLINE_BOX || display() == INLINE_TABLE;
1371     }
1372     bool isDisplayInlineType() {
1373         return display() == INLINE || isDisplayReplacedType();
1374     }
1375     bool isOriginalDisplayInlineType() {
1376         return originalDisplay() == INLINE || originalDisplay() == INLINE_BLOCK ||
1377                originalDisplay() == INLINE_BOX || originalDisplay() == INLINE_TABLE;
1378     }
1379     
1380     // To obtain at any time the pseudo state for a given link.
1381     PseudoState pseudoState() const { return m_pseudoState; }
1382     void setPseudoState(PseudoState s) { m_pseudoState = s; }
1383     
1384     // To tell if this style matched attribute selectors. This makes it impossible to share.
1385     bool affectedByAttributeSelectors() const { return m_affectedByAttributeSelectors; }
1386     void setAffectedByAttributeSelectors() { m_affectedByAttributeSelectors = true; }
1387
1388     // Initial values for all the properties
1389     static bool initialBackgroundAttachment() { return true; }
1390     static EBackgroundRepeat initialBackgroundRepeat() { return REPEAT; }
1391     static bool initialBorderCollapse() { return false; }
1392     static EBorderStyle initialBorderStyle() { return BNONE; }
1393     static ECaptionSide initialCaptionSide() { return CAPTOP; }
1394     static EClear initialClear() { return CNONE; }
1395     static EDirection initialDirection() { return LTR; }
1396     static EDisplay initialDisplay() { return INLINE; }
1397     static EEmptyCell initialEmptyCells() { return SHOW; }
1398     static EFloat initialFloating() { return FNONE; }
1399     static EListStylePosition initialListStylePosition() { return OUTSIDE; }
1400     static EListStyleType initialListStyleType() { return DISC; }
1401     static EOverflow initialOverflow() { return OVISIBLE; }
1402     static EPageBreak initialPageBreak() { return PBAUTO; }
1403     static EPosition initialPosition() { return STATIC; }
1404     static ETableLayout initialTableLayout() { return TAUTO; }
1405     static EUnicodeBidi initialUnicodeBidi() { return UBNormal; }
1406     static ETextTransform initialTextTransform() { return TTNONE; }
1407     static EVisibility initialVisibility() { return VISIBLE; }
1408     static EWhiteSpace initialWhiteSpace() { return NORMAL; }
1409     static Length initialBackgroundXPosition() { return Length(); }
1410     static Length initialBackgroundYPosition() { return Length(); }
1411     static short initialHorizontalBorderSpacing() { return 0; }
1412     static short initialVerticalBorderSpacing() { return 0; }
1413     static ECursor initialCursor() { return CURSOR_AUTO; }
1414     static QColor initialColor() { return Qt::black; }
1415     static CachedImage* initialBackgroundImage() { return 0; }
1416     static CachedImage* initialListStyleImage() { return 0; }
1417     static unsigned short initialBorderWidth() { return 3; }
1418     static int initialLetterWordSpacing() { return 0; }
1419     static Length initialSize() { return Length(); }
1420     static Length initialMinSize() { return Length(0, Fixed); }
1421     static Length initialMaxSize() { return Length(UNDEFINED, Fixed); }
1422     static Length initialOffset() { return Length(); }
1423     static Length initialMargin() { return Length(Fixed); }
1424     static Length initialPadding() { return Length(Variable); }
1425     static Length initialTextIndent() { return Length(Fixed); }
1426     static EVerticalAlign initialVerticalAlign() { return BASELINE; }
1427     static int initialWidows() { return 2; }
1428     static int initialOrphans() { return 2; }
1429     static Length initialLineHeight() { return Length(-100, Percent); }
1430     static ETextAlign initialTextAlign() { return TAAUTO; }
1431     static ETextDecoration initialTextDecoration() { return TDNONE; }
1432     static int initialOutlineOffset() { return 0; }
1433     static float initialOpacity() { return 1.0f; }
1434     static EBoxAlignment initialBoxAlign() { return BSTRETCH; }
1435     static EBoxDirection initialBoxDirection() { return BNORMAL; }
1436     static EBoxLines initialBoxLines() { return SINGLE; }
1437     static EBoxOrient initialBoxOrient() { return HORIZONTAL; }
1438     static EBoxAlignment initialBoxPack() { return BSTART; }
1439     static float initialBoxFlex() { return 0.0f; }
1440     static int initialBoxFlexGroup() { return 1; }
1441     static int initialBoxOrdinalGroup() { return 1; }
1442     static int initialMarqueeLoopCount() { return -1; }
1443     static int initialMarqueeSpeed() { return 85; }
1444     static Length initialMarqueeIncrement() { return Length(6, Fixed); }
1445     static EMarqueeBehavior initialMarqueeBehavior() { return MSCROLL; }
1446     static EMarqueeDirection initialMarqueeDirection() { return MAUTO; }
1447     static EUserModify initialUserModify() { return READ_ONLY; }
1448     static EUserDrag initialUserDrag() { return DRAG_AUTO; }
1449     static EUserSelect initialUserSelect() { return SELECT_AUTO; }
1450     static bool initialTextOverflow() { return false; }
1451     static EMarginCollapse initialMarginTopCollapse() { return MCOLLAPSE; }
1452     static EMarginCollapse initialMarginBottomCollapse() { return MCOLLAPSE; }
1453
1454 #if APPLE_CHANGES
1455     // Keep these at the end.
1456     static int initialLineClamp() { return -1; }
1457     static bool initialTextSizeAdjust() { return true; }
1458     static QValueList<StyleDashboardRegion> initialDashboardRegions() { 
1459         QValueList<StyleDashboardRegion> emptyList;
1460         return emptyList;
1461     }
1462 #endif
1463 };
1464
1465
1466 } // namespace
1467
1468 #endif
1469