]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
fix for wxSYS_COLOUR_LISTBOX representation
[wxWidgets.git] / src / msw / font.cpp
index bf831d467a11e83162eaf28521ce3d53bdf89d71..a8fb8be5411b96d729878c1062e835c8981b81a6 100644 (file)
     #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;