/* ******************************************************************************* * * Copyright (C) 1999-2000, International Business Machines * Corporation and others. All Rights Reserved. * ******************************************************************************* * file name: ubidi.h * encoding: US-ASCII * tab size: 8 (not used) * indentation:4 * * created on: 1999sep15 * created by: Markus W. Scherer */ #ifndef BIDI_H #define BIDI_H #include "unicode/utypes.h" #include "unicode/ubidi.h" #ifndef XP_CPLUSPLUS # error This is a C++ header file. #endif class U_COMMON_API BiDi { public: BiDi(); BiDi(UErrorCode &rErrorCode); BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode); ~BiDi(); void setInverse(UBool isInverse); UBool isInverse(); BiDi & setPara(const UChar *text, UTextOffset length, UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, UErrorCode &rErrorCode); BiDi & setLine(const BiDi &rParaBiDi, UTextOffset start, UTextOffset limit, UErrorCode &rErrorCode); UBiDiDirection getDirection() const; const UChar * getText() const; UTextOffset getLength() const; UBiDiLevel getParaLevel() const; UBiDiLevel getLevelAt(UTextOffset charIndex) const; const UBiDiLevel * getLevels(UErrorCode &rErrorCode); void getLogicalRun(UTextOffset logicalStart, UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const; UTextOffset countRuns(UErrorCode &rErrorCode); UBiDiDirection getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength); UTextOffset getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode); UTextOffset getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode); void getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode); void getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode); static void reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap); static void reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap); static void invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length); UTextOffset writeReordered(UChar *dest, int32_t destSize, uint16_t options, UErrorCode &rErrorCode); static UTextOffset writeReverse(const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, uint16_t options, UErrorCode &rErrorCode); protected: UBiDi *pBiDi; }; /* Inline implementations. -------------------------------------------------- */ inline BiDi::BiDi() { pBiDi=ubidi_open(); } inline BiDi::BiDi(UErrorCode &rErrorCode) { if(U_SUCCESS(rErrorCode)) { pBiDi=ubidi_open(); if(pBiDi==0) { rErrorCode=U_MEMORY_ALLOCATION_ERROR; } } else { pBiDi=0; } } inline BiDi::BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode) { pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode); } inline BiDi::~BiDi() { ubidi_close(pBiDi); pBiDi=0; } inline void BiDi::setInverse(UBool isInverse) { ubidi_setInverse(pBiDi, isInverse); } inline UBool BiDi::isInverse() { return ubidi_isInverse(pBiDi); } inline BiDi & BiDi::setPara(const UChar *text, UTextOffset length, UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels, UErrorCode &rErrorCode) { ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode); return *this; } inline BiDi & BiDi::setLine(const BiDi &rParaBiDi, UTextOffset start, UTextOffset limit, UErrorCode &rErrorCode) { ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode); return *this; } inline UBiDiDirection BiDi::getDirection() const { return ubidi_getDirection(pBiDi); } inline const UChar * BiDi::getText() const { return ubidi_getText(pBiDi); } inline UTextOffset BiDi::getLength() const { return ubidi_getLength(pBiDi); } inline UBiDiLevel BiDi::getParaLevel() const { return ubidi_getParaLevel(pBiDi); } inline UBiDiLevel BiDi::getLevelAt(UTextOffset charIndex) const { return ubidi_getLevelAt(pBiDi, charIndex); } inline const UBiDiLevel * BiDi::getLevels(UErrorCode &rErrorCode) { return ubidi_getLevels(pBiDi, &rErrorCode); } inline void BiDi::getLogicalRun(UTextOffset logicalStart, UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const { ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel); } inline UTextOffset BiDi::countRuns(UErrorCode &rErrorCode) { return ubidi_countRuns(pBiDi, &rErrorCode); } inline UBiDiDirection BiDi::getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength) { return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength); } inline UTextOffset BiDi::getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode) { return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode); } inline UTextOffset BiDi::getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode) { return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode); } inline void BiDi::getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode) { ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode); } inline void BiDi::getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode) { ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode); } inline void BiDi::reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) { ubidi_reorderLogical(levels, length, indexMap); } inline void BiDi::reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) { ubidi_reorderVisual(levels, length, indexMap); } inline void BiDi::invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length) { ubidi_invertMap(srcMap, destMap, length); } inline UTextOffset BiDi::writeReordered(UChar *dest, int32_t destSize, uint16_t options, UErrorCode &rErrorCode) { return ubidi_writeReordered(pBiDi, dest, destSize, options, &rErrorCode); } inline UTextOffset BiDi::writeReverse(const UChar *src, int32_t srcLength, UChar *dest, int32_t destSize, uint16_t options, UErrorCode &rErrorCode) { return ubidi_writeReverse(src, srcLength, dest, destSize, options, &rErrorCode); } #endif