| OLD | NEW |
| (Empty) |
| 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 | |
| 3 // found in the LICENSE file. | |
| 4 | |
| 5 #ifndef NGLineBuilder_h | |
| 6 #define NGLineBuilder_h | |
| 7 | |
| 8 #include "core/CoreExport.h" | |
| 9 #include "core/layout/ng/geometry/ng_logical_offset.h" | |
| 10 #include "core/layout/ng/ng_constraint_space_builder.h" | |
| 11 #include "core/layout/ng/ng_fragment_builder.h" | |
| 12 #include "core/layout/ng/ng_line_height_metrics.h" | |
| 13 #include "platform/fonts/FontBaseline.h" | |
| 14 #include "platform/heap/Handle.h" | |
| 15 #include "wtf/Vector.h" | |
| 16 | |
| 17 namespace blink { | |
| 18 | |
| 19 class NGConstraintSpace; | |
| 20 class NGInlineNode; | |
| 21 class NGLayoutInlineItem; | |
| 22 class NGLineBoxFragmentBuilder; | |
| 23 class NGTextFragmentBuilder; | |
| 24 | |
| 25 // NGLineBuilder creates the fragment tree for a line. | |
| 26 // NGLineBuilder manages the current line as a range, |start| and |end|. | |
| 27 // |end| can be extended multiple times before creating a line, usually until | |
| 28 // |!CanFitOnLine()|. | |
| 29 // |SetBreakOpportunity| can mark the last confirmed offset that can fit. | |
| 30 class CORE_EXPORT NGLineBuilder final { | |
| 31 STACK_ALLOCATED(); | |
| 32 | |
| 33 public: | |
| 34 NGLineBuilder(NGInlineNode*, NGConstraintSpace*); | |
| 35 | |
| 36 const NGConstraintSpace& ConstraintSpace() const { | |
| 37 return *constraint_space_; | |
| 38 } | |
| 39 | |
| 40 LayoutUnit MaxInlineSize() const { return max_inline_size_; } | |
| 41 | |
| 42 // Returns if the current items fit on a line. | |
| 43 bool CanFitOnLine() const; | |
| 44 | |
| 45 // Returns if there were any items. | |
| 46 bool HasItems() const; | |
| 47 | |
| 48 // Set the start offset. | |
| 49 // Set the end as well, and therefore empties the current line. | |
| 50 void SetStart(unsigned index, unsigned offset); | |
| 51 | |
| 52 // Set the end offset. | |
| 53 void SetEnd(unsigned end_offset); | |
| 54 | |
| 55 // Set the end offset if caller knows the inline size since the current end. | |
| 56 void SetEnd(unsigned index, | |
| 57 unsigned end_offset, | |
| 58 LayoutUnit inline_size_since_current_end); | |
| 59 | |
| 60 // Create a line up to the end offset. | |
| 61 // Then set the start to the end offset, and thus empty the current line. | |
| 62 void CreateLine(); | |
| 63 | |
| 64 // Returns if a break opportunity was set on the current line. | |
| 65 bool HasBreakOpportunity() const; | |
| 66 | |
| 67 // Returns if there were items after the last break opportunity. | |
| 68 bool HasItemsAfterLastBreakOpportunity() const; | |
| 69 | |
| 70 // Set the break opportunity at the current end offset. | |
| 71 void SetBreakOpportunity(); | |
| 72 | |
| 73 // Create a line up to the last break opportunity. | |
| 74 // Items after that are sent to the next line. | |
| 75 void CreateLineUpToLastBreakOpportunity(); | |
| 76 | |
| 77 // Set the start offset of hangables; e.g., spaces or hanging punctuations. | |
| 78 // Hangable characters can go beyond the right margin, and are ignored for | |
| 79 // center/right alignment. | |
| 80 void SetStartOfHangables(unsigned offset); | |
| 81 | |
| 82 // Create fragments for all lines created so far. | |
| 83 RefPtr<NGLayoutResult> CreateFragments(); | |
| 84 | |
| 85 // Copy fragment data of all lines created by this NGLineBuilder to | |
| 86 // LayoutBlockFlow. | |
| 87 // This must run after |CreateFragments()|, and after the fragments it created | |
| 88 // are placed. | |
| 89 void CopyFragmentDataToLayoutBlockFlow(); | |
| 90 | |
| 91 // Compute inline size of an NGLayoutInlineItem. | |
| 92 // Same as NGLayoutInlineItem::InlineSize(), except that this function can | |
| 93 // compute atomic inlines by performing layout. | |
| 94 LayoutUnit InlineSize(const NGLayoutInlineItem&); | |
| 95 | |
| 96 private: | |
| 97 bool IsHorizontalWritingMode() const { return is_horizontal_writing_mode_; } | |
| 98 | |
| 99 LayoutUnit InlineSize(const NGLayoutInlineItem&, | |
| 100 unsigned start_offset, | |
| 101 unsigned end_offset); | |
| 102 LayoutUnit InlineSizeFromLayout(const NGLayoutInlineItem&); | |
| 103 const NGLayoutResult* LayoutItem(const NGLayoutInlineItem&); | |
| 104 | |
| 105 struct LineItemChunk { | |
| 106 unsigned index; | |
| 107 unsigned start_offset; | |
| 108 unsigned end_offset; | |
| 109 LayoutUnit inline_size; | |
| 110 }; | |
| 111 | |
| 112 void BidiReorder(Vector<LineItemChunk, 32>*); | |
| 113 | |
| 114 // Lays out the inline float. | |
| 115 // List of actions: | |
| 116 // - tries to position the float right away if we have enough space. | |
| 117 // - updates the current_opportunity if we actually place the float. | |
| 118 // - if it's too wide then we add the float to the unpositioned list so it can | |
| 119 // be positioned after we're done with the current line. | |
| 120 void LayoutAndPositionFloat(LayoutUnit end_position, LayoutObject*); | |
| 121 | |
| 122 void PlaceItems(const Vector<LineItemChunk, 32>&); | |
| 123 void AccumulateUsedFonts(const NGLayoutInlineItem&, | |
| 124 const LineItemChunk&, | |
| 125 NGLineBoxFragmentBuilder*); | |
| 126 LayoutUnit PlaceAtomicInline(const NGLayoutInlineItem&, | |
| 127 LayoutUnit estimated_baseline, | |
| 128 NGLineBoxFragmentBuilder*, | |
| 129 NGTextFragmentBuilder*); | |
| 130 | |
| 131 // Finds the next layout opportunity for the next text fragment. | |
| 132 void FindNextLayoutOpportunity(); | |
| 133 | |
| 134 Persistent<NGInlineNode> inline_box_; | |
| 135 NGConstraintSpace* constraint_space_; // Not owned as STACK_ALLOCATED. | |
| 136 Vector<RefPtr<NGLayoutResult>, 32> layout_results_; | |
| 137 unsigned start_index_ = 0; | |
| 138 unsigned start_offset_ = 0; | |
| 139 unsigned last_index_ = 0; | |
| 140 unsigned end_offset_ = 0; | |
| 141 unsigned last_break_opportunity_index_ = 0; | |
| 142 unsigned last_break_opportunity_offset_ = 0; | |
| 143 LayoutUnit end_position_; | |
| 144 LayoutUnit last_break_opportunity_position_; | |
| 145 LayoutUnit content_size_; | |
| 146 LayoutUnit max_inline_size_; | |
| 147 NGFragmentBuilder container_builder_; | |
| 148 RefPtr<NGLayoutResult> container_layout_result_; | |
| 149 FontBaseline baseline_type_ = FontBaseline::AlphabeticBaseline; | |
| 150 | |
| 151 NGLogicalOffset bfc_offset_; | |
| 152 NGLogicalRect current_opportunity_; | |
| 153 | |
| 154 unsigned is_horizontal_writing_mode_ : 1; | |
| 155 | |
| 156 NGConstraintSpaceBuilder space_builder_; | |
| 157 #if DCHECK_IS_ON() | |
| 158 unsigned is_bidi_reordered_ : 1; | |
| 159 #endif | |
| 160 }; | |
| 161 | |
| 162 } // namespace blink | |
| 163 | |
| 164 #endif // NGLineBuilder_h | |
| OLD | NEW |