/* -*- 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. */ //-------------------------------------------------------------------------------------------------------- // Author: Frank Tang ftang@netscape.com x2913 // // Text Handlering Routien for Unicode rendering //-------------------------------------------------------------------------------------------------------- #include "stdafx.h" #include "cuvfs.h" #include "cuvfm.h" #include "libi18n.h" //------------------------------------------------------------------------------------------------ // INTL_CompoundStrFromUTF8 //------------------------------------------------------------------------------------------------ static INTL_CompoundStr* INTL_CompoundStrFromUTF8(LPCSTR pString, int length) { WCHAR ucs2[512]; int ulen; INTL_CompoundStr *This = NULL; ulen = CASTINT(INTL_TextToUnicode(CS_UTF8, (unsigned char*)pString, length, ucs2, 512)); This = INTL_CompoundStrFromUnicode(ucs2, ulen); return This; } //------------------------------------------------------------------------------------------------ // // CIntlUnicodeVirtualFontStrategy::GetTextExtentPoint // //------------------------------------------------------------------------------------------------ BOOL CIntlUnicodeVirtualFontStrategy::GetTextExtentPoint(HDC hDC, LPCSTR pString, int iLength, LPSIZE pSize) { pSize->cx = 0; pSize->cy = 0; CUnicodeVirtualFontMgr ufm(hDC); INTL_CompoundStr *str = INTL_CompoundStrFromUTF8(pString, iLength); if(str) { CDC * pDC = CDC::FromHandle(hDC); INTL_Encoding_ID encoding; unsigned char *text; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator) str, &encoding, &text); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &text)) { SIZE textsize; pDC->SelectObject(ufm.GetCsidFont(encoding)); int textlength = XP_STRLEN((char*)text); VERIFY(CIntlWin::GetTextExtentPoint(encoding, hDC, (char*)text, textlength, &textsize)); pSize->cx += textsize.cx; if(textsize.cy > pSize->cy) pSize->cy = textsize.cy; } INTL_CompoundStrDestroy(str); } // The destructor of CUnicodeVirtualFontMgr will reset the font. return TRUE; } //------------------------------------------------------------------------------------------------ // // CIntlUnicodeVirtualFontStrategy::TextOut // //------------------------------------------------------------------------------------------------ BOOL CIntlUnicodeVirtualFontStrategy::TextOut(HDC hDC, int nXStart, int nYStart, LPCSTR pString, int iLength) { // Save the current font on stack CUnicodeVirtualFontMgr ufm(hDC); INTL_CompoundStr *str = INTL_CompoundStrFromUTF8(pString, iLength); if(str) { CDC * pDC = CDC::FromHandle(hDC); INTL_Encoding_ID encoding; unsigned char *text; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator) str, &encoding, &text); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &text)) { SIZE textsize; pDC->SelectObject(ufm.GetCsidFont(encoding)); int textlength = XP_STRLEN((char*)text); VERIFY(CIntlWin::TextOut(encoding, hDC, nXStart, nYStart + ufm.CacularAscentDelta(hDC), (char*)text, textlength)); VERIFY(CIntlWin::GetTextExtentPoint(encoding, hDC, (char*)text, textlength, &textsize)); nXStart += textsize.cx; } INTL_CompoundStrDestroy(str); } // The destructor of CUnicodeVirtualFontMgr will reset the font. return TRUE; } BOOL CIntlUnicodeVirtualFontStrategy::GetTextExtentPointWithCyaFont(CyaFont *theNSFont, HDC hDC, LPCSTR pString, int iLength, LPSIZE pSize) { pSize->cx = 0; pSize->cy = 0; CUnicodeVirtualFontMgr ufm(hDC); // Change this to get attribute from CyaFont instead of hDC INTL_CompoundStr *str = INTL_CompoundStrFromUTF8(pString, iLength); if(str) { CDC * pDC = CDC::FromHandle(hDC); INTL_Encoding_ID encoding; unsigned char *text; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator) str, &encoding, &text); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &text)) { SIZE textsize; CyaFont *encodingFont = ufm.GetCsidCyaFont(hDC, encoding); encodingFont->PrepareDrawText( hDC ); // Select the Font in the DC int textlength = XP_STRLEN((char*)text); VERIFY(CIntlWin::GetTextExtentPointWithCyaFont(encodingFont ,encoding, hDC, (char*)text, textlength, &textsize)); encodingFont->EndDrawText( hDC ); // Restore the old Font in the DC pSize->cx += textsize.cx; if(textsize.cy > pSize->cy) pSize->cy = textsize.cy; } INTL_CompoundStrDestroy(str); } // The destructor of CUnicodeVirtualFontMgr will reset the font. return TRUE; } // GetTextExtentPointWithCyaFont BOOL CIntlUnicodeVirtualFontStrategy::TextOutWithCyaFont(CyaFont *theNSFont, HDC hDC, int nXStart, int nYStart, LPCSTR lpString, int iLength) { // Save the current font on stack CUnicodeVirtualFontMgr ufm(hDC); /* May be we should pass theNSFont instead */ INTL_CompoundStr *str = INTL_CompoundStrFromUTF8(lpString, iLength); if(str) { CDC * pDC = CDC::FromHandle(hDC); INTL_Encoding_ID encoding; unsigned char *text; INTL_CompoundStrIterator iter; for(iter = INTL_CompoundStrFirstStr((INTL_CompoundStrIterator) str, &encoding, &text); iter != NULL; iter = INTL_CompoundStrNextStr(iter, &encoding, &text)) { CyaFont *encodingFont = ufm.GetCsidCyaFont(hDC, encoding); SIZE textsize; int textlength = XP_STRLEN((char*)text); encodingFont->PrepareDrawText( hDC ); // Select the Font in the DC VERIFY(CIntlWin::TextOutWithCyaFont(encodingFont,encoding, hDC, nXStart, nYStart + ufm.CacularAscentDelta(hDC), (char*)text, textlength)); VERIFY(CIntlWin::GetTextExtentPoint(encoding, hDC, (char*)text, textlength, &textsize)); encodingFont->EndDrawText( hDC ); // Restore the old Font in the DC nXStart += textsize.cx; } INTL_CompoundStrDestroy(str); } // The destructor of CUnicodeVirtualFontMgr will reset the font. return TRUE; } // TextOutWithCyaFont