Reviewed by Darin
[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 // Word Break Values. Matches WinIE, rather than CSS3
566
567 enum EWordWrap {
568     WBNORMAL, BREAK_WORD
569 };
570
571 enum ENBSPMode {
572     NBNORMAL, SPACE
573 };
574
575 enum EKHTMLLineBreak {
576     LBNORMAL, AFTER_WHITE_SPACE
577 };
578
579 // This struct is for rarely used non-inherited CSS3 properties.  By grouping them together,
580 // we save space, and only allocate this object when someone actually uses
581 // a non-inherited CSS3 property.
582 class StyleCSS3NonInheritedData : public Shared<StyleCSS3NonInheritedData>
583 {
584 public:
585     StyleCSS3NonInheritedData();
586     ~StyleCSS3NonInheritedData();
587     StyleCSS3NonInheritedData(const StyleCSS3NonInheritedData& o);
588
589 #ifndef KHTML_NO_XBL
590     bool bindingsEquivalent(const StyleCSS3NonInheritedData& o) const;
591 #endif
592
593     bool operator==(const StyleCSS3NonInheritedData& o) const;
594     bool operator!=(const StyleCSS3NonInheritedData &o) const {
595         return !(*this == o);
596     }
597     
598 #if APPLE_CHANGES
599     int lineClamp;         // An Apple extension.  Not really CSS3 but not worth making a new struct over.
600     QValueList<StyleDashboardRegion> m_dashboardRegions;
601 #endif
602     float opacity;         // Whether or not we're transparent.
603     DataRef<StyleFlexibleBoxData> flexibleBox; // Flexible box properties 
604     DataRef<StyleMarqueeData> marquee; // Marquee properties
605     EUserDrag userDrag : 2; // Whether or not a drag can be initiated by this element.
606     EUserSelect userSelect : 2;  // Whether or not the element is selectable.
607     bool textOverflow : 1; // Whether or not lines that spill out should be truncated with "..."
608     EMarginCollapse marginTopCollapse : 2;
609     EMarginCollapse marginBottomCollapse : 2;
610
611 #ifndef KHTML_NO_XBL
612     BindingURI* bindingURI; // The XBL binding URI list.
613 #endif
614 };
615
616 // This struct is for rarely used inherited CSS3 properties.  By grouping them together,
617 // we save space, and only allocate this object when someone actually uses
618 // an inherited CSS3 property.
619 class StyleCSS3InheritedData : public Shared<StyleCSS3InheritedData>
620 {
621 public:
622     StyleCSS3InheritedData();
623     ~StyleCSS3InheritedData();
624     StyleCSS3InheritedData(const StyleCSS3InheritedData& o);
625
626     bool operator==(const StyleCSS3InheritedData& o) const;
627     bool operator!=(const StyleCSS3InheritedData &o) const {
628         return !(*this == o);
629     }
630     bool shadowDataEquivalent(const StyleCSS3InheritedData& o) const;
631
632     ShadowData* textShadow;  // Our text shadow information for shadowed text drawing.
633     EUserModify userModify : 2; // Flag used for editing state
634     EWordWrap wordWrap : 1;    // Flag used for word wrap
635     ENBSPMode nbspMode : 1;    
636     EKHTMLLineBreak khtmlLineBreak : 1;    
637 #if APPLE_CHANGES
638     bool textSizeAdjust : 1;    // An Apple extension.  Not really CSS3 but not worth making a new struct over.
639 #endif
640     
641 private:
642     StyleCSS3InheritedData &operator=(const StyleCSS3InheritedData &);
643 };
644
645 //------------------------------------------------
646 // Inherited attributes.
647 //
648
649 enum EWhiteSpace {
650     NORMAL, PRE, NOWRAP, KHTML_NOWRAP
651 };
652
653 enum ETextAlign {
654     TAAUTO, LEFT, RIGHT, CENTER, JUSTIFY, KHTML_LEFT, KHTML_RIGHT, KHTML_CENTER
655 };
656
657 enum ETextTransform {
658     CAPITALIZE, UPPERCASE, LOWERCASE, TTNONE
659 };
660
661 enum EDirection {
662     LTR, RTL
663 };
664
665 enum ETextDecoration {
666     TDNONE = 0x0 , UNDERLINE = 0x1, OVERLINE = 0x2, LINE_THROUGH= 0x4, BLINK = 0x8
667 };
668
669 enum EPageBreak {
670     PBAUTO, PBALWAYS, PBAVOID
671 };
672
673 class StyleInheritedData : public Shared<StyleInheritedData>
674 {
675 public:
676     StyleInheritedData();
677     ~StyleInheritedData();
678     StyleInheritedData(const StyleInheritedData& o );
679
680     bool operator==(const StyleInheritedData& o) const;
681     bool operator != ( const StyleInheritedData &o ) const {
682         return !(*this == o);
683     }
684
685     Length indent;
686     // could be packed in a short but doesn't
687     // make a difference currently because of padding
688     Length line_height;
689
690     CachedImage *style_image;
691     CachedImage *cursor_image;
692
693     khtml::Font font;
694     QColor color;
695     
696     short horizontal_border_spacing;
697     short vertical_border_spacing;
698     
699     // Paged media properties.
700     short widows;
701     short orphans;
702     EPageBreak page_break_inside : 2;
703 };
704
705
706 enum EEmptyCell {
707     SHOW, HIDE
708 };
709
710 enum ECaptionSide
711 {
712     CAPTOP, CAPBOTTOM, CAPLEFT, CAPRIGHT
713 };
714
715
716 enum EListStyleType {
717      DISC, CIRCLE, SQUARE, LDECIMAL, DECIMAL_LEADING_ZERO,
718      LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK,
719      LOWER_ALPHA, LOWER_LATIN, UPPER_ALPHA, UPPER_LATIN,
720      HEBREW, ARMENIAN, GEORGIAN, CJK_IDEOGRAPHIC,
721      HIRAGANA, KATAKANA, HIRAGANA_IROHA, KATAKANA_IROHA, LNONE
722 };
723
724 enum EListStylePosition { OUTSIDE, INSIDE };
725
726 enum EVisibility { VISIBLE, HIDDEN, COLLAPSE };
727
728 enum ECursor {
729     CURSOR_AUTO, CURSOR_CROSS, CURSOR_DEFAULT, CURSOR_POINTER, CURSOR_MOVE,
730     CURSOR_E_RESIZE, CURSOR_NE_RESIZE, CURSOR_NW_RESIZE, CURSOR_N_RESIZE, CURSOR_SE_RESIZE, CURSOR_SW_RESIZE,
731     CURSOR_S_RESIZE, CURSOR_W_RESIZE, CURSOR_TEXT, CURSOR_WAIT, CURSOR_HELP
732 };
733
734 enum ContentType {
735     CONTENT_NONE, CONTENT_OBJECT, CONTENT_TEXT, CONTENT_COUNTER
736 };
737
738 struct ContentData {
739     ContentData() :_contentType(CONTENT_NONE), _nextContent(0) {}
740     ~ContentData();
741     void clearContent();
742
743     ContentType contentType() { return _contentType; }
744
745     DOM::DOMStringImpl* contentText() { if (contentType() == CONTENT_TEXT) return _content.text; return 0; }
746     CachedObject* contentObject() { if (contentType() == CONTENT_OBJECT) return _content.object; return 0; }
747     
748     ContentType _contentType;
749
750     union {
751         CachedObject* object;
752         DOM::DOMStringImpl* text;
753         // counters...
754     } _content ;
755
756     ContentData* _nextContent;
757 };
758
759 //------------------------------------------------
760
761 enum EDisplay {
762     INLINE, BLOCK, LIST_ITEM, RUN_IN, COMPACT, INLINE_BLOCK,
763     TABLE, INLINE_TABLE, TABLE_ROW_GROUP,
764     TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_ROW,
765     TABLE_COLUMN_GROUP, TABLE_COLUMN, TABLE_CELL,
766     TABLE_CAPTION, BOX, INLINE_BOX, NONE
767 };
768
769 class RenderStyle
770 {
771     friend class CSSStyleSelector;
772 public:
773     static void cleanup();
774
775     // static pseudo styles. Dynamic ones are produced on the fly.
776     enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED };
777
778     void ref() { m_ref++;  }
779     void deref(RenderArena* arena) { 
780         if (m_ref) m_ref--; 
781         if (!m_ref)
782             arenaDelete(arena);
783     }
784     bool hasOneRef() { return m_ref==1; }
785     int refCount() const { return m_ref; }
786     
787     // Overloaded new operator.  Derived classes must override operator new
788     // in order to allocate out of the RenderArena.
789     void* operator new(size_t sz, RenderArena* renderArena) throw();    
790     
791     // Overridden to prevent the normal delete from being called.
792     void operator delete(void* ptr, size_t sz);
793     
794 private:
795     void arenaDelete(RenderArena *arena);
796
797 protected:
798
799 // !START SYNC!: Keep this in sync with the copy constructor in render_style.cpp
800
801     // inherit
802     struct InheritedFlags {
803         bool operator==( const InheritedFlags &other ) const {
804             return (_empty_cells == other._empty_cells) &&
805                    (_caption_side == other._caption_side) &&
806                    (_list_style_type == other._list_style_type) &&
807                    (_list_style_position == other._list_style_position) &&
808                    (_visibility == other._visibility) &&
809                    (_text_align == other._text_align) &&
810                    (_text_transform == other._text_transform) &&
811                    (_text_decorations == other._text_decorations) &&
812                    (_text_transform == other._text_transform) &&
813                    (_cursor_style == other._cursor_style) &&
814                    (_direction == other._direction) &&
815                    (_border_collapse == other._border_collapse) &&
816                    (_white_space == other._white_space) &&
817                    (_box_direction == other._box_direction) &&
818                    (_visuallyOrdered == other._visuallyOrdered) &&
819                    (_htmlHacks == other._htmlHacks) &&
820                    (_should_correct_text_color == other._should_correct_text_color);
821         }
822         
823         bool operator!=( const InheritedFlags &other ) const {
824             return !(*this == other);
825         }
826
827         EEmptyCell _empty_cells : 1 ;
828         ECaptionSide _caption_side : 2;
829         EListStyleType _list_style_type : 5 ;
830         EListStylePosition _list_style_position :1;
831         EVisibility _visibility : 2;
832         ETextAlign _text_align : 4;
833         ETextTransform _text_transform : 2;
834         int _text_decorations : 4;
835         ECursor _cursor_style : 4;
836         EDirection _direction : 1;
837         bool _border_collapse : 1 ;
838         EWhiteSpace _white_space : 2;
839         EBoxDirection _box_direction : 1; // CSS3 box_direction property (flexible box layout module)
840               // non CSS2 inherited
841               bool _visuallyOrdered : 1;
842               bool _htmlHacks :1;
843               bool _should_correct_text_color : 1;
844     } inherited_flags;
845
846 // don't inherit
847     struct NonInheritedFlags {
848         bool operator==( const NonInheritedFlags &other ) const {
849             return (_effectiveDisplay == other._effectiveDisplay) &&
850             (_originalDisplay == other._originalDisplay) &&
851             (_bg_repeat == other._bg_repeat) &&
852             (_overflow == other._overflow) &&
853             (_vertical_align == other._vertical_align) &&
854             (_clear == other._clear) &&
855             (_position == other._position) &&
856             (_floating == other._floating) &&
857             (_table_layout == other._table_layout) &&
858             (_page_break_before == other._page_break_before) &&
859             (_page_break_after == other._page_break_after) &&
860             (_styleType == other._styleType) &&
861             (_affectedByHover == other._affectedByHover) &&
862             (_affectedByActive == other._affectedByActive) &&
863             (_affectedByDrag == other._affectedByDrag) &&
864             (_pseudoBits == other._pseudoBits) &&
865             (_unicodeBidi == other._unicodeBidi);
866         }
867
868         bool operator!=( const NonInheritedFlags &other ) const {
869             return !(*this == other);
870         }
871         
872         EDisplay _effectiveDisplay : 5;
873         EDisplay _originalDisplay : 5;
874         EBackgroundRepeat _bg_repeat : 2;
875         bool _bg_attachment : 1;
876         EOverflow _overflow : 4 ;
877         EVerticalAlign _vertical_align : 4;
878         EClear _clear : 2;
879         EPosition _position : 2;
880         EFloat _floating : 2;
881         ETableLayout _table_layout : 1;
882         
883         EPageBreak _page_break_before : 2;
884         EPageBreak _page_break_after : 2;
885
886         PseudoId _styleType : 3;
887         bool _affectedByHover : 1;
888         bool _affectedByActive : 1;
889         bool _affectedByDrag : 1;
890         int _pseudoBits : 6;
891         EUnicodeBidi _unicodeBidi : 2;
892     } noninherited_flags;
893
894 // non-inherited attributes
895     DataRef<StyleBoxData> box;
896     DataRef<StyleVisualData> visual;
897     DataRef<StyleBackgroundData> background;
898     DataRef<StyleSurroundData> surround;
899     DataRef<StyleCSS3NonInheritedData> css3NonInheritedData;
900
901 // inherited attributes
902     DataRef<StyleCSS3InheritedData> css3InheritedData;
903     DataRef<StyleInheritedData> inherited;
904     
905 // list of associated pseudo styles
906     RenderStyle* pseudoStyle;
907     
908     // added this here, so we can get rid of the vptr in this class.
909     // makes up for the same size.
910     ContentData *content;
911
912     PseudoState m_pseudoState : 3;
913     bool m_affectedByAttributeSelectors : 1;
914     
915     int m_ref;
916     
917 // !END SYNC!
918
919 // static default style
920     static RenderStyle* _default;
921
922 protected:
923     void setBitDefaults()
924     {
925         inherited_flags._empty_cells = initialEmptyCells();
926         inherited_flags._caption_side = initialCaptionSide();
927         inherited_flags._list_style_type = initialListStyleType();
928         inherited_flags._list_style_position = initialListStylePosition();
929         inherited_flags._visibility = initialVisibility();
930         inherited_flags._text_align = initialTextAlign();
931         inherited_flags._text_transform = initialTextTransform();
932         inherited_flags._text_decorations = initialTextDecoration();
933         inherited_flags._cursor_style = initialCursor();
934         inherited_flags._direction = initialDirection();
935         inherited_flags._border_collapse = initialBorderCollapse();
936         inherited_flags._white_space = initialWhiteSpace();
937         inherited_flags._visuallyOrdered = false;
938         inherited_flags._htmlHacks=false;
939         inherited_flags._box_direction = initialBoxDirection();
940         inherited_flags._should_correct_text_color = false;
941         
942         noninherited_flags._effectiveDisplay = noninherited_flags._originalDisplay = initialDisplay();
943         noninherited_flags._bg_repeat = initialBackgroundRepeat();
944         noninherited_flags._bg_attachment = initialBackgroundAttachment();
945         noninherited_flags._overflow = initialOverflow();
946         noninherited_flags._vertical_align = initialVerticalAlign();
947         noninherited_flags._clear = initialClear();
948         noninherited_flags._position = initialPosition();
949         noninherited_flags._floating = initialFloating();
950         noninherited_flags._table_layout = initialTableLayout();
951         noninherited_flags._page_break_before = initialPageBreak();
952         noninherited_flags._page_break_after = initialPageBreak();
953         noninherited_flags._styleType = NOPSEUDO;
954         noninherited_flags._affectedByHover = false;
955         noninherited_flags._affectedByActive = false;
956         noninherited_flags._affectedByDrag = false;
957         noninherited_flags._pseudoBits = 0;
958         noninherited_flags._unicodeBidi = initialUnicodeBidi();
959     }
960
961 public:
962
963     RenderStyle();
964     // used to create the default style.
965     RenderStyle(bool);
966     RenderStyle(const RenderStyle&);
967
968     ~RenderStyle();
969
970     void inheritFrom(const RenderStyle* inheritParent);
971
972     PseudoId styleType() { return  noninherited_flags._styleType; }
973
974     RenderStyle* getPseudoStyle(PseudoId pi);
975     void addPseudoStyle(RenderStyle* pseudo);
976
977     bool affectedByHoverRules() const { return  noninherited_flags._affectedByHover; }
978     bool affectedByActiveRules() const { return  noninherited_flags._affectedByActive; }
979     bool affectedByDragRules() const { return  noninherited_flags._affectedByDrag; }
980
981     void setAffectedByHoverRules(bool b) {  noninherited_flags._affectedByHover = b; }
982     void setAffectedByActiveRules(bool b) {  noninherited_flags._affectedByActive = b; }
983     void setAffectedByDragRules(bool b) {  noninherited_flags._affectedByDrag = b; }
984  
985     bool operator==(const RenderStyle& other) const;
986     bool        isFloating() const { return !(noninherited_flags._floating == FNONE); }
987     bool        hasMargin() const { return surround->margin.nonZero(); }
988     bool        hasBorder() const { return surround->border.hasBorder(); }
989     bool        hasOffset() const { return surround->offset.nonZero(); }
990
991     bool visuallyOrdered() const { return inherited_flags._visuallyOrdered; }
992     void setVisuallyOrdered(bool b) {  inherited_flags._visuallyOrdered = b; }
993
994     bool isStyleAvailable() const;
995     
996     bool hasPseudoStyle(PseudoId pseudo) const;
997     void setHasPseudoStyle(PseudoId pseudo);
998     
999 // attribute getter methods
1000
1001     EDisplay    display() const { return noninherited_flags._effectiveDisplay; }
1002     EDisplay    originalDisplay() const { return noninherited_flags._originalDisplay; }
1003     
1004     Length      left() const {  return surround->offset.left; }
1005     Length      right() const {  return surround->offset.right; }
1006     Length      top() const {  return surround->offset.top; }
1007     Length      bottom() const {  return surround->offset.bottom; }
1008
1009     EPosition   position() const { return  noninherited_flags._position; }
1010     EFloat      floating() const { return  noninherited_flags._floating; }
1011
1012     Length      width() const { return box->width; }
1013     Length      height() const { return box->height; }
1014     Length      minWidth() const { return box->min_width; }
1015     Length      maxWidth() const { return box->max_width; }
1016     Length      minHeight() const { return box->min_height; }
1017     Length      maxHeight() const { return box->max_height; }
1018
1019     const BorderValue& borderLeft() const { return surround->border.left; }
1020     const BorderValue& borderRight() const { return surround->border.right; }
1021     const BorderValue& borderTop() const { return surround->border.top; }
1022     const BorderValue& borderBottom() const { return surround->border.bottom; }
1023
1024     unsigned short  borderLeftWidth() const
1025     { if( surround->border.left.style == BNONE || surround->border.left.style == BHIDDEN) return 0; return surround->border.left.width; }
1026     EBorderStyle    borderLeftStyle() const { return surround->border.left.style; }
1027     const QColor &  borderLeftColor() const { return surround->border.left.color; }
1028     bool borderLeftIsTransparent() const { return surround->border.left.isTransparent(); }
1029     unsigned short  borderRightWidth() const
1030     { if (surround->border.right.style == BNONE || surround->border.right.style == BHIDDEN) return 0; return surround->border.right.width; }
1031     EBorderStyle    borderRightStyle() const {  return surround->border.right.style; }
1032     const QColor &          borderRightColor() const {  return surround->border.right.color; }
1033     bool borderRightIsTransparent() const { return surround->border.right.isTransparent(); }
1034     unsigned short  borderTopWidth() const
1035     { if(surround->border.top.style == BNONE || surround->border.top.style == BHIDDEN) return 0; return surround->border.top.width; }
1036     EBorderStyle    borderTopStyle() const {return surround->border.top.style; }
1037     const QColor &  borderTopColor() const {  return surround->border.top.color; }
1038     bool borderTopIsTransparent() const { return surround->border.top.isTransparent(); }
1039     unsigned short  borderBottomWidth() const
1040     { if(surround->border.bottom.style == BNONE || surround->border.bottom.style == BHIDDEN) return 0; return surround->border.bottom.width; }
1041     EBorderStyle    borderBottomStyle() const {  return surround->border.bottom.style; }
1042     const QColor &          borderBottomColor() const {  return surround->border.bottom.color; }
1043     bool borderBottomIsTransparent() const { return surround->border.bottom.isTransparent(); }
1044     
1045     unsigned short outlineSize() const { return outlineWidth() + outlineOffset(); }
1046     unsigned short outlineWidth() const { if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline.width; }
1047     EBorderStyle    outlineStyle() const {  return background->outline.style; }
1048     bool outlineStyleIsAuto() const { return background->outline._auto; }
1049     const QColor &          outlineColor() const {  return background->outline.color; }
1050
1051     EOverflow overflow() const { return  noninherited_flags._overflow; }
1052     EVisibility visibility() const { return inherited_flags._visibility; }
1053     EVerticalAlign verticalAlign() const { return  noninherited_flags._vertical_align; }
1054     Length verticalAlignLength() const { return box->vertical_align; }
1055
1056     Length clipLeft() const { return visual->clip.left; }
1057     Length clipRight() const { return visual->clip.right; }
1058     Length clipTop() const { return visual->clip.top; }
1059     Length clipBottom() const { return visual->clip.bottom; }
1060     LengthBox clip() const { return visual->clip; }
1061     bool hasClip() const { return visual->hasClip; }
1062     
1063     EUnicodeBidi unicodeBidi() const { return noninherited_flags._unicodeBidi; }
1064
1065     EClear clear() const { return  noninherited_flags._clear; }
1066     ETableLayout tableLayout() const { return  noninherited_flags._table_layout; }
1067
1068     short colSpan() const { return visual->colspan; }
1069
1070     const QFont & font() const { return inherited->font.f; }
1071     // use with care. call font->update() after modifications
1072     const Font &htmlFont() { return inherited->font; }
1073     const QFontMetrics & fontMetrics() const { return inherited->font.fm; }
1074
1075     const QColor & color() const { return inherited->color; }
1076     Length textIndent() const { return inherited->indent; }
1077     ETextAlign textAlign() const { return inherited_flags._text_align; }
1078     ETextTransform textTransform() const { return inherited_flags._text_transform; }
1079     int textDecorationsInEffect() const { return inherited_flags._text_decorations; }
1080     int textDecoration() const { return visual->textDecoration; }
1081     int wordSpacing() const { return inherited->font.wordSpacing; }
1082     int letterSpacing() const { return inherited->font.letterSpacing; }
1083
1084     EDirection direction() const { return inherited_flags._direction; }
1085     Length lineHeight() const { return inherited->line_height; }
1086
1087     EWhiteSpace whiteSpace() const { return inherited_flags._white_space; }
1088
1089
1090     const QColor & backgroundColor() const { return background->color; }
1091     CachedImage *backgroundImage() const { return background->image; }
1092     EBackgroundRepeat backgroundRepeat() const { return  noninherited_flags._bg_repeat; }
1093     bool backgroundAttachment() const { return  noninherited_flags._bg_attachment; }
1094     Length backgroundXPosition() const { return background->x_position; }
1095     Length backgroundYPosition() const { return background->y_position; }
1096
1097     // returns true for collapsing borders, false for separate borders
1098     bool borderCollapse() const { return inherited_flags._border_collapse; }
1099     short horizontalBorderSpacing() const { return inherited->horizontal_border_spacing; }
1100     short verticalBorderSpacing() const { return inherited->vertical_border_spacing; }
1101     EEmptyCell emptyCells() const { return inherited_flags._empty_cells; }
1102     ECaptionSide captionSide() const { return inherited_flags._caption_side; }
1103
1104     short counterIncrement() const { return visual->counter_increment; }
1105     short counterReset() const { return visual->counter_reset; }
1106
1107     EListStyleType listStyleType() const { return inherited_flags._list_style_type; }
1108     CachedImage *listStyleImage() const { return inherited->style_image; }
1109     EListStylePosition listStylePosition() const { return inherited_flags._list_style_position; }
1110
1111     Length marginTop() const { return surround->margin.top; }
1112     Length marginBottom() const {  return surround->margin.bottom; }
1113     Length marginLeft() const {  return surround->margin.left; }
1114     Length marginRight() const {  return surround->margin.right; }
1115
1116     Length paddingTop() const {  return surround->padding.top; }
1117     Length paddingBottom() const {  return surround->padding.bottom; }
1118     Length paddingLeft() const { return surround->padding.left; }
1119     Length paddingRight() const {  return surround->padding.right; }
1120
1121     ECursor cursor() const { return inherited_flags._cursor_style; }
1122     
1123     CachedImage *cursorImage() const { return inherited->cursor_image; }
1124
1125     short widows() const { return inherited->widows; }
1126     short orphans() const { return inherited->orphans; }
1127     EPageBreak pageBreakInside() const { return inherited->page_break_inside; }
1128     EPageBreak pageBreakBefore() const { return noninherited_flags._page_break_before; }
1129     EPageBreak pageBreakAfter() const { return noninherited_flags._page_break_after; }
1130     
1131     // CSS3 Getter Methods
1132 #ifndef KHTML_NO_XBL
1133     BindingURI* bindingURIs() const { return css3NonInheritedData->bindingURI; }
1134 #endif
1135     int outlineOffset() const { 
1136         if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline._offset;
1137     }
1138     ShadowData* textShadow() const { return css3InheritedData->textShadow; }
1139     float opacity() const { return css3NonInheritedData->opacity; }
1140     EBoxAlignment boxAlign() const { return css3NonInheritedData->flexibleBox->align; }
1141     EBoxDirection boxDirection() const { return inherited_flags._box_direction; }
1142     float boxFlex() { return css3NonInheritedData->flexibleBox->flex; }
1143     unsigned int boxFlexGroup() const { return css3NonInheritedData->flexibleBox->flex_group; }
1144     EBoxLines boxLines() { return css3NonInheritedData->flexibleBox->lines; }
1145     unsigned int boxOrdinalGroup() const { return css3NonInheritedData->flexibleBox->ordinal_group; }
1146     EBoxOrient boxOrient() const { return css3NonInheritedData->flexibleBox->orient; }
1147     EBoxAlignment boxPack() const { return css3NonInheritedData->flexibleBox->pack; }
1148     Length marqueeIncrement() const { return css3NonInheritedData->marquee->increment; }
1149     int marqueeSpeed() const { return css3NonInheritedData->marquee->speed; }
1150     int marqueeLoopCount() const { return css3NonInheritedData->marquee->loops; }
1151     EMarqueeBehavior marqueeBehavior() const { return css3NonInheritedData->marquee->behavior; }
1152     EMarqueeDirection marqueeDirection() const { return css3NonInheritedData->marquee->direction; }
1153     EUserModify userModify() const { return css3InheritedData->userModify; }
1154     EUserDrag userDrag() const { return css3NonInheritedData->userDrag; }
1155     EUserSelect userSelect() const { return css3NonInheritedData->userSelect; }
1156     bool textOverflow() const { return css3NonInheritedData->textOverflow; }
1157     EMarginCollapse marginTopCollapse() const { return css3NonInheritedData->marginTopCollapse; }
1158     EMarginCollapse marginBottomCollapse() const { return css3NonInheritedData->marginBottomCollapse; }
1159     EWordWrap wordWrap() const { return css3InheritedData->wordWrap; }
1160     ENBSPMode nbspMode() const { return css3InheritedData->nbspMode; }
1161     EKHTMLLineBreak khtmlLineBreak() const { return css3InheritedData->khtmlLineBreak; }
1162     // End CSS3 Getters
1163
1164 #if APPLE_CHANGES
1165     // Apple-specific property getter methods
1166     int lineClamp() const { return css3NonInheritedData->lineClamp; }
1167     bool textSizeAdjust() const { return css3InheritedData->textSizeAdjust; }
1168 #endif
1169
1170 // attribute setter methods
1171
1172     void setDisplay(EDisplay v) {  noninherited_flags._effectiveDisplay = v; }
1173     void setOriginalDisplay(EDisplay v) {  noninherited_flags._originalDisplay = v; }
1174     void setPosition(EPosition v) {  noninherited_flags._position = v; }
1175     void setFloating(EFloat v) {  noninherited_flags._floating = v; }
1176
1177     void setLeft(Length v)  {  SET_VAR(surround,offset.left,v) }
1178     void setRight(Length v) {  SET_VAR(surround,offset.right,v) }
1179     void setTop(Length v)   {  SET_VAR(surround,offset.top,v) }
1180     void setBottom(Length v){  SET_VAR(surround,offset.bottom,v) }
1181
1182     void setWidth(Length v)  { SET_VAR(box,width,v) }
1183     void setHeight(Length v) { SET_VAR(box,height,v) }
1184
1185     void setMinWidth(Length v)  { SET_VAR(box,min_width,v) }
1186     void setMaxWidth(Length v)  { SET_VAR(box,max_width,v) }
1187     void setMinHeight(Length v) { SET_VAR(box,min_height,v) }
1188     void setMaxHeight(Length v) { SET_VAR(box,max_height,v) }
1189
1190 #if APPLE_CHANGES
1191     QValueList<StyleDashboardRegion> dashboardRegions() const { return css3NonInheritedData->m_dashboardRegions; }
1192     void setDashboardRegions(QValueList<StyleDashboardRegion> regions) { SET_VAR(css3NonInheritedData,m_dashboardRegions,regions); }
1193     void setDashboardRegion (int type, QString label, Length t, Length r, Length b, Length l, bool append) {
1194         StyleDashboardRegion region;
1195         region.label = label;
1196         region.offset.top  = t;
1197         region.offset.right = r;
1198         region.offset.bottom = b;
1199         region.offset.left = l;
1200         region.type = type;
1201         if (!append) {
1202             css3NonInheritedData.access()->m_dashboardRegions.clear ();
1203         }
1204         css3NonInheritedData.access()->m_dashboardRegions.append (region);
1205     }
1206 #endif
1207
1208     void resetBorderTop() { SET_VAR(surround, border.top, BorderValue()) }
1209     void resetBorderRight() { SET_VAR(surround, border.right, BorderValue()) }
1210     void resetBorderBottom() { SET_VAR(surround, border.bottom, BorderValue()) }
1211     void resetBorderLeft() { SET_VAR(surround, border.left, BorderValue()) }
1212     void resetOutline() { SET_VAR(background, outline, OutlineValue()) }
1213     
1214     void setBorderLeftWidth(unsigned short v)   {  SET_VAR(surround,border.left.width,v) }
1215     void setBorderLeftStyle(EBorderStyle v)     {  SET_VAR(surround,border.left.style,v) }
1216     void setBorderLeftColor(const QColor & v)   {  SET_VAR(surround,border.left.color,v) }
1217     void setBorderRightWidth(unsigned short v)  {  SET_VAR(surround,border.right.width,v) }
1218     void setBorderRightStyle(EBorderStyle v)    {  SET_VAR(surround,border.right.style,v) }
1219     void setBorderRightColor(const QColor & v)  {  SET_VAR(surround,border.right.color,v) }
1220     void setBorderTopWidth(unsigned short v)    {  SET_VAR(surround,border.top.width,v) }
1221     void setBorderTopStyle(EBorderStyle v)      {  SET_VAR(surround,border.top.style,v) }
1222     void setBorderTopColor(const QColor & v)    {  SET_VAR(surround,border.top.color,v) }    
1223     void setBorderBottomWidth(unsigned short v) {  SET_VAR(surround,border.bottom.width,v) }
1224     void setBorderBottomStyle(EBorderStyle v)   {  SET_VAR(surround,border.bottom.style,v) }
1225     void setBorderBottomColor(const QColor & v) {  SET_VAR(surround,border.bottom.color,v) }
1226     void setOutlineWidth(unsigned short v) {  SET_VAR(background,outline.width,v) }
1227     void setOutlineStyle(EBorderStyle v, bool isAuto = false)   
1228     {  
1229         SET_VAR(background,outline.style,v)
1230         SET_VAR(background,outline._auto, isAuto)
1231     }
1232     void setOutlineColor(const QColor & v) {  SET_VAR(background,outline.color,v) }
1233
1234     void setOverflow(EOverflow v) {  noninherited_flags._overflow = v; }
1235     void setVisibility(EVisibility v) { inherited_flags._visibility = v; }
1236     void setVerticalAlign(EVerticalAlign v) { noninherited_flags._vertical_align = v; }
1237     void setVerticalAlignLength(Length l) { SET_VAR(box, vertical_align, l ) }
1238
1239     void setHasClip(bool b = true) { SET_VAR(visual,hasClip,b) }
1240     void setClipLeft(Length v) { SET_VAR(visual,clip.left,v) }
1241     void setClipRight(Length v) { SET_VAR(visual,clip.right,v) }
1242     void setClipTop(Length v) { SET_VAR(visual,clip.top,v) }
1243     void setClipBottom(Length v) { SET_VAR(visual,clip.bottom,v) }
1244     void setClip( Length top, Length right, Length bottom, Length left );
1245     
1246     void setUnicodeBidi( EUnicodeBidi b ) { noninherited_flags._unicodeBidi = b; }
1247
1248     void setClear(EClear v) {  noninherited_flags._clear = v; }
1249     void setTableLayout(ETableLayout v) {  noninherited_flags._table_layout = v; }
1250     void ssetColSpan(short v) { SET_VAR(visual,colspan,v) }
1251
1252     bool setFontDef(const khtml::FontDef & v) {
1253         // bah, this doesn't compare pointers. broken! (Dirk)
1254         if (!(inherited->font.fontDef == v)) {
1255             inherited.access()->font = Font( v, inherited->font.letterSpacing, inherited->font.wordSpacing );
1256             return true;
1257         }
1258         return false;
1259     }
1260
1261     void setColor(const QColor & v) { SET_VAR(inherited,color,v) }
1262     void setTextIndent(Length v) { SET_VAR(inherited,indent,v) }
1263     void setTextAlign(ETextAlign v) { inherited_flags._text_align = v; }
1264     void setTextTransform(ETextTransform v) { inherited_flags._text_transform = v; }
1265     void addToTextDecorationsInEffect(int v) { inherited_flags._text_decorations |= v; }
1266     void setTextDecorationsInEffect(int v) { inherited_flags._text_decorations = v; }
1267     void setTextDecoration(int v) { SET_VAR(visual, textDecoration, v); }
1268     void setDirection(EDirection v) { inherited_flags._direction = v; }
1269     void setLineHeight(Length v) { SET_VAR(inherited,line_height,v) }
1270
1271     void setWhiteSpace(EWhiteSpace v) { inherited_flags._white_space = v; }
1272
1273     void setWordSpacing(int v) { SET_VAR(inherited,font.wordSpacing,v) }
1274     void setLetterSpacing(int v) { SET_VAR(inherited,font.letterSpacing,v) }
1275
1276     void setBackgroundColor(const QColor & v) {  SET_VAR(background,color,v) }
1277     void setBackgroundImage(CachedImage *v) {  SET_VAR(background,image,v) }
1278     void setBackgroundRepeat(EBackgroundRepeat v) {  noninherited_flags._bg_repeat = v; }
1279     void setBackgroundAttachment(bool scroll) {  noninherited_flags._bg_attachment = scroll; }
1280     void setBackgroundXPosition(Length v) {  SET_VAR(background,x_position,v) }
1281     void setBackgroundYPosition(Length v) {  SET_VAR(background,y_position,v) }
1282
1283     void setBorderCollapse(bool collapse) { inherited_flags._border_collapse = collapse; }
1284     void setHorizontalBorderSpacing(short v) { SET_VAR(inherited,horizontal_border_spacing,v) }
1285     void setVerticalBorderSpacing(short v) { SET_VAR(inherited,vertical_border_spacing,v) }
1286     void setEmptyCells(EEmptyCell v) { inherited_flags._empty_cells = v; }
1287     void setCaptionSide(ECaptionSide v) { inherited_flags._caption_side = v; }
1288
1289
1290     void setCounterIncrement(short v) {  SET_VAR(visual,counter_increment,v) }
1291     void setCounterReset(short v) {  SET_VAR(visual,counter_reset,v) }
1292
1293     void setListStyleType(EListStyleType v) { inherited_flags._list_style_type = v; }
1294     void setListStyleImage(CachedImage *v) {  SET_VAR(inherited,style_image,v)}
1295     void setListStylePosition(EListStylePosition v) { inherited_flags._list_style_position = v; }
1296
1297     void resetMargin() { SET_VAR(surround, margin, LengthBox(Fixed)) }
1298     void setMarginTop(Length v)     {  SET_VAR(surround,margin.top,v) }
1299     void setMarginBottom(Length v)  {  SET_VAR(surround,margin.bottom,v) }
1300     void setMarginLeft(Length v)    {  SET_VAR(surround,margin.left,v) }
1301     void setMarginRight(Length v)   {  SET_VAR(surround,margin.right,v) }
1302
1303     void resetPadding() { SET_VAR(surround, padding, LengthBox(Variable)) }
1304     void setPaddingTop(Length v)    {  SET_VAR(surround,padding.top,v) }
1305     void setPaddingBottom(Length v) {  SET_VAR(surround,padding.bottom,v) }
1306     void setPaddingLeft(Length v)   {  SET_VAR(surround,padding.left,v) }
1307     void setPaddingRight(Length v)  {  SET_VAR(surround,padding.right,v) }
1308
1309     void setCursor( ECursor c ) { inherited_flags._cursor_style = c; }
1310     void setCursorImage( CachedImage *v ) { SET_VAR(inherited,cursor_image,v) }
1311
1312     bool shouldCorrectTextColor() const { return inherited_flags._should_correct_text_color; }
1313     void setShouldCorrectTextColor(bool b=true) { inherited_flags._should_correct_text_color = b; }
1314
1315     bool htmlHacks() const { return inherited_flags._htmlHacks; }
1316     void setHtmlHacks(bool b=true) { inherited_flags._htmlHacks = b; }
1317
1318     bool hasAutoZIndex() { return box->z_auto; }
1319     void setHasAutoZIndex() { SET_VAR(box, z_auto, true); SET_VAR(box, z_index, 0) }
1320     int zIndex() const { return box->z_index; }
1321     void setZIndex(int v) { SET_VAR(box, z_auto, false); SET_VAR(box, z_index, v) }
1322
1323     void setWidows(short w) { SET_VAR(inherited, widows, w); }
1324     void setOrphans(short o) { SET_VAR(inherited, orphans, o); }
1325     void setPageBreakInside(EPageBreak b) { SET_VAR(inherited, page_break_inside, b); }
1326     void setPageBreakBefore(EPageBreak b) { noninherited_flags._page_break_before = b; }
1327     void setPageBreakAfter(EPageBreak b) { noninherited_flags._page_break_after = b; }
1328     
1329     // CSS3 Setters
1330 #ifndef KHTML_NO_XBL
1331     void deleteBindingURIs() { 
1332         delete css3NonInheritedData->bindingURI; 
1333         SET_VAR(css3NonInheritedData, bindingURI, 0);
1334     }
1335     void inheritBindingURIs(BindingURI* other) {
1336         SET_VAR(css3NonInheritedData, bindingURI, other->copy());
1337     }
1338     void addBindingURI(DOM::DOMStringImpl* uri);
1339 #endif
1340     void setOutlineOffset(unsigned short v) {  SET_VAR(background,outline._offset,v) }
1341     void setTextShadow(ShadowData* val, bool add=false);
1342     void setOpacity(float f) { SET_VAR(css3NonInheritedData, opacity, f); }
1343     void setBoxAlign(EBoxAlignment a) { SET_VAR(css3NonInheritedData.access()->flexibleBox, align, a); }
1344     void setBoxDirection(EBoxDirection d) { inherited_flags._box_direction = d; }
1345     void setBoxFlex(float f) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex, f); }
1346     void setBoxFlexGroup(unsigned int fg) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex_group, fg); }
1347     void setBoxLines(EBoxLines l) { SET_VAR(css3NonInheritedData.access()->flexibleBox, lines, l); }
1348     void setBoxOrdinalGroup(unsigned int og) { SET_VAR(css3NonInheritedData.access()->flexibleBox, ordinal_group, og); }
1349     void setBoxOrient(EBoxOrient o) { SET_VAR(css3NonInheritedData.access()->flexibleBox, orient, o); }
1350     void setBoxPack(EBoxAlignment p) { SET_VAR(css3NonInheritedData.access()->flexibleBox, pack, p); }
1351     void setMarqueeIncrement(const Length& f) { SET_VAR(css3NonInheritedData.access()->marquee, increment, f); }
1352     void setMarqueeSpeed(int f) { SET_VAR(css3NonInheritedData.access()->marquee, speed, f); }
1353     void setMarqueeDirection(EMarqueeDirection d) { SET_VAR(css3NonInheritedData.access()->marquee, direction, d); }
1354     void setMarqueeBehavior(EMarqueeBehavior b) { SET_VAR(css3NonInheritedData.access()->marquee, behavior, b); }
1355     void setMarqueeLoopCount(int i) { SET_VAR(css3NonInheritedData.access()->marquee, loops, i); }
1356     void setUserModify(EUserModify u) { SET_VAR(css3InheritedData, userModify, u); }
1357     void setUserDrag(EUserDrag d) { SET_VAR(css3NonInheritedData, userDrag, d); }
1358     void setUserSelect(EUserSelect s) { SET_VAR(css3NonInheritedData, userSelect, s); }
1359     void setTextOverflow(bool b) { SET_VAR(css3NonInheritedData, textOverflow, b); }
1360     void setMarginTopCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginTopCollapse, c); }
1361     void setMarginBottomCollapse(EMarginCollapse c) { SET_VAR(css3NonInheritedData, marginBottomCollapse, c); }
1362     void setWordWrap(EWordWrap b) { SET_VAR(css3InheritedData, wordWrap, b); }
1363     void setNBSPMode(ENBSPMode b) { SET_VAR(css3InheritedData, nbspMode, b); }
1364     void setKHTMLLineBreak(EKHTMLLineBreak b) { SET_VAR(css3InheritedData, khtmlLineBreak, b); }
1365     // End CSS3 Setters
1366    
1367 #if APPLE_CHANGES
1368     // Apple-specific property setters
1369     void setLineClamp(int c) { SET_VAR(css3NonInheritedData, lineClamp, c); }
1370     void setTextSizeAdjust(bool b) { SET_VAR(css3InheritedData, textSizeAdjust, b); }
1371 #endif
1372
1373     QPalette palette() const { return visual->palette; }
1374     void setPaletteColor(QPalette::ColorGroup g, QColorGroup::ColorRole r, const QColor& c);
1375     void resetPalette() // Called when the desktop color scheme changes.
1376     {
1377         const_cast<StyleVisualData *>(visual.get())->palette = QApplication::palette();
1378     }
1379
1380     ContentData* contentData() { return content; }
1381     bool contentDataEquivalent(RenderStyle* otherStyle);
1382     void setContent(DOM::DOMStringImpl* s, bool add = false);
1383     void setContent(CachedObject* o, bool add = false);
1384
1385     bool inheritedNotEqual( RenderStyle *other ) const;
1386
1387     // The difference between two styles.  The following values are used:
1388     // (1) Equal - The two styles are identical
1389     // (2) Repaint - The object just needs to be repainted.
1390     // (3) RepaintLayer - The layer and its descendant layers needs to be repainted.
1391     // (4) Layout - A layout is required.
1392     enum Diff { Equal, Repaint, RepaintLayer, Layout };
1393     Diff diff( const RenderStyle *other ) const;
1394
1395     bool isDisplayReplacedType() {
1396         return display() == INLINE_BLOCK || display() == INLINE_BOX || display() == INLINE_TABLE;
1397     }
1398     bool isDisplayInlineType() {
1399         return display() == INLINE || isDisplayReplacedType();
1400     }
1401     bool isOriginalDisplayInlineType() {
1402         return originalDisplay() == INLINE || originalDisplay() == INLINE_BLOCK ||
1403                originalDisplay() == INLINE_BOX || originalDisplay() == INLINE_TABLE;
1404     }
1405     
1406     // To obtain at any time the pseudo state for a given link.
1407     PseudoState pseudoState() const { return m_pseudoState; }
1408     void setPseudoState(PseudoState s) { m_pseudoState = s; }
1409     
1410     // To tell if this style matched attribute selectors. This makes it impossible to share.
1411     bool affectedByAttributeSelectors() const { return m_affectedByAttributeSelectors; }
1412     void setAffectedByAttributeSelectors() { m_affectedByAttributeSelectors = true; }
1413
1414     // Initial values for all the properties
1415     static bool initialBackgroundAttachment() { return true; }
1416     static EBackgroundRepeat initialBackgroundRepeat() { return REPEAT; }
1417     static bool initialBorderCollapse() { return false; }
1418     static EBorderStyle initialBorderStyle() { return BNONE; }
1419     static ECaptionSide initialCaptionSide() { return CAPTOP; }
1420     static EClear initialClear() { return CNONE; }
1421     static EDirection initialDirection() { return LTR; }
1422     static EDisplay initialDisplay() { return INLINE; }
1423     static EEmptyCell initialEmptyCells() { return SHOW; }
1424     static EFloat initialFloating() { return FNONE; }
1425     static EListStylePosition initialListStylePosition() { return OUTSIDE; }
1426     static EListStyleType initialListStyleType() { return DISC; }
1427     static EOverflow initialOverflow() { return OVISIBLE; }
1428     static EPageBreak initialPageBreak() { return PBAUTO; }
1429     static EPosition initialPosition() { return STATIC; }
1430     static ETableLayout initialTableLayout() { return TAUTO; }
1431     static EUnicodeBidi initialUnicodeBidi() { return UBNormal; }
1432     static ETextTransform initialTextTransform() { return TTNONE; }
1433     static EVisibility initialVisibility() { return VISIBLE; }
1434     static EWhiteSpace initialWhiteSpace() { return NORMAL; }
1435     static Length initialBackgroundXPosition() { return Length(); }
1436     static Length initialBackgroundYPosition() { return Length(); }
1437     static short initialHorizontalBorderSpacing() { return 0; }
1438     static short initialVerticalBorderSpacing() { return 0; }
1439     static ECursor initialCursor() { return CURSOR_AUTO; }
1440     static QColor initialColor() { return Qt::black; }
1441     static CachedImage* initialBackgroundImage() { return 0; }
1442     static CachedImage* initialListStyleImage() { return 0; }
1443     static unsigned short initialBorderWidth() { return 3; }
1444     static int initialLetterWordSpacing() { return 0; }
1445     static Length initialSize() { return Length(); }
1446     static Length initialMinSize() { return Length(0, Fixed); }
1447     static Length initialMaxSize() { return Length(UNDEFINED, Fixed); }
1448     static Length initialOffset() { return Length(); }
1449     static Length initialMargin() { return Length(Fixed); }
1450     static Length initialPadding() { return Length(Variable); }
1451     static Length initialTextIndent() { return Length(Fixed); }
1452     static EVerticalAlign initialVerticalAlign() { return BASELINE; }
1453     static int initialWidows() { return 2; }
1454     static int initialOrphans() { return 2; }
1455     static Length initialLineHeight() { return Length(-100, Percent); }
1456     static ETextAlign initialTextAlign() { return TAAUTO; }
1457     static ETextDecoration initialTextDecoration() { return TDNONE; }
1458     static int initialOutlineOffset() { return 0; }
1459     static float initialOpacity() { return 1.0f; }
1460     static EBoxAlignment initialBoxAlign() { return BSTRETCH; }
1461     static EBoxDirection initialBoxDirection() { return BNORMAL; }
1462     static EBoxLines initialBoxLines() { return SINGLE; }
1463     static EBoxOrient initialBoxOrient() { return HORIZONTAL; }
1464     static EBoxAlignment initialBoxPack() { return BSTART; }
1465     static float initialBoxFlex() { return 0.0f; }
1466     static int initialBoxFlexGroup() { return 1; }
1467     static int initialBoxOrdinalGroup() { return 1; }
1468     static int initialMarqueeLoopCount() { return -1; }
1469     static int initialMarqueeSpeed() { return 85; }
1470     static Length initialMarqueeIncrement() { return Length(6, Fixed); }
1471     static EMarqueeBehavior initialMarqueeBehavior() { return MSCROLL; }
1472     static EMarqueeDirection initialMarqueeDirection() { return MAUTO; }
1473     static EUserModify initialUserModify() { return READ_ONLY; }
1474     static EUserDrag initialUserDrag() { return DRAG_AUTO; }
1475     static EUserSelect initialUserSelect() { return SELECT_AUTO; }
1476     static bool initialTextOverflow() { return false; }
1477     static EMarginCollapse initialMarginTopCollapse() { return MCOLLAPSE; }
1478     static EMarginCollapse initialMarginBottomCollapse() { return MCOLLAPSE; }
1479     static EWordWrap initialWordWrap() { return WBNORMAL; }
1480     static ENBSPMode initialNBSPMode() { return NBNORMAL; }
1481     static EKHTMLLineBreak initialKHTMLLineBreak() { return LBNORMAL; }
1482
1483 #if APPLE_CHANGES
1484     // Keep these at the end.
1485     static int initialLineClamp() { return -1; }
1486     static bool initialTextSizeAdjust() { return true; }
1487     static const QValueList<StyleDashboardRegion>& initialDashboardRegions() { 
1488         static QValueList<StyleDashboardRegion> emptyList;
1489         return emptyList;
1490     }
1491 #endif
1492 };
1493
1494
1495 } // namespace
1496
1497 #endif
1498