Revert borders to integers for subpixel layout
[WebKit-https.git] / Source / WebCore / rendering / RenderTableCell.h
1 /*
2  * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3  *           (C) 1997 Torben Weis (weis@kde.org)
4  *           (C) 1998 Waldo Bastian (bastian@kde.org)
5  *           (C) 1999 Lars Knoll (knoll@kde.org)
6  *           (C) 1999 Antti Koivisto (koivisto@kde.org)
7  * Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009 Apple Inc. All rights reserved.
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., 51 Franklin Street, Fifth Floor,
22  * Boston, MA 02110-1301, USA.
23  */
24
25 #ifndef RenderTableCell_h
26 #define RenderTableCell_h
27
28 #include "RenderTableSection.h"
29
30 namespace WebCore {
31
32 static const unsigned unsetColumnIndex = 0x7FFFFFFF;
33 static const unsigned maxColumnIndex = 0x7FFFFFFE; // 2,147,483,646
34
35 static const unsigned unsetRowIndex = 0x7FFFFFFF;
36 static const unsigned maxRowIndex = 0x7FFFFFFE; // 2,147,483,646
37
38 enum IncludeBorderColorOrNot { DoNotIncludeBorderColor, IncludeBorderColor };
39
40 class RenderTableCell : public RenderBlock {
41 public:
42     explicit RenderTableCell(Node*);
43
44     // FIXME: need to implement cellIndex
45     int cellIndex() const { return 0; }
46     void setCellIndex(int) { }
47
48     unsigned colSpan() const;
49     unsigned rowSpan() const;
50
51     // Called from HTMLTableCellElement.
52     void colSpanOrRowSpanChanged();
53
54     void setCol(unsigned column)
55     {
56         if (UNLIKELY(column > maxColumnIndex))
57             CRASH();
58
59         m_column = column;
60     }
61
62     unsigned col() const
63     {
64         ASSERT(m_column != unsetColumnIndex);
65         return m_column;
66     }
67
68     void setRow(unsigned row)
69     {
70         if (UNLIKELY(row > maxRowIndex))
71             CRASH();
72
73         m_row = row;
74     }
75
76     bool rowWasSet() const { return m_row != unsetRowIndex; }
77     unsigned row() const
78     {
79         ASSERT(rowWasSet());
80         return m_row;
81     }
82
83     RenderTableSection* section() const { return toRenderTableSection(parent()->parent()); }
84     RenderTable* table() const { return toRenderTable(parent()->parent()->parent()); }
85
86     Length styleOrColLogicalWidth() const;
87
88     LayoutUnit logicalHeightForRowSizing() const;
89
90     virtual void computePreferredLogicalWidths();
91
92     void updateLogicalWidth(LayoutUnit);
93
94     virtual int borderLeft() const;
95     virtual int borderRight() const;
96     virtual int borderTop() const;
97     virtual int borderBottom() const;
98     virtual int borderStart() const;
99     virtual int borderEnd() const;
100     virtual int borderBefore() const;
101     virtual int borderAfter() const;
102
103     void collectBorderValues(RenderTable::CollapsedBorderValues&) const;
104     static void sortBorderValues(RenderTable::CollapsedBorderValues&);
105
106     virtual void layout();
107
108     virtual void paint(PaintInfo&, const LayoutPoint&);
109
110     void paintCollapsedBorders(PaintInfo&, const LayoutPoint&);
111     void paintBackgroundsBehindCell(PaintInfo&, const LayoutPoint&, RenderObject* backgroundObject);
112
113     LayoutUnit cellBaselinePosition() const;
114
115     void setIntrinsicPaddingBefore(int p) { m_intrinsicPaddingBefore = p; }
116     void setIntrinsicPaddingAfter(int p) { m_intrinsicPaddingAfter = p; }
117     void setIntrinsicPadding(int before, int after) { setIntrinsicPaddingBefore(before); setIntrinsicPaddingAfter(after); }
118     void clearIntrinsicPadding() { setIntrinsicPadding(0, 0); }
119
120     int intrinsicPaddingBefore() const { return m_intrinsicPaddingBefore; }
121     int intrinsicPaddingAfter() const { return m_intrinsicPaddingAfter; }
122
123     virtual LayoutUnit paddingTop(bool includeIntrinsicPadding = true) const;
124     virtual LayoutUnit paddingBottom(bool includeIntrinsicPadding = true) const;
125     virtual LayoutUnit paddingLeft(bool includeIntrinsicPadding = true) const;
126     virtual LayoutUnit paddingRight(bool includeIntrinsicPadding = true) const;
127     
128     // FIXME: For now we just assume the cell has the same block flow direction as the table.  It's likely we'll
129     // create an extra anonymous RenderBlock to handle mixing directionality anyway, in which case we can lock
130     // the block flow directionality of the cells to the table's directionality.
131     virtual LayoutUnit paddingBefore(bool includeIntrinsicPadding = true) const;
132     virtual LayoutUnit paddingAfter(bool includeIntrinsicPadding = true) const;
133
134     void setOverrideHeightFromRowHeight(LayoutUnit);
135
136     virtual void scrollbarsChanged(bool horizontalScrollbarChanged, bool verticalScrollbarChanged);
137
138     bool cellWidthChanged() const { return m_cellWidthChanged; }
139     void setCellWidthChanged(bool b = true) { m_cellWidthChanged = b; }
140
141 protected:
142     virtual void styleDidChange(StyleDifference, const RenderStyle* oldStyle);
143
144 private:
145     virtual const char* renderName() const { return isAnonymous() ? "RenderTableCell (anonymous)" : "RenderTableCell"; }
146
147     virtual bool isTableCell() const { return true; }
148
149     virtual void willBeDestroyed();
150
151     virtual void computeLogicalWidth();
152
153     virtual void paintBoxDecorations(PaintInfo&, const LayoutPoint&);
154     virtual void paintMask(PaintInfo&, const LayoutPoint&);
155
156     virtual bool boxShadowShouldBeAppliedToBackground(BackgroundBleedAvoidance, InlineFlowBox*) const OVERRIDE;
157
158     virtual LayoutSize offsetFromContainer(RenderObject*, const LayoutPoint&) const;
159     virtual LayoutRect clippedOverflowRectForRepaint(RenderBoxModelObject* repaintContainer) const;
160     virtual void computeRectForRepaint(RenderBoxModelObject* repaintContainer, LayoutRect&, bool fixed = false) const;
161
162     int borderHalfLeft(bool outer) const;
163     int borderHalfRight(bool outer) const;
164     int borderHalfTop(bool outer) const;
165     int borderHalfBottom(bool outer) const;
166
167     int borderHalfStart(bool outer) const;
168     int borderHalfEnd(bool outer) const;
169     int borderHalfBefore(bool outer) const;
170     int borderHalfAfter(bool outer) const;
171
172     CollapsedBorderValue collapsedStartBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
173     CollapsedBorderValue collapsedEndBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
174     CollapsedBorderValue collapsedBeforeBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
175     CollapsedBorderValue collapsedAfterBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
176
177     CollapsedBorderValue cachedCollapsedLeftBorder(RenderStyle*) const;
178     CollapsedBorderValue cachedCollapsedRightBorder(RenderStyle*) const;
179     CollapsedBorderValue cachedCollapsedTopBorder(RenderStyle*) const;
180     CollapsedBorderValue cachedCollapsedBottomBorder(RenderStyle*) const;
181
182     CollapsedBorderValue computeCollapsedStartBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
183     CollapsedBorderValue computeCollapsedEndBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
184     CollapsedBorderValue computeCollapsedBeforeBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
185     CollapsedBorderValue computeCollapsedAfterBorder(IncludeBorderColorOrNot = IncludeBorderColor) const;
186
187     unsigned m_row : 31;
188     bool m_cellWidthChanged : 1;
189     unsigned m_column : 31;
190     bool m_hasAssociatedTableCellElement : 1;
191     int m_intrinsicPaddingBefore;
192     int m_intrinsicPaddingAfter;
193 };
194
195 inline RenderTableCell* toRenderTableCell(RenderObject* object)
196 {
197     ASSERT(!object || object->isTableCell());
198     return static_cast<RenderTableCell*>(object);
199 }
200
201 inline const RenderTableCell* toRenderTableCell(const RenderObject* object)
202 {
203     ASSERT(!object || object->isTableCell());
204     return static_cast<const RenderTableCell*>(object);
205 }
206
207 // This will catch anyone doing an unnecessary cast.
208 void toRenderTableCell(const RenderTableCell*);
209
210 } // namespace WebCore
211
212 #endif // RenderTableCell_h