]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
include wx/thread.h in debug build which is needed after last change
[wxWidgets.git] / src / msw / font.cpp
index b18902071fb5c954f1cf150c0bba17583546de66..d7fcfe9b9f6b995f4843bfa17c39883ed5442f07 100644 (file)
 // headers
 // ----------------------------------------------------------------------------
 
 // headers
 // ----------------------------------------------------------------------------
 
-#if defined(__GNUG__) && !defined(NO_GCC_PRAGMA)
-    #pragma implementation "font.h"
-#endif
-
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
 // For compilers that support precompilation, includes "wx.h".
 #include "wx/wxprec.h"
 
     #pragma hdrstop
 #endif
 
     #pragma hdrstop
 #endif
 
+#include "wx/font.h"
+
 #ifndef WX_PRECOMP
 #ifndef WX_PRECOMP
-    #include "wx/setup.h"
     #include "wx/list.h"
     #include "wx/utils.h"
     #include "wx/app.h"
     #include "wx/list.h"
     #include "wx/utils.h"
     #include "wx/app.h"
-    #include "wx/font.h"
     #include "wx/log.h"
     #include "wx/encinfo.h"
 #endif // WX_PRECOMP
     #include "wx/log.h"
     #include "wx/encinfo.h"
 #endif // WX_PRECOMP
@@ -108,8 +104,8 @@ public:
     // constructors
     wxFontRefData()
     {
     // constructors
     wxFontRefData()
     {
-        Init(-1, wxSize(0, 0), FALSE, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL,
-             wxFONTWEIGHT_NORMAL, FALSE, wxEmptyString,
+        Init(-1, wxSize(0,0), false, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL,
+             wxFONTWEIGHT_NORMAL, false, wxEmptyString,
              wxFONTENCODING_DEFAULT);
     }
 
              wxFONTENCODING_DEFAULT);
     }
 
@@ -223,7 +219,7 @@ public:
         else
         {
             m_pointSize = pointSize;
         else
         {
             m_pointSize = pointSize;
-            m_sizeUsingPixels = FALSE;
+            m_sizeUsingPixels = false;
         }
     }
 
         }
     }
 
@@ -236,7 +232,7 @@ public:
         else
         {
             m_pixelSize = pixelSize;
         else
         {
             m_pixelSize = pixelSize;
-            m_sizeUsingPixels = TRUE;
+            m_sizeUsingPixels = true;
         }
     }
 
         }
     }
 
@@ -261,12 +257,13 @@ public:
             m_weight = weight;
     }
 
             m_weight = weight;
     }
 
-    void SetFaceName(const wxString& faceName)
+    bool SetFaceName(const wxString& faceName)
     {
         if ( m_nativeFontInfoOk )
     {
         if ( m_nativeFontInfoOk )
-            m_nativeFontInfo.SetFaceName(faceName);
-        else
-            m_faceName = faceName;
+            return m_nativeFontInfo.SetFaceName(faceName);
+
+        m_faceName = faceName;
+        return true;
     }
 
     void SetUnderlined(bool underlined)
     }
 
     void SetUnderlined(bool underlined)
@@ -324,6 +321,8 @@ protected:
     bool             m_nativeFontInfoOk;
 };
 
     bool             m_nativeFontInfoOk;
 };
 
+#define M_FONTDATA ((wxFontRefData*)m_refData)
+
 // ============================================================================
 // implementation
 // ============================================================================
 // ============================================================================
 // implementation
 // ============================================================================
@@ -390,12 +389,10 @@ bool wxFontRefData::Alloc(wxFont *font)
     if ( !hfont )
     {
         wxLogLastError(wxT("CreateFont"));
     if ( !hfont )
     {
         wxLogLastError(wxT("CreateFont"));
-
         return false;
     }
 
     m_hFont = (WXHFONT)hfont;
         return false;
     }
 
     m_hFont = (WXHFONT)hfont;
-
     return true;
 }
 
     return true;
 }
 
