Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(97)

Side by Side Diff: core/fxcrt/fx_arabic.cpp

Issue 2650773003: Use std::vector for fx_ucd.h arrays. (Closed)
Patch Set: even slightly more saner Created 3 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | core/fxcrt/fx_arb.h » ('j') | xfa/fgas/layout/fgas_rtfbreak.h » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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 }
OLDNEW
« no previous file with comments | « no previous file | core/fxcrt/fx_arb.h » ('j') | xfa/fgas/layout/fgas_rtfbreak.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698