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/ubidi.h"
00022
00023 #ifndef XP_CPLUSPLUS
00024 # error This is a C++ header file.
00025 #endif
00026
00036 class U_COMMON_API BiDi {
00037 public:
00041 BiDi();
00042
00046 BiDi(UErrorCode &rErrorCode);
00047
00051 BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode);
00052
00056 ~BiDi();
00057
00069 void
00070 setInverse(UBool isInverse);
00071
00078 UBool
00079 isInverse();
00080
00084 BiDi &
00085 setPara(const UChar *text, UTextOffset length,
00086 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00087 UErrorCode &rErrorCode);
00088
00089
00093 BiDi &
00094 setLine(const BiDi &rParaBiDi,
00095 UTextOffset start, UTextOffset limit,
00096 UErrorCode &rErrorCode);
00097
00101 UBiDiDirection
00102 getDirection() const;
00103
00107 const UChar *
00108 getText() const;
00109
00113 UTextOffset
00114 getLength() const;
00115
00119 UBiDiLevel
00120 getParaLevel() const;
00121
00125 UBiDiLevel
00126 getLevelAt(UTextOffset charIndex) const;
00127
00131 const UBiDiLevel *
00132 getLevels(UErrorCode &rErrorCode);
00133
00137 void
00138 getLogicalRun(UTextOffset logicalStart,
00139 UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const;
00140
00144 UTextOffset
00145 countRuns(UErrorCode &rErrorCode);
00146
00152 UBiDiDirection
00153 getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength);
00154
00158 UTextOffset
00159 getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode);
00160
00164 UTextOffset
00165 getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode);
00166
00172 void
00173 getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode);
00174
00180 void
00181 getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode);
00182
00186 static void
00187 reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap);
00188
00192 static void
00193 reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap);
00194
00198 static void
00199 invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length);
00200
00210 UTextOffset
00211 writeReordered(UChar *dest, int32_t destSize,
00212 uint16_t options,
00213 UErrorCode &rErrorCode);
00214
00221 static UTextOffset
00222 writeReverse(const UChar *src, int32_t srcLength,
00223 UChar *dest, int32_t destSize,
00224 uint16_t options,
00225 UErrorCode &rErrorCode);
00226
00227 protected:
00228 UBiDi *pBiDi;
00229 };
00230
00231
00232
00233 inline BiDi::BiDi() {
00234 pBiDi=ubidi_open();
00235 }
00236
00237 inline BiDi::BiDi(UErrorCode &rErrorCode) {
00238 if(U_SUCCESS(rErrorCode)) {
00239 pBiDi=ubidi_open();
00240 if(pBiDi==0) {
00241 rErrorCode=U_MEMORY_ALLOCATION_ERROR;
00242 }
00243 } else {
00244 pBiDi=0;
00245 }
00246 }
00247
00248 inline BiDi::BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode) {
00249 pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode);
00250 }
00251
00252 inline BiDi::~BiDi() {
00253 ubidi_close(pBiDi);
00254 pBiDi=0;
00255 }
00256
00257 inline void
00258 BiDi::setInverse(UBool isInverse) {
00259 ubidi_setInverse(pBiDi, isInverse);
00260 }
00261
00262 inline UBool
00263 BiDi::isInverse() {
00264 return ubidi_isInverse(pBiDi);
00265 }
00266
00267 inline BiDi &
00268 BiDi::setPara(const UChar *text, UTextOffset length,
00269 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00270 UErrorCode &rErrorCode) {
00271 ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode);
00272 return *this;
00273 }
00274
00275
00276 inline BiDi &
00277 BiDi::setLine(const BiDi &rParaBiDi,
00278 UTextOffset start, UTextOffset limit,
00279 UErrorCode &rErrorCode) {
00280 ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode);
00281 return *this;
00282 }
00283
00284 inline UBiDiDirection
00285 BiDi::getDirection() const {
00286 return ubidi_getDirection(pBiDi);
00287 }
00288
00289 inline const UChar *
00290 BiDi::getText() const {
00291 return ubidi_getText(pBiDi);
00292 }
00293
00294 inline UTextOffset
00295 BiDi::getLength() const {
00296 return ubidi_getLength(pBiDi);
00297 }
00298
00299 inline UBiDiLevel
00300 BiDi::getParaLevel() const {
00301 return ubidi_getParaLevel(pBiDi);
00302 }
00303
00304 inline UBiDiLevel
00305 BiDi::getLevelAt(UTextOffset charIndex) const {
00306 return ubidi_getLevelAt(pBiDi, charIndex);
00307 }
00308
00309 inline const UBiDiLevel *
00310 BiDi::getLevels(UErrorCode &rErrorCode) {
00311 return ubidi_getLevels(pBiDi, &rErrorCode);
00312 }
00313
00314 inline void
00315 BiDi::getLogicalRun(UTextOffset logicalStart,
00316 UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const {
00317 ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel);
00318 }
00319
00320 inline UTextOffset
00321 BiDi::countRuns(UErrorCode &rErrorCode) {
00322 return ubidi_countRuns(pBiDi, &rErrorCode);
00323 }
00324
00325 inline UBiDiDirection
00326 BiDi::getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength) {
00327 return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength);
00328 }
00329
00330 inline UTextOffset
00331 BiDi::getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode) {
00332 return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode);
00333 }
00334
00335 inline UTextOffset
00336 BiDi::getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode) {
00337 return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode);
00338 }
00339
00340 inline void
00341 BiDi::getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode) {
00342 ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode);
00343 }
00344
00345 inline void
00346 BiDi::getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode) {
00347 ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode);
00348 }
00349
00350 inline void
00351 BiDi::reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) {
00352 ubidi_reorderLogical(levels, length, indexMap);
00353 }
00354
00355 inline void
00356 BiDi::reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) {
00357 ubidi_reorderVisual(levels, length, indexMap);
00358 }
00359
00360 inline void
00361 BiDi::invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length) {
00362 ubidi_invertMap(srcMap, destMap, length);
00363 }
00364
00365 inline UTextOffset
00366 BiDi::writeReordered(UChar *dest, int32_t destSize,
00367 uint16_t options,
00368 UErrorCode &rErrorCode) {
00369 return ubidi_writeReordered(pBiDi, dest, destSize, options, &rErrorCode);
00370 }
00371
00372 inline UTextOffset
00373 BiDi::writeReverse(const UChar *src, int32_t srcLength,
00374 UChar *dest, int32_t destSize,
00375 uint16_t options,
00376 UErrorCode &rErrorCode) {
00377 return ubidi_writeReverse(src, srcLength, dest, destSize, options, &rErrorCode);
00378 }
00379
00380 #endif