Index: third_party/WebKit/Source/core/paint/TableCollapsedBorderPainter.h |
diff --git a/third_party/WebKit/Source/core/paint/TableCollapsedBorderPainter.h b/third_party/WebKit/Source/core/paint/TableCollapsedBorderPainter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..a35edfb8bd7b9b0e81524cab32daec902246c8bf |
--- /dev/null |
+++ b/third_party/WebKit/Source/core/paint/TableCollapsedBorderPainter.h |
@@ -0,0 +1,240 @@ |
+// Copyright 2014 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+#ifndef TableCollapsedBorderPainter_h |
+#define TableCollapsedBorderPainter_h |
+#include "core/layout/LayoutTableSection.h" // for LayoutTableSection::CellStruct |
+#include "core/style/BorderValue.h" |
+#include "core/style/CollapsedBorderValue.h" |
+#include "platform/graphics/paint/DisplayItem.h" |
+#include "platform/wtf/Allocator.h" |
+namespace blink { |
+struct PaintInfo; |
+class CellSpan; |
+class BorderValue; |
+class LayoutPoint; |
+class LayoutTable; |
+class LayoutTableCell; |
+class LayoutTableCol; |
+class LayoutTableRow; |
+class LayoutTableSection; |
+/* |
+ * * Paints all the borders inside a single section |
+ * */ |
+class TableCollapsedBorderPainter { |
+ STACK_ALLOCATED(); |
+ |
+ public: |
+ TableCollapsedBorderPainter(const LayoutTableSection* layoutTableSection) |
+ : layout_table_section_(layoutTableSection) { |
+ hidden_border_.SetStyle(kBorderStyleNone); |
+ } |
+ TableCollapsedBorderPainter() : layout_table_section_(nullptr) { |
+ hidden_border_.SetStyle(kBorderStyleNone); |
+ } |
+ void PaintBorders(const PaintInfo&, |
+ const LayoutPoint&, |
+ const CellSpan&, |
+ const CellSpan&, |
+ const TableCollapsedBorderPainter& previous_painter); |
+ struct EdgeRecord { |
+ EdgeRecord() : precedence_(kBorderPrecedenceOff){}; |
+ EdgeRecord(const BorderValue& border, |
+ EBorderPrecedence precedence, |
+ Color resolved_color) |
+ : precedence_(precedence), |
+ border_(border), |
+ resolved_color_(resolved_color){}; |
+ EBorderPrecedence precedence_; |
+ BorderValue border_; |
+ Color resolved_color_; |
+ }; |
+ // Ordered by winning order, do not modify |
+ enum EdgeDirection { North, West, East, South, None }; |
+ |
+ private: |
+ // Represents a visible edge in a table |
+ struct VisibleEdgeRecord { |
+ VisibleEdgeRecord(unsigned row, |
+ unsigned column, |
+ EdgeDirection direction, |
+ const BorderValue& border, |
+ EBorderPrecedence precedence, |
+ Color resolved_color, |
+ bool force_removal = false) |
+ : m_row(row), |
+ m_column(column), |
+ direction_(direction), |
+ precedence_(precedence), |
+ border_(border), |
+ resolved_color_(resolved_color), |
+ force_removal_(force_removal){}; |
+ unsigned m_row; |
+ unsigned m_column; |
+ EdgeDirection direction_; |
+ EBorderPrecedence precedence_; |
+ BorderValue border_; |
+ Color resolved_color_; |
+ bool force_removal_; |
+ }; |
+ typedef Vector<VisibleEdgeRecord> VisibleEdgeContainer; |
+ typedef Vector<EdgeRecord> EdgeRecordContainer; |
+ // Represents edge intersection |
+ struct Intersection { |
+ Intersection() : width_(0), height_(0), direction_(None){}; |
+ Intersection(LayoutUnit width, LayoutUnit height, EdgeDirection direction) |
+ : width_(width), height_(height), direction_(direction){}; |
+ LayoutUnit width_; // width of widest north-south edge |
+ LayoutUnit height_; // width of widest east-west edge |
+ EdgeDirection direction_; // direction of the winning edge |
+ }; |
+ typedef Vector<Intersection> IntersectionContainer; |
+ void InitEdges(const CellSpan&, |
+ const CellSpan&, |
+ const TableCollapsedBorderPainter& previous_painter); |
+ void PopulateEdges(const CellSpan&, |
+ const CellSpan&, |
+ const TableCollapsedBorderPainter& previous_painter); |
+ // Visible edges traversal |
+ void GetVisibleEdgesTable(VisibleEdgeContainer& edges, const LayoutTable*); |
+ void GetVisibleEdgesSection(VisibleEdgeContainer& edges); |
+ void GetVisibleEdgesColgroup(VisibleEdgeContainer& edges, |
+ const LayoutTableCol*); |
+ void GetVisibleEdgesCol(VisibleEdgeContainer& edges, const LayoutTableCol*); |
+ void GetVisibleEdgesRow(VisibleEdgeContainer& edges, const LayoutTableRow*); |
+ void GetVisibleEdgesCell(VisibleEdgeContainer& edges, |
+ const LayoutTableCell*, |
+ TextDirection); |
+ void GetVisibleEdgesSiblingSection( |
+ VisibleEdgeContainer& edges, |
+ const TableCollapsedBorderPainter& previous_painter); |
+ // Visible edges utils |
+ void RotateBorders(TextDirection, |
+ WritingMode, |
+ const BorderValue** top_border, |
+ const BorderValue** right_border, |
+ const BorderValue** bottom_border, |
+ const BorderValue** left_border) const; |
+ void FillVisibleRect(VisibleEdgeContainer& edges, |
+ unsigned startRow, |
+ unsigned start_column, |
+ unsigned end_row, |
+ unsigned end_column, |
+ const ComputedStyle* border_style, |
+ TextDirection, |
+ WritingMode, |
+ Color resolved_color, |
+ EBorderPrecedence); |
+ void FillHorizontalEdges(VisibleEdgeContainer& edges, |
+ unsigned row, |
+ unsigned start_column, |
+ unsigned end_column, |
+ const BorderValue&, |
+ EBorderPrecedence, |
+ Color resolved_color); |
+ void FillVerticalEdges(VisibleEdgeContainer& edges, |
+ unsigned column, |
+ unsigned startRow, |
+ unsigned end_row, |
+ const BorderValue&, |
+ EBorderPrecedence, |
+ Color resolved_color); |
+ void MergeVisibleEdges(VisibleEdgeContainer& edges); |
+ void InitIntersections(); |
+ void InitIntersection(unsigned row, unsigned col); |
+ LayoutRect GetCellPhysicalPosition(unsigned row, unsigned effective_column) { |
+ DCHECK(row != npos && effective_column != npos); |
+ return layout_table_section_->GetCellPhysicalPosition(row, |
+ effective_column); |
+ }; |
+ // Painting |
+ LayoutRect CellRectAsBorder(const LayoutRect& cell_rect, |
+ BoxSide, |
+ unsigned border_width, |
+ WritingMode, |
+ TextDirection); |
+ LayoutRect EdgePaintPosition(unsigned row, |
+ unsigned col, |
+ unsigned border_width, |
+ EdgeDirection, |
+ WritingMode, |
+ TextDirection); |
+ void PaintEdges(const PaintInfo&, |
+ const LayoutPoint&, |
+ const CellSpan& rows, |
+ const CellSpan& cols); |
+ void PaintOneEdge(const PaintInfo&, |
+ const LayoutPoint&, |
+ unsigned row, |
+ unsigned col, |
+ EdgeDirection, |
+ WritingMode, |
+ TextDirection); |
+ void AdjustForIntersections(LayoutRect& position, |
+ unsigned row, |
+ unsigned col, |
+ EdgeDirection, |
+ WritingMode, |
+ TextDirection); |
+ void AdjustForIntersectionsHorizontal(LayoutRect& position, |
+ EdgeDirection, |
+ bool isLTR, |
+ const Intersection* start_intersection, |
+ bool winner_start, |
+ const Intersection* end_intersection, |
+ bool winner_end); |
+ void AdjustForIntersectionsFlippedBlocks( |
+ LayoutRect& position, |
+ EdgeDirection, |
+ bool isLTR, |
+ const Intersection* start_intersection, |
+ bool winner_start, |
+ const Intersection* end_intersection, |
+ bool winner_end); |
+ void AdjustForIntersectionsFlippedLines( |
+ LayoutRect& position, |
+ EdgeDirection, |
+ bool isLTR, |
+ const Intersection* start_intersection, |
+ bool winner_start, |
+ const Intersection* end_intersection, |
+ bool winner_end); |
+ void ShowEdge(unsigned row, |
+ unsigned col, |
+ EdgeDirection, |
+ EBorderPrecedence, |
+ const BorderValue&, |
+ Color) const; |
+ void ShowEdges(bool showHidden = false) const; |
+ void ShowVisibleEdges(const VisibleEdgeContainer& edges) const; |
+ void ShowIntersections() const; |
+ void ShowIntersection(unsigned row, unsigned col) const; |
+ |
+ // Edges: |
+ // Mental model for edges is that they originate at intersections (where cells |
+ // meet) We store two edges for each intersection: East and South. We only |
+ // store visible edges, not all edges in a section. |
+ EdgeRecordContainer edges_; |
+ // Limits for rows/cols stored in edges_. effective |
+ unsigned start_visible_row_; |
+ unsigned start_visible_column_; |
+ unsigned end_visible_row_; // inclusive, +1 is out of bounds |
+ unsigned end_visible_column_; // inclusive, +1 is out of bounds |
+ // not-a-position edge index |
+ static const unsigned npos = 0xFFFFFFFF; |
+ // returns edge index for position, npos for none |
+ unsigned EdgeToIndex(unsigned row, unsigned column, EdgeDirection) const; |
+ // Intersections: |
+ // Each intersection has width, height, and winning border |
+ IntersectionContainer intersections_; |
+ unsigned max_intersection_width_; |
+ unsigned max_intersection_height_; |
+ unsigned IntersectionToIndex(unsigned row, unsigned column) const; |
+ const LayoutTableSection* layout_table_section_; |
+ // number of rows/cols in the section |
+ unsigned num_rows_; |
+ unsigned num_effective_columns_; |
+ BorderValue hidden_border_; |
+}; |
+} // namespace blink |
+#endif // TableCollapsedBorderPainter_h |