pjs/cmd/winfe/cuvfm.cpp

238 строки
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.
*/
//--------------------------------------------------------------------------------------------------------
// Unicode Virtual Font Manager used for Unicode rendering
//--------------------------------------------------------------------------------------------------------
#include "stdafx.h"
#include "cuvfm.h"
//------------------------------------------------------------------------------------------------
//
// CUnicodeVirtualFontMgr
//
//------------------------------------------------------------------------------------------------
#ifdef XP_WIN
#ifndef XP_WIN32
#define GDI_ERROR NULL
#endif
#endif
CUnicodeVirtualFontMgr::CUnicodeVirtualFontMgr(HDC in_hdc)
{
TEXTMETRIC tm;
::GetTextMetrics(in_hdc, &tm);
m_DC = in_hdc;
m_OrigFont = (HFONT)::SelectObject(in_hdc, ::GetStockObject(SYSTEM_FONT));
if(m_OrigFont != (HGDIOBJ)GDI_ERROR)
{
CFont *pFont = CFont::FromHandle(m_OrigFont);
if( (pFont) &&
#ifdef XP_WIN32
(pFont->GetLogFont(& (this->m_lf))))
#else
(::GetObject(pFont->m_hObject ,sizeof(LOGFONT), &(this->m_lf))))
#endif
{
m_bFixed = ( m_lf.lfPitchAndFamily & FIXED_PITCH );
m_iOrigAscent = tm.tmAscent;
}
::SelectObject(in_hdc, m_OrigFont);
}
}
//------------------------------------------------------------------------------------------------
//
// ~CUnicodeVirtualFontMgr()
//
//------------------------------------------------------------------------------------------------
CUnicodeVirtualFontMgr::~CUnicodeVirtualFontMgr()
{
// restore the original font when we destroy.
if(m_OrigFont != (HGDIOBJ)GDI_ERROR)
{
::SelectObject(m_DC, m_OrigFont);
}
}
//------------------------------------------------------------------------------------------------
//
// CacularAscentDelta()
//
//------------------------------------------------------------------------------------------------
int CUnicodeVirtualFontMgr::CacularAscentDelta(HDC hDC)
{
// restore the original font when we destroy.
if(m_OrigFont != (HGDIOBJ)GDI_ERROR)
{
TEXTMETRIC tm;
::GetTextMetrics(hDC, &tm);
return m_iOrigAscent - tm.tmAscent;
}
return 0;
}
//------------------------------------------------------------------------------------------------
//
// CUnicodeVirtualFontMgr::GetCsidFont
//
//------------------------------------------------------------------------------------------------
CFont* CUnicodeVirtualFontMgr::GetCsidFont(int16 encoding)
{
if(m_OrigFont != (HGDIOBJ)GDI_ERROR)
{
CFont *pFont;
if(! GetFontFromCache(encoding, pFont))
{
VERIFY(pFont = CreateFont(encoding));
if(pFont != NULL)
{
if(AddFontToCache(encoding, pFont) == FALSE)
{
delete pFont;
return NULL;
}
}
}
return pFont;
}
return NULL;
}
CyaFont *CUnicodeVirtualFontMgr::GetCsidCyaFont(HDC hdc, int16 encoding)
{
if(m_OrigFont != (HGDIOBJ)GDI_ERROR)
{
CyaFont *pFont;
if(! GetCyaFontFromCache(encoding, pFont))
{
VERIFY(pFont = CreateCyaFont(hdc, encoding));
if(pFont != NULL)
{
if(AddCyaFontToCache(encoding, pFont) == FALSE)
{
delete pFont;
return NULL;
}
}
}
return pFont;
}
return NULL;
} // GetCsidCyaFont
//------------------------------------------------------------------------------------------------
//
// CUnicodeVirtualFontMgr::CreateFont
//
//------------------------------------------------------------------------------------------------
void CUnicodeVirtualFontMgr::UpdateLOGFONTForEncoding(int16 encoding)
{
m_lf.lfCharSet = DEFAULT_CHARSET;
m_lf.lfPitchAndFamily = DEFAULT_PITCH;
switch(encoding)
{
case CS_DINGBATS:
{
strcpy(m_lf.lfFaceName, "Wingdings");
if( (! theApp.m_bUseUnicodeFont) )
m_lf.lfCharSet = SYMBOL_CHARSET;
}
break;
case CS_SYMBOL:
{
strcpy(m_lf.lfFaceName, "Symbol");
if( (! theApp.m_bUseUnicodeFont) )
m_lf.lfCharSet = SYMBOL_CHARSET;
}
break;
default:
{
EncodingInfo *pEncoding = theApp.m_pIntlFont->GetEncodingInfo(theApp.m_pIntlFont->DocCSIDtoID(encoding & ~CS_AUTO));
XP_ASSERT(pEncoding);
if(pEncoding)
{
strcpy(m_lf.lfFaceName, ((m_bFixed) ? pEncoding->szFixName : pEncoding->szPropName ));
if(sysInfo.m_bWin4)
{
if( (! theApp.m_bUseUnicodeFont) )
{
m_lf.lfCharSet = ((m_bFixed) ?
pEncoding->iFixCharset : pEncoding->iPropCharset);
}
}
}
}
break;
}
}
CFont* CUnicodeVirtualFontMgr::CreateFont(int16 encoding)
{
UpdateLOGFONTForEncoding(encoding);
CFont *pSelectThis = new CFont();
VERIFY(pSelectThis->CreateFontIndirect(&m_lf));
return pSelectThis;
}
CyaFont* CUnicodeVirtualFontMgr::CreateCyaFont(HDC hdc, int16 encoding)
{
int isUnicode;
if ( CIntlWin::UseUnicodeFontAPI( encoding ))
{
isUnicode = 1;
}
else
{
isUnicode = 0;
}
UpdateLOGFONTForEncoding(encoding);
CyaFont *pSelectThis = new CyaFont();
// todo: pass in context as first paramer, it will be used
// to get current URL, for webfont security.
VERIFY(pSelectThis->CreateNetscapeFontWithLOGFONT(NULL,hdc, &m_lf, isUnicode) == FONTERR_OK );
return pSelectThis;
}
BOOL CUnicodeVirtualFontMgr::GetFontFromCache(int16 encoding, CFont*& pFont)
{
return CVirtualFontFontCache::Get(encoding,
m_lf.lfHeight, m_bFixed, (m_lf.lfWeight == FW_BOLD),
m_lf.lfItalic, m_lf.lfUnderline ,pFont);
}
BOOL CUnicodeVirtualFontMgr::AddFontToCache(int16 encoding, CFont* pFont)
{
return CVirtualFontFontCache::Add(encoding,
m_lf.lfHeight, m_bFixed, (m_lf.lfWeight == FW_BOLD),
m_lf.lfItalic, m_lf.lfUnderline ,pFont);
}
BOOL CUnicodeVirtualFontMgr::GetCyaFontFromCache(int16 encoding, CyaFont*& pFont)
{
return CVirtualFontFontCache::Get(encoding,
m_lf.lfHeight, m_bFixed, (m_lf.lfWeight == FW_BOLD),
m_lf.lfItalic, m_lf.lfUnderline ,pFont);
}
BOOL CUnicodeVirtualFontMgr::AddCyaFontToCache(int16 encoding, CyaFont* pFont)
{
return CVirtualFontFontCache::Add(encoding,
m_lf.lfHeight, m_bFixed, (m_lf.lfWeight == FW_BOLD),
m_lf.lfItalic, m_lf.lfUnderline ,pFont);
}