/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ // =========================================================================== // UUnicodeTextHandler.cp // =========================================================================== // // Authror: Frank Tang ftang@netscape.com /*----------------------------------------------------------------------------- UUnicodeTextHandler Switch font to draw Unicode (UCS2) It use Singleton (See Design Patterns by Erich Gamma ) -----------------------------------------------------------------------------*/ #include "UUnicodeTextHandler.h" UUnicodeTextHandler* UUnicodeTextHandler::fTheOnlyInstance = NULL; UUnicodeTextHandler* UUnicodeTextHandler::Instance() { if(fTheOnlyInstance == NULL) fTheOnlyInstance = new UUnicodeTextHandler(); return fTheOnlyInstance; } void UUnicodeTextHandler::DrawUnicode(UFontSwitcher* fs, INTL_Unicode* unicode, int len) { INTL_CompoundStr* cs = INTL_CompoundStrFromUnicode(unicode, len); if(cs) { INTL_Encoding_ID encoding; unsigned char* outtext; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator)cs, &encoding , &outtext); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &outtext)) { if((outtext) && (*outtext)) { fs->EncodingTextFont(encoding); ::DrawText(outtext, 0, XP_STRLEN((char*)outtext)); } } INTL_CompoundStrDestroy(cs); } } short UUnicodeTextHandler::UnicodeWidth(UFontSwitcher* fs, INTL_Unicode* unicode, int len) { short width = 0; INTL_CompoundStr* cs = INTL_CompoundStrFromUnicode(unicode, len); if(cs) { INTL_Encoding_ID encoding; unsigned char* outtext; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator)cs, &encoding , &outtext); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &outtext)) { if((outtext) && (*outtext)) { fs->EncodingTextFont(encoding); width += ::TextWidth(outtext, 0, XP_STRLEN((char*)outtext)); } } INTL_CompoundStrDestroy(cs); } return width; } void UUnicodeTextHandler::GetFontInfo (UFontSwitcher* fs, FontInfo* fi) { FontInfo cur; int16 *list; int16 num; list = INTL_GetUnicodeCSIDList(&num); fi->ascent = fi->descent = fi->widMax = fi->leading = 0; for(int i = 0; i < num; i++) { fs->EncodingTextFont(list[i]); ::GetFontInfo(&cur); if(fi->ascent < cur.ascent) fi->ascent = cur.ascent; if(fi->descent < cur.descent) fi->descent = cur.descent; if(fi->widMax < cur.widMax) fi->widMax = cur.widMax; if(fi->leading < cur.leading) fi->leading = cur.leading; } }