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