Chromium Code Reviews| 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 = (int16_t)iBaseLevel; |
|
dsinclair
2017/01/24 18:43:58
nit: static_cast?
Tom Sepez
2017/01/24 19:16:12
Done.
| |
| 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 |