X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/0c5d3e1ccd1d27ab0cf913ddbffb1b54b5802f3a..10992a81d39da31b79063387b7b71c0ff68737ce:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 31f47b02a0..472b616884 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,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,8 @@ friend class WXDLLEXPORT wxFont; public: wxFontRefData() { - Init(); + Init(wxDEFAULT_FONT_SIZE, wxDEFAULT, wxNORMAL, wxNORMAL, FALSE, + "", wxFONTENCODING_DEFAULT); } wxFontRefData(const wxFontRefData& data) @@ -127,28 +129,28 @@ 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)"); + wxLogLastError(wxT("DeleteObject(font)")); } } } @@ -175,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); @@ -199,101 +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; } - 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(wxT("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) @@ -302,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; @@ -313,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 @@ -327,17 +260,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; + } } // ---------------------------------------------------------------------------- @@ -445,7 +378,7 @@ wxString wxFont::GetFaceName() const { wxString str; if ( M_FONTDATA ) - str = M_FONTDATA->m_faceName ; + str = M_FONTDATA->m_faceName; return str; } @@ -453,3 +386,4 @@ wxFontEncoding wxFont::GetEncoding() const { return M_FONTDATA->m_encoding; } +