diff options
Diffstat (limited to 'src/tools/qunicodetables_p.h')
-rw-r--r-- | src/tools/qunicodetables_p.h | 266 |
1 files changed, 266 insertions, 0 deletions
diff --git a/src/tools/qunicodetables_p.h b/src/tools/qunicodetables_p.h new file mode 100644 index 000000000..3dff630d4 --- /dev/null +++ b/src/tools/qunicodetables_p.h @@ -0,0 +1,266 @@ +/**************************************************************************** +** +** ??? +** +** Copyright (C) 2005-2008 Trolltech ASA. All rights reserved. +** +** This file is part of the widgets module of the TQt GUI Toolkit. +** +** This file may be used under the terms of the GNU General +** Public License versions 2.0 or 3.0 as published by the Free +** Software Foundation and appearing in the files LICENSE.GPL2 +** and LICENSE.GPL3 included in the packaging of this file. +** Alternatively you may (at your option) use any later version +** of the GNU General Public License if such license has been +** publicly approved by Trolltech ASA (or its successors, if any) +** and the KDE Free TQt Foundation. +** +** Please review the following information to ensure GNU General +** Public Licensing retquirements will be met: +** http://trolltech.com/products/qt/licenses/licensing/opensource/. +** If you are unsure which license is appropriate for your use, please +** review the following information: +** http://trolltech.com/products/qt/licenses/licensing/licensingoverview +** or contact the sales department at sales@trolltech.com. +** +** This file may be used under the terms of the Q Public License as +** defined by Trolltech ASA and appearing in the file LICENSE.TQPL +** included in the packaging of this file. Licensees holding valid TQt +** Commercial licenses may use this file in accordance with the TQt +** Commercial License Agreement provided with the Software. +** +** This file is provided "AS IS" with NO WARRANTY OF ANY KIND, +** INCLUDING THE WARRANTIES OF DESIGN, MERCHANTABILITY AND FITNESS FOR +** A PARTICULAR PURPOSE. Trolltech reserves all rights not granted +** herein. +** +**********************************************************************/ + +#ifndef TQUNICODETABLES_P_H +#define TQUNICODETABLES_P_H + +// +// W A R N I N G +// ------------- +// +// This file is not part of the TQt API. It exists for the convenience +// of internal files. This header file may change from version to version +// without notice, or even be removed. +// +// We mean it. +// +// + +#ifndef QT_H +#include "qstring.h" +#endif // QT_H + +#ifdef QT_NO_UNICODETABLES +# include <ctype.h> +#endif + +class TQUnicodeTables { +public: + static const Q_UINT8 unicode_info[]; +#ifndef QT_NO_UNICODETABLES + static const Q_UINT16 decomposition_map[]; + static const Q_UINT16 decomposition_info[]; + static const Q_UINT16 ligature_map[]; + static const Q_UINT16 ligature_info[]; + static const Q_UINT8 direction_info[]; + static const Q_UINT8 combining_info[]; + static const Q_UINT16 case_info[]; + static const Q_INT8 decimal_info[]; + static const Q_UINT16 symmetricPairs[]; + static const int symmetricPairsSize; + static const Q_UINT8 line_break_info[]; +#else + static const Q_UINT8 latin1_line_break_info[]; +#endif + static const unsigned char otherScripts[]; + static const unsigned char indicScripts[]; + static const unsigned char scriptTable[]; + enum { SCRIPTS_INDIC = 0x7e }; + + // see http://www.unicode.org/reports/tr14/tr14-13.html + // we don't use the XX and AI properties and map them to AL instead. + enum LineBreakClass { + LineBreak_OP, LineBreak_CL, LineBreak_QU, LineBreak_GL, LineBreak_NS, + LineBreak_EX, LineBreak_SY, LineBreak_IS, LineBreak_PR, LineBreak_PO, + LineBreak_NU, LineBreak_AL, LineBreak_ID, LineBreak_IN, LineBreak_HY, + LineBreak_BA, LineBreak_BB, LineBreak_B2, LineBreak_ZW, LineBreak_CM, + LineBreak_SA, LineBreak_BK, LineBreak_CR, LineBreak_LF, LineBreak_SG, + LineBreak_CB, LineBreak_SP + }; +}; + + +inline TQChar::Category category( const TQChar &c ) +{ +#ifdef QT_NO_UNICODETABLES + if ( c.unicode() > 0xff ) return TQChar::Letter_Uppercase; //######## + return (TQChar::Category)TQUnicodeTables::unicode_info[c.unicode()]; +#else + register int uc = ((int)TQUnicodeTables::unicode_info[c.row()]) << 8; + uc += c.cell(); + return (TQChar::Category)TQUnicodeTables::unicode_info[uc]; +#endif // QT_NO_UNICODETABLES +} + +inline TQChar lower( const TQChar &c ) +{ +#ifndef QT_NO_UNICODETABLES + int row = c.row(); + int cell = c.cell(); + register int ci = TQUnicodeTables::case_info[row]; + register int uc = ((int)TQUnicodeTables::unicode_info[c.row()]) << 8; + uc += c.cell(); + if (TQUnicodeTables::unicode_info[uc] != TQChar::Letter_Uppercase || !ci) + return c; + Q_UINT16 lower = TQUnicodeTables::case_info[(ci<<8)+cell]; + return lower ? TQChar(lower) : c; +#else + if ( c.row() ) + return c; + return TQChar( tolower((uchar) c.latin1()) ); +#endif +} + +inline TQChar upper( const TQChar &c ) +{ +#ifndef QT_NO_UNICODETABLES + int row = c.row(); + int cell = c.cell(); + register int ci = TQUnicodeTables::case_info[row]; + register int uc = ((int)TQUnicodeTables::unicode_info[c.row()]) << 8; + uc += c.cell(); + if (TQUnicodeTables::unicode_info[uc] != TQChar::Letter_Lowercase || !ci) + return c; + Q_UINT16 upper = TQUnicodeTables::case_info[(ci<<8)+cell]; + return upper ? TQChar(upper) : c; +#else + if ( c.row() ) + return c; + return TQChar( toupper((uchar) c.latin1()) ); +#endif +} + +inline TQChar::Direction direction( const TQChar &c ) +{ +#ifndef QT_NO_UNICODETABLES + register int pos = TQUnicodeTables::direction_info[c.row()]; + return (TQChar::Direction) (TQUnicodeTables::direction_info[(pos<<8)+c.cell()] & 0x1f); +#else + Q_UNUSED(c); + return TQChar::DirL; +#endif +} + +inline bool mirrored( const TQChar &c ) +{ +#ifndef QT_NO_UNICODETABLES + register int pos = TQUnicodeTables::direction_info[c.row()]; + return TQUnicodeTables::direction_info[(pos<<8)+c.cell()] > 128; +#else + Q_UNUSED(c); + return FALSE; +#endif +} + + +inline TQChar mirroredChar( const TQChar &ch ) +{ +#ifndef QT_NO_UNICODETABLES + if(!::mirrored( ch )) + return ch; + + int i; + int c = ch.unicode(); + for (i = 0; i < TQUnicodeTables::symmetricPairsSize; i ++) { + if (TQUnicodeTables::symmetricPairs[i] == c) + return TQUnicodeTables::symmetricPairs[(i%2) ? (i-1) : (i+1)]; + } +#endif + return ch; +} + +inline TQChar::Joining joining( const TQChar &ch ) +{ +#ifndef QT_NO_UNICODETABLES + register int pos = TQUnicodeTables::direction_info[ch.row()]; + return (TQChar::Joining) ((TQUnicodeTables::direction_info[(pos<<8)+ch.cell()] >> 5) &0x3); +#else + Q_UNUSED(ch); + return TQChar::OtherJoining; +#endif +} + +inline bool isMark( const TQChar &ch ) +{ + TQChar::Category c = ::category( ch ); + return c >= TQChar::Mark_NonSpacing && c <= TQChar::Mark_Enclosing; +} + +inline unsigned char combiningClass( const TQChar &ch ) +{ +#ifndef QT_NO_UNICODETABLES + const int pos = TQUnicodeTables::combining_info[ch.row()]; + return TQUnicodeTables::combining_info[(pos<<8) + ch.cell()]; +#else + Q_UNUSED(ch); + return 0; +#endif +} + +inline bool isSpace( const TQChar &ch ) +{ + if( ch.unicode() >= 9 && ch.unicode() <=13 ) return TRUE; + TQChar::Category c = ::category( ch ); + return c >= TQChar::Separator_Space && c <= TQChar::Separator_Paragraph; +} + +inline int lineBreakClass( const TQChar &ch ) +{ +#ifdef QT_NO_UNICODETABLES + return ch.row() ? TQUnicodeTables::LineBreak_AL + : TQUnicodeTables::latin1_line_break_info[ch.cell()]; +#else + register int pos = ((int)TQUnicodeTables::line_break_info[ch.row()] << 8) + ch.cell(); + return TQUnicodeTables::line_break_info[pos]; +#endif +} + +inline int scriptForChar( ushort uc ) +{ + unsigned char script = TQUnicodeTables::scriptTable[(uc>>8)]; + if ( script >= TQUnicodeTables::SCRIPTS_INDIC ) { + if ( script == TQUnicodeTables::SCRIPTS_INDIC ) { + script = TQUnicodeTables::indicScripts[ (uc-0x0900)>>7 ]; + } else { + // 0x80 + SCRIPTS_xx + unsigned char index = script-0x80; + unsigned char cell = uc &0xff; + while( TQUnicodeTables::otherScripts[index++] < cell ) + index++; + script = TQUnicodeTables::otherScripts[index]; + } + } + return script; +} + +#ifdef Q_WS_X11 +#define SCRIPT_FOR_CHAR( script, c ) \ +do { \ + unsigned short _uc = (c).unicode(); \ + if ( _uc < 0x100 ) { \ + script = TQFont::Latin; \ + } else { \ + script = (TQFont::Script)scriptForChar( _uc ); \ + } \ +} while( FALSE ) +#else +#define SCRIPT_FOR_CHAR( script, c ) \ + script = (TQFont::Script)scriptForChar( (c).unicode() ) +#endif + +#endif |