From: Vadim Zeitlin Date: Mon, 24 Dec 2001 01:06:15 +0000 (+0000) Subject: code clean up, avoid duplicating the same code in font.cpp and fontutil.cpp X-Git-Url: https://git.saurik.com/wxWidgets.git/commitdiff_plain/7936354da7452fa9923bdd374742d64af9f86934 code clean up, avoid duplicating the same code in font.cpp and fontutil.cpp git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@13176 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- diff --git a/include/wx/fontutil.h b/include/wx/fontutil.h index c8df0749ca..40ad085434 100644 --- a/include/wx/fontutil.h +++ b/include/wx/fontutil.h @@ -67,7 +67,7 @@ struct WXDLLEXPORT wxNativeFontInfo #define wNO_NATIVE_FONTINFO int pointSize; - int family; + wxFontFamily family; wxFontStyle style; wxFontWeight weight; bool underlined; @@ -81,14 +81,13 @@ struct WXDLLEXPORT wxNativeFontInfo // reset to the default state void Init(); - // accessors and modifiers for the font elements: note that there is no - // GetFamily() because in general it is impossible to get the family for an - // arbitrary native font + // accessors and modifiers for the font elements int GetPointSize() const; wxFontStyle GetStyle() const; wxFontWeight GetWeight() const; bool GetUnderlined() const; wxString GetFaceName() const; + wxFontFamily GetFamily() const; wxFontEncoding GetEncoding() const; void SetPointSize(int pointsize); @@ -96,6 +95,7 @@ struct WXDLLEXPORT wxNativeFontInfo void SetWeight(wxFontWeight weight); void SetUnderlined(bool underlined); void SetFaceName(wxString facename); + void SetFamily(wxFontFamily family); void SetEncoding(wxFontEncoding encoding); // it is important to be able to serialize wxNativeFontInfo objects to be diff --git a/src/common/fontcmn.cpp b/src/common/fontcmn.cpp index c8e3bec361..fcbe26c07b 100644 --- a/src/common/fontcmn.cpp +++ b/src/common/fontcmn.cpp @@ -339,6 +339,11 @@ wxString wxNativeFontInfo::GetFaceName() const return faceName; } +wxFontFamily wxNativeFontInfo::GetFamily() const +{ + return family; +} + wxFontEncoding wxNativeFontInfo::GetEncoding() const { return encoding; @@ -369,6 +374,11 @@ void wxNativeFontInfo::SetFaceName(wxString facename_) facename = facename_; } +void wxNativeFontInfo::SetFamily(wxFontFamily family) +{ + family = family_; +} + void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding_) { encoding = encoding_; diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 7a55510e19..2df27bb969 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -366,6 +366,8 @@ void wxNativeFontInfo::Init() int wxNativeFontInfo::GetPointSize() const { + // FIXME: using the screen here results in incorrect font size calculation + // for printing! const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY); return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5); @@ -404,9 +406,16 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const void wxNativeFontInfo::SetPointSize(int pointsize) { +#if wxFONT_SIZE_COMPATIBILITY + // Incorrect, but compatible with old wxWindows behaviour + lf.lfHeight = (pointSize*ppInch)/72; +#else // wxFONT_SIZE_COMPATIBILITY + // FIXME: using the screen here results in incorrect font size calculation + // for printing! const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY); lf.lfHeight = -(int)((pointsize*((double)ppInch)/72.0) + 0.5); +#endif // wxFONT_SIZE_COMPATIBILITY/!wxFONT_SIZE_COMPATIBILITY } void wxNativeFontInfo::SetStyle(wxFontStyle style) @@ -459,6 +468,53 @@ void wxNativeFontInfo::SetFaceName(wxString facename) wxStrncpy(lf.lfFaceName, facename, sizeof(lf.lfFaceName)); } +void wxNativeFontInfo::SetFamily(wxFontFamily family) +{ + int ff_family; + wxString facename; + + switch ( family ) + { + case wxSCRIPT: + ff_family = FF_SCRIPT; + facename = _T("Script"); + break; + + case wxDECORATIVE: + ff_family = FF_DECORATIVE; + facename = _T("Wingdings"); + break; + + case wxROMAN: + ff_family = FF_ROMAN; + facename = _T("Times New Roman"); + break; + + case wxTELETYPE: + case wxMODERN: + ff_family = FF_MODERN; + facename = _T("Courier New"); + break; + + case wxSWISS: + ff_family = FF_SWISS; + facename = _T("Arial"); + break; + + case wxDEFAULT: + default: + ff_family = FF_SWISS; + facename = _T("MS Sans Serif"); + } + + lf.lfPitchAndFamily = DEFAULT_PITCH | ff_family; + + if ( !wxStrlen(lf.lfFaceName) ) + { + SetFaceName(facename); + } +} + void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding) { wxNativeEncodingInfo info; diff --git a/src/msw/fontutil.cpp b/src/msw/fontutil.cpp index 5fdf917e37..9b61937b17 100644 --- a/src/msw/fontutil.cpp +++ b/src/msw/fontutil.cpp @@ -302,144 +302,36 @@ wxFontEncoding wxGetFontEncFromCharSet(int cs) void wxFillLogFont(LOGFONT *logFont, const wxFont *font) { - int ff_family; - wxString ff_face; - - switch ( font->GetFamily() ) - { - 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("MS Sans Serif"); - } - - BYTE ff_italic; - switch ( font->GetStyle() ) - { - case wxITALIC: - case wxSLANT: - ff_italic = 1; - break; - - default: - wxFAIL_MSG(wxT("unknown font slant")); - // fall through - - case wxNORMAL: - ff_italic = 0; - } - - int ff_weight; - switch ( font->GetWeight() ) + // maybe we already have LOGFONT for this font? + wxNativeFontInfo *fontinfo = font->GetNativeFontInfo(); + if ( !fontinfo ) { - 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; - } - - // VZ: I'm reverting this as we clearly must use the real screen - // resolution instead of hardcoded one or it surely will fail to work - // in some cases. - // - // If there are any problems with this code, please let me know about - // it instead of reverting this change, thanks! -#if 1 // wxUSE_SCREEN_DPI - const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY); -#else // 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; -#endif // 1/0 - - int pointSize = font->GetPointSize(); -#if wxFONT_SIZE_COMPATIBILITY - // Incorrect, but compatible with old wxWindows behaviour - int nHeight = (pointSize*ppInch)/72; -#else - // Correct for Windows compatibility - int nHeight = -(int)((pointSize*((double)ppInch)/72.0) + 0.5); -#endif - - wxString facename = font->GetFaceName(); - if ( !!facename ) - { - ff_face = facename; - } - //else: ff_face is a reasonable default facename for this font family - - // deal with encoding now - wxNativeEncodingInfo info; - wxFontEncoding encoding = font->GetEncoding(); - if ( !wxGetNativeFontEncoding(encoding, &info) ) - { -#if wxUSE_FONTMAP - if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) ) -#endif // wxUSE_FONTMAP + // use wxNativeFontInfo methods to build a LOGFONT for this font + fontinfo = new wxNativeFontInfo; + + // translate all font parameters + fontinfo->SetStyle((wxFontStyle)font->GetStyle()); + fontinfo->SetWeight((wxFontWeight)font->GetWeight()); + fontinfo->SetUnderlined(font->GetUnderlined()); + fontinfo->SetPointSize(font->GetPointSize()); + + // set the family/facename + fontinfo->SetFamily((wxFontFamily)font->GetFamily()); + wxString facename = font->GetFaceName(); + if ( !facename.empty() ) { - // unsupported encoding, replace with the default - info.charset = ANSI_CHARSET; + fontinfo->SetFaceName(facename); } - } - if ( !info.facename.IsEmpty() ) - { - // the facename determined by the encoding overrides everything else - ff_face = info.facename; + // deal with encoding now (it may override the font family and facename + // so do it after setting them) + fontinfo->SetEncoding(font->GetEncoding()); } // transfer all the data to LOGFONT - logFont->lfHeight = nHeight; - logFont->lfWidth = 0; - logFont->lfEscapement = 0; - logFont->lfOrientation = 0; - logFont->lfWeight = ff_weight; - logFont->lfItalic = ff_italic; - logFont->lfUnderline = (BYTE)font->GetUnderlined(); - logFont->lfStrikeOut = 0; - logFont->lfCharSet = info.charset; - logFont->lfOutPrecision = OUT_DEFAULT_PRECIS; - logFont->lfClipPrecision = CLIP_DEFAULT_PRECIS; - logFont->lfQuality = PROOF_QUALITY; - logFont->lfPitchAndFamily = DEFAULT_PITCH | ff_family; - wxStrncpy(logFont->lfFaceName, ff_face, WXSIZEOF(logFont->lfFaceName)); + *logFont = fontinfo->lf; + + delete fontinfo; } wxFont wxCreateFontFromLogFont(const LOGFONT *logFont)