]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
better native types for carbon
[wxWidgets.git] / src / msw / font.cpp
index 024e43d3aef7ac2cdbc636bdc4dd1453fe652665..c0ae868c0aba95ea66f7b8b55a32661a480e96fc 100644 (file)
@@ -116,9 +116,9 @@ public:
     wxFontRefData(int size,
                   const wxSize& pixelSize,
                   bool sizeUsingPixels,
-                  int family,
-                  int style,
-                  int weight,
+                  wxFontFamily family,
+                  wxFontStyle style,
+                  wxFontWeight weight,
                   bool underlined,
                   const wxString& faceName,
                   wxFontEncoding encoding)
@@ -171,18 +171,18 @@ public:
         return m_nativeFontInfoOk ? true : m_sizeUsingPixels;
     }
 
-    int GetFamily() const
+    wxFontFamily GetFamily() const
     {
         return m_family;
     }
 
-    int GetStyle() const
+    wxFontStyle GetStyle() const
     {
         return m_nativeFontInfoOk ? m_nativeFontInfo.GetStyle()
                                   : m_style;
     }
 
-    int GetWeight() const
+    wxFontWeight GetWeight() const
     {
         return m_nativeFontInfoOk ? m_nativeFontInfo.GetWeight()
                                   : m_weight;
@@ -214,7 +214,7 @@ public:
     WXHFONT GetHFONT(const wxFont *font) const
     {
         if ( !m_hFont )
-            wx_const_cast(wxFontRefData *, this)->Alloc(font);
+            const_cast<wxFontRefData *>(this)->Alloc(font);
 
         return (WXHFONT)m_hFont;
     }
@@ -257,14 +257,14 @@ public:
         }
     }
 
-    void SetFamily(int family)
+    void SetFamily(wxFontFamily family)
     {
         Free();
 
         m_family = family;
     }
 
-    void SetStyle(int style)
+    void SetStyle(wxFontStyle style)
     {
         Free();
 
@@ -274,7 +274,7 @@ public:
             m_style = style;
     }
 
-    void SetWeight(int weight)
+    void SetWeight(wxFontWeight weight)
     {
         Free();
 
@@ -334,9 +334,9 @@ protected:
     void Init(int size,
               const wxSize& pixelSize,
               bool sizeUsingPixels,
-              int family,
-              int style,
-              int weight,
+              wxFontFamily family,
+              wxFontStyle style,
+              wxFontWeight weight,
               bool underlined,
               const wxString& faceName,
               wxFontEncoding encoding);
@@ -347,9 +347,9 @@ protected:
     int           m_pointSize;
     wxSize        m_pixelSize;
     bool          m_sizeUsingPixels;
-    int           m_family;
-    int           m_style;
-    int           m_weight;
+    wxFontFamily  m_family;
+    wxFontStyle   m_style;
+    wxFontWeight  m_weight;
     bool          m_underlined;
     wxString      m_faceName;
     wxFontEncoding m_encoding;
@@ -375,9 +375,9 @@ protected:
 void wxFontRefData::Init(int pointSize,
                          const wxSize& pixelSize,
                          bool sizeUsingPixels,
-                         int family,
-                         int style,
-                         int weight,
+                         wxFontFamily family,
+                         wxFontStyle style,
+                         wxFontWeight weight,
                          bool underlined,
                          const wxString& faceName,
                          wxFontEncoding encoding)
@@ -408,9 +408,10 @@ void wxFontRefData::Init(const wxNativeFontInfo& info, WXHFONT hFont)
 
     m_nativeFontInfoOk = true;
     m_nativeFontInfo = info;
+
     // This is the best we can do since we don't have the
     // correct information at this point.
-    m_family = wxSWISS;
+    m_family = wxFONTFAMILY_SWISS;
 }
 
 wxFontRefData::~wxFontRefData()
