зеркало из https://github.com/mozilla/pjs.git
238 строки
6.6 KiB
C++
Executable File
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);
|
|
}
|
|
|
|
|