]> git.saurik.com Git - wxWidgets.git/blobdiff - src/os2/font.cpp
wxRichTextCtrl native caret now flashes, for wxMac/Core Graphics mode
[wxWidgets.git] / src / os2 / font.cpp
index 6c4c32653c1022b5aa94e1010a5932fd0e92d024..ca09caefc38dacfb321eaf1be87a510efeff05af 100644 (file)
@@ -1,5 +1,5 @@
 /////////////////////////////////////////////////////////////////////////////
-// Name:        font.cpp
+// Name:        src/os2/font.cpp
 // Purpose:     wxFont class
 // Author:      David Webster
 // Modified by:
@@ -9,6 +9,9 @@
 // Licence:     wxWindows licence
 /////////////////////////////////////////////////////////////////////////////
 
+// For compilers that support precompilation, includes "wx.h".
+#include "wx/wxprec.h"
+
 // ============================================================================
 // declarations
 // ============================================================================
 // headers
 // ----------------------------------------------------------------------------
 
- #include <malloc.h>
-// For compilers that support precompilation, includes "wx.h".
-#include "wx/wxprec.h"
+#include "wx/font.h"
 
 #ifndef WX_PRECOMP
     #include <stdio.h>
-    #include "wx/setup.h"
     #include "wx/list.h"
     #include "wx/utils.h"
     #include "wx/app.h"
-    #include "wx/font.h"
+    #include "wx/log.h"
 #endif // WX_PRECOMP
 
 #include "wx/os2/private.h"
 
 #include "wx/fontutil.h"
 #include "wx/fontmap.h"
+#include "wx/encinfo.h"
 
 #include "wx/tokenzr.h"
 
+#include <malloc.h>
+
 IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 
 // ----------------------------------------------------------------------------
@@ -48,14 +51,14 @@ class WXDLLEXPORT wxFontRefData: public wxGDIRefData
 public:
     wxFontRefData()
     {
-        Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, FALSE,
-             "", wxFONTENCODING_DEFAULT);
+        Init(-1, wxFONTFAMILY_DEFAULT, wxFONTSTYLE_NORMAL, wxFONTWEIGHT_NORMAL, false,
+             wxEmptyString, wxFONTENCODING_DEFAULT);
     }
 
     wxFontRefData( int             nSize
-                  ,int             nFamily
-                  ,int             nStyle
-                  ,int             nWeight
+                  ,wxFontFamily    nFamily
+                  ,wxFontStyle     nStyle
+                  ,wxFontWeight    nWeight
                   ,bool            bUnderlined
                   ,const wxString& sFaceName
                   ,wxFontEncoding  vEncoding
@@ -108,22 +111,27 @@ public:
     //
     inline int GetPointSize(void) const
     {
-        return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetPointSize()
-                                   : m_nPointSize;
+        //
+        // We don't use the actual native font point size since it is
+        // the chosen physical font, which is usually only and approximation
+        // of the desired outline font.  The actual displayable point size
+        // is the one stored in the refData
+        //
+        return m_nPointSize;
     }
 
-    inline int GetFamily(void) const
+    inline wxFontFamily GetFamily(void) const
     {
         return m_nFamily;
     }
 
-    inline int GetStyle(void) const
+    inline wxFontStyle GetStyle(void) const
     {
         return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetStyle()
                                    : m_nStyle;
     }
 
-    inline int GetWeight(void) const
+    inline wxFontWeight GetWeight(void) const
     {
         return m_bNativeFontInfoOk ? m_vNativeFontInfo.GetWeight()
                                    : m_nWeight;
@@ -167,33 +175,34 @@ public:
             m_nPointSize = nPointSize;
     }
 
-    inline void SetFamily(int nFamily)
+    inline void SetFamily(wxFontFamily nFamily)
     {
         m_nFamily = nFamily;
     }
 
-    inline void SetStyle(int nStyle)
+    inline void SetStyle(wxFontStyle nStyle)
     {
         if (m_bNativeFontInfoOk)
-            m_vNativeFontInfo.SetStyle((wxFontStyle)nStyle);
+            m_vNativeFontInfo.SetStyle(nStyle);
         else
             m_nStyle = nStyle;
     }
 
-    inline void SetWeight(int nWeight)
+    inline void SetWeight(wxFontWeight nWeight)
     {
         if (m_bNativeFontInfoOk)
-            m_vNativeFontInfo.SetWeight((wxFontWeight)nWeight);
+            m_vNativeFontInfo.SetWeight(nWeight);
         else
             m_nWeight = nWeight;
     }
 
-    inline void SetFaceName(const wxString& sFaceName)
+    inline bool SetFaceName(const wxString& sFaceName)
     {
         if (m_bNativeFontInfoOk)
-            m_vNativeFontInfo.SetFaceName(sFaceName);
+            return m_vNativeFontInfo.SetFaceName(sFaceName);
         else
             m_sFaceName = sFaceName;
+        return true;
     }
 
     inline void SetUnderlined(bool bUnderlined)
@@ -240,9 +249,9 @@ protected:
     // Common part of all ctors
     //
     void Init( int             nSize
-              ,int             nFamily
-              ,int             nStyle
-              ,int             nWeight
+              ,wxFontFamily    nFamily
+              ,wxFontStyle     nStyle
+              ,wxFontWeight    nWeight
               ,bool            bUnderlined
               ,const wxString& rsFaceName
               ,wxFontEncoding  vEncoding
@@ -253,7 +262,7 @@ protected:
               ,WXHANDLE                hPS   = 0
              );
     //
-    // If TRUE, the pointer to the actual font is temporary and SHOULD NOT BE
+    // If true, the pointer to the actual font is temporary and SHOULD NOT BE
     // DELETED by destructor
     //
     bool                            m_bTemporary;
@@ -263,9 +272,9 @@ protected:
     // Font characterstics
     //
     int                             m_nPointSize;
-    int                             m_nFamily;
-    int                             m_nStyle;
-    int                             m_nWeight;
+    wxFontFamily                    m_nFamily;
+    wxFontStyle                     m_nStyle;
+    wxFontWeight                    m_nWeight;
     bool                            m_bUnderlined;
     wxString                        m_sFaceName;
     wxFontEncoding                  m_vEncoding;
@@ -288,6 +297,8 @@ protected:
     bool                            m_bInternalPS; // Internally generated PS?
 }; // end of CLASS wxFontRefData
 
