home *** CD-ROM | disk | FTP | other *** search
- /*
- *******************************************************************************
- * *
- * COPYRIGHT: *
- * (C) Copyright International Business Machines Corporation, 1999 *
- * Licensed Material - Program-Property of IBM - All Rights Reserved. *
- * US Government Users Restricted Rights - Use, duplication, or disclosure *
- * restricted by GSA ADP Schedule Contract with IBM Corp. *
- * *
- *******************************************************************************
- * file name: ubidi.h
- * encoding: US-ASCII
- * tab size: 8 (not used)
- * indentation:4
- *
- * created on: 1999sep15
- * created by: Markus W. Scherer
- */
-
- #ifndef BIDI_H
- #define BIDI_H
-
- #include "utypes.h"
- #include "ubidi.h"
-
- #ifndef XP_CPLUSPLUS
- # error This is a C++ header file.
- #endif
-
- /**
- * BiDi is a C++ wrapper class for UBiDi.
- * You need one BiDi object in place of one UBiDi object.
- * For details on the API and implementation of the
- * Unicode BiDi algorithm, see ubidi.h.
- *
- * @see UBiDi
- */
- class U_COMMON_API BiDi {
- public:
- /** @memo Default constructor, calls ubidi_open(). */
- BiDi();
-
- /** @memo Constructor, calls ubidi_open(). */
- BiDi(UErrorCode &rErrorCode);
-
- /** @memo Preallocating constructor, calls ubidi_openSized(). */
- BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode);
-
- /** @memo Destructor, calls ubidi_close(). */
- ~BiDi();
-
- /** @memo Set this object for one paragraph's text. */
- BiDi &
- setPara(const UChar *text, UTextOffset length,
- UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
- UErrorCode &rErrorCode);
-
-
- /** @memo Set this object for one line of the paragraph object's text. */
- BiDi &
- setLine(const BiDi &rParaBiDi,
- UTextOffset start, UTextOffset limit,
- UErrorCode &rErrorCode);
-
- /** @memo Get the directionality of the text. */
- UBiDiDirection
- getDirection() const;
-
- /** @memo Get the length of the text. */
- UTextOffset
- getLength() const;
-
- /** @memo Get the paragraph level of the text. */
- UBiDiLevel
- getParaLevel() const;
-
- /** @memo Get the level for one character. */
- UBiDiLevel
- getLevelAt(UTextOffset charIndex) const;
-
- /** @memo Get an array of levels for each character. */
- const UBiDiLevel *
- getLevels(UErrorCode &rErrorCode);
-
- /** @memo Get a logical run. */
- void
- getLogicalRun(UTextOffset logicalStart,
- UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const;
-
- /** @memo Get the number of runs. */
- UTextOffset
- countRuns(UErrorCode &rErrorCode);
-
- /**
- * @memo Get one run's logical start, length, and directionality,
- * which can be 0 for LTR or 1 for RTL.
- */
- UBiDiDirection
- getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength);
-
- /** @memo Get the visual position from a logical text position. */
- UTextOffset
- getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode);
-
- /** @memo Get the logical text position from a visual position. */
- UTextOffset
- getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode);
-
- /**
- * @memo Get a logical-to-visual index map (array) for the characters in the UBiDi
- * (paragraph or line) object.
- */
- void
- getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode);
-
- /**
- * @memo Get a visual-to-logical index map (array) for the characters in the UBiDi
- * (paragraph or line) object.
- */
- void
- getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode);
-
- /** @memo Same as ubidi_reorderLogical(). */
- static void
- reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap);
-
- /** @memo Same as ubidi_reorderVisual(). */
- static void
- reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap);
-
- /** @memo Same as ubidi_invertMap(). */
- static void
- invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length);
-
- protected:
- UBiDi *pBiDi;
- };
-
- /* Inline implementations. -------------------------------------------------- */
-
- inline BiDi::BiDi() {
- pBiDi=ubidi_open();
- }
-
- inline BiDi::BiDi(UErrorCode &rErrorCode) {
- if(U_SUCCESS(rErrorCode)) {
- pBiDi=ubidi_open();
- if(pBiDi==0) {
- rErrorCode=U_MEMORY_ALLOCATION_ERROR;
- }
- } else {
- pBiDi=0;
- }
- }
-
- inline BiDi::BiDi(UTextOffset maxLength, UTextOffset maxRunCount, UErrorCode &rErrorCode) {
- pBiDi=ubidi_openSized(maxLength, maxRunCount, &rErrorCode);
- }
-
- inline BiDi::~BiDi() {
- ubidi_close(pBiDi);
- pBiDi=0;
- }
-
- inline BiDi &
- BiDi::setPara(const UChar *text, UTextOffset length,
- UBiDiLevel paraLevel, UBiDiLevel *embeddingLevels,
- UErrorCode &rErrorCode) {
- ubidi_setPara(pBiDi, text, length, paraLevel, embeddingLevels, &rErrorCode);
- return *this;
- }
-
-
- inline BiDi &
- BiDi::setLine(const BiDi &rParaBiDi,
- UTextOffset start, UTextOffset limit,
- UErrorCode &rErrorCode) {
- ubidi_setLine(rParaBiDi.pBiDi, start, limit, pBiDi, &rErrorCode);
- return *this;
- }
-
- inline UBiDiDirection
- BiDi::getDirection() const {
- return ubidi_getDirection(pBiDi);
- }
-
- inline UTextOffset
- BiDi::getLength() const {
- return ubidi_getLength(pBiDi);
- }
-
- inline UBiDiLevel
- BiDi::getParaLevel() const {
- return ubidi_getParaLevel(pBiDi);
- }
-
- inline UBiDiLevel
- BiDi::getLevelAt(UTextOffset charIndex) const {
- return ubidi_getLevelAt(pBiDi, charIndex);
- }
-
- inline const UBiDiLevel *
- BiDi::getLevels(UErrorCode &rErrorCode) {
- return ubidi_getLevels(pBiDi, &rErrorCode);
- }
-
- inline void
- BiDi::getLogicalRun(UTextOffset logicalStart,
- UTextOffset &rLogicalLimit, UBiDiLevel &rLevel) const {
- ubidi_getLogicalRun(pBiDi, logicalStart, &rLogicalLimit, &rLevel);
- }
-
- inline UTextOffset
- BiDi::countRuns(UErrorCode &rErrorCode) {
- return ubidi_countRuns(pBiDi, &rErrorCode);
- }
-
- inline UBiDiDirection
- BiDi::getVisualRun(UTextOffset runIndex, UTextOffset &rLogicalStart, UTextOffset &rLength) {
- return ubidi_getVisualRun(pBiDi, runIndex, &rLogicalStart, &rLength);
- }
-
- inline UTextOffset
- BiDi::getVisualIndex(UTextOffset logicalIndex, UErrorCode &rErrorCode) {
- return ubidi_getVisualIndex(pBiDi, logicalIndex, &rErrorCode);
- }
-
- inline UTextOffset
- BiDi::getLogicalIndex(UTextOffset visualIndex, UErrorCode &rErrorCode) {
- return ubidi_getLogicalIndex(pBiDi, visualIndex, &rErrorCode);
- }
-
- inline void
- BiDi::getLogicalMap(UTextOffset *indexMap, UErrorCode &rErrorCode) {
- ubidi_getLogicalMap(pBiDi, indexMap, &rErrorCode);
- }
-
- inline void
- BiDi::getVisualMap(UTextOffset *indexMap, UErrorCode &rErrorCode) {
- ubidi_getVisualMap(pBiDi, indexMap, &rErrorCode);
- }
-
- inline void
- BiDi::reorderLogical(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) {
- ubidi_reorderLogical(levels, length, indexMap);
- }
-
- inline void
- BiDi::reorderVisual(const UBiDiLevel *levels, UTextOffset length, UTextOffset *indexMap) {
- ubidi_reorderVisual(levels, length, indexMap);
- }
-
- inline void
- BiDi::invertMap(const UTextOffset *srcMap, UTextOffset *destMap, UTextOffset length) {
- ubidi_invertMap(srcMap, destMap, length);
- }
-
- #endif
-