| // Copyright 2016 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 NGLineBuilder_h |
| #define NGLineBuilder_h |
| |
| #include "core/CoreExport.h" |
| #include "core/layout/ng/ng_physical_fragment.h" |
| #include "core/layout/ng/ng_units.h" |
| #include "platform/heap/Handle.h" |
| #include "wtf/Vector.h" |
| |
| namespace blink { |
| |
| class NGConstraintSpace; |
| class NGFragmentBuilder; |
| class NGInlineNode; |
| |
| // NGLineBuilder creates the fragment tree for a line. |
| class CORE_EXPORT NGLineBuilder final |
| : public GarbageCollectedFinalized<NGLineBuilder> { |
| public: |
| NGLineBuilder(NGInlineNode*, const NGConstraintSpace*); |
| |
| // Add a range of NGLayoutInlineItem to the line in the logical order. |
| void Add(unsigned start_index, unsigned end_index, LayoutUnit inline_size); |
| |
| // Create a line from items added by |Add()|. |
| void CreateLine(); |
| |
| // Create fragments for lines created by |CreateLine()|. |
| void CreateFragments(NGFragmentBuilder*); |
| |
| // Copy fragment data of all lines created by this NGLineBuilder to |
| // LayoutBlockFlow. |
| // This must run after |CreateFragments()|, and after the fragments it created |
| // are placed. |
| void CopyFragmentDataToLayoutBlockFlow(); |
| |
| DECLARE_VIRTUAL_TRACE(); |
| |
| private: |
| void BidiReorder(); |
| |
| struct LineItemChunk { |
| unsigned start_index; |
| unsigned end_index; |
| LayoutUnit inline_size; |
| }; |
| |
| // LineBoxData is a set of data for a line box that are computed in early |
| // phases, such as in |CreateLine()|, and will be used in later phases. |
| // TODO(kojii): Not sure if all these data are needed in fragment tree. If |
| // they are, we can create a linebox fragment, store them there, and this |
| // isn't needed. For now, we're trying to minimize data in fragments. |
| struct LineBoxData { |
| unsigned fragment_end; |
| LayoutUnit inline_size; |
| }; |
| |
| Member<NGInlineNode> inline_box_; |
| Member<const NGConstraintSpace> constraint_space_; |
| Vector<RefPtr<NGPhysicalFragment>, 32> fragments_; |
| Vector<NGLogicalOffset, 32> offsets_; |
| Vector<LineItemChunk, 32> line_item_chunks_; |
| Vector<LineBoxData, 32> line_box_data_list_; |
| LayoutUnit content_size_; |
| LayoutUnit max_inline_size_; |
| |
| #if DCHECK_IS_ON() |
| unsigned is_bidi_reordered_ : 1; |
| #endif |
| }; |
| |
| } // namespace blink |
| |
| #endif // NGLineBuilder_h |