X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/74b31181b345aaaef0c967cc5707bef72ce0a405..8a693e6e0460b6b3c32e4b6f114a3ab7b7cd24ea:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 4dc30246ce..e02b116efa 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -6,7 +6,7 @@ // Created: 01/02/97 // RCS-ID: $Id$ // Copyright: (c) Julian Smart and Markus Holzem -// Licence: wxWindows licence +// Licence: wxWindows licence ///////////////////////////////////////////////////////////////////////////// // ============================================================================ @@ -39,13 +39,7 @@ #include "wx/msw/private.h" -#if !USE_SHARED_LIBRARIES - IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) - - #if wxUSE_PORTABLE_FONTS_IN_MSW - IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject) - #endif -#endif +IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) // ---------------------------------------------------------------------------- // wxFontRefData - the internal description of the font @@ -128,26 +122,26 @@ void wxFontRefData::Init(int pointSize, const wxString& faceName, wxFontEncoding encoding) { - m_style = style; - m_pointSize = pointSize; - m_family = family; - m_style = style; - m_weight = weight; - m_underlined = underlined; - m_faceName = faceName; + m_style = style; + m_pointSize = pointSize; + m_family = family; + m_style = style; + m_weight = weight; + m_underlined = underlined; + m_faceName = faceName; m_encoding = encoding; - m_fontId = 0; - m_temporary = FALSE; + m_fontId = 0; + m_temporary = FALSE; - m_hFont = 0; + m_hFont = 0; } wxFontRefData::~wxFontRefData() { - if ( m_hFont ) + if ( m_hFont ) { - if ( !::DeleteObject((HFONT) m_hFont) ) + if ( !::DeleteObject((HFONT) m_hFont) ) { wxLogLastError("DeleteObject(font)"); } @@ -200,101 +194,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; } - BYTE ff_italic; - int ff_weight = 0; - int ff_family = 0; - wxString ff_face; - - switch (M_FONTDATA->m_family) + LOGFONT lf; + wxFillLogFont(&lf, this); + M_FONTDATA->m_hFont = (WXHFONT)::CreateFontIndirect(&lf); + M_FONTDATA->m_faceName = lf.lfFaceName; + if ( !M_FONTDATA->m_hFont ) { - 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") ; - } - - if (M_FONTDATA->m_style == wxITALIC || M_FONTDATA->m_style == wxSLANT) - ff_italic = 1; - else - ff_italic = 0; - - if (M_FONTDATA->m_weight == wxNORMAL) - ff_weight = FW_NORMAL; - else if (M_FONTDATA->m_weight == wxLIGHT) - ff_weight = FW_LIGHT; - else if (M_FONTDATA->m_weight == wxBOLD) - ff_weight = FW_BOLD; - - const wxChar* pzFace = (const wxChar*) ff_face; - if (!M_FONTDATA->m_faceName.IsNull()) - pzFace = (const wxChar*) M_FONTDATA->m_faceName ; - - /* 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; + wxLogLastError("CreateFont"); - 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; + return FALSE; } - */ - // Have to get screen DC Caps, because a metafile will return 0. - HDC dc2 = ::GetDC(NULL); - int ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY); - ::ReleaseDC(NULL, dc2); - - // 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. - 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 - - bool ff_underline = M_FONTDATA->m_underlined; - M_FONTDATA->m_hFont = (WXHFONT) CreateFont(nHeight, 0, 0, 0,ff_weight,ff_italic,(BYTE)ff_underline, - 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, - PROOF_QUALITY, DEFAULT_PITCH | ff_family, pzFace); -#ifdef WXDEBUG_CREATE - if (m_hFont==NULL) wxError(_T("Cannot create font"),_T("Internal Error")) ; -#endif - return (M_FONTDATA->m_hFont != (WXHFONT) NULL); + return TRUE; } bool wxFont::FreeResource(bool force) @@ -318,7 +232,7 @@ WXHANDLE wxFont::GetResourceHandle() if ( !M_FONTDATA ) return 0; else - return (WXHANDLE)M_FONTDATA->m_hFont ; + return (WXHANDLE)M_FONTDATA->m_hFont; } bool wxFont::IsFree() const @@ -328,17 +242,17 @@ bool wxFont::IsFree() const void wxFont::Unshare() { - // Don't change shared data - if ( !m_refData ) + // Don't change shared data + if ( !m_refData ) { - m_refData = new wxFontRefData(); - } + m_refData = new wxFontRefData(); + } else { - wxFontRefData* ref = new wxFontRefData(*M_FONTDATA); - UnRef(); - m_refData = ref; - } + wxFontRefData* ref = new wxFontRefData(*M_FONTDATA); + UnRef(); + m_refData = ref; + } } // ---------------------------------------------------------------------------- @@ -446,7 +360,7 @@ wxString wxFont::GetFaceName() const { wxString str; if ( M_FONTDATA ) - str = M_FONTDATA->m_faceName ; + str = M_FONTDATA->m_faceName; return str; } @@ -454,3 +368,4 @@ wxFontEncoding wxFont::GetEncoding() const { return M_FONTDATA->m_encoding; } +