Exemplo n.º 1
0
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);
}
Exemplo n.º 2
0
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];
		}
	}
}
Exemplo n.º 3
0
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);
    }
}