Fix for 3678031, implement better flexing for Emerson headers. This involved adding...
[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 : public Shared<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 class StyleSurroundData : public Shared<StyleSurroundData>
288 {
289 public:
290     StyleSurroundData();
291
292     StyleSurroundData(const StyleSurroundData& o );
293     bool operator==(const StyleSurroundData& o) const;
294     bool operator!=(const StyleSurroundData& o) const {
295         return !(*this == o);
296     }
297
298     LengthBox offset;
299     LengthBox margin;
300     LengthBox padding;
301     BorderData border;
302 };
303
304
305 //------------------------------------------------
306 // Box attributes. Not inherited.
307
308 class StyleBoxData : public Shared<StyleBoxData>
309 {
310 public:
311     StyleBoxData();
312
313     StyleBoxData(const StyleBoxData& o );
314
315
316     // copy and assignment
317 //    StyleBoxData(const StyleBoxData &other);
318 //    const StyleBoxData &operator = (const StyleBoxData &other);
319
320     bool operator==(const StyleBoxData& o) const;
321     bool operator!=(const StyleBoxData& o) const {
322         return !(*this == o);
323     }
324
325     Length width;
326     Length height;
327
328     Length min_width;
329     Length max_width;
330
331     Length min_height;
332     Length max_height;
333
334     Length vertical_align;
335
336     int z_index;
337     bool z_auto : 1;
338 };
339
340 //------------------------------------------------
341 // Random visual rendering model attributes. Not inherited.
342
343 enum EOverflow {
344     OVISIBLE, OHIDDEN, OSCROLL, OAUTO, OMARQUEE, OOVERLAY
345 };
346
347 enum EVerticalAlign {
348     BASELINE, MIDDLE, SUB, SUPER, TEXT_TOP,
349     TEXT_BOTTOM, TOP, BOTTOM, BASELINE_MIDDLE, LENGTH
350 };
351
352 enum EClear{
353     CNONE = 0, CLEFT = 1, CRIGHT = 2, CBOTH = 3
354 };
355
356 enum ETableLayout {
357     TAUTO, TFIXED
358 };
359
360 enum EUnicodeBidi {
361     UBNormal, Embed, Override
362 };
363
364 class StyleVisualData : public Shared<StyleVisualData>
365 {
366 public:
367     StyleVisualData();
368
369     ~StyleVisualData();
370
371     StyleVisualData(const StyleVisualData& o );
372
373     bool operator==( const StyleVisualData &o ) const {
374         return ( clip == o.clip &&
375                  hasClip == o.hasClip &&
376                  colspan == o.colspan &&
377                  counter_increment == o.counter_increment &&
378                  counter_reset == o.counter_reset &&
379                  palette == o.palette && textDecoration == o.textDecoration);
380     }
381     bool operator!=( const StyleVisualData &o ) const {
382         return !(*this == o);
383     }
384
385     LengthBox clip;
386     bool hasClip : 1;
387     int textDecoration : 4; // Text decorations defined *only* by this element.
388     
389     short colspan; // for html, not a css2 attribute
390
391     short counter_increment; //ok, so these are not visual mode spesific
392     short counter_reset;     //can't go to inherited, since these are not inherited
393
394     QPalette palette;      //widget styling with IE attributes
395 };
396
397 //------------------------------------------------
398 enum EBackgroundRepeat {
399     REPEAT, REPEAT_X, REPEAT_Y, NO_REPEAT
400 };
401
402
403
404 class StyleBackgroundData : public Shared<StyleBackgroundData>
405 {
406 public:
407     StyleBackgroundData();
408     ~StyleBackgroundData() {}
409     StyleBackgroundData(const StyleBackgroundData& o );
410
411     bool operator==(const StyleBackgroundData& o) const;
412     bool operator!=(const StyleBackgroundData &o) const {
413         return !(*this == o);
414     }
415
416     QColor color;
417     CachedImage *image;
418
419     Length x_position;
420     Length y_position;
421     OutlineValue outline;
422 };
423
424 //------------------------------------------------
425 // CSS3 Marquee Properties
426
427 enum EMarqueeBehavior { MNONE, MSCROLL, MSLIDE, MALTERNATE, MUNFURL };
428 enum EMarqueeDirection { MAUTO = 0, MLEFT = 1, MRIGHT = -1, MUP = 2, MDOWN = -2, MFORWARD = 3, MBACKWARD = -3 };
429
430 class StyleMarqueeData : public Shared<StyleMarqueeData>
431 {
432 public:
433     StyleMarqueeData();
434     StyleMarqueeData(const StyleMarqueeData& o);
435     
436     bool operator==(const StyleMarqueeData& o) const;
437     bool operator!=(const StyleMarqueeData& o) const {
438         return !(*this == o);
439     }
440     
441     Length increment;
442     int speed;
443     
444     int loops; // -1 means infinite.
445     
446     EMarqueeBehavior behavior : 3;
447     EMarqueeDirection direction : 3;
448 };
449     
450 //------------------------------------------------
451 // CSS3 Flexible Box Properties
452
453 enum EBoxAlignment { BSTRETCH, BSTART, BCENTER, BEND, BJUSTIFY, BBASELINE };
454 enum EBoxOrient { HORIZONTAL, VERTICAL };
455 enum EBoxLines { SINGLE, MULTIPLE };
456 enum EBoxDirection { BNORMAL, BREVERSE };
457
458 class StyleFlexibleBoxData : public Shared<StyleFlexibleBoxData>
459 {
460 public:
461     StyleFlexibleBoxData();
462     StyleFlexibleBoxData(const StyleFlexibleBoxData& o);
463
464     bool operator==(const StyleFlexibleBoxData& o) const;
465     bool operator!=(const StyleFlexibleBoxData &o) const {
466         return !(*this == o);
467     }
468
469     float flex;
470     unsigned int flex_group;
471     unsigned int ordinal_group;
472
473     EBoxAlignment align : 3;
474     EBoxAlignment pack: 3;
475     EBoxOrient orient: 1;
476     EBoxLines lines : 1;
477 };
478
479 // This struct holds information about shadows for the text-shadow and box-shadow properties.
480 struct ShadowData {
481     ShadowData(int _x, int _y, int _blur, const QColor& _color)
482     :x(_x), y(_y), blur(_blur), color(_color), next(0) {}
483     ShadowData(const ShadowData& o);
484     
485     ~ShadowData() { delete next; }
486
487     bool operator==(const ShadowData& o) const;
488     bool operator!=(const ShadowData &o) const {
489         return !(*this == o);
490     }
491     
492     int x;
493     int y;
494     int blur;
495     QColor color;
496     ShadowData* next;
497 };
498
499 #ifndef KHTML_NO_XBL
500 struct BindingURI {
501     BindingURI(DOM::DOMStringImpl*);
502     ~BindingURI();
503
504     BindingURI* copy();
505
506     bool operator==(const BindingURI& o) const;
507     bool operator!=(const BindingURI& o) const {
508         return !(*this == o);
509     }
510     
511     BindingURI* next() { return m_next; }
512     void setNext(BindingURI* n) { m_next = n; }
513     
514     DOM::DOMStringImpl* uri() { return m_uri; }
515     
516     BindingURI* m_next;
517     DOM::DOMStringImpl* m_uri;
518 };
519 #endif
520
521 //------------------------------------------------
522 // CSS3 User Modify Properties
523
524 enum EUserModify {
525     READ_ONLY, READ_WRITE
526 };
527
528 // CSS3 User Drag Values
529
530 enum EUserDrag {
531     DRAG_AUTO, DRAG_NONE, DRAG_ELEMENT
532 };
533
534 // This struct is for rarely used non-inherited CSS3 properties.  By grouping them together,
535 // we save space, and only allocate this object when someone actually uses
536 // a non-inherited CSS3 property.
537 class StyleCSS3NonInheritedData : public Shared<StyleCSS3NonInheritedData>
538 {
539 public:
540     StyleCSS3NonInheritedData();
541     ~StyleCSS3NonInheritedData();
542     StyleCSS3NonInheritedData(const StyleCSS3NonInheritedData& o);
543
544 #ifndef KHTML_NO_XBL
545     bool bindingsEquivalent(const StyleCSS3NonInheritedData& o) const;
546 #endif
547
548     bool operator==(const StyleCSS3NonInheritedData& o) const;
549     bool operator!=(const StyleCSS3NonInheritedData &o) const {
550         return !(*this == o);
551     }
552     
553 #if APPLE_CHANGES
554     int lineClamp;         // An Apple extension.  Not really CSS3 but not worth making a new struct over.
555 #endif
556     float opacity;         // Whether or not we're transparent.
557     DataRef<StyleFlexibleBoxData> flexibleBox; // Flexible box properties 
558     DataRef<StyleMarqueeData> marquee; // Marquee properties
559     EUserDrag userDrag : 2; // Whether or not a drag can be initiated by this element.
560     bool userSelect : 1;  // Whether or not the element is selectable.
561
562 #ifndef KHTML_NO_XBL
563     BindingURI* bindingURI; // The XBL binding URI list.
564 #endif
565 };
566
567 // This struct is for rarely used inherited CSS3 properties.  By grouping them together,
568 // we save space, and only allocate this object when someone actually uses
569 // an inherited CSS3 property.
570 class StyleCSS3InheritedData : public Shared<StyleCSS3InheritedData>
571 {
572 public:
573     StyleCSS3InheritedData();
574     ~StyleCSS3InheritedData();
575     StyleCSS3InheritedData(const StyleCSS3InheritedData& o);
576
577     bool operator==(const StyleCSS3InheritedData& o) const;
578     bool operator!=(const StyleCSS3InheritedData &o) const {
579         return !(*this == o);
580     }
581     bool shadowDataEquivalent(const StyleCSS3InheritedData& o) const;
582
583     ShadowData* textShadow;  // Our text shadow information for shadowed text drawing.
584     EUserModify userModify : 2; // Flag used for editing state
585
586 private:
587     StyleCSS3InheritedData &operator=(const StyleCSS3InheritedData &);
588 };
589
590 //------------------------------------------------
591 // Inherited attributes.
592 //
593
594 enum EWhiteSpace {
595     NORMAL, PRE, NOWRAP, KHTML_NOWRAP
596 };
597
598 enum ETextAlign {
599     TAAUTO, LEFT, RIGHT, CENTER, JUSTIFY, KHTML_LEFT, KHTML_RIGHT, KHTML_CENTER
600 };
601
602 enum ETextTransform {
603     CAPITALIZE, UPPERCASE, LOWERCASE, TTNONE
604 };
605
606 enum EDirection {
607     LTR, RTL
608 };
609
610 enum ETextDecoration {
611     TDNONE = 0x0 , UNDERLINE = 0x1, OVERLINE = 0x2, LINE_THROUGH= 0x4, BLINK = 0x8
612 };
613
614 enum EPageBreak {
615     PBAUTO, PBALWAYS, PBAVOID
616 };
617
618 class StyleInheritedData : public Shared<StyleInheritedData>
619 {
620 public:
621     StyleInheritedData();
622     ~StyleInheritedData();
623     StyleInheritedData(const StyleInheritedData& o );
624
625     bool operator==(const StyleInheritedData& o) const;
626     bool operator != ( const StyleInheritedData &o ) const {
627         return !(*this == o);
628     }
629
630     Length indent;
631     // could be packed in a short but doesn't
632     // make a difference currently because of padding
633     Length line_height;
634
635     CachedImage *style_image;
636     CachedImage *cursor_image;
637
638     khtml::Font font;
639     QColor color;
640     
641     short horizontal_border_spacing;
642     short vertical_border_spacing;
643     
644     // Paged media properties.
645     short widows;
646     short orphans;
647     EPageBreak page_break_inside : 2;
648 };
649
650
651 enum EEmptyCell {
652     SHOW, HIDE
653 };
654
655 enum ECaptionSide
656 {
657     CAPTOP, CAPBOTTOM, CAPLEFT, CAPRIGHT
658 };
659
660
661 enum EListStyleType {
662      DISC, CIRCLE, SQUARE, LDECIMAL, DECIMAL_LEADING_ZERO,
663      LOWER_ROMAN, UPPER_ROMAN, LOWER_GREEK,
664      LOWER_ALPHA, LOWER_LATIN, UPPER_ALPHA, UPPER_LATIN,
665      HEBREW, ARMENIAN, GEORGIAN, CJK_IDEOGRAPHIC,
666      HIRAGANA, KATAKANA, HIRAGANA_IROHA, KATAKANA_IROHA, LNONE
667 };
668
669 enum EListStylePosition { OUTSIDE, INSIDE };
670
671 enum EVisibility { VISIBLE, HIDDEN, COLLAPSE };
672
673 enum ECursor {
674     CURSOR_AUTO, CURSOR_CROSS, CURSOR_DEFAULT, CURSOR_POINTER, CURSOR_MOVE,
675     CURSOR_E_RESIZE, CURSOR_NE_RESIZE, CURSOR_NW_RESIZE, CURSOR_N_RESIZE, CURSOR_SE_RESIZE, CURSOR_SW_RESIZE,
676     CURSOR_S_RESIZE, CURSOR_W_RESIZE, CURSOR_TEXT, CURSOR_WAIT, CURSOR_HELP
677 };
678
679 enum ContentType {
680     CONTENT_NONE, CONTENT_OBJECT, CONTENT_TEXT, CONTENT_COUNTER
681 };
682
683 struct ContentData {
684     ContentData() :_contentType(CONTENT_NONE), _nextContent(0) {}
685     ~ContentData();
686     void clearContent();
687
688     ContentType contentType() { return _contentType; }
689
690     DOM::DOMStringImpl* contentText() { if (contentType() == CONTENT_TEXT) return _content.text; return 0; }
691     CachedObject* contentObject() { if (contentType() == CONTENT_OBJECT) return _content.object; return 0; }
692     
693     ContentType _contentType;
694
695     union {
696         CachedObject* object;
697         DOM::DOMStringImpl* text;
698         // counters...
699     } _content ;
700
701     ContentData* _nextContent;
702 };
703
704 //------------------------------------------------
705
706 enum EDisplay {
707     INLINE, BLOCK, LIST_ITEM, RUN_IN, COMPACT, INLINE_BLOCK,
708     TABLE, INLINE_TABLE, TABLE_ROW_GROUP,
709     TABLE_HEADER_GROUP, TABLE_FOOTER_GROUP, TABLE_ROW,
710     TABLE_COLUMN_GROUP, TABLE_COLUMN, TABLE_CELL,
711     TABLE_CAPTION, BOX, INLINE_BOX, NONE
712 };
713
714 class RenderStyle
715 {
716     friend class CSSStyleSelector;
717 public:
718     static void cleanup();
719
720     // static pseudo styles. Dynamic ones are produced on the fly.
721     enum PseudoId { NOPSEUDO, FIRST_LINE, FIRST_LETTER, BEFORE, AFTER, SELECTION, FIRST_LINE_INHERITED };
722
723     void ref() { m_ref++;  }
724     void deref(RenderArena* arena) { 
725         if (m_ref) m_ref--; 
726         if (!m_ref)
727             arenaDelete(arena);
728     }
729     bool hasOneRef() { return m_ref==1; }
730     int refCount() const { return m_ref; }
731     
732     // Overloaded new operator.  Derived classes must override operator new
733     // in order to allocate out of the RenderArena.
734     void* operator new(size_t sz, RenderArena* renderArena) throw();    
735     
736     // Overridden to prevent the normal delete from being called.
737     void operator delete(void* ptr, size_t sz);
738     
739 private:
740     void arenaDelete(RenderArena *arena);
741
742 protected:
743
744 // !START SYNC!: Keep this in sync with the copy constructor in render_style.cpp
745
746     // inherit
747     struct InheritedFlags {
748         bool operator==( const InheritedFlags &other ) const {
749             return (_empty_cells == other._empty_cells) &&
750                    (_caption_side == other._caption_side) &&
751                    (_list_style_type == other._list_style_type) &&
752                    (_list_style_position == other._list_style_position) &&
753                    (_visibility == other._visibility) &&
754                    (_text_align == other._text_align) &&
755                    (_text_transform == other._text_transform) &&
756                    (_text_decorations == other._text_decorations) &&
757                    (_text_transform == other._text_transform) &&
758                    (_cursor_style == other._cursor_style) &&
759                    (_direction == other._direction) &&
760                    (_border_collapse == other._border_collapse) &&
761                    (_white_space == other._white_space) &&
762                    (_box_direction == other._box_direction) &&
763                    (_visuallyOrdered == other._visuallyOrdered) &&
764                    (_htmlHacks == other._htmlHacks) &&
765                    (_should_correct_text_color == other._should_correct_text_color);
766         }
767         
768         bool operator!=( const InheritedFlags &other ) const {
769             return !(*this == other);
770         }
771
772         EEmptyCell _empty_cells : 1 ;
773         ECaptionSide _caption_side : 2;
774         EListStyleType _list_style_type : 5 ;
775         EListStylePosition _list_style_position :1;
776         EVisibility _visibility : 2;
777         ETextAlign _text_align : 4;
778         ETextTransform _text_transform : 2;
779         int _text_decorations : 4;
780         ECursor _cursor_style : 4;
781         EDirection _direction : 1;
782         bool _border_collapse : 1 ;
783         EWhiteSpace _white_space : 2;
784         EBoxDirection _box_direction : 1; // CSS3 box_direction property (flexible box layout module)
785               // non CSS2 inherited
786               bool _visuallyOrdered : 1;
787               bool _htmlHacks :1;
788               bool _should_correct_text_color : 1;
789     } inherited_flags;
790
791 // don't inherit
792     struct NonInheritedFlags {
793         bool operator==( const NonInheritedFlags &other ) const {
794             return (_effectiveDisplay == other._effectiveDisplay) &&
795             (_originalDisplay == other._originalDisplay) &&
796             (_bg_repeat == other._bg_repeat) &&
797             (_overflow == other._overflow) &&
798             (_vertical_align == other._vertical_align) &&
799             (_clear == other._clear) &&
800             (_position == other._position) &&
801             (_floating == other._floating) &&
802             (_table_layout == other._table_layout) &&
803             (_page_break_before == other._page_break_before) &&
804             (_page_break_after == other._page_break_after) &&
805             (_styleType == other._styleType) &&
806             (_affectedByHover == other._affectedByHover) &&
807             (_affectedByActive == other._affectedByActive) &&
808             (_pseudoBits == other._pseudoBits) &&
809             (_unicodeBidi == other._unicodeBidi);
810         }
811
812         bool operator!=( const NonInheritedFlags &other ) const {
813             return !(*this == other);
814         }
815         
816         EDisplay _effectiveDisplay : 5;
817         EDisplay _originalDisplay : 5;
818         EBackgroundRepeat _bg_repeat : 2;
819         bool _bg_attachment : 1;
820         EOverflow _overflow : 4 ;
821         EVerticalAlign _vertical_align : 4;
822         EClear _clear : 2;
823         EPosition _position : 2;
824         EFloat _floating : 2;
825         ETableLayout _table_layout : 1;
826         
827         EPageBreak _page_break_before : 2;
828         EPageBreak _page_break_after : 2;
829
830         PseudoId _styleType : 3;
831         bool _affectedByHover : 1;
832         bool _affectedByActive : 1;
833         int _pseudoBits : 6;
834         EUnicodeBidi _unicodeBidi : 2;
835     } noninherited_flags;
836
837 // non-inherited attributes
838     DataRef<StyleBoxData> box;
839     DataRef<StyleVisualData> visual;
840     DataRef<StyleBackgroundData> background;
841     DataRef<StyleSurroundData> surround;
842     DataRef<StyleCSS3NonInheritedData> css3NonInheritedData;
843     
844 // inherited attributes
845     DataRef<StyleCSS3InheritedData> css3InheritedData;
846     DataRef<StyleInheritedData> inherited;
847     
848 // list of associated pseudo styles
849     RenderStyle* pseudoStyle;
850     
851     // added this here, so we can get rid of the vptr in this class.
852     // makes up for the same size.
853     ContentData *content;
854
855     PseudoState m_pseudoState : 3;
856     bool m_affectedByAttributeSelectors : 1;
857     
858     int m_ref;
859     
860 // !END SYNC!
861
862 // static default style
863     static RenderStyle* _default;
864
865 protected:
866     void setBitDefaults()
867     {
868         inherited_flags._empty_cells = initialEmptyCells();
869         inherited_flags._caption_side = initialCaptionSide();
870         inherited_flags._list_style_type = initialListStyleType();
871         inherited_flags._list_style_position = initialListStylePosition();
872         inherited_flags._visibility = initialVisibility();
873         inherited_flags._text_align = initialTextAlign();
874         inherited_flags._text_transform = initialTextTransform();
875         inherited_flags._text_decorations = initialTextDecoration();
876         inherited_flags._cursor_style = initialCursor();
877         inherited_flags._direction = initialDirection();
878         inherited_flags._border_collapse = initialBorderCollapse();
879         inherited_flags._white_space = initialWhiteSpace();
880         inherited_flags._visuallyOrdered = false;
881         inherited_flags._htmlHacks=false;
882         inherited_flags._box_direction = initialBoxDirection();
883         inherited_flags._should_correct_text_color = false;
884         
885         noninherited_flags._effectiveDisplay = noninherited_flags._originalDisplay = initialDisplay();
886         noninherited_flags._bg_repeat = initialBackgroundRepeat();
887         noninherited_flags._bg_attachment = initialBackgroundAttachment();
888         noninherited_flags._overflow = initialOverflow();
889         noninherited_flags._vertical_align = initialVerticalAlign();
890         noninherited_flags._clear = initialClear();
891         noninherited_flags._position = initialPosition();
892         noninherited_flags._floating = initialFloating();
893         noninherited_flags._table_layout = initialTableLayout();
894         noninherited_flags._page_break_before = initialPageBreak();
895         noninherited_flags._page_break_after = initialPageBreak();
896         noninherited_flags._styleType = NOPSEUDO;
897         noninherited_flags._affectedByHover = false;
898         noninherited_flags._affectedByActive = false;
899         noninherited_flags._pseudoBits = 0;
900         noninherited_flags._unicodeBidi = initialUnicodeBidi();
901     }
902
903 public:
904
905     RenderStyle();
906     // used to create the default style.
907     RenderStyle(bool);
908     RenderStyle(const RenderStyle&);
909
910     ~RenderStyle();
911
912     void inheritFrom(const RenderStyle* inheritParent);
913
914     PseudoId styleType() { return  noninherited_flags._styleType; }
915
916     RenderStyle* getPseudoStyle(PseudoId pi);
917     void addPseudoStyle(RenderStyle* pseudo);
918
919     bool affectedByHoverRules() const { return  noninherited_flags._affectedByHover; }
920     bool affectedByActiveRules() const { return  noninherited_flags._affectedByActive; }
921
922     void setAffectedByHoverRules(bool b) {  noninherited_flags._affectedByHover = b; }
923     void setAffectedByActiveRules(bool b) {  noninherited_flags._affectedByActive = b; }
924  
925     bool operator==(const RenderStyle& other) const;
926     bool        isFloating() const { return !(noninherited_flags._floating == FNONE); }
927     bool        hasMargin() const { return surround->margin.nonZero(); }
928     bool        hasBorder() const { return surround->border.hasBorder(); }
929     bool        hasOffset() const { return surround->offset.nonZero(); }
930
931     bool visuallyOrdered() const { return inherited_flags._visuallyOrdered; }
932     void setVisuallyOrdered(bool b) {  inherited_flags._visuallyOrdered = b; }
933
934     bool isStyleAvailable() const;
935     
936     bool hasPseudoStyle(PseudoId pseudo) const;
937     void setHasPseudoStyle(PseudoId pseudo);
938     
939 // attribute getter methods
940
941     EDisplay    display() const { return noninherited_flags._effectiveDisplay; }
942     EDisplay    originalDisplay() const { return noninherited_flags._originalDisplay; }
943     
944     Length      left() const {  return surround->offset.left; }
945     Length      right() const {  return surround->offset.right; }
946     Length      top() const {  return surround->offset.top; }
947     Length      bottom() const {  return surround->offset.bottom; }
948
949     EPosition   position() const { return  noninherited_flags._position; }
950     EFloat      floating() const { return  noninherited_flags._floating; }
951
952     Length      width() const { return box->width; }
953     Length      height() const { return box->height; }
954     Length      minWidth() const { return box->min_width; }
955     Length      maxWidth() const { return box->max_width; }
956     Length      minHeight() const { return box->min_height; }
957     Length      maxHeight() const { return box->max_height; }
958
959     const BorderValue& borderLeft() const { return surround->border.left; }
960     const BorderValue& borderRight() const { return surround->border.right; }
961     const BorderValue& borderTop() const { return surround->border.top; }
962     const BorderValue& borderBottom() const { return surround->border.bottom; }
963
964     unsigned short  borderLeftWidth() const
965     { if( surround->border.left.style == BNONE || surround->border.left.style == BHIDDEN) return 0; return surround->border.left.width; }
966     EBorderStyle    borderLeftStyle() const { return surround->border.left.style; }
967     const QColor &  borderLeftColor() const { return surround->border.left.color; }
968     bool borderLeftIsTransparent() const { return surround->border.left.isTransparent(); }
969     unsigned short  borderRightWidth() const
970     { if (surround->border.right.style == BNONE || surround->border.right.style == BHIDDEN) return 0; return surround->border.right.width; }
971     EBorderStyle    borderRightStyle() const {  return surround->border.right.style; }
972     const QColor &          borderRightColor() const {  return surround->border.right.color; }
973     bool borderRightIsTransparent() const { return surround->border.right.isTransparent(); }
974     unsigned short  borderTopWidth() const
975     { if(surround->border.top.style == BNONE || surround->border.top.style == BHIDDEN) return 0; return surround->border.top.width; }
976     EBorderStyle    borderTopStyle() const {return surround->border.top.style; }
977     const QColor &  borderTopColor() const {  return surround->border.top.color; }
978     bool borderTopIsTransparent() const { return surround->border.top.isTransparent(); }
979     unsigned short  borderBottomWidth() const
980     { if(surround->border.bottom.style == BNONE || surround->border.bottom.style == BHIDDEN) return 0; return surround->border.bottom.width; }
981     EBorderStyle    borderBottomStyle() const {  return surround->border.bottom.style; }
982     const QColor &          borderBottomColor() const {  return surround->border.bottom.color; }
983     bool borderBottomIsTransparent() const { return surround->border.bottom.isTransparent(); }
984     
985     unsigned short outlineSize() const { return outlineWidth() + outlineOffset(); }
986     unsigned short outlineWidth() const { if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline.width; }
987     EBorderStyle    outlineStyle() const {  return background->outline.style; }
988     bool outlineStyleIsAuto() const { return background->outline._auto; }
989     const QColor &          outlineColor() const {  return background->outline.color; }
990
991     EOverflow overflow() const { return  noninherited_flags._overflow; }
992     EVisibility visibility() const { return inherited_flags._visibility; }
993     EVerticalAlign verticalAlign() const { return  noninherited_flags._vertical_align; }
994     Length verticalAlignLength() const { return box->vertical_align; }
995
996     Length clipLeft() const { return visual->clip.left; }
997     Length clipRight() const { return visual->clip.right; }
998     Length clipTop() const { return visual->clip.top; }
999     Length clipBottom() const { return visual->clip.bottom; }
1000     bool hasClip() const { return visual->hasClip; }
1001     
1002     EUnicodeBidi unicodeBidi() const { return noninherited_flags._unicodeBidi; }
1003
1004     EClear clear() const { return  noninherited_flags._clear; }
1005     ETableLayout tableLayout() const { return  noninherited_flags._table_layout; }
1006
1007     short colSpan() const { return visual->colspan; }
1008
1009     const QFont & font() const { return inherited->font.f; }
1010     // use with care. call font->update() after modifications
1011     const Font &htmlFont() { return inherited->font; }
1012     const QFontMetrics & fontMetrics() const { return inherited->font.fm; }
1013
1014     const QColor & color() const { return inherited->color; }
1015     Length textIndent() const { return inherited->indent; }
1016     ETextAlign textAlign() const { return inherited_flags._text_align; }
1017     ETextTransform textTransform() const { return inherited_flags._text_transform; }
1018     int textDecorationsInEffect() const { return inherited_flags._text_decorations; }
1019     int textDecoration() const { return visual->textDecoration; }
1020     int wordSpacing() const { return inherited->font.wordSpacing; }
1021     int letterSpacing() const { return inherited->font.letterSpacing; }
1022
1023     EDirection direction() const { return inherited_flags._direction; }
1024     Length lineHeight() const { return inherited->line_height; }
1025
1026     EWhiteSpace whiteSpace() const { return inherited_flags._white_space; }
1027
1028
1029     const QColor & backgroundColor() const { return background->color; }
1030     CachedImage *backgroundImage() const { return background->image; }
1031     EBackgroundRepeat backgroundRepeat() const { return  noninherited_flags._bg_repeat; }
1032     bool backgroundAttachment() const { return  noninherited_flags._bg_attachment; }
1033     Length backgroundXPosition() const { return background->x_position; }
1034     Length backgroundYPosition() const { return background->y_position; }
1035
1036     // returns true for collapsing borders, false for separate borders
1037     bool borderCollapse() const { return inherited_flags._border_collapse; }
1038     short horizontalBorderSpacing() const { return inherited->horizontal_border_spacing; }
1039     short verticalBorderSpacing() const { return inherited->vertical_border_spacing; }
1040     EEmptyCell emptyCells() const { return inherited_flags._empty_cells; }
1041     ECaptionSide captionSide() const { return inherited_flags._caption_side; }
1042
1043     short counterIncrement() const { return visual->counter_increment; }
1044     short counterReset() const { return visual->counter_reset; }
1045
1046     EListStyleType listStyleType() const { return inherited_flags._list_style_type; }
1047     CachedImage *listStyleImage() const { return inherited->style_image; }
1048     EListStylePosition listStylePosition() const { return inherited_flags._list_style_position; }
1049
1050     Length marginTop() const { return surround->margin.top; }
1051     Length marginBottom() const {  return surround->margin.bottom; }
1052     Length marginLeft() const {  return surround->margin.left; }
1053     Length marginRight() const {  return surround->margin.right; }
1054
1055     Length paddingTop() const {  return surround->padding.top; }
1056     Length paddingBottom() const {  return surround->padding.bottom; }
1057     Length paddingLeft() const { return surround->padding.left; }
1058     Length paddingRight() const {  return surround->padding.right; }
1059
1060     ECursor cursor() const { return inherited_flags._cursor_style; }
1061     
1062     CachedImage *cursorImage() const { return inherited->cursor_image; }
1063
1064     short widows() const { return inherited->widows; }
1065     short orphans() const { return inherited->orphans; }
1066     EPageBreak pageBreakInside() const { return inherited->page_break_inside; }
1067     EPageBreak pageBreakBefore() const { return noninherited_flags._page_break_before; }
1068     EPageBreak pageBreakAfter() const { return noninherited_flags._page_break_after; }
1069     
1070     // CSS3 Getter Methods
1071 #ifndef KHTML_NO_XBL
1072     BindingURI* bindingURIs() const { return css3NonInheritedData->bindingURI; }
1073 #endif
1074     int outlineOffset() const { 
1075         if (background->outline.style == BNONE || background->outline.style == BHIDDEN) return 0; return background->outline._offset;
1076     }
1077     ShadowData* textShadow() const { return css3InheritedData->textShadow; }
1078     float opacity() { return css3NonInheritedData->opacity; }
1079     EBoxAlignment boxAlign() { return css3NonInheritedData->flexibleBox->align; }
1080     EBoxDirection boxDirection() { return inherited_flags._box_direction; }
1081     float boxFlex() { return css3NonInheritedData->flexibleBox->flex; }
1082     unsigned int boxFlexGroup() { return css3NonInheritedData->flexibleBox->flex_group; }
1083     EBoxLines boxLines() { return css3NonInheritedData->flexibleBox->lines; }
1084     unsigned int boxOrdinalGroup() { return css3NonInheritedData->flexibleBox->ordinal_group; }
1085     EBoxOrient boxOrient() { return css3NonInheritedData->flexibleBox->orient; }
1086     EBoxAlignment boxPack() { return css3NonInheritedData->flexibleBox->pack; }
1087     Length marqueeIncrement() { return css3NonInheritedData->marquee->increment; }
1088     int marqueeSpeed() { return css3NonInheritedData->marquee->speed; }
1089     int marqueeLoopCount() { return css3NonInheritedData->marquee->loops; }
1090     EMarqueeBehavior marqueeBehavior() { return css3NonInheritedData->marquee->behavior; }
1091     EMarqueeDirection marqueeDirection() { return css3NonInheritedData->marquee->direction; }
1092     EUserModify userModify() const { return css3InheritedData->userModify; }
1093     EUserDrag userDrag() const { return css3NonInheritedData->userDrag; }
1094     bool userSelect() const { return css3NonInheritedData->userSelect; }
1095     // End CSS3 Getters
1096
1097 #if APPLE_CHANGES
1098     // Apple-specific property getter methods
1099     int lineClamp() { return css3NonInheritedData->lineClamp; }
1100 #endif
1101
1102 // attribute setter methods
1103
1104     void setDisplay(EDisplay v) {  noninherited_flags._effectiveDisplay = v; }
1105     void setOriginalDisplay(EDisplay v) {  noninherited_flags._originalDisplay = v; }
1106     void setPosition(EPosition v) {  noninherited_flags._position = v; }
1107     void setFloating(EFloat v) {  noninherited_flags._floating = v; }
1108
1109     void setLeft(Length v)  {  SET_VAR(surround,offset.left,v) }
1110     void setRight(Length v) {  SET_VAR(surround,offset.right,v) }
1111     void setTop(Length v)   {  SET_VAR(surround,offset.top,v) }
1112     void setBottom(Length v){  SET_VAR(surround,offset.bottom,v) }
1113
1114     void setWidth(Length v)  { SET_VAR(box,width,v) }
1115     void setHeight(Length v) { SET_VAR(box,height,v) }
1116
1117     void setMinWidth(Length v)  { SET_VAR(box,min_width,v) }
1118     void setMaxWidth(Length v)  { SET_VAR(box,max_width,v) }
1119     void setMinHeight(Length v) { SET_VAR(box,min_height,v) }
1120     void setMaxHeight(Length v) { SET_VAR(box,max_height,v) }
1121
1122     void resetBorderTop() { SET_VAR(surround, border.top, BorderValue()) }
1123     void resetBorderRight() { SET_VAR(surround, border.right, BorderValue()) }
1124     void resetBorderBottom() { SET_VAR(surround, border.bottom, BorderValue()) }
1125     void resetBorderLeft() { SET_VAR(surround, border.left, BorderValue()) }
1126     void resetOutline() { SET_VAR(background, outline, OutlineValue()) }
1127     
1128     void setBorderLeftWidth(unsigned short v)   {  SET_VAR(surround,border.left.width,v) }
1129     void setBorderLeftStyle(EBorderStyle v)     {  SET_VAR(surround,border.left.style,v) }
1130     void setBorderLeftColor(const QColor & v)   {  SET_VAR(surround,border.left.color,v) }
1131     void setBorderRightWidth(unsigned short v)  {  SET_VAR(surround,border.right.width,v) }
1132     void setBorderRightStyle(EBorderStyle v)    {  SET_VAR(surround,border.right.style,v) }
1133     void setBorderRightColor(const QColor & v)  {  SET_VAR(surround,border.right.color,v) }
1134     void setBorderTopWidth(unsigned short v)    {  SET_VAR(surround,border.top.width,v) }
1135     void setBorderTopStyle(EBorderStyle v)      {  SET_VAR(surround,border.top.style,v) }
1136     void setBorderTopColor(const QColor & v)    {  SET_VAR(surround,border.top.color,v) }    
1137     void setBorderBottomWidth(unsigned short v) {  SET_VAR(surround,border.bottom.width,v) }
1138     void setBorderBottomStyle(EBorderStyle v)   {  SET_VAR(surround,border.bottom.style,v) }
1139     void setBorderBottomColor(const QColor & v) {  SET_VAR(surround,border.bottom.color,v) }
1140     void setOutlineWidth(unsigned short v) {  SET_VAR(background,outline.width,v) }
1141     void setOutlineStyle(EBorderStyle v, bool isAuto = false)   
1142     {  
1143         SET_VAR(background,outline.style,v)
1144         SET_VAR(background,outline._auto, isAuto)
1145     }
1146     void setOutlineColor(const QColor & v) {  SET_VAR(background,outline.color,v) }
1147
1148     void setOverflow(EOverflow v) {  noninherited_flags._overflow = v; }
1149     void setVisibility(EVisibility v) { inherited_flags._visibility = v; }
1150     void setVerticalAlign(EVerticalAlign v) { noninherited_flags._vertical_align = v; }
1151     void setVerticalAlignLength(Length l) { SET_VAR(box, vertical_align, l ) }
1152
1153     void setHasClip(bool b = true) { SET_VAR(visual,hasClip,b) }
1154     void setClipLeft(Length v) { SET_VAR(visual,clip.left,v) }
1155     void setClipRight(Length v) { SET_VAR(visual,clip.right,v) }
1156     void setClipTop(Length v) { SET_VAR(visual,clip.top,v) }
1157     void setClipBottom(Length v) { SET_VAR(visual,clip.bottom,v) }
1158     void setClip( Length top, Length right, Length bottom, Length left );
1159     
1160     void setUnicodeBidi( EUnicodeBidi b ) { noninherited_flags._unicodeBidi = b; }
1161
1162     void setClear(EClear v) {  noninherited_flags._clear = v; }
1163     void setTableLayout(ETableLayout v) {  noninherited_flags._table_layout = v; }
1164     void ssetColSpan(short v) { SET_VAR(visual,colspan,v) }
1165
1166     bool setFontDef(const khtml::FontDef & v) {
1167         // bah, this doesn't compare pointers. broken! (Dirk)
1168         if (!(inherited->font.fontDef == v)) {
1169             inherited.access()->font = Font( v, inherited->font.letterSpacing, inherited->font.wordSpacing );
1170             return true;
1171         }
1172         return false;
1173     }
1174
1175     void setColor(const QColor & v) { SET_VAR(inherited,color,v) }
1176     void setTextIndent(Length v) { SET_VAR(inherited,indent,v) }
1177     void setTextAlign(ETextAlign v) { inherited_flags._text_align = v; }
1178     void setTextTransform(ETextTransform v) { inherited_flags._text_transform = v; }
1179     void addToTextDecorationsInEffect(int v) { inherited_flags._text_decorations |= v; }
1180     void setTextDecorationsInEffect(int v) { inherited_flags._text_decorations = v; }
1181     void setTextDecoration(int v) { SET_VAR(visual, textDecoration, v); }
1182     void setDirection(EDirection v) { inherited_flags._direction = v; }
1183     void setLineHeight(Length v) { SET_VAR(inherited,line_height,v) }
1184
1185     void setWhiteSpace(EWhiteSpace v) { inherited_flags._white_space = v; }
1186
1187     void setWordSpacing(int v) { SET_VAR(inherited,font.wordSpacing,v) }
1188     void setLetterSpacing(int v) { SET_VAR(inherited,font.letterSpacing,v) }
1189
1190     void setBackgroundColor(const QColor & v) {  SET_VAR(background,color,v) }
1191     void setBackgroundImage(CachedImage *v) {  SET_VAR(background,image,v) }
1192     void setBackgroundRepeat(EBackgroundRepeat v) {  noninherited_flags._bg_repeat = v; }
1193     void setBackgroundAttachment(bool scroll) {  noninherited_flags._bg_attachment = scroll; }
1194     void setBackgroundXPosition(Length v) {  SET_VAR(background,x_position,v) }
1195     void setBackgroundYPosition(Length v) {  SET_VAR(background,y_position,v) }
1196
1197     void setBorderCollapse(bool collapse) { inherited_flags._border_collapse = collapse; }
1198     void setHorizontalBorderSpacing(short v) { SET_VAR(inherited,horizontal_border_spacing,v) }
1199     void setVerticalBorderSpacing(short v) { SET_VAR(inherited,vertical_border_spacing,v) }
1200     void setEmptyCells(EEmptyCell v) { inherited_flags._empty_cells = v; }
1201     void setCaptionSide(ECaptionSide v) { inherited_flags._caption_side = v; }
1202
1203
1204     void setCounterIncrement(short v) {  SET_VAR(visual,counter_increment,v) }
1205     void setCounterReset(short v) {  SET_VAR(visual,counter_reset,v) }
1206
1207     void setListStyleType(EListStyleType v) { inherited_flags._list_style_type = v; }
1208     void setListStyleImage(CachedImage *v) {  SET_VAR(inherited,style_image,v)}
1209     void setListStylePosition(EListStylePosition v) { inherited_flags._list_style_position = v; }
1210
1211     void resetMargin() { SET_VAR(surround, margin, LengthBox(Fixed)) }
1212     void setMarginTop(Length v)     {  SET_VAR(surround,margin.top,v) }
1213     void setMarginBottom(Length v)  {  SET_VAR(surround,margin.bottom,v) }
1214     void setMarginLeft(Length v)    {  SET_VAR(surround,margin.left,v) }
1215     void setMarginRight(Length v)   {  SET_VAR(surround,margin.right,v) }
1216
1217     void resetPadding() { SET_VAR(surround, padding, LengthBox(Variable)) }
1218     void setPaddingTop(Length v)    {  SET_VAR(surround,padding.top,v) }
1219     void setPaddingBottom(Length v) {  SET_VAR(surround,padding.bottom,v) }
1220     void setPaddingLeft(Length v)   {  SET_VAR(surround,padding.left,v) }
1221     void setPaddingRight(Length v)  {  SET_VAR(surround,padding.right,v) }
1222
1223     void setCursor( ECursor c ) { inherited_flags._cursor_style = c; }
1224     void setCursorImage( CachedImage *v ) { SET_VAR(inherited,cursor_image,v) }
1225
1226     bool shouldCorrectTextColor() const { return inherited_flags._should_correct_text_color; }
1227     void setShouldCorrectTextColor(bool b=true) { inherited_flags._should_correct_text_color = b; }
1228
1229     bool htmlHacks() const { return inherited_flags._htmlHacks; }
1230     void setHtmlHacks(bool b=true) { inherited_flags._htmlHacks = b; }
1231
1232     bool hasAutoZIndex() { return box->z_auto; }
1233     void setHasAutoZIndex() { SET_VAR(box, z_auto, true); SET_VAR(box, z_index, 0) }
1234     int zIndex() const { return box->z_index; }
1235     void setZIndex(int v) { SET_VAR(box, z_auto, false); SET_VAR(box, z_index, v) }
1236
1237     void setWidows(short w) { SET_VAR(inherited, widows, w); }
1238     void setOrphans(short o) { SET_VAR(inherited, orphans, o); }
1239     void setPageBreakInside(EPageBreak b) { SET_VAR(inherited, page_break_inside, b); }
1240     void setPageBreakBefore(EPageBreak b) { noninherited_flags._page_break_before = b; }
1241     void setPageBreakAfter(EPageBreak b) { noninherited_flags._page_break_after = b; }
1242     
1243     // CSS3 Setters
1244 #ifndef KHTML_NO_XBL
1245     void deleteBindingURIs() { 
1246         delete css3NonInheritedData->bindingURI; 
1247         SET_VAR(css3NonInheritedData, bindingURI, 0);
1248     }
1249     void inheritBindingURIs(BindingURI* other) {
1250         SET_VAR(css3NonInheritedData, bindingURI, other->copy());
1251     }
1252     void addBindingURI(DOM::DOMStringImpl* uri);
1253 #endif
1254     void setOutlineOffset(unsigned short v) {  SET_VAR(background,outline._offset,v) }
1255     void setTextShadow(ShadowData* val, bool add=false);
1256     void setOpacity(float f) { SET_VAR(css3NonInheritedData, opacity, f); }
1257     void setBoxAlign(EBoxAlignment a) { SET_VAR(css3NonInheritedData.access()->flexibleBox, align, a); }
1258     void setBoxDirection(EBoxDirection d) { inherited_flags._box_direction = d; }
1259     void setBoxFlex(float f) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex, f); }
1260     void setBoxFlexGroup(unsigned int fg) { SET_VAR(css3NonInheritedData.access()->flexibleBox, flex_group, fg); }
1261     void setBoxLines(EBoxLines l) { SET_VAR(css3NonInheritedData.access()->flexibleBox, lines, l); }
1262     void setBoxOrdinalGroup(unsigned int og) { SET_VAR(css3NonInheritedData.access()->flexibleBox, ordinal_group, og); }
1263     void setBoxOrient(EBoxOrient o) { SET_VAR(css3NonInheritedData.access()->flexibleBox, orient, o); }
1264     void setBoxPack(EBoxAlignment p) { SET_VAR(css3NonInheritedData.access()->flexibleBox, pack, p); }
1265     void setMarqueeIncrement(const Length& f) { SET_VAR(css3NonInheritedData.access()->marquee, increment, f); }
1266     void setMarqueeSpeed(int f) { SET_VAR(css3NonInheritedData.access()->marquee, speed, f); }
1267     void setMarqueeDirection(EMarqueeDirection d) { SET_VAR(css3NonInheritedData.access()->marquee, direction, d); }
1268     void setMarqueeBehavior(EMarqueeBehavior b) { SET_VAR(css3NonInheritedData.access()->marquee, behavior, b); }
1269     void setMarqueeLoopCount(int i) { SET_VAR(css3NonInheritedData.access()->marquee, loops, i); }
1270     void setUserModify(EUserModify u) { SET_VAR(css3InheritedData, userModify, u); }
1271     void setUserDrag(EUserDrag d) { SET_VAR(css3NonInheritedData, userDrag, d); }
1272     void setUserSelect(bool b) { SET_VAR(css3NonInheritedData, userSelect, b); }
1273     // End CSS3 Setters
1274    
1275 #if APPLE_CHANGES
1276     // Apple-specific property setters
1277     void setLineClamp(int c) { SET_VAR(css3NonInheritedData, lineClamp, c); }
1278 #endif
1279
1280     QPalette palette() const { return visual->palette; }
1281     void setPaletteColor(QPalette::ColorGroup g, QColorGroup::ColorRole r, const QColor& c);
1282     void resetPalette() // Called when the desktop color scheme changes.
1283     {
1284         const_cast<StyleVisualData *>(visual.get())->palette = QApplication::palette();
1285     }
1286
1287     ContentData* contentData() { return content; }
1288     bool contentDataEquivalent(RenderStyle* otherStyle);
1289     void setContent(DOM::DOMStringImpl* s, bool add = false);
1290     void setContent(CachedObject* o, bool add = false);
1291
1292     bool inheritedNotEqual( RenderStyle *other ) const;
1293
1294     enum Diff { Equal, NonVisible = Equal, Visible, Position, Layout, CbLayout };
1295     Diff diff( const RenderStyle *other ) const;
1296
1297     bool isDisplayReplacedType() {
1298         return display() == INLINE_BLOCK || display() == INLINE_BOX || display() == INLINE_TABLE;
1299     }
1300     bool isDisplayInlineType() {
1301         return display() == INLINE || isDisplayReplacedType();
1302     }
1303     bool isOriginalDisplayInlineType() {
1304         return originalDisplay() == INLINE || originalDisplay() == INLINE_BLOCK ||
1305                originalDisplay() == INLINE_BOX || originalDisplay() == INLINE_TABLE;
1306     }
1307     
1308     // To obtain at any time the pseudo state for a given link.
1309     PseudoState pseudoState() const { return m_pseudoState; }
1310     void setPseudoState(PseudoState s) { m_pseudoState = s; }
1311     
1312     // To tell if this style matched attribute selectors. This makes it impossible to share.
1313     bool affectedByAttributeSelectors() const { return m_affectedByAttributeSelectors; }
1314     void setAffectedByAttributeSelectors() { m_affectedByAttributeSelectors = true; }
1315
1316     // Initial values for all the properties
1317     static bool initialBackgroundAttachment() { return true; }
1318     static EBackgroundRepeat initialBackgroundRepeat() { return REPEAT; }
1319     static bool initialBorderCollapse() { return false; }
1320     static EBorderStyle initialBorderStyle() { return BNONE; }
1321     static ECaptionSide initialCaptionSide() { return CAPTOP; }
1322     static EClear initialClear() { return CNONE; }
1323     static EDirection initialDirection() { return LTR; }
1324     static EDisplay initialDisplay() { return INLINE; }
1325     static EEmptyCell initialEmptyCells() { return SHOW; }
1326     static EFloat initialFloating() { return FNONE; }
1327     static EListStylePosition initialListStylePosition() { return OUTSIDE; }
1328     static EListStyleType initialListStyleType() { return DISC; }
1329     static EOverflow initialOverflow() { return OVISIBLE; }
1330     static EPageBreak initialPageBreak() { return PBAUTO; }
1331     static EPosition initialPosition() { return STATIC; }
1332     static ETableLayout initialTableLayout() { return TAUTO; }
1333     static EUnicodeBidi initialUnicodeBidi() { return UBNormal; }
1334     static ETextTransform initialTextTransform() { return TTNONE; }
1335     static EVisibility initialVisibility() { return VISIBLE; }
1336     static EWhiteSpace initialWhiteSpace() { return NORMAL; }
1337     static Length initialBackgroundXPosition() { return Length(); }
1338     static Length initialBackgroundYPosition() { return Length(); }
1339     static short initialHorizontalBorderSpacing() { return 0; }
1340     static short initialVerticalBorderSpacing() { return 0; }
1341     static ECursor initialCursor() { return CURSOR_AUTO; }
1342     static QColor initialColor() { return Qt::black; }
1343     static CachedImage* initialBackgroundImage() { return 0; }
1344     static CachedImage* initialListStyleImage() { return 0; }
1345     static unsigned short initialBorderWidth() { return 3; }
1346     static int initialLetterWordSpacing() { return 0; }
1347     static Length initialSize() { return Length(); }
1348     static Length initialMinSize() { return Length(0, Fixed); }
1349     static Length initialMaxSize() { return Length(UNDEFINED, Fixed); }
1350     static Length initialOffset() { return Length(); }
1351     static Length initialMargin() { return Length(Fixed); }
1352     static Length initialPadding() { return Length(Variable); }
1353     static Length initialTextIndent() { return Length(Fixed); }
1354     static EVerticalAlign initialVerticalAlign() { return BASELINE; }
1355     static int initialWidows() { return 2; }
1356     static int initialOrphans() { return 2; }
1357     static Length initialLineHeight() { return Length(-100, Percent); }
1358     static ETextAlign initialTextAlign() { return TAAUTO; }
1359     static ETextDecoration initialTextDecoration() { return TDNONE; }
1360     static int initialOutlineOffset() { return 0; }
1361     static float initialOpacity() { return 1.0f; }
1362     static EBoxAlignment initialBoxAlign() { return BSTRETCH; }
1363     static EBoxDirection initialBoxDirection() { return BNORMAL; }
1364     static EBoxLines initialBoxLines() { return SINGLE; }
1365     static EBoxOrient initialBoxOrient() { return HORIZONTAL; }
1366     static EBoxAlignment initialBoxPack() { return BSTART; }
1367     static float initialBoxFlex() { return 0.0f; }
1368     static int initialBoxFlexGroup() { return 1; }
1369     static int initialBoxOrdinalGroup() { return 1; }
1370     static int initialMarqueeLoopCount() { return -1; }
1371     static int initialMarqueeSpeed() { return 85; }
1372     static Length initialMarqueeIncrement() { return Length(6, Fixed); }
1373     static EMarqueeBehavior initialMarqueeBehavior() { return MSCROLL; }
1374     static EMarqueeDirection initialMarqueeDirection() { return MAUTO; }
1375     static EUserModify initialUserModify() { return READ_ONLY; }
1376     static EUserDrag initialUserDrag() { return DRAG_AUTO; }
1377     static bool initialUserSelect() { return true; }
1378
1379 #if APPLE_CHANGES
1380     // Keep these at the end.
1381     static int initialLineClamp() { return -1; }
1382 #endif
1383 };
1384
1385
1386 } // namespace
1387
1388 #endif
1389