/* */ package com.ibm.icu.text; /* */ /* */ import java.util.Arrays; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ final class BidiLine /* */ { /* */ static void setTrailingWSStart(Bidi bidi) /* */ { /* 85 */ byte[] dirProps = bidi.dirProps; /* 86 */ byte[] levels = bidi.levels; /* 87 */ int start = bidi.length; /* 88 */ byte paraLevel = bidi.paraLevel; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 96 */ if (Bidi.NoContextRTL(dirProps[(start - 1)]) == 7) { /* 97 */ bidi.trailingWSStart = start; /* 98 */ return; /* */ } /* */ /* */ /* 102 */ while ((start > 0) && ((Bidi.DirPropFlagNC(dirProps[(start - 1)]) & Bidi.MASK_WS) != 0)) { /* 103 */ start--; /* */ } /* */ /* */ /* 107 */ while ((start > 0) && (levels[(start - 1)] == paraLevel)) { /* 108 */ start--; /* */ } /* */ /* 111 */ bidi.trailingWSStart = start; /* */ } /* */ /* */ /* */ static Bidi setLine(Bidi paraBidi, int start, int limit) /* */ { /* 117 */ Bidi lineBidi = new Bidi(); /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 125 */ int length = lineBidi.length = lineBidi.originalLength = lineBidi.resultLength = limit - start; /* */ /* */ /* 128 */ lineBidi.text = new char[length]; /* 129 */ System.arraycopy(paraBidi.text, start, lineBidi.text, 0, length); /* 130 */ lineBidi.paraLevel = paraBidi.GetParaLevelAt(start); /* 131 */ lineBidi.paraCount = paraBidi.paraCount; /* 132 */ lineBidi.runs = new BidiRun[0]; /* 133 */ lineBidi.reorderingMode = paraBidi.reorderingMode; /* 134 */ lineBidi.reorderingOptions = paraBidi.reorderingOptions; /* 135 */ if (paraBidi.controlCount > 0) /* */ { /* 137 */ for (int j = start; j < limit; j++) { /* 138 */ if (Bidi.IsBidiControlChar(paraBidi.text[j])) { /* 139 */ lineBidi.controlCount += 1; /* */ } /* */ } /* 142 */ lineBidi.resultLength -= lineBidi.controlCount; /* */ } /* */ /* 145 */ lineBidi.getDirPropsMemory(length); /* 146 */ lineBidi.dirProps = lineBidi.dirPropsMemory; /* 147 */ System.arraycopy(paraBidi.dirProps, start, lineBidi.dirProps, 0, length); /* */ /* */ /* 150 */ lineBidi.getLevelsMemory(length); /* 151 */ lineBidi.levels = lineBidi.levelsMemory; /* 152 */ System.arraycopy(paraBidi.levels, start, lineBidi.levels, 0, length); /* */ /* 154 */ lineBidi.runCount = -1; /* */ /* 156 */ if (paraBidi.direction != 2) /* */ { /* 158 */ lineBidi.direction = paraBidi.direction; /* */ /* */ /* */ /* */ /* */ /* */ /* 165 */ if (paraBidi.trailingWSStart <= start) { /* 166 */ lineBidi.trailingWSStart = 0; /* 167 */ } else if (paraBidi.trailingWSStart < limit) { /* 168 */ paraBidi.trailingWSStart -= start; /* */ } else { /* 170 */ lineBidi.trailingWSStart = length; /* */ } /* */ } else { /* 173 */ byte[] levels = lineBidi.levels; /* */ /* */ /* */ /* 177 */ setTrailingWSStart(lineBidi); /* 178 */ int trailingWSStart = lineBidi.trailingWSStart; /* */ /* */ /* 181 */ if (trailingWSStart == 0) /* */ { /* 183 */ lineBidi.direction = ((byte)(lineBidi.paraLevel & 0x1)); /* */ } /* */ else { /* 186 */ byte level = (byte)(levels[0] & 0x1); /* */ /* */ /* */ /* 190 */ if ((trailingWSStart < length) && ((lineBidi.paraLevel & 0x1) != level)) /* */ { /* */ /* */ /* 194 */ lineBidi.direction = 2; /* */ } /* */ else /* */ { /* 198 */ for (int i = 1;; i++) { /* 199 */ if (i == trailingWSStart) /* */ { /* 201 */ lineBidi.direction = level; /* 202 */ break; } /* 203 */ if ((levels[i] & 0x1) != level) { /* 204 */ lineBidi.direction = 2; /* 205 */ break; /* */ } /* */ } /* */ } /* */ } /* */ /* 211 */ switch (lineBidi.direction) /* */ { /* */ case 0: /* 214 */ lineBidi.paraLevel = ((byte)(lineBidi.paraLevel + 1 & 0xFFFFFFFE)); /* */ /* */ /* */ /* */ /* 219 */ lineBidi.trailingWSStart = 0; /* 220 */ break; /* */ /* */ case 1: /* 223 */ Bidi tmp475_473 = lineBidi;tmp475_473.paraLevel = ((byte)(tmp475_473.paraLevel | 0x1)); /* */ /* */ /* */ /* 227 */ lineBidi.trailingWSStart = 0; /* 228 */ break; /* */ } /* */ /* */ } /* */ /* 233 */ lineBidi.paraBidi = paraBidi; /* 234 */ return lineBidi; /* */ } /* */ /* */ /* */ static byte getLevelAt(Bidi bidi, int charIndex) /* */ { /* 240 */ if ((bidi.direction != 2) || (charIndex >= bidi.trailingWSStart)) { /* 241 */ return bidi.GetParaLevelAt(charIndex); /* */ } /* 243 */ return bidi.levels[charIndex]; /* */ } /* */ /* */ /* */ static byte[] getLevels(Bidi bidi) /* */ { /* 249 */ int start = bidi.trailingWSStart; /* 250 */ int length = bidi.length; /* */ /* 252 */ if (start != length) /* */ { /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 263 */ Arrays.fill(bidi.levels, start, length, bidi.paraLevel); /* */ /* */ /* 266 */ bidi.trailingWSStart = length; /* */ } /* 268 */ if (length < bidi.levels.length) { /* 269 */ byte[] levels = new byte[length]; /* 270 */ System.arraycopy(bidi.levels, 0, levels, 0, length); /* 271 */ return levels; /* */ } /* 273 */ return bidi.levels; /* */ } /* */ /* */ /* */ /* */ /* */ static BidiRun getLogicalRun(Bidi bidi, int logicalPosition) /* */ { /* 281 */ BidiRun newRun = new BidiRun(); /* 282 */ getRuns(bidi); /* 283 */ int runCount = bidi.runCount; /* 284 */ int visualStart = 0;int logicalLimit = 0; /* 285 */ BidiRun iRun = bidi.runs[0]; /* */ /* 287 */ for (int i = 0; i < runCount; i++) { /* 288 */ iRun = bidi.runs[i]; /* 289 */ logicalLimit = iRun.start + iRun.limit - visualStart; /* 290 */ if ((logicalPosition >= iRun.start) && (logicalPosition < logicalLimit)) { /* */ break; /* */ } /* */ /* 294 */ visualStart = iRun.limit; /* */ } /* 296 */ newRun.start = iRun.start; /* 297 */ newRun.limit = logicalLimit; /* 298 */ newRun.level = iRun.level; /* 299 */ return newRun; /* */ } /* */ /* */ static BidiRun getVisualRun(Bidi bidi, int runIndex) /* */ { /* 304 */ int start = bidi.runs[runIndex].start; /* */ /* 306 */ byte level = bidi.runs[runIndex].level; /* */ int limit; /* 308 */ int limit; if (runIndex > 0) { /* 309 */ limit = start + bidi.runs[runIndex].limit - bidi.runs[(runIndex - 1)].limit; /* */ } /* */ else /* */ { /* 313 */ limit = start + bidi.runs[0].limit; /* */ } /* 315 */ return new BidiRun(start, limit, level); /* */ } /* */ /* */ /* */ static void getSingleRun(Bidi bidi, byte level) /* */ { /* 321 */ bidi.runs = bidi.simpleRuns; /* 322 */ bidi.runCount = 1; /* */ /* */ /* 325 */ bidi.runs[0] = new BidiRun(0, bidi.length, level); /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ private static void reorderLine(Bidi bidi, byte minLevel, byte maxLevel) /* */ { /* 364 */ if (maxLevel <= (minLevel | 0x1)) { /* 365 */ return; /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 378 */ minLevel = (byte)(minLevel + 1); /* */ /* 380 */ BidiRun[] runs = bidi.runs; /* 381 */ byte[] levels = bidi.levels; /* 382 */ int runCount = bidi.runCount; /* */ /* */ /* 385 */ if (bidi.trailingWSStart < bidi.length) { /* 386 */ runCount--; /* */ } /* */ /* 389 */ maxLevel = (byte)(maxLevel - 1); if (maxLevel >= minLevel) { /* 390 */ int firstRun = 0; /* */ /* */ /* */ /* */ for (;;) /* */ { /* 396 */ if ((firstRun < runCount) && (levels[runs[firstRun].start] < maxLevel)) { /* 397 */ firstRun++; /* */ } else { /* 399 */ if (firstRun >= runCount) { /* */ break; /* */ } /* */ /* */ /* 404 */ int limitRun = firstRun; /* 405 */ do { limitRun++; } while ((limitRun < runCount) && (levels[runs[limitRun].start] >= maxLevel)); /* */ /* */ /* 408 */ int endRun = limitRun - 1; /* 409 */ while (firstRun < endRun) { /* 410 */ BidiRun tempRun = runs[firstRun]; /* 411 */ runs[firstRun] = runs[endRun]; /* 412 */ runs[endRun] = tempRun; /* 413 */ firstRun++; /* 414 */ endRun--; /* */ } /* */ /* 417 */ if (limitRun == runCount) { /* */ break; /* */ } /* 420 */ firstRun = limitRun + 1; /* */ } /* */ } /* */ } /* */ /* */ /* 426 */ if ((minLevel & 0x1) == 0) { /* 427 */ int firstRun = 0; /* */ /* */ /* 430 */ if (bidi.trailingWSStart == bidi.length) { /* 431 */ runCount--; /* */ } /* */ /* */ /* 435 */ while (firstRun < runCount) { /* 436 */ BidiRun tempRun = runs[firstRun]; /* 437 */ runs[firstRun] = runs[runCount]; /* 438 */ runs[runCount] = tempRun; /* 439 */ firstRun++; /* 440 */ runCount--; /* */ } /* */ } /* */ } /* */ /* */ /* */ static int getRunFromLogicalIndex(Bidi bidi, int logicalIndex) /* */ { /* 448 */ BidiRun[] runs = bidi.runs; /* 449 */ int runCount = bidi.runCount;int visualStart = 0; /* */ /* 451 */ for (int i = 0; i < runCount; i++) { /* 452 */ int length = runs[i].limit - visualStart; /* 453 */ int logicalStart = runs[i].start; /* 454 */ if ((logicalIndex >= logicalStart) && (logicalIndex < logicalStart + length)) { /* 455 */ return i; /* */ } /* 457 */ visualStart += length; /* */ } /* */ /* */ /* 461 */ throw new IllegalStateException("Internal ICU error in getRunFromLogicalIndex"); /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ static void getRuns(Bidi bidi) /* */ { /* 481 */ if (bidi.runCount >= 0) { /* 482 */ return; /* */ } /* 484 */ if (bidi.direction != 2) /* */ { /* */ /* 487 */ getSingleRun(bidi, bidi.paraLevel); /* */ } /* */ else { /* 490 */ int length = bidi.length; /* 491 */ byte[] levels = bidi.levels; /* */ /* 493 */ byte level = 126; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 505 */ int limit = bidi.trailingWSStart; /* */ /* 507 */ int runCount = 0; /* 508 */ for (int i = 0; i < limit; i++) /* */ { /* 510 */ if (levels[i] != level) { /* 511 */ runCount++; /* 512 */ level = levels[i]; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* 520 */ if ((runCount == 1) && (limit == length)) /* */ { /* 522 */ getSingleRun(bidi, levels[0]); /* */ /* */ } /* */ else /* */ { /* 527 */ byte minLevel = 62; /* 528 */ byte maxLevel = 0; /* */ /* */ /* 531 */ if (limit < length) { /* 532 */ runCount++; /* */ } /* */ /* */ /* 536 */ bidi.getRunsMemory(runCount); /* 537 */ BidiRun[] runs = bidi.runsMemory; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 545 */ int runIndex = 0; /* */ /* */ /* 548 */ i = 0; /* */ do /* */ { /* 551 */ int start = i; /* 552 */ level = levels[i]; /* 553 */ if (level < minLevel) { /* 554 */ minLevel = level; /* */ } /* 556 */ if (level > maxLevel) { /* 557 */ maxLevel = level; /* */ } /* */ do /* */ { /* 561 */ i++; } while ((i < limit) && (levels[i] == level)); /* */ /* */ /* 564 */ runs[runIndex] = new BidiRun(start, i - start, level); /* 565 */ runIndex++; /* 566 */ } while (i < limit); /* */ /* 568 */ if (limit < length) /* */ { /* 570 */ runs[runIndex] = new BidiRun(limit, length - limit, bidi.paraLevel); /* */ /* */ /* 573 */ if (bidi.paraLevel < minLevel) { /* 574 */ minLevel = bidi.paraLevel; /* */ } /* */ } /* */ /* */ /* 579 */ bidi.runs = runs; /* 580 */ bidi.runCount = runCount; /* */ /* 582 */ reorderLine(bidi, minLevel, maxLevel); /* */ /* */ /* */ /* 586 */ limit = 0; /* 587 */ for (i = 0; i < runCount; i++) { /* 588 */ runs[i].level = levels[runs[i].start]; /* 589 */ limit = runs[i].limit += limit; /* */ } /* */ /* */ /* */ /* */ /* */ /* 596 */ if (runIndex < runCount) { /* 597 */ int trailingRun = (bidi.paraLevel & 0x1) != 0 ? 0 : runIndex; /* 598 */ runs[trailingRun].level = bidi.paraLevel; /* */ } /* */ } /* */ } /* */ /* */ /* 604 */ if (bidi.insertPoints.size > 0) /* */ { /* */ /* 607 */ for (int ip = 0; ip < bidi.insertPoints.size; ip++) { /* 608 */ Bidi.Point point = bidi.insertPoints.points[ip]; /* 609 */ int runIndex = getRunFromLogicalIndex(bidi, point.pos); /* 610 */ bidi.runs[runIndex].insertRemove |= point.flag; /* */ } /* */ } /* */ /* */ /* 615 */ if (bidi.controlCount > 0) /* */ { /* */ /* 618 */ for (int ic = 0; ic < bidi.length; ic++) { /* 619 */ char c = bidi.text[ic]; /* 620 */ if (Bidi.IsBidiControlChar(c)) { /* 621 */ int runIndex = getRunFromLogicalIndex(bidi, ic); /* 622 */ bidi.runs[runIndex].insertRemove -= 1; /* */ } /* */ } /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ static int[] prepareReorder(byte[] levels, byte[] pMinLevel, byte[] pMaxLevel) /* */ { /* 633 */ if ((levels == null) || (levels.length <= 0)) { /* 634 */ return null; /* */ } /* */ /* */ /* 638 */ byte minLevel = 62; /* 639 */ byte maxLevel = 0; /* 640 */ for (int start = levels.length; start > 0;) { /* 641 */ byte level = levels[(--start)]; /* 642 */ if (level > 62) { /* 643 */ return null; /* */ } /* 645 */ if (level < minLevel) { /* 646 */ minLevel = level; /* */ } /* 648 */ if (level > maxLevel) { /* 649 */ maxLevel = level; /* */ } /* */ } /* 652 */ pMinLevel[0] = minLevel; /* 653 */ pMaxLevel[0] = maxLevel; /* */ /* */ /* 656 */ int[] indexMap = new int[levels.length]; /* 657 */ for (start = levels.length; start > 0;) { /* 658 */ start--; /* 659 */ indexMap[start] = start; /* */ } /* */ /* 662 */ return indexMap; /* */ } /* */ /* */ static int[] reorderLogical(byte[] levels) /* */ { /* 667 */ byte[] aMinLevel = new byte[1]; /* 668 */ byte[] aMaxLevel = new byte[1]; /* */ /* */ /* 671 */ int[] indexMap = prepareReorder(levels, aMinLevel, aMaxLevel); /* 672 */ if (indexMap == null) { /* 673 */ return null; /* */ } /* */ /* 676 */ byte minLevel = aMinLevel[0]; /* 677 */ byte maxLevel = aMaxLevel[0]; /* */ /* */ /* 680 */ if ((minLevel == maxLevel) && ((minLevel & 0x1) == 0)) { /* 681 */ return indexMap; /* */ } /* */ /* */ /* 685 */ minLevel = (byte)(minLevel | 0x1); /* */ /* */ do /* */ { /* 689 */ int start = 0; /* */ /* */ /* */ /* */ for (;;) /* */ { /* 695 */ if ((start < levels.length) && (levels[start] < maxLevel)) { /* 696 */ start++; /* */ } else { /* 698 */ if (start >= levels.length) { /* */ break; /* */ } /* */ /* */ /* 703 */ int limit = start; do { limit++; } while ((limit < levels.length) && (levels[limit] >= maxLevel)); /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 716 */ int sumOfSosEos = start + limit - 1; /* */ /* */ do /* */ { /* 720 */ indexMap[start] = (sumOfSosEos - indexMap[start]); /* 721 */ start++; } while (start < limit); /* */ /* */ /* 724 */ if (limit == levels.length) { /* */ break; /* */ } /* 727 */ start = limit + 1; /* */ } /* */ } /* 730 */ maxLevel = (byte)(maxLevel - 1); } while (maxLevel >= minLevel); /* 731 */ return indexMap; /* */ } /* */ /* */ static int[] reorderVisual(byte[] levels) /* */ { /* 736 */ byte[] aMinLevel = new byte[1]; /* 737 */ byte[] aMaxLevel = new byte[1]; /* */ /* */ /* */ /* 741 */ int[] indexMap = prepareReorder(levels, aMinLevel, aMaxLevel); /* 742 */ if (indexMap == null) { /* 743 */ return null; /* */ } /* */ /* 746 */ byte minLevel = aMinLevel[0]; /* 747 */ byte maxLevel = aMaxLevel[0]; /* */ /* */ /* 750 */ if ((minLevel == maxLevel) && ((minLevel & 0x1) == 0)) { /* 751 */ return indexMap; /* */ } /* */ /* */ /* 755 */ minLevel = (byte)(minLevel | 0x1); /* */ /* */ do /* */ { /* 759 */ int start = 0; /* */ /* */ /* */ /* */ for (;;) /* */ { /* 765 */ if ((start < levels.length) && (levels[start] < maxLevel)) { /* 766 */ start++; /* */ } else { /* 768 */ if (start >= levels.length) { /* */ break; /* */ } /* */ /* */ /* 773 */ int limit = start; do { limit++; } while ((limit < levels.length) && (levels[limit] >= maxLevel)); /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 781 */ int end = limit - 1; /* 782 */ while (start < end) { /* 783 */ int temp = indexMap[start]; /* 784 */ indexMap[start] = indexMap[end]; /* 785 */ indexMap[end] = temp; /* */ /* 787 */ start++; /* 788 */ end--; /* */ } /* */ /* 791 */ if (limit == levels.length) { /* */ break; /* */ } /* 794 */ start = limit + 1; /* */ } /* */ } /* 797 */ maxLevel = (byte)(maxLevel - 1); } while (maxLevel >= minLevel); /* */ /* 799 */ return indexMap; /* */ } /* */ /* */ static int getVisualIndex(Bidi bidi, int logicalIndex) /* */ { /* 804 */ int visualIndex = -1; /* */ /* */ /* 807 */ switch (bidi.direction) { /* */ case 0: /* 809 */ visualIndex = logicalIndex; /* 810 */ break; /* */ case 1: /* 812 */ visualIndex = bidi.length - logicalIndex - 1; /* 813 */ break; /* */ default: /* 815 */ getRuns(bidi); /* 816 */ BidiRun[] runs = bidi.runs; /* 817 */ int visualStart = 0; /* */ /* */ /* 820 */ for (int i = 0; i < bidi.runCount; i++) { /* 821 */ int length = runs[i].limit - visualStart; /* 822 */ int offset = logicalIndex - runs[i].start; /* 823 */ if ((offset >= 0) && (offset < length)) { /* 824 */ if (runs[i].isEvenRun()) /* */ { /* 826 */ visualIndex = visualStart + offset; break; /* */ } /* */ /* 829 */ visualIndex = visualStart + length - offset - 1; /* */ /* 831 */ break; /* */ } /* 833 */ visualStart += length; /* */ } /* 835 */ if (i >= bidi.runCount) { /* 836 */ return -1; /* */ } /* */ break; /* */ } /* 840 */ if (bidi.insertPoints.size > 0) /* */ { /* 842 */ BidiRun[] runs = bidi.runs; /* */ /* 844 */ int visualStart = 0;int markFound = 0; /* 845 */ int length; for (int i = 0;; visualStart += length) { /* 846 */ length = runs[i].limit - visualStart; /* 847 */ int insertRemove = runs[i].insertRemove; /* 848 */ if ((insertRemove & 0x5) > 0) { /* 849 */ markFound++; /* */ } /* */ /* 852 */ if (visualIndex < runs[i].limit) { /* 853 */ return visualIndex + markFound; /* */ } /* 855 */ if ((insertRemove & 0xA) > 0) { /* 856 */ markFound++; /* */ } /* 845 */ i++; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 860 */ if (bidi.controlCount > 0) /* */ { /* 862 */ BidiRun[] runs = bidi.runs; /* */ /* 864 */ int visualStart = 0;int controlFound = 0; /* 865 */ char uchar = bidi.text[logicalIndex]; /* */ /* 867 */ if (Bidi.IsBidiControlChar(uchar)) { /* 868 */ return -1; /* */ } /* */ int length; /* 871 */ for (int i = 0;; visualStart += length) { /* 872 */ length = runs[i].limit - visualStart; /* 873 */ int insertRemove = runs[i].insertRemove; /* */ /* 875 */ if (visualIndex >= runs[i].limit) { /* 876 */ controlFound -= insertRemove; /* */ } /* */ else /* */ { /* 880 */ if (insertRemove == 0) /* 881 */ return visualIndex - controlFound; /* */ int limit; /* 883 */ int start; int limit; if (runs[i].isEvenRun()) /* */ { /* 885 */ int start = runs[i].start; /* 886 */ limit = logicalIndex; /* */ } /* */ else { /* 889 */ start = logicalIndex + 1; /* 890 */ limit = runs[i].start + length; /* */ } /* 892 */ for (int j = start; j < limit; j++) { /* 893 */ uchar = bidi.text[j]; /* 894 */ if (Bidi.IsBidiControlChar(uchar)) { /* 895 */ controlFound++; /* */ } /* */ } /* 898 */ return visualIndex - controlFound; /* */ } /* 871 */ i++; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 902 */ return visualIndex; /* */ } /* */ /* */ /* */ /* */ /* */ static int getLogicalIndex(Bidi bidi, int visualIndex) /* */ { /* 910 */ BidiRun[] runs = bidi.runs; /* 911 */ int runCount = bidi.runCount; /* 912 */ if (bidi.insertPoints.size > 0) /* */ { /* 914 */ int markFound = 0; /* 915 */ int visualStart = 0; /* */ int length; /* 917 */ for (int i = 0;; visualStart += length) { /* 918 */ length = runs[i].limit - visualStart; /* 919 */ int insertRemove = runs[i].insertRemove; /* 920 */ if ((insertRemove & 0x5) > 0) { /* 921 */ if (visualIndex <= visualStart + markFound) { /* 922 */ return -1; /* */ } /* 924 */ markFound++; /* */ } /* */ /* 927 */ if (visualIndex < runs[i].limit + markFound) { /* 928 */ visualIndex -= markFound; /* 929 */ break; /* */ } /* 931 */ if ((insertRemove & 0xA) > 0) { /* 932 */ if (visualIndex == visualStart + length + markFound) { /* 933 */ return -1; /* */ } /* 935 */ markFound++; /* */ } /* 917 */ i++; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ } /* 939 */ else if (bidi.controlCount > 0) /* */ { /* 941 */ int controlFound = 0; /* 942 */ int visualStart = 0; /* */ /* */ int length; /* */ /* 946 */ for (int i = 0;; visualStart += length) { /* 947 */ length = runs[i].limit - visualStart; /* 948 */ int insertRemove = runs[i].insertRemove; /* */ /* 950 */ if (visualIndex >= runs[i].limit - controlFound + insertRemove) { /* 951 */ controlFound -= insertRemove; /* */ } /* */ else /* */ { /* 955 */ if (insertRemove == 0) { /* 956 */ visualIndex += controlFound; /* 957 */ break; /* */ } /* */ /* 960 */ int logicalStart = runs[i].start; /* 961 */ boolean evenRun = runs[i].isEvenRun(); /* 962 */ int logicalEnd = logicalStart + length - 1; /* 963 */ for (int j = 0; j < length; j++) { /* 964 */ int k = evenRun ? logicalStart + j : logicalEnd - j; /* 965 */ char uchar = bidi.text[k]; /* 966 */ if (Bidi.IsBidiControlChar(uchar)) { /* 967 */ controlFound++; /* */ } /* 969 */ if (visualIndex + controlFound == visualStart + j) { /* */ break; /* */ } /* */ } /* 973 */ visualIndex += controlFound; /* 974 */ break; /* */ } /* 946 */ i++; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 978 */ if (runCount <= 10) /* */ { /* 980 */ for (int i = 0; visualIndex >= runs[i].limit; i++) {} /* */ } /* */ /* 983 */ int begin = 0;int limit = runCount; /* */ int i; /* */ for (;;) /* */ { /* 987 */ i = (begin + limit) / 2; /* 988 */ if (visualIndex >= runs[i].limit) { /* 989 */ begin = i + 1; /* 990 */ } else { if ((i == 0) || (visualIndex >= runs[(i - 1)].limit)) { /* */ break; /* */ } /* 993 */ limit = i; /* */ } /* */ } /* */ /* */ /* 998 */ int start = runs[i].start; /* 999 */ if (runs[i].isEvenRun()) /* */ { /* */ /* 1002 */ if (i > 0) { /* 1003 */ visualIndex -= runs[(i - 1)].limit; /* */ } /* 1005 */ return start + visualIndex; /* */ } /* */ /* 1008 */ return start + runs[i].limit - visualIndex - 1; /* */ } /* */ /* */ /* */ /* */ static int[] getLogicalMap(Bidi bidi) /* */ { /* 1015 */ BidiRun[] runs = bidi.runs; /* */ /* 1017 */ int[] indexMap = new int[bidi.length]; /* 1018 */ if (bidi.length > bidi.resultLength) { /* 1019 */ Arrays.fill(indexMap, -1); /* */ } /* */ /* 1022 */ int visualStart = 0; /* 1023 */ for (int j = 0; j < bidi.runCount; j++) { /* 1024 */ int logicalStart = runs[j].start; /* 1025 */ int visualLimit = runs[j].limit; /* 1026 */ if (runs[j].isEvenRun()) { /* */ do { /* 1028 */ indexMap[(logicalStart++)] = (visualStart++); /* 1029 */ } while (visualStart < visualLimit); /* */ } else { /* 1031 */ logicalStart += visualLimit - visualStart; /* */ do { /* 1033 */ indexMap[(--logicalStart)] = (visualStart++); /* 1034 */ } while (visualStart < visualLimit); /* */ } /* */ } /* */ /* */ /* 1039 */ if (bidi.insertPoints.size > 0) { /* 1040 */ int markFound = 0;int runCount = bidi.runCount; /* */ /* 1042 */ runs = bidi.runs; /* 1043 */ visualStart = 0; /* */ int length; /* 1045 */ for (int i = 0; i < runCount; visualStart += length) { /* 1046 */ length = runs[i].limit - visualStart; /* 1047 */ int insertRemove = runs[i].insertRemove; /* 1048 */ if ((insertRemove & 0x5) > 0) { /* 1049 */ markFound++; /* */ } /* 1051 */ if (markFound > 0) { /* 1052 */ int logicalStart = runs[i].start; /* 1053 */ int logicalLimit = logicalStart + length; /* 1054 */ for (int j = logicalStart; j < logicalLimit; j++) { /* 1055 */ indexMap[j] += markFound; /* */ } /* */ } /* 1058 */ if ((insertRemove & 0xA) > 0) { /* 1059 */ markFound++; /* */ } /* 1045 */ i++; /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ } /* 1063 */ else if (bidi.controlCount > 0) { /* 1064 */ int controlFound = 0;int runCount = bidi.runCount; /* */ /* */ /* */ /* 1068 */ runs = bidi.runs; /* 1069 */ visualStart = 0; /* */ int length; /* 1071 */ for (int i = 0; i < runCount; visualStart += length) { /* 1072 */ length = runs[i].limit - visualStart; /* 1073 */ int insertRemove = runs[i].insertRemove; /* */ /* 1075 */ if (controlFound - insertRemove != 0) /* */ { /* */ /* 1078 */ int logicalStart = runs[i].start; /* 1079 */ boolean evenRun = runs[i].isEvenRun(); /* 1080 */ int logicalLimit = logicalStart + length; /* */ /* 1082 */ if (insertRemove == 0) { /* 1083 */ for (int j = logicalStart; j < logicalLimit; j++) { /* 1084 */ indexMap[j] -= controlFound; /* */ } /* */ } /* */ /* 1088 */ for (int j = 0; j < length; j++) { /* 1089 */ int k = evenRun ? logicalStart + j : logicalLimit - j - 1; /* 1090 */ char uchar = bidi.text[k]; /* 1091 */ if (Bidi.IsBidiControlChar(uchar)) { /* 1092 */ controlFound++; /* 1093 */ indexMap[k] = -1; /* */ } /* */ else { /* 1096 */ indexMap[k] -= controlFound; /* */ } /* */ } /* */ } /* 1071 */ i++; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 1100 */ return indexMap; /* */ } /* */ /* */ /* */ static int[] getVisualMap(Bidi bidi) /* */ { /* 1106 */ BidiRun[] runs = bidi.runs; /* */ /* 1108 */ int allocLength = bidi.length > bidi.resultLength ? bidi.length : bidi.resultLength; /* */ /* 1110 */ int[] indexMap = new int[allocLength]; /* */ /* 1112 */ int visualStart = 0; /* 1113 */ int idx = 0; /* 1114 */ for (int j = 0; j < bidi.runCount; j++) { /* 1115 */ int logicalStart = runs[j].start; /* 1116 */ int visualLimit = runs[j].limit; /* 1117 */ if (runs[j].isEvenRun()) { /* */ do { /* 1119 */ indexMap[(idx++)] = (logicalStart++); /* 1120 */ visualStart++; } while (visualStart < visualLimit); /* */ } else { /* 1122 */ logicalStart += visualLimit - visualStart; /* */ do { /* 1124 */ indexMap[(idx++)] = (--logicalStart); /* 1125 */ visualStart++; } while (visualStart < visualLimit); /* */ } /* */ } /* */ /* */ /* 1130 */ if (bidi.insertPoints.size > 0) { /* 1131 */ int markFound = 0;int runCount = bidi.runCount; /* */ /* 1133 */ runs = bidi.runs; /* */ /* 1135 */ for (int i = 0; i < runCount; i++) { /* 1136 */ int insertRemove = runs[i].insertRemove; /* 1137 */ if ((insertRemove & 0x5) > 0) { /* 1138 */ markFound++; /* */ } /* 1140 */ if ((insertRemove & 0xA) > 0) { /* 1141 */ markFound++; /* */ } /* */ } /* */ /* 1145 */ int k = bidi.resultLength; /* 1146 */ for (i = runCount - 1; (i >= 0) && (markFound > 0); i--) { /* 1147 */ int insertRemove = runs[i].insertRemove; /* 1148 */ if ((insertRemove & 0xA) > 0) { /* 1149 */ indexMap[(--k)] = -1; /* 1150 */ markFound--; /* */ } /* 1152 */ visualStart = i > 0 ? runs[(i - 1)].limit : 0; /* 1153 */ for (int j = runs[i].limit - 1; (j >= visualStart) && (markFound > 0); j--) { /* 1154 */ indexMap[(--k)] = indexMap[j]; /* */ } /* 1156 */ if ((insertRemove & 0x5) > 0) { /* 1157 */ indexMap[(--k)] = -1; /* 1158 */ markFound--; /* */ } /* */ } /* */ } /* 1162 */ else if (bidi.controlCount > 0) { /* 1163 */ int runCount = bidi.runCount; /* */ /* */ /* */ /* 1167 */ runs = bidi.runs; /* 1168 */ visualStart = 0; /* */ /* 1170 */ int k = 0; /* 1171 */ int length; for (int i = 0; i < runCount; visualStart += length) { /* 1172 */ length = runs[i].limit - visualStart; /* 1173 */ int insertRemove = runs[i].insertRemove; /* */ /* 1175 */ if ((insertRemove == 0) && (k == visualStart)) { /* 1176 */ k += length; /* */ } /* */ else /* */ { /* 1180 */ if (insertRemove == 0) { /* 1181 */ int visualLimit = runs[i].limit; /* 1182 */ for (int j = visualStart; j < visualLimit; j++) { /* 1183 */ indexMap[(k++)] = indexMap[j]; /* */ } /* */ } /* */ /* 1187 */ int logicalStart = runs[i].start; /* 1188 */ boolean evenRun = runs[i].isEvenRun(); /* 1189 */ int logicalEnd = logicalStart + length - 1; /* 1190 */ for (int j = 0; j < length; j++) { /* 1191 */ int m = evenRun ? logicalStart + j : logicalEnd - j; /* 1192 */ char uchar = bidi.text[m]; /* 1193 */ if (!Bidi.IsBidiControlChar(uchar)) { /* 1194 */ indexMap[(k++)] = m; /* */ } /* */ } /* */ } /* 1171 */ i++; /* */ } /* */ } /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* */ /* 1199 */ if (allocLength == bidi.resultLength) { /* 1200 */ return indexMap; /* */ } /* 1202 */ int[] newMap = new int[bidi.resultLength]; /* 1203 */ System.arraycopy(indexMap, 0, newMap, 0, bidi.resultLength); /* 1204 */ return newMap; /* */ } /* */ /* */ static int[] invertMap(int[] srcMap) /* */ { /* 1209 */ int srcLength = srcMap.length; /* 1210 */ int destLength = -1;int count = 0; /* */ /* */ /* 1213 */ for (int i = 0; i < srcLength; i++) { /* 1214 */ int srcEntry = srcMap[i]; /* 1215 */ if (srcEntry > destLength) { /* 1216 */ destLength = srcEntry; /* */ } /* 1218 */ if (srcEntry >= 0) { /* 1219 */ count++; /* */ } /* */ } /* 1222 */ destLength++; /* 1223 */ int[] destMap = new int[destLength]; /* 1224 */ if (count < destLength) /* */ { /* 1226 */ Arrays.fill(destMap, -1); /* */ } /* 1228 */ for (i = 0; i < srcLength; i++) { /* 1229 */ int srcEntry = srcMap[i]; /* 1230 */ if (srcEntry >= 0) { /* 1231 */ destMap[srcEntry] = i; /* */ } /* */ } /* 1234 */ return destMap; /* */ } /* */ } /* Location: C:\Users\Ethan\Desktop\FontZip\FontTool\sfnttool.jar!\com\ibm\icu\text\BidiLine.class * Java compiler version: 5 (49.0) * JD-Core Version: 0.7.1 */