OLD | NEW |
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 Loading... |
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 235 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
305 | 312 |
306 // Flip the rect so it aligns with the coordinates used by the rowPos and | 313 // Flip the rect so it aligns with the coordinates used by the rowPos and |
307 // columnPos vectors. | 314 // columnPos vectors. |
308 LayoutRect logicalRectForWritingModeAndDirection(const LayoutRect&) const; | 315 LayoutRect logicalRectForWritingModeAndDirection(const LayoutRect&) const; |
309 | 316 |
310 // Returns a row or column span covering all grid slots from each of which | 317 // Returns a row or column span covering all grid slots from each of which |
311 // a primary cell intersecting |visualRect| originates. | 318 // a primary cell intersecting |visualRect| originates. |
312 CellSpan dirtiedRows(const LayoutRect& visualRect) const; | 319 CellSpan dirtiedRows(const LayoutRect& visualRect) const; |
313 CellSpan dirtiedEffectiveColumns(const LayoutRect& visualRect) const; | 320 CellSpan dirtiedEffectiveColumns(const LayoutRect& visualRect) const; |
314 | 321 |
315 const HashSet<LayoutTableCell*>& overflowingCells() const { | 322 const HashSet<const LayoutTableCell*>& overflowingCells() const { |
316 return m_overflowingCells; | 323 return m_overflowingCells; |
317 } | 324 } |
318 bool hasMultipleCellLevels() const { return m_hasMultipleCellLevels; } | 325 bool hasMultipleCellLevels() const { return m_hasMultipleCellLevels; } |
319 | 326 |
320 const char* name() const override { return "LayoutTableSection"; } | 327 const char* name() const override { return "LayoutTableSection"; } |
321 | 328 |
322 // Whether a section has opaque background depends on many factors, e.g. | 329 // Whether a section has opaque background depends on many factors, e.g. |
323 // border spacing, border collapsing, missing cells, etc. For simplicity, | 330 // border spacing, border collapsing, missing cells, etc. For simplicity, |
324 // just conservatively assume all table sections are not opaque. | 331 // just conservatively assume all table sections are not opaque. |
325 bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect&, | 332 bool foregroundIsKnownToBeOpaqueInRect(const LayoutRect&, |
326 unsigned) const override { | 333 unsigned) const override { |
327 return false; | 334 return false; |
328 } | 335 } |
329 bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const override { | 336 bool backgroundIsKnownToBeOpaqueInRect(const LayoutRect&) const override { |
330 return false; | 337 return false; |
331 } | 338 } |
332 | 339 |
333 int paginationStrutForRow(LayoutTableRow*, LayoutUnit logicalOffset) const; | 340 int paginationStrutForRow(LayoutTableRow*, LayoutUnit logicalOffset) const; |
334 | 341 |
335 bool mapToVisualRectInAncestorSpaceInternal( | 342 bool mapToVisualRectInAncestorSpaceInternal( |
336 const LayoutBoxModelObject* ancestor, | 343 const LayoutBoxModelObject* ancestor, |
337 TransformState&, | 344 TransformState&, |
338 VisualRectFlags = DefaultVisualRectFlags) const override; | 345 VisualRectFlags = DefaultVisualRectFlags) const override; |
339 | 346 |
340 bool isRepeatingHeaderGroup() const; | 347 bool isRepeatingHeaderGroup() const; |
341 | 348 |
342 void layout() override; | 349 void layout() override; |
343 | 350 |
| 351 CellSpan fullSectionRowSpan() const { return CellSpan(0, m_grid.size()); } |
| 352 CellSpan fullTableEffectiveColumnSpan() const { |
| 353 return CellSpan(0, table()->numEffectiveColumns()); |
| 354 } |
| 355 |
344 protected: | 356 protected: |
345 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override; | 357 void styleDidChange(StyleDifference, const ComputedStyle* oldStyle) override; |
346 bool nodeAtPoint(HitTestResult&, | 358 bool nodeAtPoint(HitTestResult&, |
347 const HitTestLocation& locationInContainer, | 359 const HitTestLocation& locationInContainer, |
348 const LayoutPoint& accumulatedOffset, | 360 const LayoutPoint& accumulatedOffset, |
349 HitTestAction) override; | 361 HitTestAction) override; |
350 | 362 |
351 private: | 363 private: |
352 bool isOfType(LayoutObjectType type) const override { | 364 bool isOfType(LayoutObjectType type) const override { |
353 return type == LayoutObjectTableSection || LayoutBox::isOfType(type); | 365 return type == LayoutObjectTableSection || LayoutBox::isOfType(type); |
(...skipping 55 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
409 void updateBaselineForCell(LayoutTableCell*, | 421 void updateBaselineForCell(LayoutTableCell*, |
410 unsigned row, | 422 unsigned row, |
411 int& baselineDescent); | 423 int& baselineDescent); |
412 | 424 |
413 bool hasOverflowingCell() const { | 425 bool hasOverflowingCell() const { |
414 return m_overflowingCells.size() || m_forceSlowPaintPathWithOverflowingCell; | 426 return m_overflowingCells.size() || m_forceSlowPaintPathWithOverflowingCell; |
415 } | 427 } |
416 | 428 |
417 void computeOverflowFromCells(unsigned totalRows, unsigned nEffCols); | 429 void computeOverflowFromCells(unsigned totalRows, unsigned nEffCols); |
418 | 430 |
419 CellSpan fullTableRowSpan() const { return CellSpan(0, m_grid.size()); } | |
420 CellSpan fullTableEffectiveColumnSpan() const { | |
421 return CellSpan(0, table()->numEffectiveColumns()); | |
422 } | |
423 | |
424 // These two functions take a rectangle as input that has been flipped by | 431 // These two functions take a rectangle as input that has been flipped by |
425 // logicalRectForWritingModeAndDirection. | 432 // logicalRectForWritingModeAndDirection. |
426 // The returned span of rows or columns is end-exclusive, and empty if | 433 // The returned span of rows or columns is end-exclusive, and empty if |
427 // start==end. | 434 // start==end. |
428 CellSpan spannedRows(const LayoutRect& flippedRect) const; | 435 CellSpan spannedRows(const LayoutRect& flippedRect) const; |
429 CellSpan spannedEffectiveColumns(const LayoutRect& flippedRect) const; | 436 CellSpan spannedEffectiveColumns(const LayoutRect& flippedRect) const; |
430 | 437 |
431 void setLogicalPositionForCell(LayoutTableCell*, | 438 void setLogicalPositionForCell(LayoutTableCell*, |
432 unsigned effectiveColumn) const; | 439 unsigned effectiveColumn) const; |
433 | 440 |
434 void relayoutCellIfFlexed(LayoutTableCell&, int rowIndex, int rowHeight); | 441 void relayoutCellIfFlexed(LayoutTableCell&, int rowIndex, int rowHeight); |
435 | 442 |
436 int logicalHeightForRow(const LayoutTableRow&) const; | 443 int logicalHeightForRow(const LayoutTableRow&) const; |
437 | 444 |
438 // Honor breaking restrictions inside the table row, and adjust position and | 445 // Honor breaking restrictions inside the table row, and adjust position and |
439 // size accordingly. | 446 // size accordingly. |
440 void adjustRowForPagination(LayoutTableRow&, SubtreeLayoutScope&); | 447 void adjustRowForPagination(LayoutTableRow&, SubtreeLayoutScope&); |
441 | 448 |
| 449 bool paintedOutputOfObjectHasNoEffectRegardlessOfSize() const override; |
| 450 |
442 // The representation of the rows and their cells (CellStruct). | 451 // The representation of the rows and their cells (CellStruct). |
443 Vector<RowStruct> m_grid; | 452 Vector<RowStruct> m_grid; |
444 | 453 |
445 // The logical offset of each row from the top of the section. | 454 // The logical offset of each row from the top of the section. |
446 // | 455 // |
447 // Note that this Vector has one more entry than the number of rows so that | 456 // Note that this Vector has one more entry than the number of rows so that |
448 // we can keep track of the final size of the section. That is, | 457 // we can keep track of the final size of the section. That is, |
449 // m_rowPos[m_grid.size()] is a valid entry. | 458 // m_rowPos[m_grid.size()] is a valid entry. |
450 // | 459 // |
451 // To know a row's height at |rowIndex|, use the formula: | 460 // To know a row's height at |rowIndex|, use the formula: |
(...skipping 17 matching lines...) Expand all Loading... |
469 int m_outerBorderEnd; | 478 int m_outerBorderEnd; |
470 int m_outerBorderBefore; | 479 int m_outerBorderBefore; |
471 int m_outerBorderAfter; | 480 int m_outerBorderAfter; |
472 | 481 |
473 bool m_needsCellRecalc; | 482 bool m_needsCellRecalc; |
474 | 483 |
475 // This HashSet holds the overflowing cells for faster painting. | 484 // This HashSet holds the overflowing cells for faster painting. |
476 // If we have more than gMaxAllowedOverflowingCellRatio * total cells, it will | 485 // If we have more than gMaxAllowedOverflowingCellRatio * total cells, it will |
477 // be empty and m_forceSlowPaintPathWithOverflowingCell will be set to save | 486 // be empty and m_forceSlowPaintPathWithOverflowingCell will be set to save |
478 // memory. | 487 // memory. |
479 HashSet<LayoutTableCell*> m_overflowingCells; | 488 HashSet<const LayoutTableCell*> m_overflowingCells; |
480 bool m_forceSlowPaintPathWithOverflowingCell; | 489 bool m_forceSlowPaintPathWithOverflowingCell; |
481 | 490 |
482 // This boolean tracks if we have cells overlapping due to rowspan / colspan | 491 // This boolean tracks if we have cells overlapping due to rowspan / colspan |
483 // (see class comment above about when it could appear). | 492 // (see class comment above about when it could appear). |
484 // | 493 // |
485 // The use is to disable a painting optimization where we just paint the | 494 // The use is to disable a painting optimization where we just paint the |
486 // invalidated cells. | 495 // invalidated cells. |
487 bool m_hasMultipleCellLevels; | 496 bool m_hasMultipleCellLevels; |
488 | 497 |
489 // Whether any cell spans multiple rows or cols. | 498 // Whether any cell spans multiple rows or cols. |
490 bool m_hasSpanningCells; | 499 bool m_hasSpanningCells; |
491 }; | 500 }; |
492 | 501 |
493 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableSection, isTableSection()); | 502 DEFINE_LAYOUT_OBJECT_TYPE_CASTS(LayoutTableSection, isTableSection()); |
494 | 503 |
495 } // namespace blink | 504 } // namespace blink |
496 | 505 |
497 #endif // LayoutTableSection_h | 506 #endif // LayoutTableSection_h |
OLD | NEW |