@@ -419,6 +416,14 @@ void wxFontRefData::Free()
 void wxNativeFontInfo::Init()
 {
     wxZeroMemory(lf);
 void wxNativeFontInfo::Init()
 {
     wxZeroMemory(lf);
+
+    // we get better font quality if we use this instead of DEFAULT_QUALITY
+    // apparently without any drawbacks
+#ifdef __WXWINCE__
+    lf.lfQuality = CLEARTYPE_QUALITY;
+#else
+    lf.lfQuality = PROOF_QUALITY;
+#endif
 }
 
 int wxNativeFontInfo::GetPointSize() const
 }
 
 int wxNativeFontInfo::GetPointSize() const
@@ -566,48 +571,86 @@ void wxNativeFontInfo::SetUnderlined(bool underlined)
     lf.lfUnderline = underlined;
 }
 
     lf.lfUnderline = underlined;
 }
 
-void wxNativeFontInfo::SetFaceName(wxString facename)
+bool wxNativeFontInfo::SetFaceName(const wxString& facename)
 {
 {
-    wxStrncpy(lf.lfFaceName, facename, WXSIZEOF(lf.lfFaceName));
+    size_t len = WXSIZEOF(lf.lfFaceName);
+    wxStrncpy(lf.lfFaceName, facename, len);
+    lf.lfFaceName[len - 1] = '\0';    // truncate the face name
+    return true;
 }
 
 void wxNativeFontInfo::SetFamily(wxFontFamily family)
 {
     BYTE ff_family;
 }
 
 void wxNativeFontInfo::SetFamily(wxFontFamily family)
 {
     BYTE ff_family;
-    wxString facename;
+    wxArrayString facename;
+
+    // the list of fonts associated with a family was partially
+    // taken from http://www.codestyle.org/css/font-family
 
     switch ( family )
     {
         case wxSCRIPT:
             ff_family = FF_SCRIPT;
 
     switch ( family )
     {
         case wxSCRIPT:
             ff_family = FF_SCRIPT;
-            facename = _T("Script");
+            facename.Add(_T("Script"));
+            facename.Add(_T("Brush Script MT"));
+            facename.Add(_T("Comic Sans MS"));
+            facename.Add(_T("Lucida Handwriting"));
             break;
 
         case wxDECORATIVE:
             ff_family = FF_DECORATIVE;
             break;
 
         case wxDECORATIVE:
             ff_family = FF_DECORATIVE;
-            facename = _T("Old English Text MT");
+            facename.Add(_T("Old English Text MT"));
+            facename.Add(_T("Comic Sans MS"));
+            facename.Add(_T("Lucida Handwriting"));
             break;
 
         case wxROMAN:
             ff_family = FF_ROMAN;
             break;
 
         case wxROMAN:
             ff_family = FF_ROMAN;
-            facename = _T("Times New Roman");
+            facename.Add(_T("Times New Roman"));
+            facename.Add(_T("Georgia"));
+            facename.Add(_T("Garamond"));
+            facename.Add(_T("Bookman Old Style"));
+            facename.Add(_T("Book Antiqua"));
             break;
 
         case wxTELETYPE:
         case wxMODERN:
             ff_family = FF_MODERN;
             break;
 
         case wxTELETYPE:
         case wxMODERN:
             ff_family = FF_MODERN;
-            facename = _T("Courier New");
+            facename.Add(_T("Courier New"));
+            facename.Add(_T("Lucida Console"));
+            facename.Add(_T("Andale Mono"));
+            facename.Add(_T("OCR A Extended"));
+            facename.Add(_T("Terminal"));
             break;
 
         case wxSWISS:
             ff_family = FF_SWISS;
             break;
 
         case wxSWISS:
             ff_family = FF_SWISS;
-            facename = _T("Arial");
+            facename.Add(_T("Arial"));
+            facename.Add(_T("Century Gothic"));
+            facename.Add(_T("Lucida Sans Unicode"));
+            facename.Add(_T("Tahoma"));
+            facename.Add(_T("Trebuchet MS"));
+            facename.Add(_T("Verdana"));
             break;
 
         case wxDEFAULT:
         default:
             break;
 
         case wxDEFAULT:
         default:
+        {
+            // We want Windows 2000 or later to have new fonts even MS Shell Dlg
+            // is returned as default GUI font for compatibility
+            int verMaj;
             ff_family = FF_SWISS;
             ff_family = FF_SWISS;
-            facename = _T("MS Sans Serif");
+            if(wxGetOsVersion(&verMaj) == wxOS_WINDOWS_NT && verMaj >= 5)
+                facename.Add(_T("MS Shell Dlg 2"));
+            else
+                facename.Add(_T("MS Shell Dlg"));
+
+            // Quoting the MSDN:
+            //     "MS Shell Dlg is a mapping mechanism that enables
+            //     U.S. English Microsoft Windows NT, and Microsoft Windows 2000 to
+            //     support locales that have characters that are not contained in code
+            //     page 1252. It is not a font but a face name for a nonexistent font."
+        }
     }
 
     lf.lfPitchAndFamily = (BYTE)(DEFAULT_PITCH) | ff_family;
     }
 
     lf.lfPitchAndFamily = (BYTE)(DEFAULT_PITCH) | ff_family;
@@ -757,10 +800,6 @@ wxString wxNativeFontInfo::ToString() const
 // wxFont
 // ----------------------------------------------------------------------------
 
 // wxFont
 // ----------------------------------------------------------------------------
 
-void wxFont::Init()
-{
-}
-
 bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
 {
     UnRef();
 bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
 {
     UnRef();
@@ -818,6 +857,16 @@ wxFont::~wxFont()
 // real implementation
 // ----------------------------------------------------------------------------
 
 // real implementation
 // ----------------------------------------------------------------------------
 
+wxObjectRefData *wxFont::CreateRefData() const
+{
+    return new wxFontRefData();
+}
+
+wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
+{
+    return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data));
+}
+
 bool wxFont::RealizeResource()
 {
     if ( GetResourceHandle() )
 bool wxFont::RealizeResource()
 {
     if ( GetResourceHandle() )
@@ -857,28 +906,13 @@ bool wxFont::IsFree() const
     return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
 }
 
     return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
 }
 
-void wxFont::Unshare()
-{
-    // Don't change shared data
-    if ( !m_refData )
-    {
-        m_refData = new wxFontRefData();
-    }
-    else
-    {
-        wxFontRefData* ref = new wxFontRefData(*M_FONTDATA);
-        UnRef();
-        m_refData = ref;
-    }
-}
-
 // ----------------------------------------------------------------------------
 // change font attribute: we recreate font when doing it
 // ----------------------------------------------------------------------------
 
 void wxFont::SetPointSize(int pointSize)
 {
 // ----------------------------------------------------------------------------
 // change font attribute: we recreate font when doing it
 // ----------------------------------------------------------------------------
 
 void wxFont::SetPointSize(int pointSize)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetPointSize(pointSize);
 
 
     M_FONTDATA->SetPointSize(pointSize);
 
@@ -887,7 +921,7 @@ void wxFont::SetPointSize(int pointSize)
 
 void wxFont::SetPixelSize(const wxSize& pixelSize)
 {
 
 void wxFont::SetPixelSize(const wxSize& pixelSize)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetPixelSize(pixelSize);
 
 
     M_FONTDATA->SetPixelSize(pixelSize);
 
@@ -896,7 +930,7 @@ void wxFont::SetPixelSize(const wxSize& pixelSize)
 
 void wxFont::SetFamily(int family)
 {
 
 void wxFont::SetFamily(int family)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetFamily(family);
 
 
     M_FONTDATA->SetFamily(family);
 
@@ -905,7 +939,7 @@ void wxFont::SetFamily(int family)
 
 void wxFont::SetStyle(int style)
 {
 
 void wxFont::SetStyle(int style)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetStyle(style);
 
 
     M_FONTDATA->SetStyle(style);
 
@@ -914,25 +948,34 @@ void wxFont::SetStyle(int style)
 
 void wxFont::SetWeight(int weight)
 {
 
 void wxFont::SetWeight(int weight)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetWeight(weight);
 
     RealizeResource();
 }
 
 
     M_FONTDATA->SetWeight(weight);
 
     RealizeResource();
 }
 
-void wxFont::SetFaceName(const wxString& faceName)
+bool wxFont::SetFaceName(const wxString& faceName)
 {
 {
-    Unshare();
+    AllocExclusive();
 
 
-    M_FONTDATA->SetFaceName(faceName);
+    bool refdataok = M_FONTDATA->SetFaceName(faceName);
 
     RealizeResource();
 
     RealizeResource();
+
+    // NB: using win32's GetObject() API on M_FONTDATA->GetHFONT()
+    //     to retrieve a LOGFONT and then compare lf.lfFaceName
+    //     with given facename is not reliable at all:
+    //     Windows copies the facename given to ::CreateFontIndirect()
+    //     without any validity check.
+    //     Thus we use wxFontBase::SetFaceName to check if facename
+    //     is valid...
+    return refdataok && wxFontBase::SetFaceName(faceName);
 }
 
 void wxFont::SetUnderlined(bool underlined)
 {
 }
 
 void wxFont::SetUnderlined(bool underlined)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetUnderlined(underlined);
 
 
     M_FONTDATA->SetUnderlined(underlined);
 
@@ -941,7 +984,7 @@ void wxFont::SetUnderlined(bool underlined)
 
 void wxFont::SetEncoding(wxFontEncoding encoding)
 {
 
 void wxFont::SetEncoding(wxFontEncoding encoding)
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetEncoding(encoding);
 
 
     M_FONTDATA->SetEncoding(encoding);
 
@@ -950,9 +993,7 @@ void wxFont::SetEncoding(wxFontEncoding encoding)
 
 void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
 {
 
 void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
 {
-    Unshare();
-
-    FreeResource();
+    AllocExclusive();
 
     *M_FONTDATA = wxFontRefData(info);
 
 
     *M_FONTDATA = wxFontRefData(info);
 
@@ -972,6 +1013,8 @@ int wxFont::GetPointSize() const
 
 wxSize wxFont::GetPixelSize() const
 {
 
 wxSize wxFont::GetPixelSize() const
 {
+    wxCHECK_MSG( Ok(), wxDefaultSize, wxT("invalid font") );
+
     return M_FONTDATA->GetPixelSize();
 }
 
     return M_FONTDATA->GetPixelSize();
 }
 
@@ -1026,10 +1069,28 @@ wxFontEncoding wxFont::GetEncoding() const
 
 const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 {
 
 const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 {
-    return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
+    return Ok() && M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
                                            : NULL;
 }
 
                                            : NULL;
 }
 
+wxString wxFont::GetNativeFontInfoDesc() const
+{
+    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+
+    // be sure we have an HFONT associated...
+    wxConstCast(this, wxFont)->RealizeResource();
+    return wxFontBase::GetNativeFontInfoDesc();
+}
+
+wxString wxFont::GetNativeFontInfoUserDesc() const
+{
+    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+
+    // be sure we have an HFONT associated...
+    wxConstCast(this, wxFont)->RealizeResource();
+    return wxFontBase::GetNativeFontInfoUserDesc();
+}
+
 bool wxFont::IsFixedWidth() const
 {
     if ( M_FONTDATA->HasNativeFontInfo() )
 bool wxFont::IsFixedWidth() const
 {
     if ( M_FONTDATA->HasNativeFontInfo() )
@@ -1044,4 +1105,3 @@ bool wxFont::IsFixedWidth() const
 
     return wxFontBase::IsFixedWidth();
 }
 
     return wxFontBase::IsFixedWidth();
 }
-