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