+#define M_FONTDATA ((wxFontRefData*)m_refData)
+
 // ============================================================================
 // implementation
 // ============================================================================
@@ -298,9 +309,9 @@ protected:
 
 void wxFontRefData::Init(
   int                               nPointSize
-, int                               nFamily
-, int                               nStyle
-, int                               nWeight
+, wxFontFamily                      nFamily
+, wxFontStyle                       nStyle
+, wxFontWeight                      nWeight
 , bool                              bUnderlined
 , const wxString&                   rsFaceName
 , wxFontEncoding                    vEncoding
@@ -316,10 +327,10 @@ void wxFontRefData::Init(
     m_vEncoding   = vEncoding;
     m_hFont       = 0;
 
-    m_bNativeFontInfoOk = FALSE;
+    m_bNativeFontInfoOk = false;
 
     m_nFontId     = 0;
-    m_bTemporary  = FALSE;
+    m_bTemporary  = false;
     m_pFM         = (PFONTMETRICS)NULL;
     m_hPS         = NULLHANDLE;
     m_nNumFonts   = 0;
@@ -340,93 +351,120 @@ void wxFontRefData::Init(
     m_hFont = hFont;
     m_nFontId = (int)hFont;
 
-    m_bNativeFontInfoOk = TRUE;
+    m_bNativeFontInfoOk = true;
     m_vNativeFontInfo = rInfo;
 
-    if (m_hPS == NULLHANDLE)
+    if (hPS == NULLHANDLE)
     {
         m_hPS = ::WinGetPS(HWND_DESKTOP);
-        m_bInternalPS;
+        m_bInternalPS = true;
     }
     else
         m_hPS = (HPS)hPS;
-}
+
+    m_nFontId     = 0;
+    m_bTemporary  = false;
+    m_pFM         = (PFONTMETRICS)NULL;
+    m_nNumFonts   = 0;
+} // end of wxFontRefData::Init
 
 wxFontRefData::~wxFontRefData()
 {
     Free();
 }
 
-bool wxFontRefData::Alloc(
-  wxFont*                           pFont
-)
+bool wxFontRefData::Alloc( wxFont* pFont )
 {
     wxString                        sFaceName;
-    long                            flId;
+    long                            flId = m_hFont;
+    long                            lRc;
+    ERRORID                         vError;
+    wxString                        sError;
 
     if (!m_bNativeFontInfoOk)
     {
         wxFillLogFont( &m_vNativeFontInfo.fa
                       ,&m_vNativeFontInfo.fn
-                      ,m_hPS
+                      ,&m_hPS
+                      ,&m_bInternalPS
                       ,&flId
                       ,sFaceName
                       ,pFont
                      );
-        m_bNativeFontInfoOk = TRUE;
+        m_bNativeFontInfoOk = true;
     }
-
-    if(::GpiCreateLogFont( m_hPS
-                          ,NULL
-                          ,flId
-                          ,&m_vNativeFontInfo.fa
-                         ) != GPI_ERROR)
-       m_hFont = (WXHFONT)1;
-
-    //
-    // We don't actuall keep the font around if using a temporary PS
-    //
-    if (m_bInternalPS)
+    else
     {
-        if(m_hFont)
-            ::GpiDeleteSetId( m_hPS
-                             ,flId
-                            );
-
-        ::WinReleasePS(m_hPS);
+        if (flId == 0L)
+            flId = 1L;
+        else
+            flId++;
+        if (flId > 254)
+            flId = 1L;
+    }
+    if((lRc = ::GpiCreateLogFont( m_hPS
+                                 ,NULL
+                                 ,flId
+                                 ,&m_vNativeFontInfo.fa
+                                )) != GPI_ERROR)
+    {
+       m_hFont = (WXHFONT)flId;
+       m_nFontId = flId;
     }
-    else
-        //
-        // Select the font into the Presentation space
-        //
-        ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
     if (!m_hFont)
     {
-        wxLogLastError("CreateFont");
+        vError = ::WinGetLastError(vHabmain);
+        sError = wxPMErrorToStr(vError);
+        wxLogLastError(wxT("CreateFont"));
     }
 
-    //
-    // Query for the actual metrics of the current font being used
-    //
+    ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
     ::GpiQueryFontMetrics(m_hPS, sizeof(FONTMETRICS), &m_vNativeFontInfo.fm);
 
     //
     // Set refData members with the results
     //
-    m_hFont = (WXHFONT)m_nFontId;
     memcpy(&m_vFattrs, &m_vNativeFontInfo.fa, sizeof(m_vFattrs));
     memcpy(&m_vFname, &m_vNativeFontInfo.fn, sizeof(m_vFname));
-    m_nPointSize  = m_vNativeFontInfo.fm.lEmHeight;
-    if (strcmp(m_vNativeFontInfo.fa.szFacename, "Times New Roman") == 0)
-        m_nFamily = wxROMAN;
-    else if (strcmp(m_vNativeFontInfo.fa.szFacename, "WarpSans") == 0)
-        m_nFamily = wxSWISS;
-    else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Script") == 0)
-        m_nFamily = wxSCRIPT;
-    else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Courier New") == 0)
-        m_nFamily = wxMODERN;
+    //
+    // Going to leave the point size alone.  Mostly we use outline fonts
+    // that can be set to any point size inside of Presentation Parameters,
+    // regardless of whether or not the actual font is registered in the system.
+    // The GpiCreateLogFont will do enough by selecting the right family,
+    // and face name.
+    //
+    if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman") == 0)
+        m_nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman MT 30") == 0)
+        m_nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "@Times New Roman MT 30") == 0)
+        m_nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Tms Rmn") == 0)
+        m_nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "WarpSans") == 0)
+        m_nFamily = wxFONTFAMILY_DECORATIVE;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helvetica") == 0)
+        m_nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helv") == 0)
+        m_nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Script") == 0)
+        m_nFamily = wxFONTFAMILY_SCRIPT;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier New") == 0)
+        m_nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier") == 0)
+        m_nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Monospaced") == 0)
+        m_nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System VIO") == 0)
+        m_nFamily = wxFONTFAMILY_MODERN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Proportional") == 0)
+        m_nFamily = wxFONTFAMILY_MODERN;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Arial") == 0)
+        m_nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Swiss") == 0)
+        m_nFamily = wxFONTFAMILY_SWISS;
     else
