Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(6)

Side by Side Diff: third_party/WebKit/Source/core/paint/TableCellPainter.cpp

Issue 1781463002: Fix table background painting (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Sample code for improved collapsed border painting Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/paint/TableCellPainter.h" 5 #include "core/paint/TableCellPainter.h"
6 6
7 #include "core/layout/LayoutTableCell.h" 7 #include "core/layout/LayoutTableCell.h"
8 #include "core/layout/LayoutTableCol.h"
8 #include "core/paint/BlockPainter.h" 9 #include "core/paint/BlockPainter.h"
9 #include "core/paint/BoxPainter.h" 10 #include "core/paint/BoxPainter.h"
10 #include "core/paint/LayoutObjectDrawingRecorder.h" 11 #include "core/paint/LayoutObjectDrawingRecorder.h"
11 #include "core/paint/PaintInfo.h" 12 #include "core/paint/PaintInfo.h"
12 #include "platform/graphics/GraphicsContextStateSaver.h" 13 #include "platform/graphics/GraphicsContextStateSaver.h"
13 14
14 namespace blink { 15 namespace blink {
15 16
16 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedLeftBorder(c onst ComputedStyle& styleForCellFlow) const 17 inline const CollapsedBorderValue* TableCellPainter::cachedCollapsedLeftBorder(c onst ComputedStyle& styleForCellFlow) const
17 { 18 {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 if (displayItemType & DisplayItem::TableCollapsedBorderLeft) { 134 if (displayItemType & DisplayItem::TableCollapsedBorderLeft) {
134 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde rRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), BSLeft, 135 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.x(), borde rRect.y(), borderRect.x() + leftWidth, borderRect.maxY(), BSLeft,
135 leftBorderValue->color().resolve(cellColor), collapsedBorderStyle(le ftBorderValue->style()), 0, 0, true); 136 leftBorderValue->color().resolve(cellColor), collapsedBorderStyle(le ftBorderValue->style()), 0, 0, true);
136 } 137 }
137 if (displayItemType & DisplayItem::TableCollapsedBorderRight) { 138 if (displayItemType & DisplayItem::TableCollapsedBorderRight) {
138 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.maxX() - r ightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), BSRight, 139 ObjectPainter::drawLineForBoxSide(graphicsContext, borderRect.maxX() - r ightWidth, borderRect.y(), borderRect.maxX(), borderRect.maxY(), BSRight,
139 rightBorderValue->color().resolve(cellColor), collapsedBorderStyle(r ightBorderValue->style()), 0, 0, true); 140 rightBorderValue->color().resolve(cellColor), collapsedBorderStyle(r ightBorderValue->style()), 0, 0, true);
140 } 141 }
141 } 142 }
142 143
143 void TableCellPainter::paintBackgroundsBehindCell(const PaintInfo& paintInfo, co nst LayoutPoint& paintOffset, const LayoutObject* backgroundObject, DisplayItem: :Type type) 144 void TableCellPainter::paintBackgroundsBehindCell(const PaintInfo& paintInfo, co nst LayoutPoint& paintOffset, const LayoutBox* backgroundObject, DisplayItem::Ty pe type)
144 { 145 {
146 if (RuntimeEnabledFeatures::newTableCellBackgroundPaintingEnabled() && backg roundObject != &m_layoutTableCell) {
147 paintParentBackgroundsBehindCell(paintInfo, paintOffset, backgroundObjec t, type);
148 return;
149 }
150
145 if (!backgroundObject) 151 if (!backgroundObject)
146 return; 152 return;
147 153
148 if (m_layoutTableCell.style()->visibility() != VISIBLE) 154 if (m_layoutTableCell.style()->visibility() != VISIBLE)
149 return; 155 return;
150 156
151 LayoutTable* tableElt = m_layoutTableCell.table(); 157 LayoutTable* tableElt = m_layoutTableCell.table();
152 if (!tableElt->collapseBorders() && m_layoutTableCell.style()->emptyCells() == EmptyCellsHide && !m_layoutTableCell.firstChild()) 158 if (!tableElt->collapseBorders() && m_layoutTableCell.style()->emptyCells() == EmptyCellsHide && !m_layoutTableCell.firstChild())
153 return; 159 return;
154 160
(...skipping 18 matching lines...) Expand all
173 GraphicsContextStateSaver stateSaver(paintInfo.context, shouldClip); 179 GraphicsContextStateSaver stateSaver(paintInfo.context, shouldClip);
174 if (shouldClip) { 180 if (shouldClip) {
175 LayoutRect clipRect(paintRect.location(), m_layoutTableCell.size()); 181 LayoutRect clipRect(paintRect.location(), m_layoutTableCell.size());
176 clipRect.expand(m_layoutTableCell.borderInsets()); 182 clipRect.expand(m_layoutTableCell.borderInsets());
177 paintInfo.context.clip(pixelSnappedIntRect(clipRect)); 183 paintInfo.context.clip(pixelSnappedIntRect(clipRect));
178 } 184 }
179 BoxPainter(m_layoutTableCell).paintFillLayers(paintInfo, c, bgLayer, pai ntRect, BackgroundBleedNone, SkXfermode::kSrcOver_Mode, backgroundObject); 185 BoxPainter(m_layoutTableCell).paintFillLayers(paintInfo, c, bgLayer, pai ntRect, BackgroundBleedNone, SkXfermode::kSrcOver_Mode, backgroundObject);
180 } 186 }
181 } 187 }
182 188
189 void TableCellPainter::paintParentBackgroundsBehindCell(const PaintInfo& paintIn fo, const LayoutPoint& paintOffset, const LayoutBox* backgroundObject, DisplayIt em::Type type)
190 {
191 if (!backgroundObject)
192 return;
193
194 if (m_layoutTableCell.style()->visibility() != VISIBLE)
195 return;
196
197 LayoutTable* tableElt = m_layoutTableCell.table();
198 if (!tableElt->collapseBorders() && m_layoutTableCell.style()->emptyCells() == EmptyCellsHide && !m_layoutTableCell.firstChild())
199 return;
200
201 LayoutRect backgroundRect = paintBoundsParent(paintOffset, backgroundObject, type);
202
203 LayoutRect cellRect = m_layoutTableCell.frameRect();
204 cellRect.moveBy(paintOffset);
205
206 cellRect.setLocation(LayoutPoint(cellRect.pixelSnappedLocation()));
207 cellRect.setSize(LayoutSize(cellRect.pixelSnappedSize()));
208
209 // We paint background LTR, top->bottom.
210 // This makes code much simpler, but is not spec-conformant.
211 // The spec-conformant code would have to handle all writing-mode
212 // painting directions correctly.
213
214 if (backgroundRect.x() > cellRect.x())
215 backgroundRect.setX(cellRect.x());
216 if (backgroundRect.y() > cellRect.y())
217 backgroundRect.setY(cellRect.y());
218
219 Optional<LayoutObjectDrawingRecorder> recorder;
220 if (LayoutObjectDrawingRecorder::useCachedDrawingIfPossible(paintInfo.contex t, m_layoutTableCell, type)) {
221 return;
222 }
223 recorder.emplace(paintInfo.context, m_layoutTableCell, type, cellRect);
224
225 Color c = backgroundObject->resolveColor(CSSPropertyBackgroundColor);
226 const FillLayer& bgLayer = backgroundObject->style()->backgroundLayers();
227 FillLayer bgAdjustedLayer(bgLayer);
228
229 if (bgLayer.hasImage() || c.alpha()) {
230
231 GraphicsContextStateSaver stateSaver(paintInfo.context, true);
232 LayoutRect clipRect(m_layoutTableCell.location(), m_layoutTableCell.size ());
233 clipRect.moveBy(paintOffset);
234 paintInfo.context.clip(pixelSnappedIntRect(clipRect));
235
236 // If cell is larger than background, we might have to paint multiple ti mes.
237 LayoutUnit colExtraPixels = std::max(LayoutUnit(0), cellRect.maxX() - ba ckgroundRect.maxX());
238 unsigned colRepeat = 1 + (colExtraPixels / backgroundRect.width()) + (co lExtraPixels % backgroundRect.width() != 0);
239 LayoutUnit rowExtraPixels = std::max(LayoutUnit(0), cellRect.maxY() - ba ckgroundRect.maxY());
240 unsigned rowRepeat = 1 + (rowExtraPixels / backgroundRect.height()) + (r owExtraPixels % backgroundRect.height() != 0);
241 for (unsigned row = 0; row < rowRepeat; row++) {
242 for (unsigned col = 0; col < colRepeat; col++) {
243 LayoutRect paintRect = backgroundRect;
244 paintRect.move(col * paintRect.width(), row * paintRect.height() );
245 BoxPainter(*backgroundObject).paintFillLayers(paintInfo, c, bgLa yer, paintRect, BackgroundBleedNone, SkXfermode::kSrcOver_Mode, backgroundObject );
246 }
247 }
248 }
249 }
250
183 void TableCellPainter::paintBoxDecorationBackground(const PaintInfo& paintInfo, const LayoutPoint& paintOffset) 251 void TableCellPainter::paintBoxDecorationBackground(const PaintInfo& paintInfo, const LayoutPoint& paintOffset)
184 { 252 {
185 LayoutTable* table = m_layoutTableCell.table(); 253 LayoutTable* table = m_layoutTableCell.table();
186 if (!table->collapseBorders() && m_layoutTableCell.style()->emptyCells() == EmptyCellsHide && !m_layoutTableCell.firstChild()) 254 if (!table->collapseBorders() && m_layoutTableCell.style()->emptyCells() == EmptyCellsHide && !m_layoutTableCell.firstChild())
187 return; 255 return;
188 256
189 bool needsToPaintBorder = m_layoutTableCell.styleRef().hasBorderDecoration() && !table->collapseBorders(); 257 bool needsToPaintBorder = m_layoutTableCell.styleRef().hasBorderDecoration() && !table->collapseBorders();
190 if (!m_layoutTableCell.hasBackground() && !m_layoutTableCell.styleRef().boxS hadow() && !needsToPaintBorder) 258 if (!m_layoutTableCell.hasBackground() && !m_layoutTableCell.styleRef().boxS hadow() && !needsToPaintBorder)
191 return; 259 return;
192 260
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
231 } 299 }
232 300
233 LayoutRect TableCellPainter::paintBounds(const LayoutPoint& paintOffset, PaintBo undOffsetBehavior paintBoundOffsetBehavior) 301 LayoutRect TableCellPainter::paintBounds(const LayoutPoint& paintOffset, PaintBo undOffsetBehavior paintBoundOffsetBehavior)
234 { 302 {
235 LayoutPoint adjustedPaintOffset = paintOffset; 303 LayoutPoint adjustedPaintOffset = paintOffset;
236 if (paintBoundOffsetBehavior == AddOffsetFromParent) 304 if (paintBoundOffsetBehavior == AddOffsetFromParent)
237 adjustedPaintOffset.moveBy(m_layoutTableCell.location()); 305 adjustedPaintOffset.moveBy(m_layoutTableCell.location());
238 return LayoutRect(adjustedPaintOffset, LayoutSize(m_layoutTableCell.pixelSna ppedSize())); 306 return LayoutRect(adjustedPaintOffset, LayoutSize(m_layoutTableCell.pixelSna ppedSize()));
239 } 307 }
240 308
309 LayoutRect TableCellPainter::paintBoundsParent(const LayoutPoint& paintOffset, c onst LayoutBox* backgroundObject, DisplayItem::Type type)
310 {
311 LayoutRect position;
312 switch (type) {
313 case DisplayItem::TableCellBackgroundFromColumnGroup:
314 case DisplayItem::TableCellBackgroundFromColumn:
315 {
316 position = static_cast<const LayoutTableCol*>(backgroundObject)->positio nByCellSpan(
317 m_layoutTableCell.absoluteColumnIndex());
318 // position is relative to table, must correct for section location
319 LayoutPoint sectionLocation = m_layoutTableCell.section()->location();
320 position.moveBy(-sectionLocation);
321 position.moveBy(paintOffset);
322 }
323 break;
324 case DisplayItem::TableCellBackgroundFromSection:
325 position = static_cast<const LayoutTableSection*>(backgroundObject)->pos itionByCellSpan();
326 position.moveBy(paintOffset);
327 break;
328 case DisplayItem::TableCellBackgroundFromRow:
329 position = static_cast<const LayoutTableRow*>(backgroundObject)->positio nByCellSpan();
330 position.moveBy(paintOffset);
331 break;
332 case DisplayItem::BoxDecorationBackground: {
333 LayoutPoint adjustedPaintOffset = paintOffset;
334 adjustedPaintOffset.moveBy(m_layoutTableCell.location());
335 position = LayoutRect(adjustedPaintOffset, LayoutSize(m_layoutTableCell .pixelSnappedSize()));
336 }
337 break;
338 default:
339 ASSERT(false);
340 break;
341 }
342 return LayoutRect(position.pixelSnappedLocation(), position.pixelSnappedSize ());
343 }
344
241 } // namespace blink 345 } // namespace blink
242 346
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698