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 |