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
00027 U_NAMESPACE_BEGIN
00043 class U_COMMON_API BiDi {
00044 public:
00048 BiDi();
00049
00053 BiDi(UErrorCode &rErrorCode);
00054
00058 BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode);
00059
00063 ~BiDi();
00064
00076 void
00077 setInverse(UBool isInverse);
00078
00085 UBool
00086 isInverse();
00087
00091 BiDi &
00092 setPara(const UChar *text, int32_t length,
00093 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00094 UErrorCode &rErrorCode);
00095
00096
00100 BiDi &
00101 setLine(const BiDi &rParaBiDi,
00102 int32_t start, int32_t limit,
00103 UErrorCode &rErrorCode);
00104
00108 UBiDiDirection
00109 getDirection() const;
00110
00114 const UChar *
00115 getText() const;
00116
00120 int32_t
00121 getLength() const;
00122
00126 UBiDiLevel
00127 getParaLevel() const;
00128
00132 UBiDiLevel
00133 getLevelAt(int32_t charIndex) const;
00134
00138 const UBiDiLevel *
00139 getLevels(UErrorCode &rErrorCode);
00140
00144 void
00145 getLogicalRun(int32_t logicalStart,
00146 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const;
00147
00151 int32_t
00152 countRuns(UErrorCode &rErrorCode);
00153
00159 UBiDiDirection
00160 getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength);
00161
00165 int32_t
00166 getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode);
00167
00171 int32_t
00172 getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode);
00173
00179 void
00180 getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode);
00181
00187 void
00188 getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode);
00189
00193 static void
00194 reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00195
00199 static void
00200 reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00201
00205 static void
00206 invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
00207
00217 int32_t
00218 writeReordered(UChar *dest, int32_t destSize,
00219 uint16_t options,
00220 UErrorCode &rErrorCode);
00221
00228 static int32_t
00229 writeReverse(const UChar *src, int32_t srcLength,
00230 UChar *dest, int32_t destSize,
00231 uint16_t options,
00232 UErrorCode &rErrorCode);
00233
00234 protected:
00235 UBiDi *pBiDi;
00236 };
00237
00238
00239
00240 inline BiDi::BiDi() {
00241 pBiDi=ubidi_open();
00242 }
00243
00244 inline BiDi::BiDi(UErrorCode &rErrorCode) {
00245 if(U_SUCCESS(rErrorCode)) {
00246 pBiDi=ubidi_open();
00247 if(pBiDi==0) {
00248 rErrorCode=U_MEMORY_ALLOCATION_ERROR;
00249 }
00250 } else {
00251 pBiDi=0;
00252 }
00253 }
00254
00255 inline BiDi::BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode) {
00256 pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode);
00257 }
00258
00259 inline BiDi::~BiDi() {
00260 ubidi_close(pBiDi);
00261 pBiDi=0;
00262 }
00263
00264 inline void
00265 BiDi::setInverse(UBool isInverse) {
00266 ubidi_setInverse(pBiDi, isInverse);
00267 }
00268
00269 inline UBool
00270 BiDi::isInverse() {
00271 return ubidi_isInverse(pBiDi);
00272 }
00273
00274 inline BiDi &
00275 BiDi::setPara(const UChar *text, int32_t length,
00276 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00277 UErrorCode &rErrorCode) {
00278 ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode);
00279 return *this;
00280 }
00281
00282
00283 inline BiDi &
00284 BiDi::setLine(const BiDi &rParaBiDi,
00285 int32_t start, int32_t limit,
00286 UErrorCode &rErrorCode) {
00287 ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode);
00288 return *this;
00289 }
00290
00291 inline UBiDiDirection
00292 BiDi::getDirection() const {
00293 return ubidi_getDirection(pBiDi);
00294 }
00295
00296 inline const UChar *
00297 BiDi::getText() const {
00298 return ubidi_getText(pBiDi);
00299 }
00300
00301 inline int32_t
00302 BiDi::getLength() const {
00303 return ubidi_getLength(pBiDi);
00304 }
00305
00306 inline UBiDiLevel
00307 BiDi::getParaLevel() const {
00308 return ubidi_getParaLevel(pBiDi);
00309 }
00310
00311 inline UBiDiLevel
00312 BiDi::getLevelAt(int32_t charIndex) const {
00313 return ubidi_getLevelAt(pBiDi, charIndex);
00314 }
00315
00316 inline const UBiDiLevel *
00317 BiDi::getLevels(UErrorCode &rErrorCode) {
00318 return ubidi_getLevels(pBiDi, &rErrorCode);
00319 }
00320
00321 inline void
00322 BiDi::getLogicalRun(int32_t logicalStart,
00323 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const {
00324 ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel);
00325 }
00326
00327 inline int32_t
00328 BiDi::countRuns(UErrorCode &rErrorCode) {
00329 return ubidi_countRuns(pBiDi, &rErrorCode);
00330 }
00331
00332 inline UBiDiDirection
00333 BiDi::getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength) {
00334 return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength);
00335 }
00336
00337 inline int32_t
00338 BiDi::getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode) {
00339 return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode);
00340 }
00341
00342 inline int32_t
00343 BiDi::getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode) {
00344 return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode);
00345 }
00346
00347 inline void
00348 BiDi::getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00349 ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode);
00350 }
00351
00352 inline void
00353 BiDi::getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00354 ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode);
00355 }
00356
00357 inline void
00358 BiDi::reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00359 ubidi_reorderLogical(levels, length, indexMap);
00360 }
00361
00362 inline void
00363 BiDi::reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00364 ubidi_reorderVisual(levels, length, indexMap);
00365 }
00366
00367 inline void
00368 BiDi::invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) {
00369 ubidi_invertMap(srcMap, destMap, length);
00370 }
00371
00372 inline int32_t
00373 BiDi::writeReordered(UChar *dest, int32_t destSize,
00374 uint16_t options,
00375 UErrorCode &rErrorCode) {
00376 return ubidi_writeReordered(pBiDi, dest, destSize, options, &rErrorCode);
00377 }
00378
00379 inline int32_t
00380 BiDi::writeReverse(const UChar *src, int32_t srcLength,
00381 UChar *dest, int32_t destSize,
00382 uint16_t options,
00383 UErrorCode &rErrorCode) {
00384 return ubidi_writeReverse(src, srcLength, dest, destSize, options, &rErrorCode);
00385 }
00386
00387 U_NAMESPACE_END
00388
00389 #endif