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

Side by Side Diff: third_party/WebKit/Source/core/layout/LayoutTableSection.h

Issue 2786463004: Paint backgrounds of a table section/row in one display item (Closed)
Patch Set: - Created 3 years, 8 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 /* 1 /*
2 * Copyright (C) 1997 Martin Jones (mjones@kde.org) 2 * Copyright (C) 1997 Martin Jones (mjones@kde.org)
3 * (C) 1997 Torben Weis (weis@kde.org) 3 * (C) 1997 Torben Weis (weis@kde.org)
4 * (C) 1998 Waldo Bastian (bastian@kde.org) 4 * (C) 1998 Waldo Bastian (bastian@kde.org)
5 * (C) 1999 Lars Knoll (knoll@kde.org) 5 * (C) 1999 Lars Knoll (knoll@kde.org)
6 * (C) 1999 Antti Koivisto (koivisto@kde.org) 6 * (C) 1999 Antti Koivisto (koivisto@kde.org)
7 * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2013 Apple Inc. All rights 7 * Copyright (C) 2003, 2004, 2005, 2006, 2009, 2013 Apple Inc. All rights
8 * reserved. 8 * reserved.
9 * 9 *
10 * This library is free software; you can redistribute it and/or 10 * This library is free software; you can redistribute it and/or
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
50 void decreaseStart() { --m_start; } 50 void decreaseStart() { --m_start; }
51 void increaseEnd() { ++m_end; } 51 void increaseEnd() { ++m_end; }
52 52
53 void ensureConsistency(const unsigned); 53 void ensureConsistency(const unsigned);
54 54
55 private: 55 private:
56 unsigned m_start; 56 unsigned m_start;
57 unsigned m_end; 57 unsigned m_end;
58 }; 58 };
59 59
60 inline bool operator==(const CellSpan& s1, const CellSpan& s2) {
61 return s1.start() == s2.start() && s1.end() == s2.end();
62 }
63 inline bool operator!=(const CellSpan& s1, const CellSpan& s2) {
64 return !(s1 == s2);
65 }
66
60 class LayoutTableCell; 67 class LayoutTableCell;
61 class LayoutTableRow; 68 class LayoutTableRow;
62 69
63 // LayoutTableSection is used to represent table row group (display: 70 // LayoutTableSection is used to represent table row group (display:
64 // table-row-group), header group (display: table-header-group) and footer group 71 // table-row-group), header group (display: table-header-group) and footer group
65 // (display: table-footer-group). 72 // (display: table-footer-group).
66 // 73 //
67 // The object holds the internal representation of the rows (m_grid). See 74 // The object holds the internal representation of the rows (m_grid). See
68 // recalcCells() below for some extra explanation. 75 // recalcCells() below for some extra explanation.
69 // 76 //
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
309 316
310 // Flip the rect so it aligns with the coordinates used by the rowPos and 317 // Flip the rect so it aligns with the coordinates used by the rowPos and
311 // columnPos vectors. 318 // columnPos vectors.
312 LayoutRect logicalRectForWritingModeAndDirection(const LayoutRect&) const; 319 LayoutRect logicalRectForWritingModeAndDirection(const LayoutRect&) const;
313 320
314 // Returns a row or column span covering all grid slots from each of which 321 // Returns a row or column span covering all grid slots from each of which
315 // a primary cell intersecting |visualRect| originates. 322 // a primary cell intersecting |visualRect| originates.
316 CellSpan dirtiedRows(const LayoutRect& visualRect) const; 323 CellSpan dirtiedRows(const LayoutRect& visualRect) const;
317 CellSpan dirtiedEffectiveColumns(const LayoutRect& visualRect) const; 324 CellSpan dirtiedEffectiveColumns(const LayoutRect& visualRect) const;
318 325
319 const HashSet<LayoutTableCell*>& overflowingCells() const { 326 const HashSet<const LayoutTableCell*>& overflowingCells() const {
320 return m_overflowingCells; 327 return m_overflowingCells;
321 } 328 }
322 bool hasMultipleCellLevels() const { return m_hasMultipleCellLevels; } 329 bool hasMultipleCellLevels() const { return m_hasMultipleCellLevels; }
323 330
324 const char* name() const override { return "LayoutTableSection"; } 331 const char* name() const override { return "LayoutTableSection"; }
325 332
326 // Whether a section has opaque background depends on many factors, e.g. 333 // Whether a section has opaque background depends on many factors, e.g.
327 // border spacing, border collapsing, missing cells, etc. For simplicity, 334 // border spacing, border collapsing, missing cells, etc. For simplicity,
328 // just conservatively assume all table sections are not opaque. 335 // just conservatively assume all table sections are not opaque.
329 bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect&, 336 bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect&,
330 unsigned) const override { 337 unsigned) const override {
331 return false; 338 return false;
332 } 339 }
333 bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const override { 340 bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const override {
334 return false; 341 return false;
335 } 342 }
336 343
337 int paginationStrutForRow(LayoutTableRow*, LayoutUnit logicalOffset) const; 344 int paginationStrutForRow(LayoutTableRow*, LayoutUnit logicalOffset) const;
338 345
339 bool mapToVisualRectInAncestorSpaceInternal( 346 bool mapToVisualRectInAncestorSpaceInternal(
340 const LayoutBoxModelObject* ancestor, 347 const LayoutBoxModelObject* ancestor,
341 TransformState&, 348 TransformState&,
342 VisualRectFlags = DefaultVisualRectFlags) const override; 349 VisualRectFlags = DefaultVisualRectFlags) const override;
343 350
344 bool isRepeatingHeaderGroup() const; 351 bool isRepeatingHeaderGroup() const;
345 352
346 void layout() override; 353 void layout() override;
347 354
355 CellSpan fullSectionRowSpan() const { return CellSpan(0, m_grid.size()); }
356 CellSpan fullTableEffectiveColumnSpan() const {
357 return CellSpan(0, table()->numEffectiveColumns());
358 }
359
348 protected: 360 protected:
349 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override; 361 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override;
350 bool nodeAtPoint(HitTestResult&, 362 bool nodeAtPoint(HitTestResult&,
351 const HitTestLocation& locationInContainer, 363 const HitTestLocation& locationInContainer,
352 const LayoutPoint& accumulatedOffset, 364 const LayoutPoint& accumulatedOffset,
353 HitTestAction) override; 365 HitTestAction) override;
354 366
355 private: 367 private:
356 bool isOfType(LayoutObjectType type) const override { 368 bool isOfType(LayoutObjectType type) const override {
357 return type == LayoutObjectTableSection || LayoutBox::isOfType(type); 369 return type == LayoutObjectTableSection || LayoutBox::isOfType(type);
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after
413 void updateBaselineForCell(LayoutTableCell*, 425 void updateBaselineForCell(LayoutTableCell*,
414 unsigned row, 426 unsigned row,
415 int& baselineDescent); 427 int& baselineDescent);
416 428
417 bool hasOverflowingCell() const { 429 bool hasOverflowingCell() const {
418 return m_overflowingCells.size() || m_forceSlowPaintPathWithOverflowingCell; 430 return m_overflowingCells.size() || m_forceSlowPaintPathWithOverflowingCell;
419 } 431 }
420 432
421 void computeOverflowFromCells(unsigned totalRows, unsigned nEffCols); 433 void computeOverflowFromCells(unsigned totalRows, unsigned nEffCols);
422 434
423 CellSpan fullTableRowSpan() const { return CellSpan(0, m_grid.size()); }
424 CellSpan fullTableEffectiveColumnSpan() const {
425 return CellSpan(0, table()->numEffectiveColumns());
426 }
427
428 // These two functions take a rectangle as input that has been flipped by 435 // These two functions take a rectangle as input that has been flipped by
429 // logicalRectForWritingModeAndDirection. 436 // logicalRectForWritingModeAndDirection.
430 // The returned span of rows or columns is end-exclusive, and empty if 437 // The returned span of rows or columns is end-exclusive, and empty if
431 // start==end. 438 // start==end.
432 CellSpan spannedRows(const LayoutRect& flippedRect) const; 439 CellSpan spannedRows(const LayoutRect& flippedRect) const;
433 CellSpan spannedEffectiveColumns(const LayoutRect& flippedRect) const; 440 CellSpan spannedEffectiveColumns(const LayoutRect& flippedRect) const;
434 441
435 void setLogicalPositionForCell(LayoutTableCell*, 442 void setLogicalPositionForCell(LayoutTableCell*,
436 unsigned effectiveColumn) const; 443 unsigned effectiveColumn) const;
437 444
438 void relayoutCellIfFlexed(LayoutTableCell&, int rowIndex, int rowHeight); 445 void relayoutCellIfFlexed(LayoutTableCell&, int rowIndex, int rowHeight);
439 446
440 int logicalHeightForRow(const LayoutTableRow&) const; 447 int logicalHeightForRow(const LayoutTableRow&) const;
441 448
442 // Honor breaking restrictions inside the table row, and adjust position and 449 // Honor breaking restrictions inside the table row, and adjust position and
443 // size accordingly. 450 // size accordingly.
444 void adjustRowForPagination(LayoutTableRow&, SubtreeLayoutScope&); 451 void adjustRowForPagination(LayoutTableRow&, SubtreeLayoutScope&);
445 452
453 bool paintedOutputOfObjectHasNoEffectRegardlessOfSize() const override;
454
446 // The representation of the rows and their cells (CellStruct). 455 // The representation of the rows and their cells (CellStruct).
447 Vector<RowStruct> m_grid; 456 Vector<RowStruct> m_grid;
448 457
449 // The logical offset of each row from the top of the section. 458 // The logical offset of each row from the top of the section.
450 // 459 //
451 // Note that this Vector has one more entry than the number of rows so that 460 // Note that this Vector has one more entry than the number of rows so that
452 // we can keep track of the final size of the section. That is, 461 // we can keep track of the final size of the section. That is,
453 // m_rowPos[m_grid.size()] is a valid entry. 462 // m_rowPos[m_grid.size()] is a valid entry.
454 // 463 //
455 // To know a row's height at |rowIndex|, use the formula: 464 // To know a row's height at |rowIndex|, use the formula:
(...skipping 17 matching lines...) Expand all
473 int m_outerBorderEnd; 482 int m_outerBorderEnd;
474 int m_outerBorderBefore; 483 int m_outerBorderBefore;
475 int m_outerBorderAfter; 484 int m_outerBorderAfter;
476 485
477 bool m_needsCellRecalc; 486 bool m_needsCellRecalc;
478 487
479 // This HashSet holds the overflowing cells for faster painting. 488 // This HashSet holds the overflowing cells for faster painting.
480 // If we have more than gMaxAllowedOverflowingCellRatio * total cells, it will 489 // If we have more than gMaxAllowedOverflowingCellRatio * total cells, it will
481 // be empty and m_forceSlowPaintPathWithOverflowingCell will be set to save 490 // be empty and m_forceSlowPaintPathWithOverflowingCell will be set to save
482 // memory. 491 // memory.
483 HashSet<LayoutTableCell*> m_overflowingCells; 492 HashSet<const LayoutTableCell*> m_overflowingCells;
484 bool m_forceSlowPaintPathWithOverflowingCell; 493 bool m_forceSlowPaintPathWithOverflowingCell;
485 494
486 // This boolean tracks if we have cells overlapping due to rowspan / colspan 495 // This boolean tracks if we have cells overlapping due to rowspan / colspan
487 // (see class comment above about when it could appear). 496 // (see class comment above about when it could appear).
488 // 497 //
489 // The use is to disable a painting optimization where we just paint the 498 // The use is to disable a painting optimization where we just paint the
490 // invalidated cells. 499 // invalidated cells.
491 bool m_hasMultipleCellLevels; 500 bool m_hasMultipleCellLevels;
492 501
493 // Whether any cell spans multiple rows or cols. 502 // Whether any cell spans multiple rows or cols.
494 bool m_hasSpanningCells; 503 bool m_hasSpanningCells;
495 }; 504 };
496 505
497 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableSection, isTableSection()); 506 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableSection, isTableSection());
498 507
499 } // namespace blink 508 } // namespace blink
500 509
501 #endif // LayoutTableSection_h 510 #endif // LayoutTableSection_h
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/core/layout/LayoutTableRow.cpp ('k') | third_party/WebKit/Source/core/layout/LayoutTableSection.cpp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698