X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/a9249b2eb2a40d8c71f828669045c4ddaa8dc5ff..1483041dab88f43563c26405c1e2a41d6babe6a0:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index bf831d467a..a8fb8be541 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -37,10 +37,11 @@ #include "wx/log.h" #endif // WX_PRECOMP +#include "wx/msw/private.h" + #include "wx/fontutil.h" -#include "wx/tokenzr.h" +#include "wx/fontmap.h" -#include "wx/msw/private.h" #include "wx/tokenzr.h" IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) @@ -365,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); @@ -396,6 +399,45 @@ wxString wxNativeFontInfo::GetFaceName() const return lf.lfFaceName; } +wxFontFamily wxNativeFontInfo::GetFamily() const +{ + // extract family from pitch-and-family + int lfFamily = lf.lfPitchAndFamily; + int family; + + if ( lfFamily & FIXED_PITCH ) + lfFamily -= FIXED_PITCH; + if ( lfFamily & VARIABLE_PITCH ) + lfFamily -= VARIABLE_PITCH; + + switch ( lfFamily ) + { + case FF_ROMAN: + family = wxROMAN; + break; + + case FF_SWISS: + family = wxSWISS; + break; + + case FF_SCRIPT: + family = wxSCRIPT; + break; + + case FF_MODERN: + family = wxMODERN; + break; + + case FF_DECORATIVE: + family = wxDECORATIVE; + break; + + default: + family = wxSWISS; + } + return (wxFontFamily)family; +} + wxFontEncoding wxNativeFontInfo::GetEncoding() const { return wxGetFontEncFromCharSet(lf.lfCharSet); @@ -403,9 +445,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) @@ -455,7 +504,54 @@ void wxNativeFontInfo::SetUnderlined(bool underlined) void wxNativeFontInfo::SetFaceName(wxString facename) { - wxStrncpy(lf.lfFaceName, facename, sizeof(lf.lfFaceName)); + wxStrncpy(lf.lfFaceName, facename, WXSIZEOF(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("Old English Text MT"); + 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) @@ -463,8 +559,23 @@ void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding) wxNativeEncodingInfo info; if ( !wxGetNativeFontEncoding(encoding, &info) ) { - // unsupported encoding, replace with the default - info.charset = ANSI_CHARSET; +#if wxUSE_FONTMAP + if ( wxTheFontMapper->GetAltForEncoding(encoding, &info) ) + { + if ( !info.facename.empty() ) + { + // if we have this encoding only in some particular facename, use + // the facename - it is better to show the correct characters in a + // wrong facename than unreadable text in a correct one + SetFaceName(info.facename); + } + } + else +#endif // wxUSE_FONTMAP + { + // unsupported encoding, replace with the default + info.charset = ANSI_CHARSET; + } } lf.lfCharSet = info.charset;