| 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 ToLayoutNGBlockFlow(GetLayoutBlockFlow())->ResetNGInlineNodeData(); | 185 ToLayoutNGBlockFlow(GetLayoutBlockFlow())->ResetNGInlineNodeData(); |
| 186 MutableData().start_inline_ = start_inline; | 186 MutableData().start_inline_ = start_inline; |
| 187 MutableData().text_content_ = String(); | 187 MutableData().text_content_ = String(); |
| 188 MutableData().items_.clear(); | 188 MutableData().items_.clear(); |
| 189 } | 189 } |
| 190 | 190 |
| 191 void NGInlineNode::PrepareLayout() { | 191 void NGInlineNode::PrepareLayout() { |
| 192 // Scan list of siblings collecting all in-flow non-atomic inlines. A single | 192 // Scan list of siblings collecting all in-flow non-atomic inlines. A single |
| 193 // NGInlineNode represent a collection of adjacent non-atomic inlines. | 193 // NGInlineNode represent a collection of adjacent non-atomic inlines. |
| 194 CollectInlines(Data().start_inline_, GetLayoutBlockFlow()); | 194 CollectInlines(Data().start_inline_, GetLayoutBlockFlow()); |
| 195 if (Data().is_bidi_enabled_) | 195 SegmentText(); |
| 196 SegmentText(); | |
| 197 ShapeText(); | 196 ShapeText(); |
| 198 } | 197 } |
| 199 | 198 |
| 200 // Depth-first-scan of all LayoutInline and LayoutText nodes that make up this | 199 // Depth-first-scan of all LayoutInline and LayoutText nodes that make up this |
| 201 // NGInlineNode object. Collects LayoutText items, merging them up into the | 200 // NGInlineNode object. Collects LayoutText items, merging them up into the |
| 202 // parent LayoutInline where possible, and joining all text content in a single | 201 // parent LayoutInline where possible, and joining all text content in a single |
| 203 // string to allow bidi resolution and shaping of the entire block. | 202 // string to allow bidi resolution and shaping of the entire block. |
| 204 void NGInlineNode::CollectInlines(LayoutObject* start, LayoutBlockFlow* block) { | 203 void NGInlineNode::CollectInlines(LayoutObject* start, LayoutBlockFlow* block) { |
| 205 DCHECK(Data().text_content_.IsNull()); | 204 DCHECK(Data().text_content_.IsNull()); |
| 206 DCHECK(Data().items_.IsEmpty()); | 205 DCHECK(Data().items_.IsEmpty()); |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 275 return nullptr; | 274 return nullptr; |
| 276 DCHECK(node->IsInline()); | 275 DCHECK(node->IsInline()); |
| 277 builder->ExitInline(node); | 276 builder->ExitInline(node); |
| 278 node->ClearNeedsLayout(); | 277 node->ClearNeedsLayout(); |
| 279 } | 278 } |
| 280 } | 279 } |
| 281 return nullptr; | 280 return nullptr; |
| 282 } | 281 } |
| 283 | 282 |
| 284 void NGInlineNode::SegmentText() { | 283 void NGInlineNode::SegmentText() { |
| 285 // TODO(kojii): Move this to caller, this will be used again after line break. | 284 NGInlineNodeData& data = MutableData(); |
| 286 NGBidiParagraph bidi; | 285 if (!data.is_bidi_enabled_) { |
| 287 MutableData().text_content_.Ensure16Bit(); | 286 data.SetBaseDirection(TextDirection::kLtr); |
| 288 if (!bidi.SetParagraph(Data().text_content_, Style())) { | |
| 289 // On failure, give up bidi resolving and reordering. | |
| 290 MutableData().is_bidi_enabled_ = false; | |
| 291 return; | |
| 292 } | |
| 293 if (bidi.Direction() == UBIDI_LTR) { | |
| 294 // All runs are LTR, no need to reorder. | |
| 295 MutableData().is_bidi_enabled_ = false; | |
| 296 return; | 287 return; |
| 297 } | 288 } |
| 298 | 289 |
| 299 Vector<NGInlineItem>& items = MutableData().items_; | 290 NGBidiParagraph bidi; |
| 291 data.text_content_.Ensure16Bit(); |
| 292 if (!bidi.SetParagraph(data.text_content_, Style())) { |
| 293 // On failure, give up bidi resolving and reordering. |
| 294 data.is_bidi_enabled_ = false; |
| 295 data.SetBaseDirection(TextDirection::kLtr); |
| 296 return; |
| 297 } |
| 298 |
| 299 data.SetBaseDirection(bidi.BaseDirection()); |
| 300 |
| 301 if (bidi.IsAllLtr()) { |
| 302 // All runs are LTR, no need to reorder. |
| 303 data.is_bidi_enabled_ = false; |
| 304 return; |
| 305 } |
| 306 |
| 307 Vector<NGInlineItem>& items = data.items_; |
| 300 unsigned item_index = 0; | 308 unsigned item_index = 0; |
| 301 for (unsigned start = 0; start < Data().text_content_.length();) { | 309 for (unsigned start = 0; start < Data().text_content_.length();) { |
| 302 UBiDiLevel level; | 310 UBiDiLevel level; |
| 303 unsigned end = bidi.GetLogicalRun(start, &level); | 311 unsigned end = bidi.GetLogicalRun(start, &level); |
| 304 DCHECK_EQ(items[item_index].start_offset_, start); | 312 DCHECK_EQ(items[item_index].start_offset_, start); |
| 305 item_index = NGInlineItem::SetBidiLevel(items, item_index, end, level); | 313 item_index = NGInlineItem::SetBidiLevel(items, item_index, end, level); |
| 306 start = end; | 314 start = end; |
| 307 } | 315 } |
| 308 DCHECK_EQ(item_index, items.size()); | 316 DCHECK_EQ(item_index, items.size()); |
| 309 } | 317 } |
| (...skipping 208 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 518 item.Style() == item.GetLayoutObject()->Style()); | 526 item.Style() == item.GetLayoutObject()->Style()); |
| 519 } | 527 } |
| 520 #endif | 528 #endif |
| 521 } | 529 } |
| 522 | 530 |
| 523 String NGInlineNode::ToString() const { | 531 String NGInlineNode::ToString() const { |
| 524 return String::Format("NGInlineNode"); | 532 return String::Format("NGInlineNode"); |
| 525 } | 533 } |
| 526 | 534 |
| 527 } // namespace blink | 535 } // namespace blink |
| OLD | NEW |