/**************************************************************************** ** ** Chinese Font utilities for X11 ** ** Created : 20010130 ** ** Copyright (C) 1992-2008 Trolltech ASA. All rights reserved. ** ** This file is part of the tools 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 requirements 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. ** **********************************************************************/ #include "private/qfontcodecs_p.h" #ifndef TQT_NO_CODECS #ifndef TQT_NO_BIG_CODECS extern int qt_UnicodeToGbk(uint unicode, uchar *gbchar); int TQFontGb2312Codec::heuristicContentMatch(const char *, int) const { return 0; } TQFontGb2312Codec::TQFontGb2312Codec() { //tqDebug("TQFontGb2312Codec::TQFontGb2312Codec()"); } const char* TQFontGb2312Codec::name() const { //tqDebug("TQFontGb2312Codec::name() = \"gb2312.1980-0\""); return "gb2312.1980-0"; } int TQFontGb2312Codec::mibEnum() const { //tqDebug("TQFontGb2312Codec::mibEnum() = 57"); return 57; } TQString TQFontGb2312Codec::toUnicode(const char* /*chars*/, int /*len*/) const { return TQString::null; } unsigned short TQFontGb2312Codec::characterFromUnicode(const TQString &str, int pos) const { uchar buf[4]; int len = qt_UnicodeToGbk((str.unicode() + pos)->unicode(), buf); if (len == 2 && buf[0] > 0xa0 && buf[1] > 0xa0) return ((buf[0] & 0x7f) << 8) + (buf[1] & 0x7f); return 0; } TQCString TQFontGb2312Codec::fromUnicode(const TQString& uc, int& lenInOut ) const { TQCString result(lenInOut * 2 + 1); uchar *rdata = (uchar *) result.data(); const TQChar *ucp = uc.unicode(); //tqDebug("TQFontGb2312Codec::fromUnicode(const TQString& uc, int& lenInOut = %d)", lenInOut); for ( int i = 0; i < lenInOut; i++ ) { TQChar ch(*ucp++); uchar buf[8]; int len = qt_UnicodeToGbk( ch.unicode(), buf ); if ( len == 2 && buf[0] > 0xa0 && buf[1] > 0xa0 ) { *rdata++ = buf[0] & 0x7f; *rdata++ = buf[1] & 0x7f; } else { //white square *rdata++ = 0x21; *rdata++ = 0x75; } } lenInOut *= 2; return result; } void TQFontGb2312Codec::fromUnicode(const TQChar *in, unsigned short *out, int length) const { int len; uchar buf[8]; while (length--) { len = qt_UnicodeToGbk(in->unicode(), buf); if ( len == 2 && buf[0] > 0xa0 && buf[1] > 0xa0 ) { *out = (((buf[0] << 8) | buf[1]) & 0x7f7f); } else { *out = 0; } ++in; ++out; } } bool TQFontGb2312Codec::canEncode( TQChar ch ) const { uchar buf[4]; int len = qt_UnicodeToGbk( ch.unicode(), buf ); //tqDebug("TQFontGb2312Codec::canEncode( TQChar ch = %02X%02X )", ch.row(), ch.cell()); return ( len == 2 && buf[0] > 0xa0 && buf[1] > 0xa0 ); } //========================================================================== int TQFontGbkCodec::heuristicContentMatch(const char *, int) const { return 0; } int TQFontGbkCodec::heuristicNameMatch(const char* hint) const { //tqDebug("TQFontGbkCodec::heuristicNameMatch(const char* hint = \"%s\")", hint); return ( tqstricmp(hint, "gbk-0") == 0 || tqstricmp(hint, "gb18030.2000-0") == 0 ) ? 13 : 0; } TQFontGbkCodec::TQFontGbkCodec() { //tqDebug("TQFontGbkCodec::TQFontGbkCodec()"); } const char* TQFontGbkCodec::name() const { //tqDebug("TQFontGbkCodec::name() = \"gbk-0\""); return "gbk-0"; } int TQFontGbkCodec::mibEnum() const { //tqDebug("TQFontGbkCodec::mibEnum() = -113"); return -113; } TQString TQFontGbkCodec::toUnicode(const char* /*chars*/, int /*len*/) const { return TQString::null; } unsigned short TQFontGbkCodec::characterFromUnicode(const TQString &str, int pos) const { uchar buf[4]; int len = qt_UnicodeToGbk((str.unicode() + pos)->unicode(), buf); if (len == 2) return (buf[0] << 8) + buf[1]; return 0; } TQCString TQFontGbkCodec::fromUnicode(const TQString& uc, int& lenInOut ) const { TQCString result(lenInOut * 2 + 1); uchar *rdata = (uchar *) result.data(); const TQChar *ucp = uc.unicode(); //tqDebug("TQFontGbkCodec::fromUnicode(const TQString& uc, int& lenInOut = %d)", lenInOut); for ( int i = 0; i < lenInOut; i++ ) { TQChar ch(*ucp++); uchar buf[8]; int len = qt_UnicodeToGbk( ch.unicode(), buf ); if ( len == 2 ) { *rdata++ = buf[0]; *rdata++ = buf[1]; } else { //white square *rdata++ = 0xa1; *rdata++ = 0xf5; } } lenInOut *= 2; return result; } void TQFontGbkCodec::fromUnicode(const TQChar *in, unsigned short *out, int length) const { uchar buf[8]; while (length--) { *out++ = (qt_UnicodeToGbk(in->unicode(), buf) == 2) ? (buf[0] << 8) | buf[1] : 0; ++in; } } bool TQFontGbkCodec::canEncode( TQChar ch ) const { if (ch.unicode() >= 0x4e00 && ch.unicode() <= 0x9fa5) return TRUE; uchar buf[4]; int len = qt_UnicodeToGbk( ch.unicode(), buf ); //tqDebug("TQFontGbkCodec::canEncode( TQChar ch = %02X%02X )", ch.row(), ch.cell()); return ( len == 2 ); } //========================================================================== int TQFontGb18030_0Codec::heuristicContentMatch(const char *, int) const { return 0; } TQFontGb18030_0Codec::TQFontGb18030_0Codec() { //tqDebug("TQFontGb18030_0Codec::TQFontGb18030_0Codec()"); } const char* TQFontGb18030_0Codec::name() const { //tqDebug("TQFontGb18030_0Codec::name() = \"gb18030-0\""); return "gb18030-0"; } int TQFontGb18030_0Codec::mibEnum() const { //tqDebug("TQFontGb18030_0Codec::mibEnum() = -114"); return -114; } TQString TQFontGb18030_0Codec::toUnicode(const char* /*chars*/, int /*len*/) const { return TQString::null; } unsigned short TQFontGb18030_0Codec::characterFromUnicode(const TQString &str, int pos) const { const TQChar * const ch = str.unicode() + pos; if (ch->row () > 0 && !(ch->row () >= 0xd8 && ch->row () < 0xe0)) return ch->unicode(); return 0; } TQCString TQFontGb18030_0Codec::fromUnicode(const TQString& uc, int& lenInOut ) const { TQCString result(lenInOut * 2 + 1); uchar *rdata = (uchar *) result.data(); const TQChar *ucp = uc.unicode(); //tqDebug("TQFontGb18030_0Codec::fromUnicode(const TQString& uc, int& lenInOut = %d)", lenInOut); for ( int i = 0; i < lenInOut; i++ ) { TQChar ch(*ucp++); if (ch.row () > 0 && !(ch.row () >= 0xd8 && ch.row () < 0xe0)) { *rdata++ = ch.row(); *rdata++ = ch.cell(); } else { *rdata++ = 0xff; *rdata++ = 0xfd; } } lenInOut *= 2; return result; } void TQFontGb18030_0Codec::fromUnicode(const TQChar *in, unsigned short *out, int length) const { while (length--) { *out = ((in->row () > 0 && !(in->row () >= 0xd8 && in->row () < 0xe0)) ? in->unicode() : 0); ++in; ++out; } } bool TQFontGb18030_0Codec::canEncode( TQChar ch ) const { //tqDebug("TQFontGb18030_0Codec::canEncode( TQChar ch = %02X%02X )", ch.row(), ch.cell()); return (ch.row () > 0 && !(ch.row () >= 0xd8 && ch.row () < 0xe0)); } //========================================================================== #endif // TQT_NO_BIG_CODECS #endif // TQT_NO_CODECS