OLD | NEW |
1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/layout/ng/inline/ng_inline_node.h" | 5 #include "core/layout/ng/inline/ng_inline_node.h" |
6 | 6 |
7 #include "core/layout/BidiRun.h" | 7 #include "core/layout/BidiRun.h" |
8 #include "core/layout/LayoutBlockFlow.h" | 8 #include "core/layout/LayoutBlockFlow.h" |
9 #include "core/layout/LayoutObject.h" | 9 #include "core/layout/LayoutObject.h" |
10 #include "core/layout/LayoutText.h" | 10 #include "core/layout/LayoutText.h" |
(...skipping 19 matching lines...) Expand all Loading... |
30 #include "platform/fonts/shaping/HarfBuzzShaper.h" | 30 #include "platform/fonts/shaping/HarfBuzzShaper.h" |
31 #include "platform/wtf/text/CharacterNames.h" | 31 #include "platform/wtf/text/CharacterNames.h" |
32 | 32 |
33 namespace blink { | 33 namespace blink { |
34 | 34 |
35 namespace { | 35 namespace { |
36 | 36 |
37 struct FragmentPosition { | 37 struct FragmentPosition { |
38 NGLogicalOffset offset; | 38 NGLogicalOffset offset; |
39 LayoutUnit inline_size; | 39 LayoutUnit inline_size; |
| 40 NGBorderEdges border_edges; |
40 }; | 41 }; |
41 | 42 |
42 // Create BidiRuns from a list of NGPhysicalFragment. | 43 // Create BidiRuns from a list of NGPhysicalFragment. |
43 // Produce a FragmentPosition map to place InlineBoxes. | 44 // Produce a FragmentPosition map to place InlineBoxes. |
44 void CreateBidiRuns(BidiRunList<BidiRun>* bidi_runs, | 45 void CreateBidiRuns(BidiRunList<BidiRun>* bidi_runs, |
45 const Vector<RefPtr<NGPhysicalFragment>>& children, | 46 const Vector<RefPtr<NGPhysicalFragment>>& children, |
46 const NGConstraintSpace& constraint_space, | 47 const NGConstraintSpace& constraint_space, |
47 NGLogicalOffset parent_offset, | 48 NGLogicalOffset parent_offset, |
48 const Vector<NGInlineItem>& items, | 49 const Vector<NGInlineItem>& items, |
49 const Vector<unsigned, 32>& text_offsets, | 50 const Vector<unsigned, 32>& text_offsets, |
(...skipping 28 matching lines...) Expand all Loading... |
78 // One LayoutText may produce multiple text fragments that they can't | 79 // One LayoutText may produce multiple text fragments that they can't |
79 // be set to a map. | 80 // be set to a map. |
80 positions_for_bidi_runs_out->push_back(FragmentPosition{ | 81 positions_for_bidi_runs_out->push_back(FragmentPosition{ |
81 fragment.Offset() + parent_offset, fragment.InlineSize()}); | 82 fragment.Offset() + parent_offset, fragment.InlineSize()}); |
82 } else { | 83 } else { |
83 DCHECK_EQ(child->Type(), NGPhysicalFragment::kFragmentBox); | 84 DCHECK_EQ(child->Type(), NGPhysicalFragment::kFragmentBox); |
84 NGPhysicalBoxFragment* physical_fragment = | 85 NGPhysicalBoxFragment* physical_fragment = |
85 ToNGPhysicalBoxFragment(child.Get()); | 86 ToNGPhysicalBoxFragment(child.Get()); |
86 NGBoxFragment fragment(constraint_space.WritingMode(), physical_fragment); | 87 NGBoxFragment fragment(constraint_space.WritingMode(), physical_fragment); |
87 NGLogicalOffset child_offset = fragment.Offset() + parent_offset; | 88 NGLogicalOffset child_offset = fragment.Offset() + parent_offset; |
88 CreateBidiRuns(bidi_runs, physical_fragment->Children(), constraint_space, | 89 if (physical_fragment->Children().size()) { |
89 child_offset, items, text_offsets, | 90 CreateBidiRuns(bidi_runs, physical_fragment->Children(), |
90 positions_for_bidi_runs_out, positions_out); | 91 constraint_space, child_offset, items, text_offsets, |
| 92 positions_for_bidi_runs_out, positions_out); |
| 93 } else { |
| 94 // An empty inline needs a BidiRun for itself. |
| 95 LayoutObject* layout_object = physical_fragment->GetLayoutObject(); |
| 96 BidiRun* run = new BidiRun(0, 1, 0, LineLayoutItem(layout_object)); |
| 97 bidi_runs->AddRun(run); |
| 98 } |
91 // Store box fragments in a map by LineLayoutItem. | 99 // Store box fragments in a map by LineLayoutItem. |
92 positions_out->Set(LineLayoutItem(child->GetLayoutObject()), | 100 positions_out->Set(LineLayoutItem(child->GetLayoutObject()), |
93 FragmentPosition{child_offset, fragment.InlineSize()}); | 101 FragmentPosition{child_offset, fragment.InlineSize(), |
| 102 fragment.BorderEdges()}); |
94 } | 103 } |
95 } | 104 } |
96 } | 105 } |
97 | 106 |
98 // Set the geometry to InlineBoxes by using the FragmentPosition map. | 107 // Set the geometry to InlineBoxes by using the FragmentPosition map. |
99 // When the map doesn't provide positions; i.e., when InlineFlowBox doesn't have | 108 // When the map doesn't provide positions; i.e., when InlineFlowBox doesn't have |
100 // corresponding box fragment, compute the union of children. | 109 // corresponding box fragment, compute the union of children. |
101 unsigned PlaceInlineBoxChildren( | 110 unsigned PlaceInlineBoxChildren( |
102 InlineFlowBox* parent, | 111 InlineFlowBox* parent, |
103 const Vector<FragmentPosition, 32>& positions_for_bidi_runs, | 112 const Vector<FragmentPosition, 32>& positions_for_bidi_runs, |
104 const HashMap<LineLayoutItem, FragmentPosition>& positions, | 113 const HashMap<LineLayoutItem, FragmentPosition>& positions, |
105 unsigned text_index = 0, | 114 unsigned text_index = 0, |
106 bool set_parent_position_from_children = false) { | 115 bool set_parent_position_from_children = false) { |
107 LayoutUnit logical_left = LayoutUnit::Max(); | 116 LayoutUnit logical_left = LayoutUnit::Max(); |
108 LayoutUnit logical_right = LayoutUnit::Min(); | 117 LayoutUnit logical_right = LayoutUnit::Min(); |
109 LayoutUnit logical_top = LayoutUnit::Max(); | 118 LayoutUnit logical_top = LayoutUnit::Max(); |
110 for (InlineBox* inline_box = parent->FirstChild(); inline_box; | 119 for (InlineBox* inline_box = parent->FirstChild(); inline_box; |
111 inline_box = inline_box->NextOnLine()) { | 120 inline_box = inline_box->NextOnLine()) { |
112 if (inline_box->IsInlineFlowBox()) { | 121 if (inline_box->IsInlineFlowBox()) { |
| 122 InlineFlowBox* flow_box = ToInlineFlowBox(inline_box); |
113 const auto& iter = positions.find(inline_box->GetLineLayoutItem()); | 123 const auto& iter = positions.find(inline_box->GetLineLayoutItem()); |
114 if (iter != positions.end()) { | 124 if (iter != positions.end()) { |
115 const FragmentPosition& position = iter->value; | 125 const FragmentPosition& position = iter->value; |
116 inline_box->SetLogicalLeft(position.offset.inline_offset); | 126 inline_box->SetLogicalLeft(position.offset.inline_offset); |
117 inline_box->SetLogicalTop(position.offset.block_offset); | 127 inline_box->SetLogicalTop(position.offset.block_offset); |
118 inline_box->SetLogicalWidth(position.inline_size); | 128 inline_box->SetLogicalWidth(position.inline_size); |
| 129 flow_box->SetEdges(position.border_edges.line_left, |
| 130 position.border_edges.line_right); |
119 } | 131 } |
120 | 132 |
121 text_index = PlaceInlineBoxChildren(ToInlineFlowBox(inline_box), | 133 text_index = |
122 positions_for_bidi_runs, positions, | 134 PlaceInlineBoxChildren(flow_box, positions_for_bidi_runs, positions, |
123 text_index, iter == positions.end()); | 135 text_index, iter == positions.end()); |
124 } else { | 136 } else { |
125 const FragmentPosition& position = positions_for_bidi_runs[text_index++]; | 137 const FragmentPosition& position = positions_for_bidi_runs[text_index++]; |
126 inline_box->SetLogicalLeft(position.offset.inline_offset); | 138 inline_box->SetLogicalLeft(position.offset.inline_offset); |
127 inline_box->SetLogicalTop(position.offset.block_offset); | 139 inline_box->SetLogicalTop(position.offset.block_offset); |
128 inline_box->SetLogicalWidth(position.inline_size); | 140 inline_box->SetLogicalWidth(position.inline_size); |
129 if (inline_box->GetLineLayoutItem().IsBox()) { | 141 if (inline_box->GetLineLayoutItem().IsBox()) { |
130 LineLayoutBox box(inline_box->GetLineLayoutItem()); | 142 LineLayoutBox box(inline_box->GetLineLayoutItem()); |
131 box.SetLocation(inline_box->Location()); | 143 box.SetLocation(inline_box->Location()); |
132 } | 144 } |
133 } | 145 } |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
488 current_text->SetTextInternal( | 500 current_text->SetTextInternal( |
489 Text(current_offset, Data().text_content_.length()).ToString().Impl()); | 501 Text(current_offset, Data().text_content_.length()).ToString().Impl()); |
490 } | 502 } |
491 } | 503 } |
492 | 504 |
493 String NGInlineNode::ToString() const { | 505 String NGInlineNode::ToString() const { |
494 return String::Format("NGInlineNode"); | 506 return String::Format("NGInlineNode"); |
495 } | 507 } |
496 | 508 |
497 } // namespace blink | 509 } // namespace blink |
OLD | NEW |