00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef BIDI_H
00018 #define BIDI_H
00019
00020 #include "unicode/utypes.h"
00021 #include "unicode/uobject.h"
00022 #include "unicode/ubidi.h"
00023
00024 #ifdef ICU_UBIDI_USE_DEPRECATES
00025 #ifndef XP_CPLUSPLUS
00026 # error This is a C++ header file.
00027 #endif
00028
00029 U_NAMESPACE_BEGIN
00045 class U_COMMON_API BiDi : public UObject {
00046 public:
00050 BiDi();
00051
00055 BiDi(UErrorCode &rErrorCode);
00056
00060 BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode);
00061
00065 ~BiDi();
00066
00078 void
00079 setInverse(UBool isInverse);
00080
00087 UBool
00088 isInverse();
00089
00093 BiDi &
00094 setPara(const UChar *text, int32_t length,
00095 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00096 UErrorCode &rErrorCode);
00097
00098
00102 BiDi &
00103 setLine(const BiDi &rParaBiDi,
00104 int32_t start, int32_t limit,
00105 UErrorCode &rErrorCode);
00106
00110 UBiDiDirection
00111 getDirection() const;
00112
00116 const UChar *
00117 getText() const;
00118
00122 int32_t
00123 getLength() const;
00124
00128 UBiDiLevel
00129 getParaLevel() const;
00130
00134 UBiDiLevel
00135 getLevelAt(int32_t charIndex) const;
00136
00140 const UBiDiLevel *
00141 getLevels(UErrorCode &rErrorCode);
00142
00146 void
00147 getLogicalRun(int32_t logicalStart,
00148 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const;
00149
00153 int32_t
00154 countRuns(UErrorCode &rErrorCode);
00155
00161 UBiDiDirection
00162 getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength);
00163
00167 int32_t
00168 getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode);
00169
00173 int32_t
00174 getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode);
00175
00181 void
00182 getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode);
00183
00189 void
00190 getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode);
00191
00195 static void
00196 reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00197
00201 static void
00202 reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00203
00207 static void
00208 invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
00209
00219 int32_t
00220 writeReordered(UChar *dest, int32_t destSize,
00221 uint16_t options,
00222 UErrorCode &rErrorCode);
00223
00230 static int32_t
00231 writeReverse(const UChar *src, int32_t srcLength,
00232 UChar *dest, int32_t destSize,
00233 uint16_t options,
00234 UErrorCode &rErrorCode);
00235
00241 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
00242
00248 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
00249
00250 protected:
00251 UBiDi *pBiDi;
00252
00253 private:
00254
00259 static const char fgClassID;
00260 };
00261
00262
00263
00264 inline BiDi::BiDi() {
00265 pBiDi=ubidi_open();
00266 }
00267
00268 inline BiDi::BiDi(UErrorCode &rErrorCode) {
00269 if(U_SUCCESS(rErrorCode)) {
00270 pBiDi=ubidi_open();
00271 if(pBiDi==0) {
00272 rErrorCode=U_MEMORY_ALLOCATION_ERROR;
00273 }
00274 } else {
00275 pBiDi=0;
00276 }
00277 }
00278
00279 inline BiDi::BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode) {
00280 pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode);
00281 }
00282
00283 inline BiDi::~BiDi() {
00284 ubidi_close(pBiDi);
00285 pBiDi=0;
00286 }
00287
00288 inline void
00289 BiDi::setInverse(UBool isInverse) {
00290 ubidi_setInverse(pBiDi, isInverse);
00291 }
00292
00293 inline UBool
00294 BiDi::isInverse() {
00295 return ubidi_isInverse(pBiDi);
00296 }
00297
00298 inline BiDi &
00299 BiDi::setPara(const UChar *text, int32_t length,
00300 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00301 UErrorCode &rErrorCode) {
00302 ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode);
00303 return *this;
00304 }
00305
00306
00307 inline BiDi &
00308 BiDi::setLine(const BiDi &rParaBiDi,
00309 int32_t start, int32_t limit,
00310 UErrorCode &rErrorCode) {
00311 ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode);
00312 return *this;
00313 }
00314
00315 inline UBiDiDirection
00316 BiDi::getDirection() const {
00317 return ubidi_getDirection(pBiDi);
00318 }
00319
00320 inline const UChar *
00321 BiDi::getText() const {
00322 return ubidi_getText(pBiDi);
00323 }
00324
00325 inline int32_t
00326 BiDi::getLength() const {
00327 return ubidi_getLength(pBiDi);
00328 }
00329
00330 inline UBiDiLevel
00331 BiDi::getParaLevel() const {
00332 return ubidi_getParaLevel(pBiDi);
00333 }
00334
00335 inline UBiDiLevel
00336 BiDi::getLevelAt(int32_t charIndex) const {
00337 return ubidi_getLevelAt(pBiDi, charIndex);
00338 }
00339
00340 inline const UBiDiLevel *
00341 BiDi::getLevels(UErrorCode &rErrorCode) {
00342 return ubidi_getLevels(pBiDi, &rErrorCode);
00343 }
00344
00345 inline void
00346 BiDi::getLogicalRun(int32_t logicalStart,
00347 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const {
00348 ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel);
00349 }
00350
00351 inline int32_t
00352 BiDi::countRuns(UErrorCode &rErrorCode) {
00353 return ubidi_countRuns(pBiDi, &rErrorCode);
00354 }
00355
00356 inline UBiDiDirection
00357 BiDi::getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength) {
00358 return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength);
00359 }
00360
00361 inline int32_t
00362 BiDi::getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode) {
00363 return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode);
00364 }
00365
00366 inline int32_t
00367 BiDi::getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode) {
00368 return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode);
00369 }
00370
00371 inline void
00372 BiDi::getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00373 ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode);
00374 }
00375
00376 inline void
00377 BiDi::getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00378 ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode);
00379 }
00380
00381 inline void
00382 BiDi::reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00383 ubidi_reorderLogical(levels, length, indexMap);
00384 }
00385
00386 inline void
00387 BiDi::reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00388 ubidi_reorderVisual(levels, length, indexMap);
00389 }
00390
00391 inline void
00392 BiDi::invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) {
00393 ubidi_invertMap(srcMap, destMap, length);
00394 }
00395
00396 inline int32_t
00397 BiDi::writeReordered(UChar *dest, int32_t destSize,
00398 uint16_t options,
00399 UErrorCode &rErrorCode) {
00400 return ubidi_writeReordered(pBiDi, dest, destSize, options, &rErrorCode);
00401 }
00402
00403 inline int32_t
00404 BiDi::writeReverse(const UChar *src, int32_t srcLength,
00405 UChar *dest, int32_t destSize,
00406 uint16_t options,
00407 UErrorCode &rErrorCode) {
00408 return ubidi_writeReverse(src, srcLength, dest, destSize, options, &rErrorCode);
00409 }
00410
00411 U_NAMESPACE_END
00412 #else
00413
00414 #error "The unicode/bidi.h header is obsolete. Please use the BiDi C API in unicode/ubidi.h instead."
00415
00416 #endif
00417
00418 #endif