e3d08cceeac7a330212ab997479e8c10635e0651
[WebKit-https.git] / Source / WebCore / rendering / RenderBoxModelObject.h
1 /*
2  * Copyright (C) 1999 Lars Knoll (knoll@kde.org)
3  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
4  * Copyright (C) 2003, 2006, 2007, 2009 Apple Inc. All rights reserved.
5  * Copyright (C) 2010 Google Inc. All rights reserved.
6  *
7  * This library is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Library General Public
9  * License as published by the Free Software Foundation; either
10  * version 2 of the License, or (at your option) any later version.
11  *
12  * This library is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
15  * Library General Public License for more details.
16  *
17  * You should have received a copy of the GNU Library General Public License
18  * along with this library; see the file COPYING.LIB.  If not, write to
19  * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20  * Boston, MA 02110-1301, USA.
21  *
22  */
23
24 #ifndef RenderBoxModelObject_h
25 #define RenderBoxModelObject_h
26
27 #include "RenderObject.h"
28 #include "ShadowData.h"
29
30 namespace WebCore {
31
32 // Modes for some of the line-related functions.
33 enum LinePositionMode { PositionOnContainingLine, PositionOfInteriorLineBoxes };
34 enum LineDirectionMode { HorizontalLine, VerticalLine };
35 typedef unsigned BorderEdgeFlags;
36
37 enum BackgroundBleedAvoidance {
38     BackgroundBleedNone,
39     BackgroundBleedShrinkBackground,
40     BackgroundBleedUseTransparencyLayer
41 };
42
43 // This class is the base for all objects that adhere to the CSS box model as described
44 // at http://www.w3.org/TR/CSS21/box.html
45
46 class RenderBoxModelObject : public RenderObject {
47 public:
48     RenderBoxModelObject(Node*);
49     virtual ~RenderBoxModelObject();
50     
51     LayoutUnit relativePositionOffsetX() const;
52     LayoutUnit relativePositionOffsetY() const;
53     LayoutSize relativePositionOffset() const { return LayoutSize(relativePositionOffsetX(), relativePositionOffsetY()); }
54     LayoutSize relativePositionLogicalOffset() const { return style()->isHorizontalWritingMode() ? relativePositionOffset() : relativePositionOffset().transposedSize(); }
55
56     // IE extensions. Used to calculate offsetWidth/Height.  Overridden by inlines (RenderFlow)
57     // to return the remaining width on a given line (and the height of a single line).
58     virtual LayoutUnit offsetLeft() const;
59     virtual LayoutUnit offsetTop() const;
60     virtual LayoutUnit offsetWidth() const = 0;
61     virtual LayoutUnit offsetHeight() const = 0;
62
63     virtual void styleWillChange(StyleDifference, const RenderStyle* newStyle);
64     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
65     virtual void updateBoxModelInfoFromStyle();
66
67     bool hasSelfPaintingLayer() const;
68     RenderLayer* layer() const { return m_layer; }
69     virtual bool requiresLayer() const { return isRoot() || isPositioned() || isRelPositioned() || isTransparent() || hasOverflowClip() || hasTransform() || hasMask() || hasReflection() || style()->specifiesColumns(); }
70
71     // This will work on inlines to return the bounding box of all of the lines' border boxes.
72     virtual LayoutRect borderBoundingBox() const = 0;
73
74     // Virtual since table cells override
75     virtual LayoutUnit paddingTop(bool includeIntrinsicPadding = true) const;
76     virtual LayoutUnit paddingBottom(bool includeIntrinsicPadding = true) const;
77     virtual LayoutUnit paddingLeft(bool includeIntrinsicPadding = true) const;
78     virtual LayoutUnit paddingRight(bool includeIntrinsicPadding = true) const;
79     virtual LayoutUnit paddingBefore(bool includeIntrinsicPadding = true) const;
80     virtual LayoutUnit paddingAfter(bool includeIntrinsicPadding = true) const;
81     virtual LayoutUnit paddingStart(bool includeIntrinsicPadding = true) const;
82     virtual LayoutUnit paddingEnd(bool includeIntrinsicPadding = true) const;
83
84     virtual LayoutUnit borderTop() const { return style()->borderTopWidth(); }
85     virtual LayoutUnit borderBottom() const { return style()->borderBottomWidth(); }
86     virtual LayoutUnit borderLeft() const { return style()->borderLeftWidth(); }
87     virtual LayoutUnit borderRight() const { return style()->borderRightWidth(); }
88     virtual LayoutUnit borderBefore() const { return style()->borderBeforeWidth(); }
89     virtual LayoutUnit borderAfter() const { return style()->borderAfterWidth(); }
90     virtual LayoutUnit borderStart() const { return style()->borderStartWidth(); }
91     virtual LayoutUnit borderEnd() const { return style()->borderEndWidth(); }
92
93     LayoutUnit borderAndPaddingHeight() const { return borderTop() + borderBottom() + paddingTop() + paddingBottom(); }
94     LayoutUnit borderAndPaddingWidth() const { return borderLeft() + borderRight() + paddingLeft() + paddingRight(); }
95     LayoutUnit borderAndPaddingLogicalHeight() const { return borderBefore() + borderAfter() + paddingBefore() + paddingAfter(); }
96     LayoutUnit borderAndPaddingLogicalWidth() const { return borderStart() + borderEnd() + paddingStart() + paddingEnd(); }
97     LayoutUnit borderAndPaddingLogicalLeft() const { return style()->isHorizontalWritingMode() ? borderLeft() + paddingLeft() : borderTop() + paddingTop(); }
98
99     LayoutUnit borderAndPaddingStart() const { return borderStart() + paddingStart(); }
100     LayoutUnit borderLogicalLeft() const { return style()->isHorizontalWritingMode() ? borderLeft() : borderTop(); }
101     LayoutUnit borderLogicalRight() const { return style()->isHorizontalWritingMode() ? borderRight() : borderBottom(); }
102
103     virtual LayoutUnit marginTop() const = 0;
104     virtual LayoutUnit marginBottom() const = 0;
105     virtual LayoutUnit marginLeft() const = 0;
106     virtual LayoutUnit marginRight() const = 0;
107     virtual LayoutUnit marginBefore() const = 0;
108     virtual LayoutUnit marginAfter() const = 0;
109     virtual LayoutUnit marginStart() const = 0;
110     virtual LayoutUnit marginEnd() const = 0;
111
112     bool hasInlineDirectionBordersPaddingOrMargin() const { return hasInlineDirectionBordersOrPadding() || marginStart()|| marginEnd(); }
113     bool hasInlineDirectionBordersOrPadding() const { return borderStart() || borderEnd() || paddingStart()|| paddingEnd(); }
114
115     virtual int containingBlockLogicalWidthForContent() const;
116
117     virtual void childBecameNonInline(RenderObject* /*child*/) { }
118
119     void paintBorder(const PaintInfo&, const IntRect&, const RenderStyle*, BackgroundBleedAvoidance = BackgroundBleedNone, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
120     bool paintNinePieceImage(GraphicsContext*, const IntRect&, const RenderStyle*, const NinePieceImage&, CompositeOperator = CompositeSourceOver);
121     void paintBoxShadow(GraphicsContext*, const LayoutRect&, const RenderStyle*, ShadowStyle, bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true);
122     void paintFillLayerExtended(const PaintInfo&, const Color&, const FillLayer*, const LayoutRect&, BackgroundBleedAvoidance, InlineFlowBox* = 0, const LayoutSize& = LayoutSize(), CompositeOperator = CompositeSourceOver, RenderObject* backgroundObject = 0);
123     
124     // Overridden by subclasses to determine line height and baseline position.
125     virtual int lineHeight(bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const = 0;
126     virtual int baselinePosition(FontBaseline, bool firstLine, LineDirectionMode, LinePositionMode = PositionOnContainingLine) const = 0;
127
128     // Called by RenderObject::willBeDestroyed() and is the only way layers should ever be destroyed
129     void destroyLayer();
130
131     void highQualityRepaintTimerFired(Timer<RenderBoxModelObject>*);
132
133     virtual void setSelectionState(SelectionState s);
134
135 protected:
136     virtual void willBeDestroyed();
137
138     class BackgroundImageGeometry {
139     public:
140         LayoutPoint destOrigin() const { return m_destOrigin; }
141         void setDestOrigin(const LayoutPoint& destOrigin)
142         {
143             m_destOrigin = destOrigin;
144         }
145         
146         LayoutRect destRect() const { return m_destRect; }
147         void setDestRect(const LayoutRect& destRect)
148         {
149             m_destRect = destRect;
150         }
151
152         // Returns the phase relative to the destination rectangle.
153         LayoutPoint relativePhase() const;
154         
155         LayoutPoint phase() const { return m_phase; }   
156         void setPhase(const LayoutPoint& phase)
157         {
158             m_phase = phase;
159         }
160
161         LayoutSize tileSize() const { return m_tileSize; }    
162         void setTileSize(const LayoutSize& tileSize)
163         {
164             m_tileSize = tileSize;
165         }
166         
167         void setPhaseX(int x) { m_phase.setX(x); }
168         void setPhaseY(int y) { m_phase.setY(y); }
169         
170         void setNoRepeatX(int xOffset);
171         void setNoRepeatY(int yOffset);
172         
173         void useFixedAttachment(const LayoutPoint& attachmentPoint);
174         
175         void clip(const LayoutRect&);
176     private:
177         LayoutRect m_destRect;
178         LayoutPoint m_destOrigin;
179         LayoutPoint m_phase;
180         LayoutSize m_tileSize;
181     };
182
183     void calculateBackgroundImageGeometry(const FillLayer*, const IntRect& paintRect, BackgroundImageGeometry&);
184     void getBorderEdgeInfo(class BorderEdge[], bool includeLogicalLeftEdge = true, bool includeLogicalRightEdge = true) const;
185     bool borderObscuresBackgroundEdge(const FloatSize& contextScale) const;
186
187     bool shouldPaintAtLowQuality(GraphicsContext*, Image*, const void*, const IntSize&);
188
189     RenderBoxModelObject* continuation() const;
190     void setContinuation(RenderBoxModelObject*);
191
192 private:
193     virtual bool isBoxModelObject() const { return true; }
194
195     IntSize calculateFillTileSize(const FillLayer*, IntSize scaledSize) const;
196
197     RoundedRect getBackgroundRoundedRect(const LayoutRect&, InlineFlowBox*, LayoutUnit inlineBoxWidth, LayoutUnit inlineBoxHeight,
198         bool includeLogicalLeftEdge, bool includeLogicalRightEdge);
199
200     void clipBorderSidePolygon(GraphicsContext*, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
201                                BoxSide, bool firstEdgeMatches, bool secondEdgeMatches);
202     void paintOneBorderSide(GraphicsContext*, const RenderStyle*, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
203                                 const IntRect& sideRect, BoxSide, BoxSide adjacentSide1, BoxSide adjacentSide2, const class BorderEdge[],
204                                 const Path*, BackgroundBleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge, bool antialias, const Color* overrideColor = 0);
205     void paintTranslucentBorderSides(GraphicsContext*, const RenderStyle*, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
206                           const class BorderEdge[], BackgroundBleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge, bool antialias = false);
207     void paintBorderSides(GraphicsContext*, const RenderStyle*, const RoundedRect& outerBorder, const RoundedRect& innerBorder,
208                           const class BorderEdge[], BorderEdgeFlags, BackgroundBleedAvoidance,
209                           bool includeLogicalLeftEdge, bool includeLogicalRightEdge, bool antialias = false, const Color* overrideColor = 0);
210     void drawBoxSideFromPath(GraphicsContext*, const IntRect&, const Path&, const class BorderEdge[],
211                             float thickness, float drawThickness, BoxSide, const RenderStyle*, 
212                             Color, EBorderStyle, BackgroundBleedAvoidance, bool includeLogicalLeftEdge, bool includeLogicalRightEdge);
213
214     friend class RenderView;
215
216     RenderLayer* m_layer;
217     
218     // Used to store state between styleWillChange and styleDidChange
219     static bool s_wasFloating;
220     static bool s_hadLayer;
221     static bool s_layerWasSelfPainting;
222 };
223
224 inline RenderBoxModelObject* toRenderBoxModelObject(RenderObject* object)
225
226     ASSERT(!object || object->isBoxModelObject());
227     return static_cast<RenderBoxModelObject*>(object);
228 }
229
230 inline const RenderBoxModelObject* toRenderBoxModelObject(const RenderObject* object)
231
232     ASSERT(!object || object->isBoxModelObject());
233     return static_cast<const RenderBoxModelObject*>(object);
234 }
235
236 // This will catch anyone doing an unnecessary cast.
237 void toRenderBoxModelObject(const RenderBoxModelObject*);
238
239 } // namespace WebCore
240
241 #endif // RenderBoxModelObject_h