U_CAPI UBiDiDirection U_EXPORT2 ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, int32_t *pLogicalStart, int32_t *pLength) { int32_t start; UErrorCode errorCode = U_ZERO_ERROR; RETURN_IF_NOT_VALID_PARA_OR_LINE(pBiDi, errorCode, UBIDI_LTR); ubidi_getRuns(pBiDi, &errorCode); if(U_FAILURE(errorCode)) { return UBIDI_LTR; } RETURN_IF_BAD_RANGE(runIndex, 0, pBiDi->runCount, errorCode, UBIDI_LTR); start=pBiDi->runs[runIndex].logicalStart; if(pLogicalStart!=NULL) { *pLogicalStart=GET_INDEX(start); } if(pLength!=NULL) { if(runIndex>0) { *pLength=pBiDi->runs[runIndex].visualLimit- pBiDi->runs[runIndex-1].visualLimit; } else { *pLength=pBiDi->runs[0].visualLimit; } } return (UBiDiDirection)GET_ODD_BIT(start); }
U_CAPI void U_EXPORT2 ubidi_getLogicalRun(const UBiDi * pBiDi, int32_t logicalPosition, int32_t * pLogicalLimit, UBiDiLevel * pLevel) { UErrorCode errorCode; int32_t runCount, visualStart, logicalLimit, logicalFirst, i; Run iRun; errorCode = U_ZERO_ERROR; RETURN_VOID_IF_BAD_RANGE(logicalPosition, 0, pBiDi->length, errorCode); /* ubidi_countRuns will check VALID_PARA_OR_LINE */ runCount = ubidi_countRuns((UBiDi *)pBiDi, &errorCode); if (U_FAILURE(errorCode)) { return; } /* this is done based on runs rather than on levels since levels have a special interpretation when UBIDI_REORDER_RUNS_ONLY */ visualStart = logicalLimit = 0; iRun = pBiDi->runs[0]; for (i = 0; i < runCount; i++) { iRun = pBiDi->runs[i]; logicalFirst = GET_INDEX(iRun.logicalStart); logicalLimit = logicalFirst + iRun.visualLimit - visualStart; if ((logicalPosition >= logicalFirst) && (logicalPosition < logicalLimit)) { break; } visualStart = iRun.visualLimit; } if (pLogicalLimit) { *pLogicalLimit = logicalLimit; } if (pLevel) { if (pBiDi->reorderingMode == UBIDI_REORDER_RUNS_ONLY) { *pLevel = (UBiDiLevel)GET_ODD_BIT(iRun.logicalStart); } else if (pBiDi->direction != UBIDI_MIXED || logicalPosition >= pBiDi->trailingWSStart) { *pLevel = GET_PARALEVEL(pBiDi, logicalPosition); } else { *pLevel = pBiDi->levels[logicalPosition]; } } }
U_CAPI UBiDiDirection U_EXPORT2 ubidi_getVisualRun(UBiDi *pBiDi, int32_t runIndex, int32_t *pLogicalStart, int32_t *pLength) { if( pBiDi==NULL || runIndex<0 || (pBiDi->runCount==-1 && !ubidi_getRuns(pBiDi)) || runIndex>=pBiDi->runCount ) { return UBIDI_LTR; } else { int32_t start=pBiDi->runs[runIndex].logicalStart; if(pLogicalStart!=NULL) { *pLogicalStart=GET_INDEX(start); } if(pLength!=NULL) { if(runIndex>0) { *pLength=pBiDi->runs[runIndex].visualLimit- pBiDi->runs[runIndex-1].visualLimit; } else { *pLength=pBiDi->runs[0].visualLimit; } } return (UBiDiDirection)GET_ODD_BIT(start); } }