-        m_nFamily = wxSWISS;
+        m_nFamily = wxFONTFAMILY_SWISS;
 
     if (m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_ITALIC)
         m_nStyle = wxFONTSTYLE_ITALIC;
@@ -458,9 +496,27 @@ bool wxFontRefData::Alloc(
             m_nWeight = wxFONTWEIGHT_NORMAL;
     }
     m_bUnderlined = ((m_vNativeFontInfo.fa.fsSelection & FATTR_SEL_UNDERSCORE) != 0);
-    m_sFaceName = m_vNativeFontInfo.fa.szFacename;
+    m_sFaceName = (wxChar*)m_vNativeFontInfo.fa.szFacename;
     m_vEncoding = wxGetFontEncFromCharSet(m_vNativeFontInfo.fa.usCodePage);
-    return TRUE;
+
+    //
+    // We don't actuall keep the font around if using a temporary PS
+    //
+    if (m_bInternalPS)
+    {
+        if(m_hFont)
+            ::GpiDeleteSetId( m_hPS
+                             ,flId
+                            );
+
+        ::WinReleasePS(m_hPS);
+    }
+    else
+        //
+        // Select the font into the Presentation space
+        //
+        ::GpiSetCharSet(m_hPS, flId); // sets font for presentation space
+    return true;
 } // end of wxFontRefData::Alloc
 
 void wxFontRefData::Free()
