]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
no message
[wxWidgets.git] / src / msw / font.cpp
index 48a127d8f96e66c281b905ac70aea83e74a0c9bf..1ef70b48b4fe2da5961b0dba7c818bf006e27493 100644 (file)
 #endif
 
 #include "wx/msw/private.h"
-#include "assert.h"
+#include <assert.h>
 
 #if !USE_SHARED_LIBRARIES
 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 
-#if USE_PORTABLE_FONTS_IN_MSW
+#if wxUSE_PORTABLE_FONTS_IN_MSW
 IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
 #endif
 
@@ -55,6 +55,20 @@ wxFontRefData::wxFontRefData(void)
        m_hFont = 0;
 }
 
+wxFontRefData::wxFontRefData(const wxFontRefData& data)
+{
+       m_style = data.m_style;
+       m_temporary = FALSE;
+       m_pointSize = data.m_pointSize;
+       m_family = data.m_family;
+       m_fontId = data.m_fontId;
+       m_style = data.m_style;
+       m_weight = data.m_weight;
+       m_underlined = data.m_underlined;
+       m_faceName = data.m_faceName;
+       m_hFont = 0;
+}
+
 wxFontRefData::~wxFontRefData(void)
 {
        if ( m_hFont )
@@ -70,27 +84,25 @@ wxFont::wxFont(void)
 /* Constructor for a font. Note that the real construction is done
  * in wxDC::SetFont, when information is available about scaling etc.
  */
-wxFont::wxFont(int PointSize, int Family, int Style, int Weight, bool Underlined, const wxString& Face)
+wxFont::wxFont(int pointSize, int family, int style, int weight, bool underlined, const wxString& faceName)
 {
-  Create(PointSize, Family, Style, Weight, Underlined, Face);
+    Create(pointSize, family, style, weight, underlined, faceName);
 
     if ( wxTheFontList )
         wxTheFontList->Append(this);
 }
 
-bool wxFont::Create(int PointSize, int Family, int Style, int Weight, bool Underlined, const wxString& Face)
+bool wxFont::Create(int pointSize, int family, int style, int weight, bool underlined, const wxString& faceName)
 {
   UnRef();
   m_refData = new wxFontRefData;
 
-  M_FONTDATA->m_family = Family;
-  M_FONTDATA->m_style = Style;
-  M_FONTDATA->m_weight = Weight;
-  M_FONTDATA->m_pointSize = PointSize;
-  M_FONTDATA->m_underlined = Underlined;
-  M_FONTDATA->m_faceName = Face;
-  M_FONTDATA->m_temporary = FALSE;
-  M_FONTDATA->m_hFont = 0;
+  M_FONTDATA->m_family = family;
+  M_FONTDATA->m_style = style;
+  M_FONTDATA->m_weight = weight;
+  M_FONTDATA->m_pointSize = pointSize;
+  M_FONTDATA->m_underlined = underlined;
+  M_FONTDATA->m_faceName = faceName;
 
   RealizeResource();
 
@@ -146,13 +158,9 @@ bool wxFont::RealizeResource(void)
     else if (M_FONTDATA->m_weight == wxBOLD)
       ff_weight = FW_BOLD;
 
-#if defined(__X__) || (defined(__WINDOWS__) && USE_PORTABLE_FONTS_IN_MSW)
-    ff_face = wxTheFontNameDirectory.GetScreenName(M_FONTDATA->m_family, M_FONTDATA->m_weight, M_FONTDATA->m_style);
-#else
-    ff_face = M_FONTDATA->m_faceName;
-       if ( ff_face.IsNull() )
-               ff_face = "";
-#endif
+    const char* pzFace = (const char*) ff_face;
+    if (!M_FONTDATA->m_faceName.IsNull())
+        pzFace = (const char*) M_FONTDATA->m_faceName ;
 
 /* Always calculate fonts using the screen DC (is this the best strategy?)
  * There may be confusion if a font is selected into a printer
@@ -196,8 +204,8 @@ bool wxFont::RealizeResource(void)
 
     M_FONTDATA->m_hFont = (WXHFONT) CreateFont(nHeight, 0, 0, 0,ff_weight,ff_italic,(BYTE)ff_underline,
                 0, ANSI_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS,
-                PROOF_QUALITY, DEFAULT_PITCH | ff_family, (ff_face == "" ? NULL : (const char *)ff_face));
-#ifdef DEBUG_CREATE
+                PROOF_QUALITY, DEFAULT_PITCH | ff_family, pzFace);
+#ifdef WXDEBUG_CREATE
     if (m_hFont==NULL) wxError("Cannot create font","Internal Error") ;
 #endif
     return (M_FONTDATA->m_hFont != (WXHFONT) NULL);
@@ -216,21 +224,7 @@ bool wxFont::FreeResource(bool force)
   return FALSE;
 }
 
-/*
-bool wxFont::UseResource(void)
-{
-  IncrementResourceUsage();
-  return TRUE;
-}
-
-bool wxFont::ReleaseResource(void)
-{
-  DecrementResourceUsage();
-  return TRUE;
-}
-*/
-  
-WXHANDLE wxFont::GetResourceHandle(void)
+WXHANDLE wxFont::GetResourceHandle()
 {
   if ( !M_FONTDATA )
        return 0;
@@ -238,51 +232,78 @@ WXHANDLE wxFont::GetResourceHandle(void)
     return (WXHANDLE)M_FONTDATA->m_hFont ;
 }
 
-bool wxFont::IsFree(void)
+bool wxFont::IsFree()
 {
   return (M_FONTDATA && (M_FONTDATA->m_hFont == 0));
 }
 
+void wxFont::Unshare()
+{
+       // Don't change shared data
+       if (!m_refData)
+    {
+               m_refData = new wxFontRefData();
+       }
+    else
+    {
+               wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData);
+               UnRef();
+               m_refData = ref;
+       }
+}
+
 void wxFont::SetPointSize(int pointSize)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_pointSize = pointSize;
+
+    RealizeResource();
 }
 
 void wxFont::SetFamily(int family)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_family = family;
+
+    RealizeResource();
 }
 
 void wxFont::SetStyle(int style)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_style = style;
+
+    RealizeResource();
 }
 
 void wxFont::SetWeight(int weight)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_weight = weight;
+
+    RealizeResource();
 }
 
 void wxFont::SetFaceName(const wxString& faceName)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_faceName = faceName;
+
+    RealizeResource();
 }
 
 void wxFont::SetUnderlined(bool underlined)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_underlined = underlined;
+
+    RealizeResource();
 }
 
 wxString wxFont::GetFamilyString(void) const
@@ -315,7 +336,6 @@ wxString wxFont::GetFamilyString(void) const
   return fam;
 }
 
-/* New font system */
 wxString wxFont::GetFaceName(void) const
 {
   wxString str("");