OLD | NEW |
1 // Copyright 2014 PDFium Authors. All rights reserved. | 1 // Copyright 2014 PDFium 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 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com | 5 // Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com |
6 | 6 |
7 #include "core/fxcrt/fx_arabic.h" | 7 #include "core/fxcrt/fx_arabic.h" |
| 8 |
| 9 #include <algorithm> |
| 10 #include <vector> |
| 11 |
8 #include "core/fxcrt/fx_ucd.h" | 12 #include "core/fxcrt/fx_ucd.h" |
| 13 #include "third_party/base/stl_util.h" |
9 | 14 |
10 namespace { | 15 namespace { |
11 | 16 |
12 const FX_ARBFORMTABLE g_FX_ArabicFormTables[] = { | 17 const FX_ARBFORMTABLE g_FX_ArabicFormTables[] = { |
13 {0xFE81, 0xFE82, 0xFE81, 0xFE82}, {0xFE83, 0xFE84, 0xFE83, 0xFE84}, | 18 {0xFE81, 0xFE82, 0xFE81, 0xFE82}, {0xFE83, 0xFE84, 0xFE83, 0xFE84}, |
14 {0xFE85, 0xFE86, 0xFE85, 0xFE86}, {0xFE87, 0xFE88, 0xFE87, 0xFE88}, | 19 {0xFE85, 0xFE86, 0xFE85, 0xFE86}, {0xFE87, 0xFE88, 0xFE87, 0xFE88}, |
15 {0xFE89, 0xFE8A, 0xFE8B, 0xFE8C}, {0xFE8D, 0xFE8E, 0xFE8D, 0xFE8E}, | 20 {0xFE89, 0xFE8A, 0xFE8B, 0xFE8C}, {0xFE8D, 0xFE8E, 0xFE8D, 0xFE8E}, |
16 {0xFE8F, 0xFE90, 0xFE91, 0xFE92}, {0xFE93, 0xFE94, 0xFE93, 0xFE94}, | 21 {0xFE8F, 0xFE90, 0xFE91, 0xFE92}, {0xFE93, 0xFE94, 0xFE93, 0xFE94}, |
17 {0xFE95, 0xFE96, 0xFE97, 0xFE98}, {0xFE99, 0xFE9A, 0xFE9B, 0xFE9C}, | 22 {0xFE95, 0xFE96, 0xFE97, 0xFE98}, {0xFE99, 0xFE9A, 0xFE9B, 0xFE9C}, |
18 {0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0}, {0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4}, | 23 {0xFE9D, 0xFE9E, 0xFE9F, 0xFEA0}, {0xFEA1, 0xFEA2, 0xFEA3, 0xFEA4}, |
(...skipping 393 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
412 } | 417 } |
413 int32_t i = 0; | 418 int32_t i = 0; |
414 while (i < iSize) { | 419 while (i < iSize) { |
415 i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, false); | 420 i += FX_BidiReorderLevel(iBaseLevel, wsText, levels, i, false); |
416 } | 421 } |
417 } | 422 } |
418 | 423 |
419 template <class baseType> | 424 template <class baseType> |
420 class CFX_BidiLineTemplate { | 425 class CFX_BidiLineTemplate { |
421 public: | 426 public: |
422 void FX_BidiReverseString(CFX_ArrayTemplate<baseType>& chars, | 427 void FX_BidiReverseString(std::vector<baseType>& chars, |
423 int32_t iStart, | 428 int32_t iStart, |
424 int32_t iCount) { | 429 int32_t iCount) { |
425 ASSERT(iStart > -1 && iStart < chars.GetSize()); | 430 ASSERT(iStart >= 0 && iStart < pdfium::CollectionSize<int32_t>(chars)); |
426 ASSERT(iCount >= 0 && iStart + iCount <= chars.GetSize()); | 431 ASSERT(iCount >= 0 && |
427 baseType *pStart, *pEnd; | 432 iStart + iCount <= pdfium::CollectionSize<int32_t>(chars)); |
428 int32_t iEnd = iStart + iCount - 1, iTemp; | 433 std::reverse(chars.begin() + iStart, chars.begin() + iStart + iCount); |
429 while (iStart < iEnd) { | |
430 pStart = chars.GetDataPtr(iStart++); | |
431 pEnd = chars.GetDataPtr(iEnd--); | |
432 iTemp = pStart->m_iBidiPos; | |
433 pStart->m_iBidiPos = pEnd->m_iBidiPos; | |
434 pEnd->m_iBidiPos = iTemp; | |
435 } | |
436 } | 434 } |
437 void FX_BidiSetDeferredRun(CFX_ArrayTemplate<baseType>& chars, | 435 |
| 436 void FX_BidiSetDeferredRun(std::vector<baseType>& chars, |
438 bool bClass, | 437 bool bClass, |
439 int32_t iStart, | 438 int32_t iStart, |
440 int32_t iCount, | 439 int32_t iCount, |
441 int32_t iValue) { | 440 int32_t iValue) { |
442 ASSERT(iStart > -1 && iStart <= chars.GetSize()); | 441 ASSERT(iStart >= 0 && iStart <= pdfium::CollectionSize<int32_t>(chars)); |
443 ASSERT(iStart - iCount > -1); | 442 ASSERT(iStart - iCount > -1); |
444 baseType* pTC; | |
445 int32_t iLast = iStart - iCount; | 443 int32_t iLast = iStart - iCount; |
446 if (bClass) { | 444 if (bClass) { |
447 for (int32_t i = iStart - 1; i >= iLast; i--) { | 445 for (int32_t i = iStart - 1; i >= iLast; i--) |
448 pTC = chars.GetDataPtr(i); | 446 chars[i].m_iBidiClass = (int16_t)iValue; |
449 pTC->m_iBidiClass = (int16_t)iValue; | |
450 } | |
451 } else { | 447 } else { |
452 for (int32_t i = iStart - 1; i >= iLast; i--) { | 448 for (int32_t i = iStart - 1; i >= iLast; i--) |
453 pTC = chars.GetDataPtr(i); | 449 chars[i].m_iBidiLevel = (int16_t)iValue; |
454 pTC->m_iBidiLevel = (int16_t)iValue; | |
455 } | |
456 } | 450 } |
457 } | 451 } |
458 void FX_BidiClassify(CFX_ArrayTemplate<baseType>& chars, | 452 |
459 int32_t iCount, | 453 void FX_BidiClassify(std::vector<baseType>& chars, int32_t iCount, bool bWS) { |
460 bool bWS) { | 454 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
461 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | |
462 baseType* pTC; | |
463 if (bWS) { | 455 if (bWS) { |
464 for (int32_t i = 0; i < iCount; i++) { | 456 for (int32_t i = 0; i < iCount; i++) { |
465 pTC = chars.GetDataPtr(i); | 457 chars[i].m_iBidiClass = |
466 pTC->m_iBidiClass = | 458 (int16_t)(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
467 (int16_t)(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >> | |
468 FX_BIDICLASSBITS; | 459 FX_BIDICLASSBITS; |
469 } | 460 } |
470 } else { | 461 } else { |
471 for (int32_t i = 0; i < iCount; i++) { | 462 for (int32_t i = 0; i < iCount; i++) { |
472 pTC = chars.GetDataPtr(i); | 463 chars[i].m_iBidiClass = (int16_t) |
473 pTC->m_iBidiClass = (int16_t) | 464 gc_FX_BidiNTypes[(chars[i].m_dwCharProps & FX_BIDICLASSBITSMASK) >> |
474 gc_FX_BidiNTypes[(pTC->m_dwCharProps & FX_BIDICLASSBITSMASK) >> | |
475 FX_BIDICLASSBITS]; | 465 FX_BIDICLASSBITS]; |
476 } | 466 } |
477 } | 467 } |
478 } | 468 } |
479 void FX_BidiResolveExplicit(CFX_ArrayTemplate<baseType>& chars, | 469 |
| 470 void FX_BidiResolveExplicit(std::vector<baseType>& chars, |
480 int32_t iCount, | 471 int32_t iCount, |
481 int32_t iBaseLevel) { | 472 int32_t iBaseLevel) { |
482 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 473 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
483 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 474 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
484 if (iCount < 1) { | 475 for (int32_t i = 0; i < iCount; i++) |
485 return; | 476 chars[i].m_iBidiLevel = static_cast<int16_t>(iBaseLevel); |
486 } | |
487 baseType* pTC; | |
488 for (int32_t i = 0; i < iCount; i++) { | |
489 pTC = chars.GetDataPtr(i); | |
490 pTC->m_iBidiLevel = (int16_t)iBaseLevel; | |
491 } | |
492 } | 477 } |
493 void FX_BidiResolveWeak(CFX_ArrayTemplate<baseType>& chars, | 478 |
| 479 void FX_BidiResolveWeak(std::vector<baseType>& chars, |
494 int32_t iCount, | 480 int32_t iCount, |
495 int32_t iBaseLevel) { | 481 int32_t iBaseLevel) { |
496 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 482 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
497 iCount--; | 483 iCount--; |
498 if (iCount < 1) { | 484 if (iCount < 1) { |
499 return; | 485 return; |
500 } | 486 } |
501 baseType *pTC, *pTCNext; | 487 baseType *pTC, *pTCNext; |
502 int32_t iLevelCur = iBaseLevel; | 488 int32_t iLevelCur = iBaseLevel; |
503 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; | 489 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BWSxr : FX_BWSxl; |
504 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; | 490 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
505 for (; i <= iCount; i++) { | 491 for (; i <= iCount; i++) { |
506 pTC = chars.GetDataPtr(i); | 492 pTC = &chars[i]; |
507 iClsCur = pTC->m_iBidiClass; | 493 iClsCur = pTC->m_iBidiClass; |
508 if (iClsCur == FX_BIDICLASS_BN) { | 494 if (iClsCur == FX_BIDICLASS_BN) { |
509 pTC->m_iBidiLevel = (int16_t)iLevelCur; | 495 pTC->m_iBidiLevel = (int16_t)iLevelCur; |
510 if (i == iCount && iLevelCur != iBaseLevel) { | 496 if (i == iCount && iLevelCur != iBaseLevel) { |
511 iClsCur = FX_BidiDirection(iLevelCur); | 497 iClsCur = FX_BidiDirection(iLevelCur); |
512 pTC->m_iBidiClass = (int16_t)iClsCur; | 498 pTC->m_iBidiClass = (int16_t)iClsCur; |
513 } else if (i < iCount) { | 499 } else if (i < iCount) { |
514 pTCNext = chars.GetDataPtr(i + 1); | 500 pTCNext = &chars[i + 1]; |
515 int32_t iLevelNext, iLevelNew; | 501 int32_t iLevelNext, iLevelNew; |
516 iClsNew = pTCNext->m_iBidiClass; | 502 iClsNew = pTCNext->m_iBidiClass; |
517 iLevelNext = pTCNext->m_iBidiLevel; | 503 iLevelNext = pTCNext->m_iBidiLevel; |
518 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { | 504 if (iClsNew != FX_BIDICLASS_BN && iLevelCur != iLevelNext) { |
519 iLevelNew = iLevelNext; | 505 iLevelNew = iLevelNext; |
520 if (iLevelCur > iLevelNew) { | 506 if (iLevelCur > iLevelNew) { |
521 iLevelNew = iLevelCur; | 507 iLevelNew = iLevelCur; |
522 } | 508 } |
523 pTC->m_iBidiLevel = (int16_t)iLevelNew; | 509 pTC->m_iBidiLevel = (int16_t)iLevelNew; |
524 iClsCur = FX_BidiDirection(iLevelNew); | 510 iClsCur = FX_BidiDirection(iLevelNew); |
(...skipping 29 matching lines...) Expand all Loading... |
554 iState = gc_FX_BidiWeakStates[iState][iClsCur]; | 540 iState = gc_FX_BidiWeakStates[iState][iClsCur]; |
555 } | 541 } |
556 if (iNum > 0) { | 542 if (iNum > 0) { |
557 iClsCur = FX_BidiDirection(iBaseLevel); | 543 iClsCur = FX_BidiDirection(iBaseLevel); |
558 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]); | 544 iClsRun = FX_BidiGetDeferredType(gc_FX_BidiWeakActions[iState][iClsCur]); |
559 if (iClsRun != FX_BIDIWEAKACTION_XX) { | 545 if (iClsRun != FX_BIDIWEAKACTION_XX) { |
560 FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); | 546 FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); |
561 } | 547 } |
562 } | 548 } |
563 } | 549 } |
564 void FX_BidiResolveNeutrals(CFX_ArrayTemplate<baseType>& chars, | 550 |
| 551 void FX_BidiResolveNeutrals(std::vector<baseType>& chars, |
565 int32_t iCount, | 552 int32_t iCount, |
566 int32_t iBaseLevel) { | 553 int32_t iBaseLevel) { |
567 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 554 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
568 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 555 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
569 iCount--; | 556 iCount--; |
570 if (iCount < 1) { | 557 if (iCount < 1) { |
571 return; | 558 return; |
572 } | 559 } |
573 baseType* pTC; | 560 baseType* pTC; |
574 int32_t iLevel = iBaseLevel; | 561 int32_t iLevel = iBaseLevel; |
575 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; | 562 int32_t iState = FX_IsOdd(iBaseLevel) ? FX_BNSr : FX_BNSl; |
576 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; | 563 int32_t i = 0, iNum = 0, iClsCur, iClsRun, iClsNew, iAction; |
577 for (; i <= iCount; i++) { | 564 for (; i <= iCount; i++) { |
578 pTC = chars.GetDataPtr(i); | 565 pTC = &chars[i]; |
579 iClsCur = pTC->m_iBidiClass; | 566 iClsCur = pTC->m_iBidiClass; |
580 if (iClsCur == FX_BIDICLASS_BN) { | 567 if (iClsCur == FX_BIDICLASS_BN) { |
581 if (iNum) { | 568 if (iNum) { |
582 iNum++; | 569 iNum++; |
583 } | 570 } |
584 continue; | 571 continue; |
585 } | 572 } |
586 ASSERT(iClsCur < FX_BIDICLASS_AL); | 573 ASSERT(iClsCur < FX_BIDICLASS_AL); |
587 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; | 574 iAction = gc_FX_BidiNeutralActions[iState][iClsCur]; |
588 iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel); | 575 iClsRun = FX_BidiGetDeferredNeutrals(iAction, iLevel); |
(...skipping 13 matching lines...) Expand all Loading... |
602 } | 589 } |
603 if (iNum > 0) { | 590 if (iNum > 0) { |
604 iClsCur = FX_BidiDirection(iLevel); | 591 iClsCur = FX_BidiDirection(iLevel); |
605 iClsRun = FX_BidiGetDeferredNeutrals( | 592 iClsRun = FX_BidiGetDeferredNeutrals( |
606 gc_FX_BidiNeutralActions[iState][iClsCur], iLevel); | 593 gc_FX_BidiNeutralActions[iState][iClsCur], iLevel); |
607 if (iClsRun != FX_BIDICLASS_N) { | 594 if (iClsRun != FX_BIDICLASS_N) { |
608 FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); | 595 FX_BidiSetDeferredRun(chars, true, i, iNum, iClsRun); |
609 } | 596 } |
610 } | 597 } |
611 } | 598 } |
612 void FX_BidiResolveImplicit(CFX_ArrayTemplate<baseType>& chars, | 599 |
613 int32_t iCount) { | 600 void FX_BidiResolveImplicit(std::vector<baseType>& chars, int32_t iCount) { |
614 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 601 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
615 baseType* pTC; | |
616 int32_t iCls, iLevel; | |
617 for (int32_t i = 0; i < iCount; i++) { | 602 for (int32_t i = 0; i < iCount; i++) { |
618 pTC = chars.GetDataPtr(i); | 603 int32_t iCls = chars[i].m_iBidiClass; |
619 iCls = pTC->m_iBidiClass; | |
620 if (iCls == FX_BIDICLASS_BN) { | 604 if (iCls == FX_BIDICLASS_BN) { |
621 continue; | 605 continue; |
622 } | 606 } |
623 ASSERT(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); | 607 ASSERT(iCls > FX_BIDICLASS_ON && iCls < FX_BIDICLASS_AL); |
624 iLevel = pTC->m_iBidiLevel; | 608 int32_t iLevel = chars[i].m_iBidiLevel; |
625 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; | 609 iLevel += gc_FX_BidiAddLevel[FX_IsOdd(iLevel)][iCls - 1]; |
626 pTC->m_iBidiLevel = (int16_t)iLevel; | 610 chars[i].m_iBidiLevel = (int16_t)iLevel; |
627 } | 611 } |
628 } | 612 } |
629 void FX_BidiResolveWhitespace(CFX_ArrayTemplate<baseType>& chars, | 613 |
| 614 void FX_BidiResolveWhitespace(std::vector<baseType>& chars, |
630 int32_t iCount, | 615 int32_t iCount, |
631 int32_t iBaseLevel) { | 616 int32_t iBaseLevel) { |
632 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 617 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
633 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 618 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
634 if (iCount < 1) { | 619 if (iCount < 1) { |
635 return; | 620 return; |
636 } | 621 } |
637 iCount--; | 622 iCount--; |
638 int32_t iLevel = iBaseLevel; | 623 int32_t iLevel = iBaseLevel; |
639 int32_t i = 0, iNum = 0; | 624 int32_t i = 0, iNum = 0; |
640 baseType* pTC; | |
641 for (; i <= iCount; i++) { | 625 for (; i <= iCount; i++) { |
642 pTC = chars.GetDataPtr(i); | 626 switch (chars[i].m_iBidiClass) { |
643 switch (pTC->m_iBidiClass) { | |
644 case FX_BIDICLASS_WS: | 627 case FX_BIDICLASS_WS: |
645 iNum++; | 628 iNum++; |
646 break; | 629 break; |
647 case FX_BIDICLASS_RLE: | 630 case FX_BIDICLASS_RLE: |
648 case FX_BIDICLASS_LRE: | 631 case FX_BIDICLASS_LRE: |
649 case FX_BIDICLASS_LRO: | 632 case FX_BIDICLASS_LRO: |
650 case FX_BIDICLASS_RLO: | 633 case FX_BIDICLASS_RLO: |
651 case FX_BIDICLASS_PDF: | 634 case FX_BIDICLASS_PDF: |
652 case FX_BIDICLASS_BN: | 635 case FX_BIDICLASS_BN: |
653 pTC->m_iBidiLevel = (int16_t)iLevel; | 636 chars[i].m_iBidiLevel = (int16_t)iLevel; |
654 iNum++; | 637 iNum++; |
655 break; | 638 break; |
656 case FX_BIDICLASS_S: | 639 case FX_BIDICLASS_S: |
657 case FX_BIDICLASS_B: | 640 case FX_BIDICLASS_B: |
658 if (iNum > 0) { | 641 if (iNum > 0) { |
659 FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); | 642 FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); |
660 } | 643 } |
661 pTC->m_iBidiLevel = (int16_t)iBaseLevel; | 644 chars[i].m_iBidiLevel = (int16_t)iBaseLevel; |
662 iNum = 0; | 645 iNum = 0; |
663 break; | 646 break; |
664 default: | 647 default: |
665 iNum = 0; | 648 iNum = 0; |
666 break; | 649 break; |
667 } | 650 } |
668 iLevel = pTC->m_iBidiLevel; | 651 iLevel = chars[i].m_iBidiLevel; |
669 } | 652 } |
670 if (iNum > 0) { | 653 if (iNum > 0) { |
671 FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); | 654 FX_BidiSetDeferredRun(chars, false, i, iNum, iBaseLevel); |
672 } | 655 } |
673 } | 656 } |
674 int32_t FX_BidiReorderLevel(CFX_ArrayTemplate<baseType>& chars, | 657 |
| 658 int32_t FX_BidiReorderLevel(std::vector<baseType>& chars, |
675 int32_t iCount, | 659 int32_t iCount, |
676 int32_t iBaseLevel, | 660 int32_t iBaseLevel, |
677 int32_t iStart, | 661 int32_t iStart, |
678 bool bReverse) { | 662 bool bReverse) { |
679 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 663 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
680 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 664 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
681 ASSERT(iStart >= 0 && iStart < iCount); | 665 ASSERT(iStart >= 0 && iStart < iCount); |
682 if (iCount < 1) { | 666 if (iCount < 1) { |
683 return 0; | 667 return 0; |
684 } | 668 } |
685 baseType* pTC; | |
686 bReverse = bReverse || FX_IsOdd(iBaseLevel); | 669 bReverse = bReverse || FX_IsOdd(iBaseLevel); |
687 int32_t i = iStart, iLevel; | 670 int32_t i = iStart; |
688 for (; i < iCount; i++) { | 671 for (; i < iCount; i++) { |
689 pTC = chars.GetDataPtr(i); | 672 int32_t iLevel = chars[i].m_iBidiLevel; |
690 if ((iLevel = pTC->m_iBidiLevel) == iBaseLevel) { | 673 if (iLevel == iBaseLevel) |
691 continue; | 674 continue; |
692 } | 675 if (iLevel < iBaseLevel) |
693 if (iLevel < iBaseLevel) { | |
694 break; | 676 break; |
695 } | |
696 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse) - 1; | 677 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel + 1, i, bReverse) - 1; |
697 } | 678 } |
698 int32_t iNum = i - iStart; | 679 int32_t iNum = i - iStart; |
699 if (bReverse && iNum > 1) { | 680 if (bReverse && iNum > 1) { |
700 FX_BidiReverseString(chars, iStart, iNum); | 681 FX_BidiReverseString(chars, iStart, iNum); |
701 } | 682 } |
702 return iNum; | 683 return iNum; |
703 } | 684 } |
704 void FX_BidiReorder(CFX_ArrayTemplate<baseType>& chars, | 685 |
| 686 void FX_BidiReorder(std::vector<baseType>& chars, |
705 int32_t iCount, | 687 int32_t iCount, |
706 int32_t iBaseLevel) { | 688 int32_t iBaseLevel) { |
707 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 689 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
708 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); | 690 ASSERT(iBaseLevel >= 0 && iBaseLevel <= FX_BIDIMAXLEVEL); |
709 int32_t i = 0; | 691 int32_t i = 0; |
710 while (i < iCount) { | 692 while (i < iCount) { |
711 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, false); | 693 i += FX_BidiReorderLevel(chars, iCount, iBaseLevel, i, false); |
712 } | 694 } |
713 } | 695 } |
714 void FX_BidiPosition(CFX_ArrayTemplate<baseType>& chars, int32_t iCount) { | 696 |
715 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 697 void FX_BidiPosition(std::vector<baseType>& chars, int32_t iCount) { |
716 baseType* pTC; | 698 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
717 int32_t i = 0; | 699 for (int32_t i = 0; i < iCount; ++i) |
718 while (i < iCount) { | 700 chars[chars[i].m_iBidiPos].m_iBidiOrder = i; |
719 pTC = chars.GetDataPtr(i); | |
720 pTC = chars.GetDataPtr(pTC->m_iBidiPos); | |
721 pTC->m_iBidiOrder = i++; | |
722 } | |
723 } | 701 } |
724 | 702 |
725 void FX_BidiLine(CFX_ArrayTemplate<baseType>& chars, | 703 void FX_BidiLine(std::vector<baseType>& chars, |
726 int32_t iCount, | 704 int32_t iCount, |
727 int32_t iBaseLevel) { | 705 int32_t iBaseLevel) { |
728 ASSERT(iCount > -1 && iCount <= chars.GetSize()); | 706 ASSERT(iCount >= 0 && iCount <= pdfium::CollectionSize<int32_t>(chars)); |
729 if (iCount < 2) { | 707 if (iCount < 2) { |
730 return; | 708 return; |
731 } | 709 } |
732 FX_BidiClassify(chars, iCount, false); | 710 FX_BidiClassify(chars, iCount, false); |
733 FX_BidiResolveExplicit(chars, iCount, iBaseLevel); | 711 FX_BidiResolveExplicit(chars, iCount, iBaseLevel); |
734 FX_BidiResolveWeak(chars, iCount, iBaseLevel); | 712 FX_BidiResolveWeak(chars, iCount, iBaseLevel); |
735 FX_BidiResolveNeutrals(chars, iCount, iBaseLevel); | 713 FX_BidiResolveNeutrals(chars, iCount, iBaseLevel); |
736 FX_BidiResolveImplicit(chars, iCount); | 714 FX_BidiResolveImplicit(chars, iCount); |
737 FX_BidiClassify(chars, iCount, true); | 715 FX_BidiClassify(chars, iCount, true); |
738 FX_BidiResolveWhitespace(chars, iCount, iBaseLevel); | 716 FX_BidiResolveWhitespace(chars, iCount, iBaseLevel); |
739 FX_BidiReorder(chars, iCount, iBaseLevel); | 717 FX_BidiReorder(chars, iCount, iBaseLevel); |
740 FX_BidiPosition(chars, iCount); | 718 FX_BidiPosition(chars, iCount); |
741 } | 719 } |
742 }; | 720 }; |
743 void FX_BidiLine(CFX_TxtCharArray& chars, int32_t iCount, int32_t iBaseLevel) { | 721 |
| 722 void FX_BidiLine(std::vector<CFX_TxtChar>& chars, |
| 723 int32_t iCount, |
| 724 int32_t iBaseLevel) { |
744 CFX_BidiLineTemplate<CFX_TxtChar> blt; | 725 CFX_BidiLineTemplate<CFX_TxtChar> blt; |
745 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 726 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
746 } | 727 } |
747 void FX_BidiLine(CFX_RTFCharArray& chars, int32_t iCount, int32_t iBaseLevel) { | 728 void FX_BidiLine(std::vector<CFX_RTFChar>& chars, |
| 729 int32_t iCount, |
| 730 int32_t iBaseLevel) { |
748 CFX_BidiLineTemplate<CFX_RTFChar> blt; | 731 CFX_BidiLineTemplate<CFX_RTFChar> blt; |
749 blt.FX_BidiLine(chars, iCount, iBaseLevel); | 732 blt.FX_BidiLine(chars, iCount, iBaseLevel); |
750 } | 733 } |
OLD | NEW |