@@ -471,10 +527,6 @@ void wxFontRefData::Free()
 
     if ( m_hFont )
     {
-        if (!::GpiSetCharSet(m_hPS, LCID_DEFAULT))
-        {
-            wxLogLastError(wxT("DeleteObject(font)"));
-        }
         ::GpiDeleteSetId(m_hPS, 1L); /* delete the logical font          */
         m_nFontId = 0;
         m_hFont   = 0;
@@ -532,7 +584,7 @@ bool wxNativeFontInfo::GetUnderlined() const
 
 wxString wxNativeFontInfo::GetFaceName() const
 {
-    return fm.szFacename;
+    return (wxChar*)fm.szFacename;
 } // end of wxNativeFontInfo::GetFaceName
 
 wxFontFamily wxNativeFontInfo::GetFamily() const
@@ -542,16 +594,38 @@ wxFontFamily wxNativeFontInfo::GetFamily() const
     //
     // Extract family from facename
     //
-    if (strcmp(fa.szFacename, "Times New Roman") == 0)
-        nFamily = wxROMAN;
-    else if (strcmp(fa.szFacename, "WarpSans") == 0)
-        nFamily = wxSWISS;
-    else if (strcmp(fa.szFacename, "Script") == 0)
-        nFamily = wxSCRIPT;
-    else if (strcmp(fa.szFacename, "Courier New") == 0)
-        nFamily = wxMODERN;
+    if (strcmp(fm.szFamilyname, "Times New Roman") == 0)
+        nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(fm.szFamilyname, "Times New Roman MT 30") == 0)
+        nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(fm.szFamilyname, "@Times New Roman MT 30") == 0)
+        nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(fm.szFamilyname, "Tms Rmn") == 0)
+        nFamily = wxFONTFAMILY_ROMAN;
+    else if (strcmp(fm.szFamilyname, "WarpSans") == 0)
+        nFamily = wxFONTFAMILY_DECORATIVE;
+    else if (strcmp(fm.szFamilyname, "Helvetica") == 0)
+        nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(fm.szFamilyname, "Helv") == 0)
+        nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(fm.szFamilyname, "Script") == 0)
+        nFamily = wxFONTFAMILY_SCRIPT;
+    else if (strcmp(fm.szFamilyname, "Courier New") == 0)
+        nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(fm.szFamilyname, "Courier") == 0)
+        nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(fm.szFamilyname, "System Monospaced") == 0)
+        nFamily = wxFONTFAMILY_TELETYPE;
+    else if (strcmp(fm.szFamilyname, "System VIO") == 0)
+        nFamily = wxFONTFAMILY_MODERN;
+    else if (strcmp(fm.szFamilyname, "System Proportional") == 0)
+        nFamily = wxFONTFAMILY_MODERN;
+    else if (strcmp(fm.szFamilyname, "Arial") == 0)
+        nFamily = wxFONTFAMILY_SWISS;
+    else if (strcmp(fm.szFamilyname, "Swiss") == 0)
+        nFamily = wxFONTFAMILY_SWISS;
     else
-        nFamily = wxSWISS;
+        nFamily = wxFONTFAMILY_SWISS;
     return (wxFontFamily)nFamily;
 } // end of wxNativeFontInfo::GetFamily
 
@@ -619,11 +693,12 @@ void wxNativeFontInfo::SetUnderlined(
         fa.fsSelection |= FATTR_SEL_UNDERSCORE;
 } // end of wxNativeFontInfo::SetUnderlined
 