@@ -422,7 +423,11 @@ bool wxFontRefData::Alloc(const wxFont *font)
 {
     if ( !m_nativeFontInfoOk )
     {
-        wxFillLogFont(&m_nativeFontInfo.lf, font);
+        // NOTE: we use wxNativeInfo::InitFromFont to avoid code duplication:
+        //       it results in using our m_* variables (except for m_hFont and
+        //       for m_nativeFontInfo obviously) for the initialization
+        //       of the wxNativeInfo::lf member.
+        m_nativeFontInfo.InitFromFont(*font);
         m_nativeFontInfoOk = true;
     }
 
@@ -565,11 +570,16 @@ void wxNativeFontInfo::SetPointSize(int pointsize)
 
 void wxNativeFontInfo::SetPixelSize(const wxSize& pixelSize)
 {
+    // NOTE: although the MSW port allows for negative pixel size heights,
+    //       other ports don't and since it's a very useful feature assert
+    //       here if we get a negative height:
+    wxCHECK_RET( pixelSize.GetWidth() >= 0 && pixelSize.GetHeight() > 0,
+                 "Negative values for the pixel size or zero pixel height are not allowed" );
+    
     lf.lfHeight = pixelSize.GetHeight();
     lf.lfWidth = pixelSize.GetWidth();
 }
 
-
 void wxNativeFontInfo::SetStyle(wxFontStyle style)
 {
     switch ( style )
@@ -618,9 +628,7 @@ void wxNativeFontInfo::SetUnderlined(bool underlined)
 
 bool wxNativeFontInfo::SetFaceName(const wxString& facename)
 {
-    size_t len = WXSIZEOF(lf.lfFaceName);
-    wxStrncpy(lf.lfFaceName, facename, len);
-    lf.lfFaceName[len - 1] = '\0';    // truncate the face name
+    wxStrlcpy(lf.lfFaceName, facename.c_str(), WXSIZEOF(lf.lfFaceName));
     return true;
 }
 
@@ -845,6 +853,13 @@ wxString wxNativeFontInfo::ToString() const
 // wxFont
 // ----------------------------------------------------------------------------
 
+wxFont::wxFont(const wxString& fontdesc)
+{
+    wxNativeFontInfo info;
+    if ( info.FromString(fontdesc) )
+        (void)Create(info);
+}
+
 bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
 {
     UnRef();
@@ -854,19 +869,12 @@ bool wxFont::Create(const wxNativeFontInfo& info, WXHFONT hFont)
     return RealizeResource();
 }
 
-wxFont::wxFont(const wxString& fontdesc)
-{
-    wxNativeFontInfo info;
-    if ( info.FromString(fontdesc) )
-        (void)Create(info);
-}
-
 bool wxFont::DoCreate(int pointSize,
                       const wxSize& pixelSize,
                       bool sizeUsingPixels,
-                      int family,
-                      int style,
-                      int weight,
+                      wxFontFamily family,
+                      wxFontStyle style,
+                      wxFontWeight weight,
                       bool underlined,
                       const wxString& faceName,
                       wxFontEncoding encoding)
@@ -895,28 +903,27 @@ wxFont::~wxFont()
 // real implementation
 // ----------------------------------------------------------------------------
 
-wxObjectRefData *wxFont::CreateRefData() const
+wxGDIRefData *wxFont::CreateGDIRefData() const
 {
     return new wxFontRefData();
 }
 
-wxObjectRefData *wxFont::CloneRefData(const wxObjectRefData *data) const
+wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const
 {
-    return new wxFontRefData(*wx_static_cast(const wxFontRefData *, data));
+    return new wxFontRefData(*static_cast<const wxFontRefData *>(data));
 }
 
 bool wxFont::RealizeResource()
 {
-    // don't do anything if we already have a valid font
-    if ( GetHFONT() )
-        return true;
-
-    return M_FONTDATA->Alloc(this);
+    // NOTE: the GetHFONT() call automatically triggers a reallocation of
+    //       the HFONT if necessary (will do nothing if we already have the resource); 
+    //       it returns NULL only if there is a failure in wxFontRefData::Alloc()...
+    return GetHFONT() != NULL;
 }
 
 bool wxFont::FreeResource(bool WXUNUSED(force))
 {
-    if ( !GetHFONT() )
+    if ( !M_FONTDATA )
         return false;
 
     M_FONTDATA->Free();
@@ -931,6 +938,8 @@ WXHANDLE wxFont::GetResourceHandle() const
 
 WXHFONT wxFont::GetHFONT() const
 {
+    // NOTE: wxFontRefData::GetHFONT() will automatically call
+    //       wxFontRefData::Alloc() if necessary
     return M_FONTDATA ? M_FONTDATA->GetHFONT(this) : 0;
 }
 
@@ -958,21 +967,21 @@ void wxFont::SetPixelSize(const wxSize& pixelSize)
     M_FONTDATA->SetPixelSize(pixelSize);
 }
 
-void wxFont::SetFamily(int family)
+void wxFont::SetFamily(wxFontFamily family)
 {
     AllocExclusive();
 
     M_FONTDATA->SetFamily(family);
 }
 
-void wxFont::SetStyle(int style)
+void wxFont::SetStyle(wxFontStyle style)
 {
     AllocExclusive();
 
     M_FONTDATA->SetStyle(style);
 }
 
-void wxFont::SetWeight(int weight)
+void wxFont::SetWeight(wxFontWeight weight)
 {
     AllocExclusive();
 
@@ -1023,93 +1032,95 @@ void wxFont::DoSetNativeFontInfo(const wxNativeFontInfo& info)
 
 int wxFont::GetPointSize() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
 
     return M_FONTDATA->GetPointSize();
 }
 
 wxSize wxFont::GetPixelSize() const
 {
-    wxCHECK_MSG( Ok(), wxDefaultSize, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxDefaultSize, wxT("invalid font") );
 
     return M_FONTDATA->GetPixelSize();
 }
 
 bool wxFont::IsUsingSizeInPixels() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), 0, wxT("invalid font") );
 
     return M_FONTDATA->IsUsingSizeInPixels();
 }
 
