Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 /* | 1 /* |
| 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 2000 Lars Knoll (knoll@kde.org) |
| 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008 Apple Inc. All right reserved. | 3 * Copyright (C) 2003, 2004, 2006, 2007, 2008 Apple Inc. All right reserved. |
| 4 * | 4 * |
| 5 * This library is free software; you can redistribute it and/or | 5 * This library is free software; you can redistribute it and/or |
| 6 * modify it under the terms of the GNU Library General Public | 6 * modify it under the terms of the GNU Library General Public |
| 7 * License as published by the Free Software Foundation; either | 7 * License as published by the Free Software Foundation; either |
| 8 * version 2 of the License, or (at your option) any later version. | 8 * version 2 of the License, or (at your option) any later version. |
| 9 * | 9 * |
| 10 * This library is distributed in the hope that it will be useful, | 10 * This library is distributed in the hope that it will be useful, |
| (...skipping 30 matching lines...) Expand all Loading... | |
| 41 public: | 41 public: |
| 42 MidpointState() { reset(); } | 42 MidpointState() { reset(); } |
| 43 | 43 |
| 44 void reset() { | 44 void reset() { |
| 45 m_numMidpoints = 0; | 45 m_numMidpoints = 0; |
| 46 m_currentMidpoint = 0; | 46 m_currentMidpoint = 0; |
| 47 m_betweenMidpoints = false; | 47 m_betweenMidpoints = false; |
| 48 } | 48 } |
| 49 | 49 |
| 50 void startIgnoringSpaces(const Iterator& midpoint) { | 50 void startIgnoringSpaces(const Iterator& midpoint) { |
| 51 ASSERT(!(m_numMidpoints % 2)); | 51 DCHECK(!(m_numMidpoints % 2)); |
| 52 addMidpoint(midpoint); | 52 addMidpoint(midpoint); |
| 53 } | 53 } |
| 54 | 54 |
| 55 void stopIgnoringSpaces(const Iterator& midpoint) { | 55 void stopIgnoringSpaces(const Iterator& midpoint) { |
| 56 ASSERT(m_numMidpoints % 2); | 56 DCHECK(m_numMidpoints % 2); |
| 57 addMidpoint(midpoint); | 57 addMidpoint(midpoint); |
| 58 } | 58 } |
| 59 | 59 |
| 60 // Adding a pair of midpoints before a character will split it out into a new | 60 // Adding a pair of midpoints before a character will split it out into a new |
| 61 // line box. | 61 // line box. |
| 62 void ensureCharacterGetsLineBox(Iterator& textParagraphSeparator) { | 62 void ensureCharacterGetsLineBox(Iterator& textParagraphSeparator) { |
| 63 startIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), | 63 startIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), |
| 64 textParagraphSeparator.offset() - 1)); | 64 textParagraphSeparator.offset() - 1)); |
| 65 stopIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), | 65 stopIgnoringSpaces(Iterator(0, textParagraphSeparator.getLineLayoutItem(), |
| 66 textParagraphSeparator.offset())); | 66 textParagraphSeparator.offset())); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 249 void setLastStrongDir(WTF::Unicode::CharDirection lastStrongDir) { | 249 void setLastStrongDir(WTF::Unicode::CharDirection lastStrongDir) { |
| 250 m_status.lastStrong = lastStrongDir; | 250 m_status.lastStrong = lastStrongDir; |
| 251 } | 251 } |
| 252 void setEorDir(WTF::Unicode::CharDirection eorDir) { m_status.eor = eorDir; } | 252 void setEorDir(WTF::Unicode::CharDirection eorDir) { m_status.eor = eorDir; } |
| 253 | 253 |
| 254 WTF::Unicode::CharDirection dir() const { return m_direction; } | 254 WTF::Unicode::CharDirection dir() const { return m_direction; } |
| 255 void setDir(WTF::Unicode::CharDirection d) { m_direction = d; } | 255 void setDir(WTF::Unicode::CharDirection d) { m_direction = d; } |
| 256 | 256 |
| 257 const BidiStatus& status() const { return m_status; } | 257 const BidiStatus& status() const { return m_status; } |
| 258 void setStatus(const BidiStatus s) { | 258 void setStatus(const BidiStatus s) { |
| 259 ASSERT(s.context); | 259 DCHECK(s.context); |
| 260 m_status = s; | 260 m_status = s; |
| 261 m_paragraphDirectionality = s.context->dir() == WTF::Unicode::LeftToRight | 261 m_paragraphDirectionality = s.context->dir() == WTF::Unicode::LeftToRight |
| 262 ? TextDirection::kLtr | 262 ? TextDirection::kLtr |
| 263 : TextDirection::kRtl; | 263 : TextDirection::kRtl; |
| 264 } | 264 } |
| 265 | 265 |
| 266 MidpointState<Iterator>& midpointState() { return m_midpointState; } | 266 MidpointState<Iterator>& midpointState() { return m_midpointState; } |
| 267 | 267 |
| 268 // The current algorithm handles nested isolates one layer of nesting at a | 268 // The current algorithm handles nested isolates one layer of nesting at a |
| 269 // time. But when we layout each isolated span, we will walk into (and | 269 // time. But when we layout each isolated span, we will walk into (and |
| 270 // ignore) all child isolated spans. | 270 // ignore) all child isolated spans. |
| 271 void enterIsolate() { m_nestedIsolateCount++; } | 271 void enterIsolate() { m_nestedIsolateCount++; } |
| 272 void exitIsolate() { | 272 void exitIsolate() { |
| 273 ASSERT(m_nestedIsolateCount >= 1); | 273 DCHECK_GE(m_nestedIsolateCount, 1u); |
| 274 m_nestedIsolateCount--; | 274 m_nestedIsolateCount--; |
| 275 } | 275 } |
| 276 bool inIsolate() const { return m_nestedIsolateCount; } | 276 bool inIsolate() const { return m_nestedIsolateCount; } |
| 277 | 277 |
| 278 void embed(WTF::Unicode::CharDirection, BidiEmbeddingSource); | 278 void embed(WTF::Unicode::CharDirection, BidiEmbeddingSource); |
| 279 bool commitExplicitEmbedding(BidiRunList<Run>&); | 279 bool commitExplicitEmbedding(BidiRunList<Run>&); |
| 280 | 280 |
| 281 void createBidiRunsForLine(const Iterator& end, | 281 void createBidiRunsForLine(const Iterator& end, |
| 282 VisualDirectionOverride = NoVisualOverride, | 282 VisualDirectionOverride = NoVisualOverride, |
| 283 bool hardLineBreak = false, | 283 bool hardLineBreak = false, |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 377 bool* hasStrongDirectionality); | 377 bool* hasStrongDirectionality); |
| 378 | 378 |
| 379 Vector<BidiEmbedding, 8> m_currentExplicitEmbeddingSequence; | 379 Vector<BidiEmbedding, 8> m_currentExplicitEmbeddingSequence; |
| 380 HashMap<Run*, MidpointState<Iterator>> m_midpointStateForIsolatedRun; | 380 HashMap<Run*, MidpointState<Iterator>> m_midpointStateForIsolatedRun; |
| 381 }; | 381 }; |
| 382 | 382 |
| 383 #if DCHECK_IS_ON() | 383 #if DCHECK_IS_ON() |
| 384 template <class Iterator, class Run, class IsolatedRun> | 384 template <class Iterator, class Run, class IsolatedRun> |
| 385 BidiResolver<Iterator, Run, IsolatedRun>::~BidiResolver() { | 385 BidiResolver<Iterator, Run, IsolatedRun>::~BidiResolver() { |
| 386 // The owner of this resolver should have handled the isolated runs. | 386 // The owner of this resolver should have handled the isolated runs. |
| 387 ASSERT(m_isolatedRuns.isEmpty()); | 387 DCHECK(m_isolatedRuns.isEmpty()); |
| 388 ASSERT(!m_runs.runCount()); | 388 DCHECK(!m_runs.runCount()); |
| 389 } | 389 } |
| 390 #endif | 390 #endif |
| 391 | 391 |
| 392 template <class Iterator, class Run, class IsolatedRun> | 392 template <class Iterator, class Run, class IsolatedRun> |
| 393 void BidiResolver<Iterator, Run, IsolatedRun>::appendRun( | 393 void BidiResolver<Iterator, Run, IsolatedRun>::appendRun( |
| 394 BidiRunList<Run>& runs) { | 394 BidiRunList<Run>& runs) { |
| 395 if (!m_emptyRun && !m_eor.atEnd()) { | 395 if (!m_emptyRun && !m_eor.atEnd()) { |
| 396 unsigned startOffset = m_sor.offset(); | 396 unsigned startOffset = m_sor.offset(); |
| 397 unsigned endOffset = m_eor.offset(); | 397 unsigned endOffset = m_eor.offset(); |
| 398 | 398 |
| (...skipping 27 matching lines...) Expand all Loading... | |
| 426 m_direction = WTF::Unicode::OtherNeutral; | 426 m_direction = WTF::Unicode::OtherNeutral; |
| 427 m_status.eor = WTF::Unicode::OtherNeutral; | 427 m_status.eor = WTF::Unicode::OtherNeutral; |
| 428 } | 428 } |
| 429 | 429 |
| 430 template <class Iterator, class Run, class IsolatedRun> | 430 template <class Iterator, class Run, class IsolatedRun> |
| 431 void BidiResolver<Iterator, Run, IsolatedRun>::embed( | 431 void BidiResolver<Iterator, Run, IsolatedRun>::embed( |
| 432 WTF::Unicode::CharDirection dir, | 432 WTF::Unicode::CharDirection dir, |
| 433 BidiEmbeddingSource source) { | 433 BidiEmbeddingSource source) { |
| 434 // Isolated spans compute base directionality during their own UBA run. | 434 // Isolated spans compute base directionality during their own UBA run. |
| 435 // Do not insert fake embed characters once we enter an isolated span. | 435 // Do not insert fake embed characters once we enter an isolated span. |
| 436 ASSERT(!inIsolate()); | 436 DCHECK(!inIsolate()); |
| 437 using namespace WTF::Unicode; | 437 using namespace WTF::Unicode; |
| 438 | 438 |
| 439 ASSERT(dir == PopDirectionalFormat || dir == LeftToRightEmbedding || | 439 DCHECK(dir == PopDirectionalFormat || dir == LeftToRightEmbedding || |
| 440 dir == LeftToRightOverride || dir == RightToLeftEmbedding || | 440 dir == LeftToRightOverride || dir == RightToLeftEmbedding || |
| 441 dir == RightToLeftOverride); | 441 dir == RightToLeftOverride); |
| 442 m_currentExplicitEmbeddingSequence.push_back(BidiEmbedding(dir, source)); | 442 m_currentExplicitEmbeddingSequence.push_back(BidiEmbedding(dir, source)); |
| 443 } | 443 } |
| 444 | 444 |
| 445 template <class Iterator, class Run, class IsolatedRun> | 445 template <class Iterator, class Run, class IsolatedRun> |
| 446 void BidiResolver<Iterator, Run, IsolatedRun>:: | 446 void BidiResolver<Iterator, Run, IsolatedRun>:: |
| 447 checkDirectionInLowerRaiseEmbeddingLevel() { | 447 checkDirectionInLowerRaiseEmbeddingLevel() { |
| 448 using namespace WTF::Unicode; | 448 using namespace WTF::Unicode; |
| 449 | 449 |
| 450 ASSERT(m_status.eor != OtherNeutral || m_eor.atEnd()); | 450 DCHECK(m_status.eor != OtherNeutral || m_eor.atEnd()); |
| 451 ASSERT(m_status.last != NonSpacingMark && m_status.last != BoundaryNeutral && | 451 DCHECK(m_status.last != NonSpacingMark && m_status.last != BoundaryNeutral && |
|
tkent
2017/04/09 23:07:01
Split this into 7 DCHECKs.
Hwanseung Lee
2017/04/11 03:29:38
Done.
| |
| 452 m_status.last != RightToLeftEmbedding && | 452 m_status.last != RightToLeftEmbedding && |
| 453 m_status.last != LeftToRightEmbedding && | 453 m_status.last != LeftToRightEmbedding && |
| 454 m_status.last != RightToLeftOverride && | 454 m_status.last != RightToLeftOverride && |
| 455 m_status.last != LeftToRightOverride && | 455 m_status.last != LeftToRightOverride && |
| 456 m_status.last != PopDirectionalFormat); | 456 m_status.last != PopDirectionalFormat); |
| 457 if (m_direction == OtherNeutral) | 457 if (m_direction == OtherNeutral) |
| 458 m_direction = | 458 m_direction = |
| 459 m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft; | 459 m_status.lastStrong == LeftToRight ? LeftToRight : RightToLeft; |
| 460 } | 460 } |
| 461 | 461 |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 540 m_emptyRun = true; | 540 m_emptyRun = true; |
| 541 | 541 |
| 542 setLastDir(to); | 542 setLastDir(to); |
| 543 setLastStrongDir(to); | 543 setLastStrongDir(to); |
| 544 m_eor = Iterator(); | 544 m_eor = Iterator(); |
| 545 } | 545 } |
| 546 | 546 |
| 547 template <class Iterator, class Run, class IsolatedRun> | 547 template <class Iterator, class Run, class IsolatedRun> |
| 548 void BidiResolver<Iterator, Run, IsolatedRun>::computeTrailingSpace( | 548 void BidiResolver<Iterator, Run, IsolatedRun>::computeTrailingSpace( |
| 549 BidiRunList<Run>& runs) { | 549 BidiRunList<Run>& runs) { |
| 550 ASSERT(runs.runCount()); | 550 DCHECK(runs.runCount()); |
| 551 | 551 |
| 552 Run* trailingSpaceRun = runs.logicallyLastRun(); | 552 Run* trailingSpaceRun = runs.logicallyLastRun(); |
| 553 | 553 |
| 554 int firstSpace = findFirstTrailingSpaceAtRun(trailingSpaceRun); | 554 int firstSpace = findFirstTrailingSpaceAtRun(trailingSpaceRun); |
| 555 if (firstSpace == trailingSpaceRun->stop()) | 555 if (firstSpace == trailingSpaceRun->stop()) |
| 556 return; | 556 return; |
| 557 | 557 |
| 558 bool shouldReorder = | 558 bool shouldReorder = |
| 559 trailingSpaceRun != (m_paragraphDirectionality == TextDirection::kLtr | 559 trailingSpaceRun != (m_paragraphDirectionality == TextDirection::kLtr |
| 560 ? runs.lastRun() | 560 ? runs.lastRun() |
| 561 : runs.firstRun()); | 561 : runs.firstRun()); |
| 562 if (firstSpace != trailingSpaceRun->start()) { | 562 if (firstSpace != trailingSpaceRun->start()) { |
| 563 BidiContext* baseContext = context(); | 563 BidiContext* baseContext = context(); |
| 564 while (BidiContext* parent = baseContext->parent()) | 564 while (BidiContext* parent = baseContext->parent()) |
| 565 baseContext = parent; | 565 baseContext = parent; |
| 566 | 566 |
| 567 m_trailingSpaceRun = addTrailingRun( | 567 m_trailingSpaceRun = addTrailingRun( |
| 568 runs, firstSpace, trailingSpaceRun->m_stop, trailingSpaceRun, | 568 runs, firstSpace, trailingSpaceRun->m_stop, trailingSpaceRun, |
| 569 baseContext, m_paragraphDirectionality); | 569 baseContext, m_paragraphDirectionality); |
| 570 ASSERT(m_trailingSpaceRun); | 570 DCHECK(m_trailingSpaceRun); |
| 571 trailingSpaceRun->m_stop = firstSpace; | 571 trailingSpaceRun->m_stop = firstSpace; |
| 572 return; | 572 return; |
| 573 } | 573 } |
| 574 if (!shouldReorder) { | 574 if (!shouldReorder) { |
| 575 m_trailingSpaceRun = trailingSpaceRun; | 575 m_trailingSpaceRun = trailingSpaceRun; |
| 576 return; | 576 return; |
| 577 } | 577 } |
| 578 | 578 |
| 579 // Apply L1 rule. | 579 // Apply L1 rule. |
| 580 if (m_paragraphDirectionality == TextDirection::kLtr) { | 580 if (m_paragraphDirectionality == TextDirection::kLtr) { |
| 581 runs.moveRunToEnd(trailingSpaceRun); | 581 runs.moveRunToEnd(trailingSpaceRun); |
| 582 trailingSpaceRun->m_level = 0; | 582 trailingSpaceRun->m_level = 0; |
| 583 } else { | 583 } else { |
| 584 runs.moveRunToBeginning(trailingSpaceRun); | 584 runs.moveRunToBeginning(trailingSpaceRun); |
| 585 trailingSpaceRun->m_level = 1; | 585 trailingSpaceRun->m_level = 1; |
| 586 } | 586 } |
| 587 m_trailingSpaceRun = trailingSpaceRun; | 587 m_trailingSpaceRun = trailingSpaceRun; |
| 588 } | 588 } |
| 589 | 589 |
| 590 template <class Iterator, class Run, class IsolatedRun> | 590 template <class Iterator, class Run, class IsolatedRun> |
| 591 bool BidiResolver<Iterator, Run, IsolatedRun>::commitExplicitEmbedding( | 591 bool BidiResolver<Iterator, Run, IsolatedRun>::commitExplicitEmbedding( |
| 592 BidiRunList<Run>& runs) { | 592 BidiRunList<Run>& runs) { |
| 593 // When we're "inIsolate()" we're resolving the parent context which | 593 // When we're "inIsolate()" we're resolving the parent context which |
| 594 // ignores (skips over) the isolated content, including embedding levels. | 594 // ignores (skips over) the isolated content, including embedding levels. |
| 595 // We should never accrue embedding levels while skipping over isolated | 595 // We should never accrue embedding levels while skipping over isolated |
| 596 // content. | 596 // content. |
| 597 ASSERT(!inIsolate() || m_currentExplicitEmbeddingSequence.isEmpty()); | 597 DCHECK(!inIsolate() || m_currentExplicitEmbeddingSequence.isEmpty()); |
| 598 | 598 |
| 599 using namespace WTF::Unicode; | 599 using namespace WTF::Unicode; |
| 600 | 600 |
| 601 unsigned char fromLevel = context()->level(); | 601 unsigned char fromLevel = context()->level(); |
| 602 RefPtr<BidiContext> toContext = context(); | 602 RefPtr<BidiContext> toContext = context(); |
| 603 | 603 |
| 604 for (size_t i = 0; i < m_currentExplicitEmbeddingSequence.size(); ++i) { | 604 for (size_t i = 0; i < m_currentExplicitEmbeddingSequence.size(); ++i) { |
| 605 BidiEmbedding embedding = m_currentExplicitEmbeddingSequence[i]; | 605 BidiEmbedding embedding = m_currentExplicitEmbeddingSequence[i]; |
| 606 if (embedding.direction() == PopDirectionalFormat) { | 606 if (embedding.direction() == PopDirectionalFormat) { |
| 607 if (BidiContext* parentContext = toContext->parent()) | 607 if (BidiContext* parentContext = toContext->parent()) |
| (...skipping 173 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 781 } | 781 } |
| 782 | 782 |
| 783 template <class Iterator, class Run, class IsolatedRun> | 783 template <class Iterator, class Run, class IsolatedRun> |
| 784 void BidiResolver<Iterator, Run, IsolatedRun>::createBidiRunsForLine( | 784 void BidiResolver<Iterator, Run, IsolatedRun>::createBidiRunsForLine( |
| 785 const Iterator& end, | 785 const Iterator& end, |
| 786 VisualDirectionOverride override, | 786 VisualDirectionOverride override, |
| 787 bool hardLineBreak, | 787 bool hardLineBreak, |
| 788 bool reorderRuns) { | 788 bool reorderRuns) { |
| 789 using namespace WTF::Unicode; | 789 using namespace WTF::Unicode; |
| 790 | 790 |
| 791 ASSERT(m_direction == OtherNeutral); | 791 DCHECK_EQ(m_direction, OtherNeutral); |
| 792 m_trailingSpaceRun = 0; | 792 m_trailingSpaceRun = 0; |
| 793 | 793 |
| 794 m_endOfLine = end; | 794 m_endOfLine = end; |
| 795 | 795 |
| 796 if (override != NoVisualOverride) { | 796 if (override != NoVisualOverride) { |
| 797 m_emptyRun = false; | 797 m_emptyRun = false; |
| 798 m_sor = m_current; | 798 m_sor = m_current; |
| 799 m_eor = Iterator(); | 799 m_eor = Iterator(); |
| 800 while (m_current != end && !m_current.atEnd()) { | 800 while (m_current != end && !m_current.atEnd()) { |
| 801 m_eor = m_current; | 801 m_eor = m_current; |
| (...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 867 dirCurrent = context()->dir(); | 867 dirCurrent = context()->dir(); |
| 868 else if (dirCurrent == NonSpacingMark) | 868 else if (dirCurrent == NonSpacingMark) |
| 869 dirCurrent = m_status.last; | 869 dirCurrent = m_status.last; |
| 870 } | 870 } |
| 871 | 871 |
| 872 // We ignore all character directionality while in unicode-bidi: isolate | 872 // We ignore all character directionality while in unicode-bidi: isolate |
| 873 // spans. We'll handle ordering the isolated characters in a second pass. | 873 // spans. We'll handle ordering the isolated characters in a second pass. |
| 874 if (inIsolate()) | 874 if (inIsolate()) |
| 875 dirCurrent = OtherNeutral; | 875 dirCurrent = OtherNeutral; |
| 876 | 876 |
| 877 ASSERT(m_status.eor != OtherNeutral || m_eor.atEnd()); | 877 DCHECK(m_status.eor != OtherNeutral || m_eor.atEnd()); |
| 878 switch (dirCurrent) { | 878 switch (dirCurrent) { |
| 879 // embedding and overrides (X1-X9 in the Bidi specs) | 879 // embedding and overrides (X1-X9 in the Bidi specs) |
| 880 case RightToLeftEmbedding: | 880 case RightToLeftEmbedding: |
| 881 case LeftToRightEmbedding: | 881 case LeftToRightEmbedding: |
| 882 case RightToLeftOverride: | 882 case RightToLeftOverride: |
| 883 case LeftToRightOverride: | 883 case LeftToRightOverride: |
| 884 case PopDirectionalFormat: | 884 case PopDirectionalFormat: |
| 885 embed(dirCurrent, FromUnicode); | 885 embed(dirCurrent, FromUnicode); |
| 886 commitExplicitEmbedding(m_runs); | 886 commitExplicitEmbedding(m_runs); |
| 887 break; | 887 break; |
| (...skipping 262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1150 case LeftToRight: | 1150 case LeftToRight: |
| 1151 case RightToLeft: | 1151 case RightToLeft: |
| 1152 case ArabicNumber: | 1152 case ArabicNumber: |
| 1153 m_direction = m_status.eor; | 1153 m_direction = m_status.eor; |
| 1154 break; | 1154 break; |
| 1155 case EuropeanNumber: | 1155 case EuropeanNumber: |
| 1156 m_direction = m_status.lastStrong == LeftToRight ? LeftToRight | 1156 m_direction = m_status.lastStrong == LeftToRight ? LeftToRight |
| 1157 : EuropeanNumber; | 1157 : EuropeanNumber; |
| 1158 break; | 1158 break; |
| 1159 default: | 1159 default: |
| 1160 ASSERT_NOT_REACHED(); | 1160 NOTREACHED(); |
| 1161 } | 1161 } |
| 1162 appendRun(m_runs); | 1162 appendRun(m_runs); |
| 1163 } | 1163 } |
| 1164 m_current = end; | 1164 m_current = end; |
| 1165 m_status = stateAtEnd.m_status; | 1165 m_status = stateAtEnd.m_status; |
| 1166 m_sor = stateAtEnd.m_sor; | 1166 m_sor = stateAtEnd.m_sor; |
| 1167 m_eor = stateAtEnd.m_eor; | 1167 m_eor = stateAtEnd.m_eor; |
| 1168 m_last = stateAtEnd.m_last; | 1168 m_last = stateAtEnd.m_last; |
| 1169 m_reachedEndOfLine = stateAtEnd.m_reachedEndOfLine; | 1169 m_reachedEndOfLine = stateAtEnd.m_reachedEndOfLine; |
| 1170 m_lastBeforeET = stateAtEnd.m_lastBeforeET; | 1170 m_lastBeforeET = stateAtEnd.m_lastBeforeET; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1207 | 1207 |
| 1208 if (!hardLineBreak && m_runs.runCount() && needsTrailingSpace(m_runs)) { | 1208 if (!hardLineBreak && m_runs.runCount() && needsTrailingSpace(m_runs)) { |
| 1209 computeTrailingSpace(m_runs); | 1209 computeTrailingSpace(m_runs); |
| 1210 } | 1210 } |
| 1211 } | 1211 } |
| 1212 | 1212 |
| 1213 template <class Iterator, class Run, class IsolatedRun> | 1213 template <class Iterator, class Run, class IsolatedRun> |
| 1214 void BidiResolver<Iterator, Run, IsolatedRun>::setMidpointStateForIsolatedRun( | 1214 void BidiResolver<Iterator, Run, IsolatedRun>::setMidpointStateForIsolatedRun( |
| 1215 Run& run, | 1215 Run& run, |
| 1216 const MidpointState<Iterator>& midpoint) { | 1216 const MidpointState<Iterator>& midpoint) { |
| 1217 ASSERT(!m_midpointStateForIsolatedRun.contains(&run)); | 1217 DCHECK(!m_midpointStateForIsolatedRun.contains(&run)); |
| 1218 m_midpointStateForIsolatedRun.insert(&run, midpoint); | 1218 m_midpointStateForIsolatedRun.insert(&run, midpoint); |
| 1219 } | 1219 } |
| 1220 | 1220 |
| 1221 template <class Iterator, class Run, class IsolatedRun> | 1221 template <class Iterator, class Run, class IsolatedRun> |
| 1222 MidpointState<Iterator> | 1222 MidpointState<Iterator> |
| 1223 BidiResolver<Iterator, Run, IsolatedRun>::midpointStateForIsolatedRun( | 1223 BidiResolver<Iterator, Run, IsolatedRun>::midpointStateForIsolatedRun( |
| 1224 Run& run) { | 1224 Run& run) { |
| 1225 return m_midpointStateForIsolatedRun.take(&run); | 1225 return m_midpointStateForIsolatedRun.take(&run); |
| 1226 } | 1226 } |
| 1227 | 1227 |
| 1228 } // namespace blink | 1228 } // namespace blink |
| 1229 | 1229 |
| 1230 #endif // BidiResolver_h | 1230 #endif // BidiResolver_h |
| OLD | NEW |