-void wxNativeFontInfo::SetFaceName(
-  wxString                          sFacename
+bool wxNativeFontInfo::SetFaceName(
+  const wxString&                   sFacename
 )
 {
-    wxStrncpy(fa.szFacename, sFacename, WXSIZEOF(fa.szFacename));
+    wxStrlcpy((wxChar*)fa.szFacename, sFacename, WXSIZEOF(fa.szFacename));
+    return true;
 } // end of wxNativeFontInfo::SetFaceName
 
 void wxNativeFontInfo::SetFamily(
@@ -634,41 +709,42 @@ void wxNativeFontInfo::SetFamily(
 
     switch (eFamily)
     {
-        case wxSCRIPT:
-            sFacename = _T("Script");
+        case wxFONTFAMILY_SCRIPT:
+            sFacename = wxT("Tms Rmn");
             break;
 
-        case wxDECORATIVE:
-            sFacename = _T("Times New Roman");
+        case wxFONTFAMILY_DECORATIVE:
+            sFacename = wxT("WarpSans");
             break;
 
-        case wxROMAN:
-            sFacename = _T("Times New Roman");
+        case wxFONTFAMILY_ROMAN:
+            sFacename = wxT("Tms Rmn");
             break;
 
-        case wxTELETYPE:
-        case wxMODERN:
-            sFacename = _T("Courier New");
+        case wxFONTFAMILY_TELETYPE:
+            sFacename = wxT("Courier") ;
             break;
 
-        case wxSWISS:
-            sFacename = _T("WarpSans");
+        case wxFONTFAMILY_MODERN:
+            sFacename = wxT("System VIO") ;
             break;
 
-        case wxDEFAULT:
+        case wxFONTFAMILY_SWISS:
+            sFacename = wxT("Helv") ;
+            break;
+
+        case wxFONTFAMILY_DEFAULT:
         default:
-            sFacename = _T("Helv");
+            sFacename = wxT("System VIO") ;
     }
 
-    if (!wxStrlen(fa.szFacename) )
+    if (!wxStrlen((wxChar*)fa.szFacename) )
     {
         SetFaceName(sFacename);
     }
 } // end of wxNativeFontInfo::SetFamily
 
-void wxNativeFontInfo::SetEncoding(
-  wxFontEncoding                    eEncoding
-)
+void wxNativeFontInfo::SetEncoding( wxFontEncoding eEncoding )
 {
     wxNativeEncodingInfo            vInfo;
 
@@ -676,8 +752,7 @@ void wxNativeFontInfo::SetEncoding(
                                   ,&vInfo
                                  ))
     {
-#if wxUSE_FONTMAP
-        if (wxTheFontMapper->GetAltForEncoding( eEncoding
+        if (wxFontMapper::Get()->GetAltForEncoding( eEncoding
                                                ,&vInfo
                                               ))
         {
@@ -692,18 +767,15 @@ void wxNativeFontInfo::SetEncoding(
             }
         }
         else
-#endif // wxUSE_FONTMAP
         {
             // unsupported encoding, replace with the default
             vInfo.charset = 850;
         }
     }
-    fa.usCodePage = vInfo.charset;
+    fa.usCodePage = (USHORT)vInfo.charset;
 } // end of wxNativeFontInfo::SetFaceName
 
-bool wxNativeFontInfo::FromString(
-  const wxString&                   rsStr
-)
+bool wxNativeFontInfo::FromString( const wxString& rsStr )
 {
     long                            lVal;
 
@@ -715,58 +787,58 @@ bool wxNativeFontInfo::FromString(
     wxString                        sToken = vTokenizer.GetNextToken();
 
     if (sToken != _T('0'))
-        return FALSE;
+        return false;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fm.lEmHeight = lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.lAveCharWidth = lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.fsSelection = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.fsType = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.fsFontUse = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.idRegistry = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.usCodePage = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fa.lMatch = lVal;
 
     sToken = vTokenizer.GetNextToken();
     if (!sToken.ToLong(&lVal))
-        return FALSE;
+        return false;
     fn.usWeightClass = (USHORT)lVal;
 
     sToken = vTokenizer.GetNextToken();
     if(!sToken)
-        return FALSE;
-    wxStrcpy(fa.szFacename, sToken.c_str());
-    return TRUE;
+        return false;
+    wxStrcpy((wxChar*)fa.szFacename, sToken.c_str());
+    return true;
 } // end of wxNativeFontInfo::FromString
 
 wxString wxNativeFontInfo::ToString() const
@@ -785,7 +857,7 @@ wxString wxNativeFontInfo::ToString() const
                 fa.usCodePage,
                 fa.lMatch,
                 fn.usWeightClass,
-                fa.szFacename);
+                (char *)fa.szFacename);
     return sStr;
 } // end of wxNativeFontInfo::ToString
 
@@ -793,21 +865,15 @@ wxString wxNativeFontInfo::ToString() const
 // wxFont
 // ----------------------------------------------------------------------------
 
-void wxFont::Init()
-{
-} // end of wxFont::Init
-
-bool wxFont::Create(
-  const wxNativeFontInfo&           rInfo
-, WXHFONT                           hFont
-)
+bool wxFont::Create( const wxNativeFontInfo& rInfo,
+                     WXHFONT hFont )
 {
     UnRef();
     m_refData = new wxFontRefData( rInfo
                                   ,hFont
                                  );
     RealizeResource();
-    return TRUE;
+    return true;
 } // end of wxFont::Create
 
 wxFont::wxFont(
@@ -824,15 +890,13 @@ wxFont::wxFont(
 // Constructor for a font. Note that the real construction is done
 // in wxDC::SetFont, when information is available about scaling etc.
 // ----------------------------------------------------------------------------
-bool wxFont::Create(
-  int                               nPointSize
-, int                               nFamily
-, int                               nStyle
-, int                               nWeight
-, bool                              bUnderlined
-, const wxString&                   rsFaceName
-, wxFontEncoding                    vEncoding
-)
+bool wxFont::Create( int             nPointSize,
+                     wxFontFamily nFamily,
+                     wxFontStyle nStyle,
+                     wxFontWeight nWeight,
+                     bool            bUnderlined,
+                     const wxString& rsFaceName,
+                     wxFontEncoding  vEncoding )
 {
     UnRef();
 
@@ -853,7 +917,7 @@ bool wxFont::Create(
                                   ,vEncoding
                                  );
     RealizeResource();
-    return TRUE;
+    return true;
 } // end of wxFont::Create
 
 wxFont::~wxFont()
@@ -867,28 +931,36 @@ wxFont::~wxFont()
 //   here, but we may check that font definition is true
 // ----------------------------------------------------------------------------
 
+wxGDIRefData *wxFont::CreateGDIRefData() const
+{
+    return new wxFontRefData();
+}
+
+wxGDIRefData *wxFont::CloneGDIRefData(const wxGDIRefData *data) const
+{
+    return new wxFontRefData(*static_cast<const wxFontRefData *>(data));
+}
+
 bool wxFont::RealizeResource()
 {
     if ( GetResourceHandle() )
     {
-        return TRUE;
+        return true;
     }
     return M_FONTDATA->Alloc(this);
 } // end of wxFont::RealizeResource
 
-bool wxFont::FreeResource(
-  bool                              bForce
-)
+bool wxFont::FreeResource( bool WXUNUSED(bForce) )
 {
     if (GetResourceHandle())
     {
         M_FONTDATA->Free();
-        return TRUE;
+        return true;
     }
-    return FALSE;
+    return false;
 } // end of wxFont::FreeResource
 
-WXHANDLE wxFont::GetResourceHandle()
+WXHANDLE wxFont::GetResourceHandle() const
 {
     return GetHFONT();
 } // end of wxFont::GetResourceHandle
@@ -903,21 +975,6 @@ bool wxFont::IsFree() const
     return M_FONTDATA && (M_FONTDATA->GetHFONT() == 0);
 } // end of wxFont::IsFree
 
-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;
-    }
-} // end of wxFont::Unshare
-
 // ----------------------------------------------------------------------------
 // change font attribute: we recreate font when doing it
 // ----------------------------------------------------------------------------
