static void getSingleRun(Bidi bidi, byte level) { /* simple, single-run case */ bidi.runs = bidi.simpleRuns; bidi.runCount = 1; /* fill and reorder the single run */ bidi.runs[0] = new BidiRun(0, bidi.length, level); }
static BidiRun getVisualRun(Bidi bidi, int runIndex) { int start = bidi.runs[runIndex].start; int limit; byte level = bidi.runs[runIndex].level; if (runIndex > 0) { limit = start + bidi.runs[runIndex].limit - bidi.runs[runIndex - 1].limit; } else { limit = start + bidi.runs[0].limit; } return new BidiRun(start, limit, level); }
static BidiRun getLogicalRun(Bidi bidi, int logicalPosition) { /* this is done based on runs rather than on levels since levels have a special interpretation when REORDER_RUNS_ONLY */ BidiRun newRun = new BidiRun(), iRun; getRuns(bidi); int runCount = bidi.runCount; int visualStart = 0, logicalLimit = 0; iRun = bidi.runs[0]; for (int i = 0; i < runCount; i++) { iRun = bidi.runs[i]; logicalLimit = iRun.start + iRun.limit - visualStart; if ((logicalPosition >= iRun.start) && (logicalPosition < logicalLimit)) { break; } visualStart = iRun.limit; } newRun.start = iRun.start; newRun.limit = logicalLimit; newRun.level = iRun.level; return newRun; }
paraStart = bidi.paras_limit[paraIndex - 1]; BidiRun bidiRun = new BidiRun(); bidiRun.start = paraStart; bidiRun.limit = bidi.paras_limit[paraIndex];
for (i = oldRunCount; i < runCount; i++) { if (runs[i] == null) { runs[i] = new BidiRun(0, 0, (byte)0);