X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b9b3ccd9ea9bf892369a6fa2c8e28e0ceca18527..c13cace12594b37706e9520a6fbd602c949f8127:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index c7a304f445..472b616884 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -39,13 +39,14 @@ #include "wx/msw/private.h" -#if !USE_SHARED_LIBRARIES - IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) +IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) - #if wxUSE_PORTABLE_FONTS_IN_MSW - IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject) - #endif -#endif +// ---------------------------------------------------------------------------- +// constants +// ---------------------------------------------------------------------------- + +// the default font size in points +static const int wxDEFAULT_FONT_SIZE = 12; // ---------------------------------------------------------------------------- // wxFontRefData - the internal description of the font @@ -58,7 +59,7 @@ friend class WXDLLEXPORT wxFont; public: wxFontRefData() { - Init(12, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE, + Init(wxDEFAULT_FONT_SIZE, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE, "", wxFONTENCODING_DEFAULT); } @@ -149,7 +150,7 @@ wxFontRefData::~wxFontRefData() { if ( !::DeleteObject((HFONT) m_hFont) ) { - wxLogLastError("DeleteObject(font)"); + wxLogLastError(wxT("DeleteObject(font)")); } } } @@ -176,6 +177,12 @@ bool wxFont::Create(int pointSize, wxFontEncoding encoding) { UnRef(); + + // wxDEFAULT is a valid value for the font size too so we must treat it + // specially here (otherwise the size would be 70 == wxDEFAULT value) + if ( pointSize == wxDEFAULT ) + pointSize = wxDEFAULT_FONT_SIZE; + m_refData = new wxFontRefData(pointSize, family, style, weight, underlined, faceName, encoding); @@ -200,222 +207,21 @@ bool wxFont::RealizeResource() { // VZ: the old code returned FALSE in this case, but it doesn't seem // to make sense because the font _was_ created - wxLogDebug(_T("Calling wxFont::RealizeResource() twice")); - return TRUE; } - int ff_family = 0; - wxString ff_face; - - switch ( M_FONTDATA->m_family ) - { - case wxSCRIPT: - ff_family = FF_SCRIPT ; - ff_face = _T("Script") ; - break ; - - case wxDECORATIVE: - ff_family = FF_DECORATIVE; - break; - - case wxROMAN: - ff_family = FF_ROMAN; - ff_face = _T("Times New Roman") ; - break; - - case wxTELETYPE: - case wxMODERN: - ff_family = FF_MODERN; - ff_face = _T("Courier New") ; - break; - - case wxSWISS: - ff_family = FF_SWISS; - ff_face = _T("Arial") ; - break; - - case wxDEFAULT: - default: - ff_family = FF_SWISS; - ff_face = _T("Arial") ; - } - - BYTE ff_italic; - switch ( M_FONTDATA->m_style ) - { - case wxITALIC: - case wxSLANT: - ff_italic = 1; - break; - - default: - wxFAIL_MSG(_T("unknown font slant")); - // fall through - - case wxNORMAL: - ff_italic = 0; - } - - int ff_weight = 0; - switch ( M_FONTDATA->m_weight ) - { - default: - wxFAIL_MSG(_T("unknown font weight")); - // fall through - - case wxNORMAL: - ff_weight = FW_NORMAL; - break; - - case wxLIGHT: - ff_weight = FW_LIGHT; - break; - - case wxBOLD: - ff_weight = FW_BOLD; - break; - } - - const wxChar* pzFace; - if ( M_FONTDATA->m_faceName.IsEmpty() ) - pzFace = ff_face; - else - pzFace = M_FONTDATA->m_faceName ; - -#if 0 - /* Always calculate fonts using the screen DC (is this the best strategy?) - * There may be confusion if a font is selected into a printer - * DC (say), because the height will be calculated very differently. - */ - // What sort of display is it? - int technology = ::GetDeviceCaps(dc, TECHNOLOGY); - - int nHeight; - - if (technology != DT_RASDISPLAY && technology != DT_RASPRINTER) - { - // Have to get screen DC Caps, because a metafile will return 0. - HDC dc2 = ::GetDC(NULL); - nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc2, LOGPIXELSY)/72; - ::ReleaseDC(NULL, dc2); - } - else - { - nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc, LOGPIXELSY)/72; - } -#endif // 0 - -#if 0 - // Have to get screen DC Caps, because a metafile will return 0. - HDC dc2 = ::GetDC(NULL); - ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY); - ::ReleaseDC(NULL, dc2); -#endif // 0 - - // New behaviour: apparently ppInch varies according to Large/Small Fonts - // setting in Windows. This messes up fonts. So, set ppInch to a constant - // 96 dpi. - static const int ppInch = 96; - -#if wxFONT_SIZE_COMPATIBILITY - // Incorrect, but compatible with old wxWindows behaviour - int nHeight = (M_FONTDATA->m_pointSize*ppInch/72); -#else - // Correct for Windows compatibility - int nHeight = - (M_FONTDATA->m_pointSize*ppInch/72); -#endif - - BYTE ff_underline = M_FONTDATA->m_underlined; - - wxFontEncoding encoding = M_FONTDATA->m_encoding; - if ( encoding == wxFONTENCODING_DEFAULT ) - { - encoding = wxFont::GetDefaultEncoding(); - } - - DWORD charset; - switch ( encoding ) + LOGFONT lf; + wxFillLogFont(&lf, this); + M_FONTDATA->m_hFont = (WXHFONT)::CreateFontIndirect(&lf); + M_FONTDATA->m_faceName = lf.lfFaceName; + if ( !M_FONTDATA->m_hFont ) { - case wxFONTENCODING_ISO8859_1: - case wxFONTENCODING_ISO8859_15: - case wxFONTENCODING_CP1250: - charset = ANSI_CHARSET; - break; - - case wxFONTENCODING_ISO8859_2: - case wxFONTENCODING_CP1252: - charset = EASTEUROPE_CHARSET; - break; - - case wxFONTENCODING_ISO8859_4: - case wxFONTENCODING_ISO8859_10: - charset = BALTIC_CHARSET; - break; - - case wxFONTENCODING_ISO8859_5: - case wxFONTENCODING_CP1251: - charset = RUSSIAN_CHARSET; - break; - - case wxFONTENCODING_ISO8859_6: - charset = ARABIC_CHARSET; - break; - - case wxFONTENCODING_ISO8859_7: - charset = GREEK_CHARSET; - break; - - case wxFONTENCODING_ISO8859_8: - charset = HEBREW_CHARSET; - break; - - case wxFONTENCODING_ISO8859_9: - charset = TURKISH_CHARSET; - break; - - case wxFONTENCODING_ISO8859_11: - charset = THAI_CHARSET; - break; - - case wxFONTENCODING_CP437: - charset = OEM_CHARSET; - break; - - default: - wxFAIL_MSG(_T("unsupported encoding")); - // fall through - - case wxFONTENCODING_SYSTEM: - charset = ANSI_CHARSET; - } + wxLogLastError(wxT("CreateFont")); - HFONT hFont = ::CreateFont - ( - nHeight, // height - 0, // width (choose best) - 0, // escapement - 0, // orientation - ff_weight, // weight - ff_italic, // italic? - ff_underline, // underlined? - 0, // strikeout? - charset, // charset - OUT_DEFAULT_PRECIS, // precision - CLIP_DEFAULT_PRECIS, // clip precision - PROOF_QUALITY, // quality of match - DEFAULT_PITCH | // fixed or variable - ff_family, // family id - pzFace // face name - ); - - M_FONTDATA->m_hFont = (WXHFONT)hFont; - if ( !hFont ) - { - wxLogLastError("CreateFont"); + return FALSE; } - return hFont != 0; + return TRUE; } bool wxFont::FreeResource(bool force) @@ -424,7 +230,7 @@ bool wxFont::FreeResource(bool force) { if ( !::DeleteObject((HFONT) M_FONTDATA->m_hFont) ) { - wxLogLastError("DeleteObject(font)"); + wxLogLastError(wxT("DeleteObject(font)")); } M_FONTDATA->m_hFont = 0; @@ -435,11 +241,16 @@ bool wxFont::FreeResource(bool force) } WXHANDLE wxFont::GetResourceHandle() +{ + return GetHFONT(); +} + +WXHFONT wxFont::GetHFONT() const { if ( !M_FONTDATA ) return 0; else - return (WXHANDLE)M_FONTDATA->m_hFont ; + return (WXHANDLE)M_FONTDATA->m_hFont; } bool wxFont::IsFree() const @@ -567,7 +378,7 @@ wxString wxFont::GetFaceName() const { wxString str; if ( M_FONTDATA ) - str = M_FONTDATA->m_faceName ; + str = M_FONTDATA->m_faceName; return str; } @@ -575,3 +386,4 @@ wxFontEncoding wxFont::GetEncoding() const { return M_FONTDATA->m_encoding; } +