home *** CD-ROM | disk | FTP | other *** search
- /* -*- 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);
- }
-
-
-