pjs/cmd/winfe/cuvfs.cpp

184 строки
6.6 KiB
C++
Executable File

/* -*- 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