Lines Matching +full:runs +full:- +full:on
6 * Copyright (C) 1999-2015, International Business Machines
11 * encoding: UTF-8
15 * created on: 1999aug06
30 * These functions deal with the aspects of potentially mixed-directional
46 * index on the fly in such a case.
48 * The implementation of the access to same-level-runs and of the reordering
51 * one (32-bit) integer per text character.
54 * same-level-runs is created. Reordering then is done on this vector.
59 * This is inefficient if there are many very short runs. If the average run
77 /* handle trailing WS (L1) -------------------------------------------------- */
86 * before the WS if it is at the paraLevel - we merge the two here.
88 * This function is called only from ubidi_setLine(), so pBiDi->paraLevel is
93 /* pBiDi->direction!=UBIDI_MIXED */ in setTrailingWSStart()
95 const DirProp *dirProps=pBiDi->dirProps; in setTrailingWSStart()
96 UBiDiLevel *levels=pBiDi->levels; in setTrailingWSStart()
97 int32_t start=pBiDi->length; in setTrailingWSStart()
98 UBiDiLevel paraLevel=pBiDi->paraLevel; in setTrailingWSStart()
102 Setting trailingWSStart to pBidi->length will avoid changing the in setTrailingWSStart()
106 if(dirProps[start-1]==B) { in setTrailingWSStart()
107 pBiDi->trailingWSStart=start; /* currently == pBiDi->length */ in setTrailingWSStart()
111 while(start>0 && DIRPROP_FLAG(dirProps[start-1])&MASK_WS) { in setTrailingWSStart()
112 --start; in setTrailingWSStart()
116 while(start>0 && levels[start-1]==paraLevel) { in setTrailingWSStart()
117 --start; in setTrailingWSStart()
120 pBiDi->trailingWSStart=start; in setTrailingWSStart()
123 /* ubidi_setLine ------------------------------------------------------------ */
136 RETURN_VOID_IF_BAD_RANGE(limit, 0, pParaBiDi->length+1, *pErrorCode); in ubidi_setLine()
142 ubidi_getParagraph(pParaBiDi, limit-1, NULL, NULL, NULL, pErrorCode)) { in ubidi_setLine()
149 pLineBiDi->pParaBiDi=NULL; /* mark unfinished setLine */ in ubidi_setLine()
150 pLineBiDi->text=pParaBiDi->text+start; in ubidi_setLine()
151 length=pLineBiDi->length=limit-start; in ubidi_setLine()
152 pLineBiDi->resultLength=pLineBiDi->originalLength=length; in ubidi_setLine()
153 pLineBiDi->paraLevel=GET_PARALEVEL(pParaBiDi, start); in ubidi_setLine()
154 pLineBiDi->paraCount=pParaBiDi->paraCount; in ubidi_setLine()
155 pLineBiDi->runs=NULL; in ubidi_setLine()
156 pLineBiDi->flags=0; in ubidi_setLine()
157 pLineBiDi->reorderingMode=pParaBiDi->reorderingMode; in ubidi_setLine()
158 pLineBiDi->reorderingOptions=pParaBiDi->reorderingOptions; in ubidi_setLine()
159 pLineBiDi->controlCount=0; in ubidi_setLine()
160 if(pParaBiDi->controlCount>0) { in ubidi_setLine()
163 if(IS_BIDI_CONTROL_CHAR(pParaBiDi->text[j])) { in ubidi_setLine()
164 pLineBiDi->controlCount++; in ubidi_setLine()
167 pLineBiDi->resultLength-=pLineBiDi->controlCount; in ubidi_setLine()
170 pLineBiDi->dirProps=pParaBiDi->dirProps+start; in ubidi_setLine()
171 pLineBiDi->levels=pParaBiDi->levels+start; in ubidi_setLine()
172 pLineBiDi->runCount=-1; in ubidi_setLine()
174 if(pParaBiDi->direction!=UBIDI_MIXED) { in ubidi_setLine()
176 pLineBiDi->direction=pParaBiDi->direction; in ubidi_setLine()
183 if(pParaBiDi->trailingWSStart<=start) { in ubidi_setLine()
184 pLineBiDi->trailingWSStart=0; in ubidi_setLine()
185 } else if(pParaBiDi->trailingWSStart<limit) { in ubidi_setLine()
186 pLineBiDi->trailingWSStart=pParaBiDi->trailingWSStart-start; in ubidi_setLine()
188 pLineBiDi->trailingWSStart=length; in ubidi_setLine()
191 const UBiDiLevel *levels=pLineBiDi->levels; in ubidi_setLine()
196 trailingWSStart=pLineBiDi->trailingWSStart; in ubidi_setLine()
198 /* recalculate pLineBiDi->direction */ in ubidi_setLine()
201 pLineBiDi->direction=(UBiDiDirection)(pLineBiDi->paraLevel&1); in ubidi_setLine()
207 if(trailingWSStart<length && (pLineBiDi->paraLevel&1)!=level) { in ubidi_setLine()
209 pLineBiDi->direction=UBIDI_MIXED; in ubidi_setLine()
211 … /* see if levels[1..trailingWSStart-1] have the same direction as levels[0] and paraLevel */ in ubidi_setLine()
216 pLineBiDi->direction=(UBiDiDirection)level; in ubidi_setLine()
219 pLineBiDi->direction=UBIDI_MIXED; in ubidi_setLine()
227 switch(pLineBiDi->direction) { in ubidi_setLine()
230 pLineBiDi->paraLevel=(UBiDiLevel)((pLineBiDi->paraLevel+1)&~1); in ubidi_setLine()
233 pLineBiDi->trailingWSStart=0; in ubidi_setLine()
237 pLineBiDi->paraLevel|=1; in ubidi_setLine()
240 pLineBiDi->trailingWSStart=0; in ubidi_setLine()
246 pLineBiDi->pParaBiDi=pParaBiDi; /* mark successful setLine */ in ubidi_setLine()
253 if(!IS_VALID_PARA_OR_LINE(pBiDi) || charIndex<0 || pBiDi->length<=charIndex) { in ubidi_getLevelAt()
255 } else if(pBiDi->direction!=UBIDI_MIXED || charIndex>=pBiDi->trailingWSStart) { in ubidi_getLevelAt()
258 return pBiDi->levels[charIndex]; in ubidi_getLevelAt()
268 if((length=pBiDi->length)<=0) { in ubidi_getLevels()
272 if((start=pBiDi->trailingWSStart)==length) { in ubidi_getLevels()
274 return pBiDi->levels; in ubidi_getLevels()
285 UBiDiLevel *levels=pBiDi->levelsMemory; in ubidi_getLevels()
287 if(start>0 && levels!=pBiDi->levels) { in ubidi_getLevels()
288 uprv_memcpy(levels, pBiDi->levels, start); in ubidi_getLevels()
290 /* pBiDi->paraLevel is ok even if contextual multiple paragraphs, in ubidi_getLevels()
292 uprv_memset(levels+start, pBiDi->paraLevel, length-start); in ubidi_getLevels()
295 pBiDi->trailingWSStart=length; in ubidi_getLevels()
296 return pBiDi->levels=levels; in ubidi_getLevels()
312 RETURN_VOID_IF_BAD_RANGE(logicalPosition, 0, pBiDi->length, errorCode); in ubidi_getLogicalRun()
318 /* this is done based on runs rather than on levels since levels have in ubidi_getLogicalRun()
322 iRun=pBiDi->runs[0]; in ubidi_getLogicalRun()
325 iRun = pBiDi->runs[i]; in ubidi_getLogicalRun()
327 logicalLimit=logicalFirst+iRun.visualLimit-visualStart; in ubidi_getLogicalRun()
338 if(pBiDi->reorderingMode==UBIDI_REORDER_RUNS_ONLY) { in ubidi_getLogicalRun()
341 else if(pBiDi->direction!=UBIDI_MIXED || logicalPosition>=pBiDi->trailingWSStart) { in ubidi_getLogicalRun()
344 *pLevel=pBiDi->levels[logicalPosition]; in ubidi_getLogicalRun()
349 /* runs API functions ------------------------------------------------------- */
353 RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); in ubidi_countRuns()
354 RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); in ubidi_countRuns()
357 return -1; in ubidi_countRuns()
359 return pBiDi->runCount; in ubidi_countRuns()
373 RETURN_IF_BAD_RANGE(runIndex, 0, pBiDi->runCount, errorCode, UBIDI_LTR); in ubidi_getVisualRun()
375 start=pBiDi->runs[runIndex].logicalStart; in ubidi_getVisualRun()
381 *pLength=pBiDi->runs[runIndex].visualLimit- in ubidi_getVisualRun()
382 pBiDi->runs[runIndex-1].visualLimit; in ubidi_getVisualRun()
384 *pLength=pBiDi->runs[0].visualLimit; in ubidi_getVisualRun()
393 /* simple, single-run case */ in getSingleRun()
394 pBiDi->runs=pBiDi->simpleRuns; in getSingleRun()
395 pBiDi->runCount=1; in getSingleRun()
398 pBiDi->runs[0].logicalStart=MAKE_INDEX_ODD_PAIR(0, level); in getSingleRun()
399 pBiDi->runs[0].visualLimit=pBiDi->length; in getSingleRun()
400 pBiDi->runs[0].insertRemove=0; in getSingleRun()
403 /* reorder the runs array (L2) ---------------------------------------------- */
406 * Reorder the same-level runs in the runs array.
414 * each sequence of same-level runs consists of only one run each, we
420 * in the last reordering the sequence of the runs at this level or higher
421 * will be all runs, and we don't need the elaborate loop to search for them.
423 * by an extra reorder-all after the reorder-some loop.
427 * Instead, all characters from trailingWSStart on are implicitly at
433 * this run and can --runCount. If it is later part of the all-runs
438 Run *runs, tempRun; in reorderLine() local
454 runs=pBiDi->runs; in reorderLine()
455 levels=pBiDi->levels; in reorderLine()
456 runCount=pBiDi->runCount; in reorderLine()
459 if(pBiDi->trailingWSStart<pBiDi->length) { in reorderLine()
460 --runCount; in reorderLine()
463 while(--maxLevel>=minLevel) { in reorderLine()
466 /* loop for all sequences of runs */ in reorderLine()
468 /* look for a sequence of runs that are all at >=maxLevel */ in reorderLine()
470 while(firstRun<runCount && levels[runs[firstRun].logicalStart]<maxLevel) { in reorderLine()
474 break; /* no more such runs */ in reorderLine()
478 … for(limitRun=firstRun; ++limitRun<runCount && levels[runs[limitRun].logicalStart]>=maxLevel;) {} in reorderLine()
480 /* Swap the entire sequence of runs from firstRun to limitRun-1. */ in reorderLine()
481 endRun=limitRun-1; in reorderLine()
483 tempRun = runs[firstRun]; in reorderLine()
484 runs[firstRun]=runs[endRun]; in reorderLine()
485 runs[endRun]=tempRun; in reorderLine()
487 --endRun; in reorderLine()
491 break; /* no more such runs */ in reorderLine()
503 if(pBiDi->trailingWSStart==pBiDi->length) { in reorderLine()
504 --runCount; in reorderLine()
507 /* Swap the entire sequence of all runs. (endRun==runCount) */ in reorderLine()
509 tempRun=runs[firstRun]; in reorderLine()
510 runs[firstRun]=runs[runCount]; in reorderLine()
511 runs[runCount]=tempRun; in reorderLine()
513 --runCount; in reorderLine()
518 /* compute the runs array --------------------------------------------------- */
521 Run *runs=pBiDi->runs; in getRunFromLogicalIndex() local
522 int32_t runCount=pBiDi->runCount, visualStart=0, i, length, logicalStart; in getRunFromLogicalIndex()
525 length=runs[i].visualLimit-visualStart; in getRunFromLogicalIndex()
526 logicalStart=GET_INDEX(runs[i].logicalStart); in getRunFromLogicalIndex()
537 * Compute the runs array from the levels array.
539 * and the runs are reordered.
540 * Odd-level runs have visualStart on their visual right edge and
550 * This method returns immediately if the runs are already set. This in ubidi_getRuns()
553 if (pBiDi->runCount>=0) { in ubidi_getRuns()
557 if(pBiDi->direction!=UBIDI_MIXED) { in ubidi_getRuns()
558 /* simple, single-run case - this covers length==0 */ in ubidi_getRuns()
559 /* pBiDi->paraLevel is ok even for contextual multiple paragraphs */ in ubidi_getRuns()
560 getSingleRun(pBiDi, pBiDi->paraLevel); in ubidi_getRuns()
563 int32_t length=pBiDi->length, limit; in ubidi_getRuns()
564 UBiDiLevel *levels=pBiDi->levels; in ubidi_getRuns()
578 limit=pBiDi->trailingWSStart; in ubidi_getRuns()
579 /* count the runs, there is at least one non-WS run, and limit>0 */ in ubidi_getRuns()
594 /* There is only one non-WS run and no trailing WS-run. */ in ubidi_getRuns()
597 /* allocate and set the runs */ in ubidi_getRuns()
598 Run *runs; in ubidi_getRuns() local
602 /* now, count a (non-mergeable) WS run */ in ubidi_getRuns()
609 runs=pBiDi->runsMemory; in ubidi_getRuns()
614 /* set the runs */ in ubidi_getRuns()
616 * 464->444, 484->444, 575->555, 595->555 in ubidi_getRuns()
639 runs[runIndex].logicalStart=start; in ubidi_getRuns()
640 runs[runIndex].visualLimit=i-start; in ubidi_getRuns()
641 runs[runIndex].insertRemove=0; in ubidi_getRuns()
647 runs[runIndex].logicalStart=limit; in ubidi_getRuns()
648 runs[runIndex].visualLimit=length-limit; in ubidi_getRuns()
649 /* For the trailing WS run, pBiDi->paraLevel is ok even in ubidi_getRuns()
651 if(pBiDi->paraLevel<minLevel) { in ubidi_getRuns()
652 minLevel=pBiDi->paraLevel; in ubidi_getRuns()
657 pBiDi->runs=runs; in ubidi_getRuns()
658 pBiDi->runCount=runCount; in ubidi_getRuns()
666 ADD_ODD_BIT_FROM_LEVEL(runs[i].logicalStart, levels[runs[i].logicalStart]); in ubidi_getRuns()
667 limit+=runs[i].visualLimit; in ubidi_getRuns()
668 runs[i].visualLimit=limit; in ubidi_getRuns()
673 /* For the trailing WS run, pBiDi->paraLevel is ok even if in ubidi_getRuns()
676 int32_t trailingRun = ((pBiDi->paraLevel & 1) != 0)? 0 : runIndex; in ubidi_getRuns()
678 ADD_ODD_BIT_FROM_LEVEL(runs[trailingRun].logicalStart, pBiDi->paraLevel); in ubidi_getRuns()
684 if(pBiDi->insertPoints.size>0) { in ubidi_getRuns()
685 Point *point, *start=pBiDi->insertPoints.points, in ubidi_getRuns()
686 *limit=start+pBiDi->insertPoints.size; in ubidi_getRuns()
689 runIndex=getRunFromLogicalIndex(pBiDi, point->pos); in ubidi_getRuns()
690 pBiDi->runs[runIndex].insertRemove|=point->flag; in ubidi_getRuns()
695 if(pBiDi->controlCount>0) { in ubidi_getRuns()
697 const UChar *start=pBiDi->text, *limit=start+pBiDi->length, *pu; in ubidi_getRuns()
700 runIndex=getRunFromLogicalIndex(pBiDi, (int32_t)(pu-start)); in ubidi_getRuns()
701 pBiDi->runs[runIndex].insertRemove--; in ubidi_getRuns()
724 level=levels[--start]; in prepareReorder()
740 --start; in prepareReorder()
747 /* reorder a line based on a levels array (L2) ------------------------------ */
791 * For each run, the new visual index=sos+eos-old visual index; in ubidi_reorderLogical()
792 * we pre-add sos+eos into sumOfSosEos -> in ubidi_reorderLogical()
793 * new visual index=sumOfSosEos-old visual index; in ubidi_reorderLogical()
795 sumOfSosEos=start+limit-1; in ubidi_reorderLogical()
799 indexMap[start]=sumOfSosEos-indexMap[start]; in ubidi_reorderLogical()
809 } while(--maxLevel>=minLevel); in ubidi_reorderLogical()
841 break; /* no more such runs */ in ubidi_reorderVisual()
848 * Swap the entire interval of indexes from start to limit-1. in ubidi_reorderVisual()
853 end=limit-1; in ubidi_reorderVisual()
860 --end; in ubidi_reorderVisual()
869 } while(--maxLevel>=minLevel); in ubidi_reorderVisual()
872 /* API functions for logical<->visual mapping ------------------------------- */
877 RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); in ubidi_getVisualIndex()
878 RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); in ubidi_getVisualIndex()
879 RETURN_IF_BAD_RANGE(logicalIndex, 0, pBiDi->length, *pErrorCode, -1); in ubidi_getVisualIndex()
881 /* we can do the trivial cases without the runs array */ in ubidi_getVisualIndex()
882 switch(pBiDi->direction) { in ubidi_getVisualIndex()
887 visualIndex=pBiDi->length-logicalIndex-1; in ubidi_getVisualIndex()
892 return -1; in ubidi_getVisualIndex()
894 Run *runs=pBiDi->runs; in ubidi_getVisualIndex() local
897 /* linear search for the run, search on the visual runs */ in ubidi_getVisualIndex()
898 for(i=0; i<pBiDi->runCount; ++i) { in ubidi_getVisualIndex()
899 length=runs[i].visualLimit-visualStart; in ubidi_getVisualIndex()
900 offset=logicalIndex-GET_INDEX(runs[i].logicalStart); in ubidi_getVisualIndex()
902 if(IS_EVEN_RUN(runs[i].logicalStart)) { in ubidi_getVisualIndex()
907 visualIndex=visualStart+length-offset-1; in ubidi_getVisualIndex()
913 if(i>=pBiDi->runCount) { in ubidi_getVisualIndex()
919 if(pBiDi->insertPoints.size>0) { in ubidi_getVisualIndex()
921 Run *runs=pBiDi->runs; in ubidi_getVisualIndex() local
925 length=runs[i].visualLimit-visualStart; in ubidi_getVisualIndex()
926 insertRemove=runs[i].insertRemove; in ubidi_getVisualIndex()
931 if(visualIndex<runs[i].visualLimit) { in ubidi_getVisualIndex()
939 else if(pBiDi->controlCount>0) { in ubidi_getVisualIndex()
941 Run *runs=pBiDi->runs; in ubidi_getVisualIndex() local
944 UChar uchar=pBiDi->text[logicalIndex]; in ubidi_getVisualIndex()
949 /* loop on runs */ in ubidi_getVisualIndex()
951 length=runs[i].visualLimit-visualStart; in ubidi_getVisualIndex()
952 insertRemove=runs[i].insertRemove; in ubidi_getVisualIndex()
954 if(visualIndex>=runs[i].visualLimit) { in ubidi_getVisualIndex()
955 controlFound-=insertRemove; in ubidi_getVisualIndex()
960 return visualIndex-controlFound; in ubidi_getVisualIndex()
962 if(IS_EVEN_RUN(runs[i].logicalStart)) { in ubidi_getVisualIndex()
964 start=runs[i].logicalStart; in ubidi_getVisualIndex()
969 limit=GET_INDEX(runs[i].logicalStart)+length; in ubidi_getVisualIndex()
972 uchar=pBiDi->text[j]; in ubidi_getVisualIndex()
977 return visualIndex-controlFound; in ubidi_getVisualIndex()
986 Run *runs; in ubidi_getLogicalIndex() local
988 RETURN_IF_NULL_OR_FAILING_ERRCODE(pErrorCode, -1); in ubidi_getLogicalIndex()
989 RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, *pErrorCode, -1); in ubidi_getLogicalIndex()
990 RETURN_IF_BAD_RANGE(visualIndex, 0, pBiDi->resultLength, *pErrorCode, -1); in ubidi_getLogicalIndex()
991 /* we can do the trivial cases without the runs array */ in ubidi_getLogicalIndex()
992 if(pBiDi->insertPoints.size==0 && pBiDi->controlCount==0) { in ubidi_getLogicalIndex()
993 if(pBiDi->direction==UBIDI_LTR) { in ubidi_getLogicalIndex()
996 else if(pBiDi->direction==UBIDI_RTL) { in ubidi_getLogicalIndex()
997 return pBiDi->length-visualIndex-1; in ubidi_getLogicalIndex()
1002 return -1; in ubidi_getLogicalIndex()
1005 runs=pBiDi->runs; in ubidi_getLogicalIndex()
1006 runCount=pBiDi->runCount; in ubidi_getLogicalIndex()
1007 if(pBiDi->insertPoints.size>0) { in ubidi_getLogicalIndex()
1011 runs=pBiDi->runs; in ubidi_getLogicalIndex()
1014 length=runs[i].visualLimit-visualStart; in ubidi_getLogicalIndex()
1015 insertRemove=runs[i].insertRemove; in ubidi_getLogicalIndex()
1023 if(visualIndex<(runs[i].visualLimit+markFound)) { in ubidi_getLogicalIndex()
1024 visualIndex-=markFound; in ubidi_getLogicalIndex()
1035 else if(pBiDi->controlCount>0) { in ubidi_getLogicalIndex()
1043 length=runs[i].visualLimit-visualStart; in ubidi_getLogicalIndex()
1044 insertRemove=runs[i].insertRemove; in ubidi_getLogicalIndex()
1046 if(visualIndex>=(runs[i].visualLimit-controlFound+insertRemove)) { in ubidi_getLogicalIndex()
1047 controlFound-=insertRemove; in ubidi_getLogicalIndex()
1055 /* count non-control chars until visualIndex */ in ubidi_getLogicalIndex()
1056 logicalStart=runs[i].logicalStart; in ubidi_getLogicalIndex()
1059 logicalEnd=logicalStart+length-1; in ubidi_getLogicalIndex()
1061 k= evenRun ? logicalStart+j : logicalEnd-j; in ubidi_getLogicalIndex()
1062 uchar=pBiDi->text[k]; in ubidi_getLogicalIndex()
1077 for(i=0; visualIndex>=runs[i].visualLimit; ++i) {} in ubidi_getLogicalIndex()
1085 if(visualIndex>=runs[i].visualLimit) { in ubidi_getLogicalIndex()
1087 } else if(i==0 || visualIndex>=runs[i-1].visualLimit) { in ubidi_getLogicalIndex()
1095 start=runs[i].logicalStart; in ubidi_getLogicalIndex()
1098 /* the offset in runs[i] is visualIndex-runs[i-1].visualLimit */ in ubidi_getLogicalIndex()
1100 visualIndex-=runs[i-1].visualLimit; in ubidi_getLogicalIndex()
1105 return GET_INDEX(start)+runs[i].visualLimit-visualIndex-1; in ubidi_getLogicalIndex()
1119 /* fill a logical-to-visual index map using the runs[] */ in ubidi_getLogicalMap()
1122 Run *runs=pBiDi->runs; in ubidi_getLogicalMap() local
1123 if (pBiDi->length<=0) { in ubidi_getLogicalMap()
1126 if (pBiDi->length>pBiDi->resultLength) { in ubidi_getLogicalMap()
1127 uprv_memset(indexMap, 0xFF, pBiDi->length*sizeof(int32_t)); in ubidi_getLogicalMap()
1131 for(j=0; j<pBiDi->runCount; ++j) { in ubidi_getLogicalMap()
1132 logicalStart=GET_INDEX(runs[j].logicalStart); in ubidi_getLogicalMap()
1133 visualLimit=runs[j].visualLimit; in ubidi_getLogicalMap()
1134 if(IS_EVEN_RUN(runs[j].logicalStart)) { in ubidi_getLogicalMap()
1139 logicalStart+=visualLimit-visualStart; /* logicalLimit */ in ubidi_getLogicalMap()
1141 indexMap[--logicalStart]=visualStart++; in ubidi_getLogicalMap()
1147 if(pBiDi->insertPoints.size>0) { in ubidi_getLogicalMap()
1148 int32_t markFound=0, runCount=pBiDi->runCount; in ubidi_getLogicalMap()
1153 length=runs[i].visualLimit-visualStart; in ubidi_getLogicalMap()
1154 insertRemove=runs[i].insertRemove; in ubidi_getLogicalMap()
1159 logicalStart=GET_INDEX(runs[i].logicalStart); in ubidi_getLogicalMap()
1170 else if(pBiDi->controlCount>0) { in ubidi_getLogicalMap()
1171 int32_t controlFound=0, runCount=pBiDi->runCount; in ubidi_getLogicalMap()
1178 length=runs[i].visualLimit-visualStart; in ubidi_getLogicalMap()
1179 insertRemove=runs[i].insertRemove; in ubidi_getLogicalMap()
1180 /* no control found within previous runs nor within this run */ in ubidi_getLogicalMap()
1181 if((controlFound-insertRemove)==0) { in ubidi_getLogicalMap()
1184 logicalStart=runs[i].logicalStart; in ubidi_getLogicalMap()
1191 indexMap[j]-=controlFound; in ubidi_getLogicalMap()
1196 k= evenRun ? logicalStart+j : logicalLimit-j-1; in ubidi_getLogicalMap()
1197 uchar=pBiDi->text[k]; in ubidi_getLogicalMap()
1203 indexMap[k]-=controlFound; in ubidi_getLogicalMap()
1220 /* fill a visual-to-logical index map using the runs[] */ in ubidi_getVisualMap()
1221 Run *runs=pBiDi->runs, *runsLimit=runs+pBiDi->runCount; in ubidi_getVisualMap() local
1224 if (pBiDi->resultLength<=0) { in ubidi_getVisualMap()
1228 for(; runs<runsLimit; ++runs) { in ubidi_getVisualMap()
1229 logicalStart=runs->logicalStart; in ubidi_getVisualMap()
1230 visualLimit=runs->visualLimit; in ubidi_getVisualMap()
1237 logicalStart+=visualLimit-visualStart; /* logicalLimit */ in ubidi_getVisualMap()
1239 *pi++ = --logicalStart; in ubidi_getVisualMap()
1245 if(pBiDi->insertPoints.size>0) { in ubidi_getVisualMap()
1246 int32_t markFound=0, runCount=pBiDi->runCount; in ubidi_getVisualMap()
1248 runs=pBiDi->runs; in ubidi_getVisualMap()
1251 insertRemove=runs[i].insertRemove; in ubidi_getVisualMap()
1260 k=pBiDi->resultLength; in ubidi_getVisualMap()
1261 for(i=runCount-1; i>=0 && markFound>0; i--) { in ubidi_getVisualMap()
1262 insertRemove=runs[i].insertRemove; in ubidi_getVisualMap()
1264 indexMap[--k]= UBIDI_MAP_NOWHERE; in ubidi_getVisualMap()
1265 markFound--; in ubidi_getVisualMap()
1267 visualStart= i>0 ? runs[i-1].visualLimit : 0; in ubidi_getVisualMap()
1268 for(j=runs[i].visualLimit-1; j>=visualStart && markFound>0; j--) { in ubidi_getVisualMap()
1269 indexMap[--k]=indexMap[j]; in ubidi_getVisualMap()
1272 indexMap[--k]= UBIDI_MAP_NOWHERE; in ubidi_getVisualMap()
1273 markFound--; in ubidi_getVisualMap()
1277 else if(pBiDi->controlCount>0) { in ubidi_getVisualMap()
1278 int32_t runCount=pBiDi->runCount, logicalEnd; in ubidi_getVisualMap()
1282 runs=pBiDi->runs; in ubidi_getVisualMap()
1287 length=runs[i].visualLimit-visualStart; in ubidi_getVisualMap()
1288 insertRemove=runs[i].insertRemove; in ubidi_getVisualMap()
1296 visualLimit=runs[i].visualLimit; in ubidi_getVisualMap()
1302 logicalStart=runs[i].logicalStart; in ubidi_getVisualMap()
1305 logicalEnd=logicalStart+length-1; in ubidi_getVisualMap()
1307 m= evenRun ? logicalStart+j : logicalEnd-j; in ubidi_getVisualMap()
1308 uchar=pBiDi->text[m]; in ubidi_getVisualMap()
1322 int32_t destLength=-1, count=0; in ubidi_invertMap()
1326 if(*--pi>destLength) { in ubidi_invertMap()
1335 /* we must fill unmatched destMap entries with -1 */ in ubidi_invertMap()
1340 if(*--pi>=0) { in ubidi_invertMap()
1341 destMap[*pi]=--length; in ubidi_invertMap()
1343 --length; in ubidi_invertMap()