summaryrefslogtreecommitdiffstats
path: root/src/tools/qunicodetables_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/tools/qunicodetables_p.h')
-rw-r--r--src/tools/qunicodetables_p.h266
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