X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/76e23cdba3a2e58e788dd18734e7893185531a5b..96c9640205933ad0673d5af2c96af0816c50160c:/src/msw/fontenum.cpp diff --git a/src/msw/fontenum.cpp b/src/msw/fontenum.cpp index ca84524de7..3c936a11fe 100644 --- a/src/msw/fontenum.cpp +++ b/src/msw/fontenum.cpp @@ -1,5 +1,5 @@ /////////////////////////////////////////////////////////////////////////////// -// Name: msw/fontenum.cpp +// Name: src/msw/fontenum.cpp // Purpose: wxFontEnumerator class for Windows // Author: Julian Smart // Modified by: Vadim Zeitlin to add support for font encodings @@ -17,10 +17,6 @@ // headers // ---------------------------------------------------------------------------- -#ifdef __GNUG__ - #pragma implementation "fontenum.h" -#endif - // For compilers that support precompilation, includes "wx.h". #include "wx/wxprec.h" @@ -28,16 +24,21 @@ #pragma hdrstop #endif +#if wxUSE_FONTENUM + +#include "wx/fontenum.h" + #ifndef WX_PRECOMP - #include "wx/font.h" + #include "wx/gdicmn.h" + #include "wx/font.h" + #include "wx/dynarray.h" + #include "wx/msw/private.h" #endif +#include "wx/encinfo.h" #include "wx/fontutil.h" -#include "wx/fontenum.h" #include "wx/fontmap.h" -#include "wx/msw/private.h" - // ---------------------------------------------------------------------------- // private classes // ---------------------------------------------------------------------------- @@ -77,22 +78,29 @@ private: // if not empty, enum only the fonts in this family wxString m_family; - // if TRUE, enum only fixed fonts + // if true, enum only fixed fonts bool m_fixedOnly; - // if TRUE, we enumerate the encodings, not fonts + // if true, we enumerate the encodings, not fonts bool m_enumEncodings; // the list of charsets we already found while enumerating charsets wxArrayInt m_charsets; + + // the list of facenames we already found while enumerating facenames + wxArrayString m_facenames; + + wxDECLARE_NO_COPY_CLASS(wxFontEnumeratorHelper); }; // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- +#ifndef __WXMICROWIN__ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, - DWORD dwStyle, LONG lParam); + DWORD dwStyle, LPARAM lParam); +#endif // ============================================================================ // implementation @@ -106,65 +114,66 @@ wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum) { m_fontEnum = fontEnum; m_charset = DEFAULT_CHARSET; - m_fixedOnly = FALSE; - m_enumEncodings = FALSE; + m_fixedOnly = false; + m_enumEncodings = false; } void wxFontEnumeratorHelper::SetFamily(const wxString& family) { - m_enumEncodings = TRUE; + m_enumEncodings = true; m_family = family; } bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) { - wxNativeEncodingInfo info; - if ( !wxGetNativeFontEncoding(encoding, &info) ) + if ( encoding != wxFONTENCODING_SYSTEM ) { - if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) ) + wxNativeEncodingInfo info; + if ( !wxGetNativeFontEncoding(encoding, &info) ) { - // no such encodings at all - return FALSE; +#if wxUSE_FONTMAP + if ( !wxFontMapper::Get()->GetAltForEncoding(encoding, &info) ) +#endif // wxUSE_FONTMAP + { + // no such encodings at all + return false; + } } + + m_charset = info.charset; + m_facename = info.facename; } - m_charset = info.charset; - m_facename = info.facename; - return TRUE; + return true; } -#if defined(__GNUWIN32__) - #if wxUSE_NORLANDER_HEADERS - #define wxFONTENUMPROC int(*)(const LOGFONTA *, const TEXTMETRICA *, long unsigned int, LPARAM) - #else - #define wxFONTENUMPROC int(*)(ENUMLOGFONTEX *, NEWTEXTMETRICEX*, int, LPARAM) - #endif +#if defined(__GNUWIN32__) && !defined(__CYGWIN10__) && !wxCHECK_W32API_VERSION( 1, 1 ) && !wxUSE_NORLANDER_HEADERS + #define wxFONTENUMPROC int(*)(ENUMLOGFONTEX *, NEWTEXTMETRICEX*, int, LPARAM) #else #define wxFONTENUMPROC FONTENUMPROC #endif void wxFontEnumeratorHelper::DoEnumerate() { +#ifndef __WXMICROWIN__ HDC hDC = ::GetDC(NULL); -#ifdef __WIN32__ +#ifdef __WXWINCE__ + ::EnumFontFamilies(hDC, + m_facename.empty() ? NULL : m_facename.wx_str(), + (wxFONTENUMPROC)wxFontEnumeratorProc, + (LPARAM)this) ; +#else // __WIN32__ LOGFONT lf; - lf.lfCharSet = m_charset; - wxStrncpy(lf.lfFaceName, m_facename, WXSIZEOF(lf.lfFaceName)); + lf.lfCharSet = (BYTE)m_charset; + wxStrlcpy(lf.lfFaceName, m_facename.c_str(), WXSIZEOF(lf.lfFaceName)); lf.lfPitchAndFamily = 0; ::EnumFontFamiliesEx(hDC, &lf, (wxFONTENUMPROC)wxFontEnumeratorProc, (LPARAM)this, 0 /* reserved */) ; -#else // Win16 - ::EnumFonts(hDC, (LPTSTR)NULL, (FONTENUMPROC)wxFontEnumeratorProc, - #ifdef STRICT - (LPARAM) - #else - (LPSTR) - #endif - this); -#endif // Win32/16 +#endif // Win32/CE ::ReleaseDC(NULL, hDC); +#endif } bool wxFontEnumeratorHelper::OnFont(const LPLOGFONT lf, @@ -178,14 +187,23 @@ bool wxFontEnumeratorHelper::OnFont(const LPLOGFONT lf, { wxConstCast(this, wxFontEnumeratorHelper)->m_charsets.Add(cs); +#if wxUSE_FONTMAP wxFontEncoding enc = wxGetFontEncFromCharSet(cs); return m_fontEnum->OnFontEncoding(lf->lfFaceName, wxFontMapper::GetEncodingName(enc)); +#else // !wxUSE_FONTMAP + // Just use some unique and, hopefully, understandable, name. + return m_fontEnum->OnFontEncoding + ( + lf->lfFaceName, + wxString::Format(wxS("Code page %d"), cs) + ); +#endif // wxUSE_FONTMAP/!wxUSE_FONTMAP } else { // continue enumeration - return TRUE; + return true; } } @@ -196,17 +214,31 @@ bool wxFontEnumeratorHelper::OnFont(const LPLOGFONT lf, if ( tm->tmPitchAndFamily & TMPF_FIXED_PITCH ) { // not a fixed pitch font - return TRUE; + return true; } } - if ( m_charset != -1 ) + if ( m_charset != DEFAULT_CHARSET ) { // check that we have the right encoding if ( lf->lfCharSet != m_charset ) { - return TRUE; + return true; + } + } + else // enumerating fonts in all charsets + { + // we can get the same facename twice or more in this case because it + // may exist in several charsets but we only want to return one copy of + // it (note that this can't happen for m_charset != DEFAULT_CHARSET) + if ( m_facenames.Index(lf->lfFaceName) != wxNOT_FOUND ) + { + // continue enumeration + return true; } + + wxConstCast(this, wxFontEnumeratorHelper)-> + m_facenames.Add(lf->lfFaceName); } return m_fontEnum->OnFacename(lf->lfFaceName); @@ -228,7 +260,7 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, } // else: no such fonts, unknown encoding - return TRUE; + return true; } bool wxFontEnumerator::EnumerateEncodings(const wxString& family) @@ -237,25 +269,33 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) fe.SetFamily(family); fe.DoEnumerate(); - return TRUE; + return true; } // ---------------------------------------------------------------------------- // Windows callbacks // ---------------------------------------------------------------------------- +#ifndef __WXMICROWIN__ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, - DWORD dwStyle, LONG lParam) + DWORD WXUNUSED(dwStyle), LPARAM lParam) { + + // we used to process TrueType fonts only, but there doesn't seem to be any + // reasons to restrict ourselves to them here +#if 0 // Get rid of any fonts that we don't want... if ( dwStyle != TRUETYPE_FONTTYPE ) { // continue enumeration return TRUE; } +#endif // 0 wxFontEnumeratorHelper *fontEnum = (wxFontEnumeratorHelper *)lParam; return fontEnum->OnFont(lplf, lptm); } +#endif +#endif // wxUSE_FONTENUM