X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/11c7d5b6d1cb54d5ffdc11d8ff092b41e225bfb6..df16a53ef9ae506c51023178e4fe45ce45e69447:/src/msw/fontenum.cpp diff --git a/src/msw/fontenum.cpp b/src/msw/fontenum.cpp index 33b5a192d8..1f7305a937 100644 --- a/src/msw/fontenum.cpp +++ b/src/msw/fontenum.cpp @@ -28,10 +28,13 @@ #pragma hdrstop #endif +#if wxUSE_FONTMAP + #ifndef WX_PRECOMP #include "wx/font.h" #endif +#include "wx/fontutil.h" #include "wx/fontenum.h" #include "wx/fontmap.h" @@ -41,15 +44,21 @@ // private classes // ---------------------------------------------------------------------------- +// the helper class which calls ::EnumFontFamilies() and whose OnFont() is +// called from the callback passed to this function and, in its turn, calls the +// appropariate wxFontEnumerator method class wxFontEnumeratorHelper { public: wxFontEnumeratorHelper(wxFontEnumerator *fontEnum); // control what exactly are we enumerating + // we enumerate fonts with given enocding bool SetEncoding(wxFontEncoding encoding); - void SetFixedOnly(bool fixedOnly) - { m_fixedOnly = fixedOnly; } + // we enumerate fixed-width fonts + void SetFixedOnly(bool fixedOnly) { m_fixedOnly = fixedOnly; } + // we enumerate the encodings available in this family + void SetFamily(const wxString& family); // call to start enumeration void DoEnumerate(); @@ -67,16 +76,27 @@ private: // if not empty, enum only the fonts with this facename wxString m_facename; + // if not empty, enum only the fonts in this family + wxString m_family; + // if TRUE, enum only fixed fonts bool m_fixedOnly; + + // if TRUE, we enumerate the encodings, not fonts + bool m_enumEncodings; + + // the list of charsets we already found while enumerating charsets + wxArrayInt m_charsets; }; // ---------------------------------------------------------------------------- // private functions // ---------------------------------------------------------------------------- +#ifndef __WXMICROWIN__ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, DWORD dwStyle, LONG lParam); +#endif // ============================================================================ // implementation @@ -89,8 +109,15 @@ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, wxFontEnumeratorHelper::wxFontEnumeratorHelper(wxFontEnumerator *fontEnum) { m_fontEnum = fontEnum; - m_charset = -1; + m_charset = DEFAULT_CHARSET; m_fixedOnly = FALSE; + m_enumEncodings = FALSE; +} + +void wxFontEnumeratorHelper::SetFamily(const wxString& family) +{ + m_enumEncodings = TRUE; + m_family = family; } bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) @@ -103,16 +130,26 @@ bool wxFontEnumeratorHelper::SetEncoding(wxFontEncoding encoding) // 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; } +#if defined(__GNUWIN32__) && !defined(__CYGWIN10__) + #if wxUSE_NORLANDER_HEADERS + #define wxFONTENUMPROC int(*)(const LOGFONT *, const TEXTMETRIC *, long unsigned int, LPARAM) + #else + #define wxFONTENUMPROC int(*)(ENUMLOGFONTEX *, NEWTEXTMETRICEX*, int, LPARAM) + #endif +#else + #define wxFONTENUMPROC FONTENUMPROC +#endif + void wxFontEnumeratorHelper::DoEnumerate() { +#ifndef __WXMICROWIN__ HDC hDC = ::GetDC(NULL); #ifdef __WIN32__ @@ -120,19 +157,44 @@ void wxFontEnumeratorHelper::DoEnumerate() lf.lfCharSet = m_charset; wxStrncpy(lf.lfFaceName, m_facename, WXSIZEOF(lf.lfFaceName)); lf.lfPitchAndFamily = 0; - ::EnumFontFamiliesEx(hDC, &lf, (FONTENUMPROC)wxFontEnumeratorProc, + ::EnumFontFamiliesEx(hDC, &lf, (wxFONTENUMPROC)wxFontEnumeratorProc, (LPARAM)this, 0 /* reserved */) ; #else // Win16 ::EnumFonts(hDC, (LPTSTR)NULL, (FONTENUMPROC)wxFontEnumeratorProc, - (LPARAM) (void*) this) ; + #ifdef STRICT + (LPARAM) + #else + (LPSTR) + #endif + this); #endif // Win32/16 ::ReleaseDC(NULL, hDC); +#endif } bool wxFontEnumeratorHelper::OnFont(const LPLOGFONT lf, const LPTEXTMETRIC tm) const { + if ( m_enumEncodings ) + { + // is this a new charset? + int cs = lf->lfCharSet; + if ( m_charsets.Index(cs) == wxNOT_FOUND ) + { + wxConstCast(this, wxFontEnumeratorHelper)->m_charsets.Add(cs); + + wxFontEncoding enc = wxGetFontEncFromCharSet(cs); + return m_fontEnum->OnFontEncoding(lf->lfFaceName, + wxFontMapper::GetEncodingName(enc)); + } + else + { + // continue enumeration + return TRUE; + } + } + if ( m_fixedOnly ) { // check that it's a fixed pitch font (there is *no* error here, the @@ -177,7 +239,9 @@ bool wxFontEnumerator::EnumerateFacenames(wxFontEncoding encoding, bool wxFontEnumerator::EnumerateEncodings(const wxString& family) { - wxFAIL_MSG(wxT("TODO")); + wxFontEnumeratorHelper fe(this); + fe.SetFamily(family); + fe.DoEnumerate(); return TRUE; } @@ -186,6 +250,7 @@ bool wxFontEnumerator::EnumerateEncodings(const wxString& family) // Windows callbacks // ---------------------------------------------------------------------------- +#ifndef __WXMICROWIN__ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, DWORD dwStyle, LONG lParam) { @@ -200,4 +265,6 @@ int CALLBACK wxFontEnumeratorProc(LPLOGFONT lplf, LPTEXTMETRIC lptm, return fontEnum->OnFont(lplf, lptm); } +#endif +#endif // wxUSE_FONTMAP