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 #ifndef XP_CPLUSPLUS
00025 # error This is a C++ header file.
00026 #endif
00027
00028 U_NAMESPACE_BEGIN
00044 class U_COMMON_API BiDi : public UObject {
00045 public:
00049 BiDi();
00050
00054 BiDi(UErrorCode &rErrorCode);
00055
00059 BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode);
00060
00064 ~BiDi();
00065
00077 void
00078 setInverse(UBool isInverse);
00079
00086 UBool
00087 isInverse();
00088
00092 BiDi &
00093 setPara(const UChar *text, int32_t length,
00094 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00095 UErrorCode &rErrorCode);
00096
00097
00101 BiDi &
00102 setLine(const BiDi &rParaBiDi,
00103 int32_t start, int32_t limit,
00104 UErrorCode &rErrorCode);
00105
00109 UBiDiDirection
00110 getDirection() const;
00111
00115 const UChar *
00116 getText() const;
00117
00121 int32_t
00122 getLength() const;
00123
00127 UBiDiLevel
00128 getParaLevel() const;
00129
00133 UBiDiLevel
00134 getLevelAt(int32_t charIndex) const;
00135
00139 const UBiDiLevel *
00140 getLevels(UErrorCode &rErrorCode);
00141
00145 void
00146 getLogicalRun(int32_t logicalStart,
00147 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const;
00148
00152 int32_t
00153 countRuns(UErrorCode &rErrorCode);
00154
00160 UBiDiDirection
00161 getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength);
00162
00166 int32_t
00167 getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode);
00168
00172 int32_t
00173 getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode);
00174
00180 void
00181 getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode);
00182
00188 void
00189 getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode);
00190
00194 static void
00195 reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00196
00200 static void
00201 reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap);
00202
00206 static void
00207 invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length);
00208
00218 int32_t
00219 writeReordered(UChar *dest, int32_t destSize,
00220 uint16_t options,
00221 UErrorCode &rErrorCode);
00222
00229 static int32_t
00230 writeReverse(const UChar *src, int32_t srcLength,
00231 UChar *dest, int32_t destSize,
00232 uint16_t options,
00233 UErrorCode &rErrorCode);
00234
00240 virtual inline UClassID getDynamicClassID() const { return getStaticClassID(); }
00241
00247 static inline UClassID getStaticClassID() { return (UClassID)&fgClassID; }
00248
00249 protected:
00250 UBiDi *pBiDi;
00251
00252 private:
00253
00258 static const char fgClassID;
00259 };
00260
00261
00262
00263 inline BiDi::BiDi() {
00264 pBiDi=ubidi_open();
00265 }
00266
00267 inline BiDi::BiDi(UErrorCode &rErrorCode) {
00268 if(U_SUCCESS(rErrorCode)) {
00269 pBiDi=ubidi_open();
00270 if(pBiDi==0) {
00271 rErrorCode=U_MEMORY_ALLOCATION_ERROR;
00272 }
00273 } else {
00274 pBiDi=0;
00275 }
00276 }
00277
00278 inline BiDi::BiDi(int32_t maxLength, int32_t maxRunCount, UErrorCode &rErrorCode) {
00279 pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode);
00280 }
00281
00282 inline BiDi::~BiDi() {
00283 ubidi_close(pBiDi);
00284 pBiDi=0;
00285 }
00286
00287 inline void
00288 BiDi::setInverse(UBool isInverse) {
00289 ubidi_setInverse(pBiDi, isInverse);
00290 }
00291
00292 inline UBool
00293 BiDi::isInverse() {
00294 return ubidi_isInverse(pBiDi);
00295 }
00296
00297 inline BiDi &
00298 BiDi::setPara(const UChar *text, int32_t length,
00299 UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
00300 UErrorCode &rErrorCode) {
00301 ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode);
00302 return *this;
00303 }
00304
00305
00306 inline BiDi &
00307 BiDi::setLine(const BiDi &rParaBiDi,
00308 int32_t start, int32_t limit,
00309 UErrorCode &rErrorCode) {
00310 ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode);
00311 return *this;
00312 }
00313
00314 inline UBiDiDirection
00315 BiDi::getDirection() const {
00316 return ubidi_getDirection(pBiDi);
00317 }
00318
00319 inline const UChar *
00320 BiDi::getText() const {
00321 return ubidi_getText(pBiDi);
00322 }
00323
00324 inline int32_t
00325 BiDi::getLength() const {
00326 return ubidi_getLength(pBiDi);
00327 }
00328
00329 inline UBiDiLevel
00330 BiDi::getParaLevel() const {
00331 return ubidi_getParaLevel(pBiDi);
00332 }
00333
00334 inline UBiDiLevel
00335 BiDi::getLevelAt(int32_t charIndex) const {
00336 return ubidi_getLevelAt(pBiDi, charIndex);
00337 }
00338
00339 inline const UBiDiLevel *
00340 BiDi::getLevels(UErrorCode &rErrorCode) {
00341 return ubidi_getLevels(pBiDi, &rErrorCode);
00342 }
00343
00344 inline void
00345 BiDi::getLogicalRun(int32_t logicalStart,
00346 int32_t &rLogicalLimit, UBiDiLevel &rLevel) const {
00347 ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel);
00348 }
00349
00350 inline int32_t
00351 BiDi::countRuns(UErrorCode &rErrorCode) {
00352 return ubidi_countRuns(pBiDi, &rErrorCode);
00353 }
00354
00355 inline UBiDiDirection
00356 BiDi::getVisualRun(int32_t runIndex, int32_t &rLogicalStart, int32_t &rLength) {
00357 return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength);
00358 }
00359
00360 inline int32_t
00361 BiDi::getVisualIndex(int32_t logicalIndex, UErrorCode &rErrorCode) {
00362 return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode);
00363 }
00364
00365 inline int32_t
00366 BiDi::getLogicalIndex(int32_t visualIndex, UErrorCode &rErrorCode) {
00367 return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode);
00368 }
00369
00370 inline void
00371 BiDi::getLogicalMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00372 ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode);
00373 }
00374
00375 inline void
00376 BiDi::getVisualMap(int32_t *indexMap, UErrorCode &rErrorCode) {
00377 ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode);
00378 }
00379
00380 inline void
00381 BiDi::reorderLogical(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00382 ubidi_reorderLogical(levels, length, indexMap);
00383 }
00384
00385 inline void
00386 BiDi::reorderVisual(const UBiDiLevel *levels, int32_t length, int32_t *indexMap) {
00387 ubidi_reorderVisual(levels, length, indexMap);
00388 }
00389
00390 inline void
00391 BiDi::invertMap(const int32_t *srcMap, int32_t *destMap, int32_t length) {
00392 ubidi_invertMap(srcMap, destMap, length);
00393 }
00394
00395 inline int32_t
00396 BiDi::writeReordered(UChar *dest, int32_t destSize,
00397 uint16_t options,
00398 UErrorCode &rErrorCode) {
00399 return ubidi_writeReordered(pBiDi, dest, destSize, options, &rErrorCode);
00400 }
00401
00402 inline int32_t
00403 BiDi::writeReverse(const UChar *src, int32_t srcLength,
00404 UChar *dest, int32_t destSize,
00405 uint16_t options,
00406 UErrorCode &rErrorCode) {
00407 return ubidi_writeReverse(src, srcLength, dest, destSize, options, &rErrorCode);
00408 }
00409
00410 U_NAMESPACE_END
00411
00412 #endif