forked from Floorp-Projects/Floorp
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathnsTablePainter.h
223 lines (186 loc) · 8.23 KB
/
nsTablePainter.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
/* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
#ifndef nsTablePainter_h__
#define nsTablePainter_h__
#include "celldata.h"
// flags for Paint, PaintChild, PaintChildren are currently only used by tables.
//Table-based paint call; not a direct call as with views
#define NS_PAINT_FLAG_TABLE_BG_PAINT 0x00000001
//Cells should paint their backgrounds only, no children
#define NS_PAINT_FLAG_TABLE_CELL_BG_PASS 0x00000002
class nsIFrame;
class nsTableFrame;
class nsTableRowGroupFrame;
class nsTableRowFrame;
class nsTableCellFrame;
class TableBackgroundPainter
{
/*
* Helper class for painting table backgrounds
*
*/
public:
enum Origin { eOrigin_Table, eOrigin_TableRowGroup, eOrigin_TableRow };
/** Public constructor
* @param aTableFrame - the table's table frame
* @param aOrigin - what type of table frame is creating this instance
* @param aPresContext - the presentation context
* @param aRenderingContext - the rendering context
* @param aDirtyRect - the area that needs to be painted,
* relative to aRenderingContext
* @param aPt - offset of the table frame relative to
* aRenderingContext
* @param aBGPaintFlags - Flags of the nsCSSRendering::PAINTBG_* variety
*/
TableBackgroundPainter(nsTableFrame* aTableFrame,
Origin aOrigin,
nsPresContext* aPresContext,
nsRenderingContext& aRenderingContext,
const nsRect& aDirtyRect,
const nsPoint& aPt,
uint32_t aBGPaintFlags);
/** Destructor */
~TableBackgroundPainter();
/* ~*~ The Border Collapse Painting Issue ~*~
In border-collapse, the *table* paints the cells' borders,
so we need to make sure the backgrounds get painted first
(underneath) by doing a cell-background-only painting pass.
*/
/* ~*~ Using nsTablePainter Background Painting ~*~
A call to PaintTable will normally paint all of the table's
elements (except for the table background, if aPaintTableBackground
is false).
Elements with views however, will be skipped and must create their
own painter to call the appropriate paint function in their ::Paint
method (e.g. painter.PaintRow in nsTableRow::Paint)
*/
/** Paint background for the table frame (if requested) and its children
* down through cells.
* (Cells themselves will only be painted in border collapse)
* Table must do a flagged TABLE_BG_PAINT ::Paint call on its
* children afterwards
* @param aTableFrame - the table frame
* @param aDeflate - deflation needed to bring table's mRect
* to the outer grid lines in border-collapse
* @param aPaintTableBackground - if true, the table background
* is included, otherwise it isn't
*/
nsresult PaintTable(nsTableFrame* aTableFrame, const nsMargin& aDeflate,
bool aPaintTableBackground);
/** Paint background for the row group and its children down through cells
* (Cells themselves will only be painted in border collapse)
* Standards mode only
* Table Row Group must do a flagged TABLE_BG_PAINT ::Paint call on its
* children afterwards
* @param aFrame - the table row group frame
*/
nsresult PaintRowGroup(nsTableRowGroupFrame* aFrame)
{ return PaintRowGroup(aFrame, false); }
/** Paint background for the row and its children down through cells
* (Cells themselves will only be painted in border collapse)
* Standards mode only
* Table Row must do a flagged TABLE_BG_PAINT ::Paint call on its
* children afterwards
* @param aFrame - the table row frame
*/
nsresult PaintRow(nsTableRowFrame* aFrame)
{ return PaintRow(aFrame, false); }
private:
/** Paint table frame's background
* @param aTableFrame - the table frame
* @param aFirstRowGroup - the first (in layout order) row group
* may be null
* @param aLastRowGroup - the last (in layout order) row group
* may be null
* @param aDeflate - adjustment to frame's rect (used for quirks BC)
* may be null
*/
nsresult PaintTableFrame(nsTableFrame* aTableFrame,
nsTableRowGroupFrame* aFirstRowGroup,
nsTableRowGroupFrame* aLastRowGroup,
const nsMargin& aDeflate);
/* aPassThrough params indicate whether to paint the element or to just
* pass through and paint underlying layers only
* See Public versions for function descriptions
*/
nsresult PaintRowGroup(nsTableRowGroupFrame* aFrame,
bool aPassThrough);
nsresult PaintRow(nsTableRowFrame* aFrame,
bool aPassThrough);
/** Paint table background layers for this cell space
* Also paints cell's own background in border-collapse mode
* @param aFrame - the cell
* @param aPassSelf - pass this cell; i.e. paint only underlying layers
*/
nsresult PaintCell(nsTableCellFrame* aFrame,
bool aPassSelf);
/** Translate mRenderingContext, mDirtyRect, and mCols' column and
* colgroup coords
* @param aDX - origin's x-coord change
* @param aDY - origin's y-coord change
*/
void TranslateContext(nscoord aDX,
nscoord aDY);
struct TableBackgroundData;
friend struct TableBackgroundData;
struct TableBackgroundData {
nsIFrame* mFrame;
/** mRect is the rect of mFrame in the current coordinate system */
nsRect mRect;
bool mVisible;
const nsStyleBorder* mBorder;
/** Data is valid & frame is visible */
bool IsVisible() const { return mVisible; }
/** Constructor */
TableBackgroundData();
/** Destructor */
~TableBackgroundData();
/** Destroys synthesized data. MUST be called before destructor
* @param aPresContext - the pres context
*/
void Destroy(nsPresContext* aPresContext);
/** Clear background data */
void Clear();
/** Calculate and set all data values to represent aFrame */
void SetFull(nsIFrame* aFrame);
/** Set frame data (mFrame, mRect) but leave style data empty */
void SetFrame(nsIFrame* aFrame);
/** Calculate the style data for mFrame */
void SetData();
/** True if need to set border-collapse border; must call SetFull beforehand */
bool ShouldSetBCBorder();
/** Set border-collapse border with aBorderWidth as widths */
nsresult SetBCBorder(nsMargin& aBorderWidth,
TableBackgroundPainter* aPainter);
private:
nsStyleBorder* mSynthBorder;
};
struct ColData;
friend struct ColData;
struct ColData {
TableBackgroundData mCol;
TableBackgroundData* mColGroup; //link to col's parent colgroup's data (owned by painter)
ColData() {
mColGroup = nullptr;
}
};
nsPresContext* mPresContext;
nsRenderingContext& mRenderingContext;
nsPoint mRenderPt;
nsRect mDirtyRect;
#ifdef DEBUG
nsCompatibility mCompatMode;
#endif
bool mIsBorderCollapse;
Origin mOrigin; //user's table frame type
ColData* mCols; //array of columns' ColData
uint32_t mNumCols;
TableBackgroundData mRowGroup; //current row group
TableBackgroundData mRow; //current row
nsRect mCellRect; //current cell's rect
nsStyleBorder mZeroBorder; //cached zero-width border
uint32_t mBGPaintFlags;
};
#endif