]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
fix for wxSYS_COLOUR_LISTBOX representation
[wxWidgets.git] / src / msw / font.cpp
index 7a55510e198d193355d2ea75f07b8f4a85552f3d..a8fb8be5411b96d729878c1062e835c8981b81a6 100644 (file)
@@ -366,6 +366,8 @@ void wxNativeFontInfo::Init()
 
 int wxNativeFontInfo::GetPointSize() const
 {
 
 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);
     const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY);
 
     return (int) (((72.0*(double)abs(lf.lfHeight)) / (double) ppInch) + 0.5);
@@ -397,6 +399,45 @@ wxString wxNativeFontInfo::GetFaceName() const
     return lf.lfFaceName;
 }
 
     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);
 wxFontEncoding wxNativeFontInfo::GetEncoding() const
 {
     return wxGetFontEncFromCharSet(lf.lfCharSet);
@@ -404,9 +445,16 @@ wxFontEncoding wxNativeFontInfo::GetEncoding() const
 
 void wxNativeFontInfo::SetPointSize(int pointsize)
 {
 
 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);
     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)
 }
 
 void wxNativeFontInfo::SetStyle(wxFontStyle style)
@@ -456,7 +504,54 @@ void wxNativeFontInfo::SetUnderlined(bool underlined)
 
 void wxNativeFontInfo::SetFaceName(wxString facename)
 {
 
 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)
 }
 
 void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
@@ -465,19 +560,22 @@ void wxNativeFontInfo::SetEncoding(wxFontEncoding encoding)
     if ( !wxGetNativeFontEncoding(encoding, &info) )
     {
 #if wxUSE_FONTMAP
     if ( !wxGetNativeFontEncoding(encoding, &info) )
     {
 #if wxUSE_FONTMAP
-        if ( !wxTheFontMapper->GetAltForEncoding(encoding, &info) )
+        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;
         }
 #endif // wxUSE_FONTMAP
         {
             // unsupported encoding, replace with the default
             info.charset = ANSI_CHARSET;
         }
-        else 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);
-        }
     }
 
     lf.lfCharSet = info.charset;
     }
 
     lf.lfCharSet = info.charset;