X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/b2aef89b7a675805b601e757492c982031f38d21..0e1399b3929661889071bb0e0f77d440b8d69b98:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 4541dbf2f6..1ef70b48b4 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -30,12 +30,12 @@ #endif #include "wx/msw/private.h" -#include "assert.h" +#include #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,7 +204,7 @@ 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)); + PROOF_QUALITY, DEFAULT_PITCH | ff_family, pzFace); #ifdef WXDEBUG_CREATE if (m_hFont==NULL) wxError("Cannot create font","Internal Error") ; #endif @@ -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("");