]> git.saurik.com Git - wxWidgets.git/blobdiff - src/msw/font.cpp
wxNO_FULL_REPAINT_ON_RESIZE logic for wxMSW
[wxWidgets.git] / src / msw / font.cpp
index 727048a9b8b324290c7e3c2af1dcb8dc88fa8809..b615928b1ae6897f3ce2c1e3eda30e4b04d0e1ba 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();
 
@@ -110,28 +122,28 @@ bool wxFont::RealizeResource(void)
     BYTE ff_italic;
     int ff_weight = 0;
     int ff_family = 0;
-    wxString ff_face("");
+    wxString ff_face(_T(""));
 
     switch (M_FONTDATA->m_family)
     {
       case wxSCRIPT:     ff_family = FF_SCRIPT ;
-                         ff_face = "Script" ;
+                         ff_face = _T("Script") ;
                          break ;
       case wxDECORATIVE: ff_family = FF_DECORATIVE;
                          break;
       case wxROMAN:      ff_family = FF_ROMAN;
-                         ff_face = "Times New Roman" ;
+                         ff_face = _T("Times New Roman") ;
                          break;
       case wxTELETYPE:
       case wxMODERN:     ff_family = FF_MODERN;
-                         ff_face = "Courier New" ;
+                         ff_face = _T("Courier New") ;
                          break;
       case wxSWISS:      ff_family = FF_SWISS;
-                         ff_face = "Arial";
+                         ff_face = _T("Arial") ;
                          break;
       case wxDEFAULT:
       default:           ff_family = FF_SWISS;
-                         ff_face = "Arial" ; 
+                         ff_face = _T("Arial") ; 
     }
 
     if (M_FONTDATA->m_style == wxITALIC || M_FONTDATA->m_style == wxSLANT)
@@ -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 wxChar* pzFace = (const wxChar*) ff_face;
+    if (!M_FONTDATA->m_faceName.IsNull())
+        pzFace = (const wxChar*) 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
@@ -184,7 +192,7 @@ bool wxFont::RealizeResource(void)
     // up fonts. So, set ppInch to a constant 96 dpi.
     ppInch = 96;
     
-#if FONT_SIZE_COMPATIBILITY
+#if wxFONT_SIZE_COMPATIBILITY
     // Incorrect, but compatible with old wxWindows behaviour
     int nHeight = (M_FONTDATA->m_pointSize*ppInch/72);
 #else
@@ -196,9 +204,9 @@ 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
-    if (m_hFont==NULL) wxError("Cannot create font","Internal Error") ;
+                PROOF_QUALITY, DEFAULT_PITCH | ff_family, pzFace);
+#ifdef WXDEBUG_CREATE
+    if (m_hFont==NULL) wxError(_T("Cannot create font"),_T("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,87 +232,113 @@ WXHANDLE wxFont::GetResourceHandle(void)
     return (WXHANDLE)M_FONTDATA->m_hFont ;
 }
 
-bool wxFont::IsFree(void)
+bool wxFont::IsFree() const
 {
   return (M_FONTDATA && (M_FONTDATA->m_hFont == 0));
 }
 
-void wxFont::SetPointSize(const int pointSize)
+void wxFont::Unshare()
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+       // 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)
+{
+    Unshare();
+
     M_FONTDATA->m_pointSize = pointSize;
+
+    RealizeResource();
 }
 
-void wxFont::SetFamily(const int family)
+void wxFont::SetFamily(int family)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_family = family;
+
+    RealizeResource();
 }
 
-void wxFont::SetStyle(const int style)
+void wxFont::SetStyle(int style)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_style = style;
+
+    RealizeResource();
 }
 
-void wxFont::SetWeight(const int weight)
+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(const bool underlined)
+void wxFont::SetUnderlined(bool underlined)
 {
-    if ( !m_refData )
-        m_refData = new wxFontRefData;
+    Unshare();
+
     M_FONTDATA->m_underlined = underlined;
+
+    RealizeResource();
 }
 
 wxString wxFont::GetFamilyString(void) const
 {
-  wxString fam("");
+  wxString fam(_T(""));
   switch (GetFamily())
   {
     case wxDECORATIVE:
-      fam = "wxDECORATIVE";
+      fam = _T("wxDECORATIVE");
       break;
     case wxROMAN:
-      fam = "wxROMAN";
+      fam = _T("wxROMAN");
       break;
     case wxSCRIPT:
-      fam = "wxSCRIPT";
+      fam = _T("wxSCRIPT");
       break;
     case wxSWISS:
-      fam = "wxSWISS";
+      fam = _T("wxSWISS");
       break;
     case wxMODERN:
-      fam = "wxMODERN";
+      fam = _T("wxMODERN");
       break;
     case wxTELETYPE:
-      fam = "wxTELETYPE";
+      fam = _T("wxTELETYPE");
       break;
     default:
-      fam = "wxDEFAULT";
+      fam = _T("wxDEFAULT");
       break;
   }
   return fam;
 }
 
-/* New font system */
 wxString wxFont::GetFaceName(void) const
 {
-  wxString str("");
+  wxString str(_T(""));
   if (M_FONTDATA)
        str = M_FONTDATA->m_faceName ;
   return str;
@@ -326,17 +346,17 @@ wxString wxFont::GetFaceName(void) const
 
 wxString wxFont::GetStyleString(void) const
 {
-  wxString styl("");
+  wxString styl(_T(""));
   switch (GetStyle())
   {
     case wxITALIC:
-      styl = "wxITALIC";
+      styl = _T("wxITALIC");
       break;
     case wxSLANT:
-      styl = "wxSLANT";
+      styl = _T("wxSLANT");
       break;
     default:
-      styl = "wxNORMAL";
+      styl = _T("wxNORMAL");
       break;
   }
   return styl;
@@ -344,17 +364,17 @@ wxString wxFont::GetStyleString(void) const
 
 wxString wxFont::GetWeightString(void) const
 {
-  wxString w("");
+  wxString w(_T(""));
   switch (GetWeight())
   {
     case wxBOLD:
-      w = "wxBOLD";
+      w = _T("wxBOLD");
       break;
     case wxLIGHT:
-      w = "wxLIGHT";
+      w = _T("wxLIGHT");
       break;
     default:
-      w = "wxNORMAL";
+      w = _T("wxNORMAL");
       break;
   }
   return w;