@@ -926,7 +983,7 @@ void wxFont::SetPointSize(
   int                               nPointSize
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetPointSize(nPointSize);
 
@@ -934,10 +991,10 @@ void wxFont::SetPointSize(
 } // end of wxFont::SetPointSize
 
 void wxFont::SetFamily(
-  int                               nFamily
+  wxFontFamily                      nFamily
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetFamily(nFamily);
 
@@ -945,10 +1002,10 @@ void wxFont::SetFamily(
 } // end of wxFont::SetFamily
 
 void wxFont::SetStyle(
-  int                               nStyle
+  wxFontStyle                       nStyle
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetStyle(nStyle);
 
@@ -956,32 +1013,34 @@ void wxFont::SetStyle(
 } // end of wxFont::SetStyle
 
 void wxFont::SetWeight(
-  int                               nWeight
+  wxFontWeight                      nWeight
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetWeight(nWeight);
 
     RealizeResource();
 } // end of wxFont::SetWeight
 
-void wxFont::SetFaceName(
+bool wxFont::SetFaceName(
   const wxString&                   rsFaceName
 )
 {
-    Unshare();
+    AllocExclusive();
 
-    M_FONTDATA->SetFaceName(rsFaceName);
+    bool refdataok = M_FONTDATA->SetFaceName(rsFaceName);
 
     RealizeResource();
+
+    return refdataok && wxFontBase::SetFaceName(rsFaceName);
 } // end of wxFont::SetFaceName
 
 void wxFont::SetUnderlined(
   bool                              bUnderlined
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetUnderlined(bUnderlined);
 
@@ -992,18 +1051,18 @@ void wxFont::SetEncoding(
   wxFontEncoding                    vEncoding
 )
 {
-    Unshare();
+    AllocExclusive();
 
     M_FONTDATA->SetEncoding(vEncoding);
 
     RealizeResource();
 } // end of wxFont::SetEncoding
 
-void wxFont::SetNativeFontInfo(
+void wxFont::DoSetNativeFontInfo(
   const wxNativeFontInfo&           rInfo
 )
 {
-    Unshare();
+    AllocExclusive();
 
     FreeResource();
 
@@ -1023,37 +1082,37 @@ int wxFont::GetPointSize() const
     return M_FONTDATA->GetPointSize();
 } // end of wxFont::GetPointSize
 
-int wxFont::GetFamily() const
+wxFontFamily wxFont::GetFamily() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), wxFONTFAMILY_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetFamily();
 } // end of wxFont::GetFamily
 
-int wxFont::GetStyle() const
+wxFontStyle wxFont::GetStyle() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), wxFONTSTYLE_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetStyle();
 } // end of wxFont::GetStyle
 
-int wxFont::GetWeight() const
+wxFontWeight wxFont::GetWeight() const
 {
-    wxCHECK_MSG( Ok(), 0, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), wxFONTWEIGHT_MAX, wxT("invalid font") );
 
     return M_FONTDATA->GetWeight();
 }
 
 bool wxFont::GetUnderlined() const
 {
-    wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") );
+    wxCHECK_MSG( Ok(), false, wxT("invalid font") );
 
     return M_FONTDATA->GetUnderlined();
 } // end of wxFont::GetUnderlined
 
 wxString wxFont::GetFaceName() const
 {
-    wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") );
+    wxCHECK_MSG( Ok(), wxEmptyString, wxT("invalid font") );
 
     return M_FONTDATA->GetFaceName();
 } // end of wxFont::GetFaceName
@@ -1065,23 +1124,27 @@ wxFontEncoding wxFont::GetEncoding() const
     return M_FONTDATA->GetEncoding();
 } // end of wxFont::GetEncoding
 
-wxNativeFontInfo* wxFont::GetNativeFontInfo() const
+const wxNativeFontInfo* wxFont::GetNativeFontInfo() const
 {
-    if (M_FONTDATA->HasNativeFontInfo())
-        return new wxNativeFontInfo(M_FONTDATA->GetNativeFontInfo());
-    return 0;
+    return M_FONTDATA->HasNativeFontInfo() ? &(M_FONTDATA->GetNativeFontInfo())
+                                           : NULL;
 } // end of wxFont::GetNativeFontInfo
 
 //
 // Internal use only method to set the FONTMETRICS array
 //
-void wxFont::SetFM(
-  PFONTMETRICS                      pFM
-, int                               nNumFonts
-)
+void wxFont::SetFM( PFONTMETRICS pFM, int nNumFonts )
 {
     M_FONTDATA->SetFM(pFM);
     M_FONTDATA->SetNumFonts(nNumFonts);
 } // end of wxFont::SetFM
 
 
+void wxFont::SetPS( HPS hPS )
+{
+    AllocExclusive();
+
+    M_FONTDATA->SetPS(hPS);
+
+    RealizeResource();
+} // end of wxFont::SetPS