00001 /* 00002 ******************************************************************************* 00003 * 00004 * Copyright (C) 1999-2000, International Business Machines 00005 * Corporation and others. All Rights Reserved. 00006 * 00007 ******************************************************************************* 00008 * file name: ubidi.h 00009 * encoding: US-ASCII 00010 * tab size: 8 (not used) 00011 * indentation:4 00012 * 00013 * created on: 1999sep15 00014 * created by: Markus W. Scherer 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 /* Inline implementations. -------------------------------------------------- */ 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