-int wxFont::GetFamily() const
+wxFontFamily wxFont::GetFamily() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxFONTFAMILY_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetFamily();
 }
 
-int wxFont::GetStyle() const
+wxFontStyle wxFont::GetStyle() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxFONTSTYLE_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetStyle();
 }
 
-int wxFont::GetWeight() const
+wxFontWeight wxFont::GetWeight() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxFONTWEIGHT_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetWeight();
 }
 
 bool wxFont::GetUnderlined() const
 {
-    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
 
     return M_FONTDATA->GetUnderlined();
 }
 
 wxString wxFont::GetFaceName() const
 {
-    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
 
     return M_FONTDATA->GetFaceName();
 }
 
 wxFontEncoding wxFont::GetEncoding() const
 {
-    wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxFONTENCODING_DEFAULT, wxT("invalid font") );
 
     return M_FONTDATA->GetEncoding();
 }
 
 const wxNativeFontInfo *wxFont::GetNativeFontInfo() const
 {
-    return Ok() && M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
+    return IsOk() && M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
                                            : NULL;
 }
 
 wxString wxFont::GetNativeFontInfoDesc() const
 {
-    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
 
     // be sure we have an HFONT associated...
-    wxConstCast(this, wxFont)->RealizeResource();
+    const_cast<wxFont*>(this)->RealizeResource();
     return wxFontBase::GetNativeFontInfoDesc();
 }
 
 wxString wxFont::GetNativeFontInfoUserDesc() const
 {
-    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
+    wxCHECK_MSG( IsOk(), wxEmptyString, wxT("invalid font") );
 
     // be sure we have an HFONT associated...
-    wxConstCast(this, wxFont)->RealizeResource();
+    const_cast<wxFont*>(this)->RealizeResource();
     return wxFontBase::GetNativeFontInfoUserDesc();
 }
 
 bool wxFont::IsFixedWidth() const
 {
+    wxCHECK_MSG( IsOk(), false, wxT("invalid font") );
+
     if ( M_FONTDATA->HasNativeFontInfo() )
     {
         // the two low-order bits specify the pitch of the font, the rest is