X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/09fcd88955f6460d1f0d3d506118ce52c1090621..29149a64916d6fdc53e445adca9ef83bc58fb6c3:/src/msw/font.cpp diff --git a/src/msw/font.cpp b/src/msw/font.cpp index 7dd7f375a5..a2a73706ed 100644 --- a/src/msw/font.cpp +++ b/src/msw/font.cpp @@ -41,6 +41,7 @@ #include "wx/tokenzr.h" #include "wx/msw/private.h" +#include "wx/tokenzr.h" IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject) @@ -85,7 +86,7 @@ public: Init(size, family, style, weight, underlined, faceName, encoding); } - wxFontRefData(const wxNativeFontInfo& info) + wxFontRefData(const wxNativeFontInfo& info) { Init(info); } @@ -121,7 +122,7 @@ protected: // Windows font handle WXHFONT m_hFont; - + // Native font info wxNativeFontInfo m_nativeFontInfo; bool m_nativeFontInfoOk; @@ -156,7 +157,7 @@ void wxFontRefData::Init(int pointSize, m_temporary = FALSE; m_hFont = 0; - + m_nativeFontInfoOk = FALSE; } @@ -218,25 +219,19 @@ void wxFontRefData::Init(const wxNativeFontInfo& info) m_faceName = info.lf.lfFaceName; - // remember that 1pt = 1/72inch int height = abs(info.lf.lfHeight); -#if wxUSE_SCREEN_DPI - HDC dc = ::GetDC(NULL); - static const int ppInch = GetDeviceCaps(dc, LOGPIXELSY); - ::ReleaseDC(NULL, dc); -#else - static const int ppInch = 96; -#endif + // remember that 1pt = 1/72inch + const int ppInch = ::GetDeviceCaps(ScreenHDC(), LOGPIXELSY); m_pointSize = (int) (((72.0*((double)height))/(double) ppInch) + 0.5); - + m_encoding = wxGetFontEncFromCharSet(info.lf.lfCharSet); - + m_fontId = 0; m_temporary = FALSE; m_hFont = 0; - + m_nativeFontInfoOk = TRUE; m_nativeFontInfo = info; } @@ -296,42 +291,42 @@ bool wxNativeFontInfo::FromString(const wxString& s) token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfItalic = l; + lf.lfItalic = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfUnderline = l; + lf.lfUnderline = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfStrikeOut = l; + lf.lfStrikeOut = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfCharSet = l; + lf.lfCharSet = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfOutPrecision = l; + lf.lfOutPrecision = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfClipPrecision = l; + lf.lfClipPrecision = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfQuality = l; + lf.lfQuality = (BYTE)l; token = tokenizer.GetNextToken(); if ( !token.ToLong(&l) ) return FALSE; - lf.lfPitchAndFamily = l; + lf.lfPitchAndFamily = (BYTE)l; token = tokenizer.GetNextToken(); if(!token) @@ -443,7 +438,7 @@ bool wxFont::RealizeResource() wxFillLogFont(&M_FONTDATA->m_nativeFontInfo.lf, this); M_FONTDATA->m_nativeFontInfoOk = TRUE; } - + M_FONTDATA->m_hFont = (WXHFONT)::CreateFontIndirect(&M_FONTDATA->m_nativeFontInfo.lf); M_FONTDATA->m_faceName = M_FONTDATA->m_nativeFontInfo.lf.lfFaceName; if ( !M_FONTDATA->m_hFont ) @@ -456,7 +451,7 @@ bool wxFont::RealizeResource() return TRUE; } -bool wxFont::FreeResource(bool force) +bool wxFont::FreeResource(bool WXUNUSED(force)) { if ( GetResourceHandle() ) { @@ -582,8 +577,8 @@ void wxFont::SetEncoding(wxFontEncoding encoding) void wxFont::SetNativeFontInfo(const wxNativeFontInfo& info) { Unshare(); - - FreeResource(); + + FreeResource(); M_FONTDATA->Init(info); @@ -596,52 +591,169 @@ void wxFont::SetNativeFontInfo(const wxNativeFontInfo& info) int wxFont::GetPointSize() const { + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + return M_FONTDATA->m_pointSize; } int wxFont::GetFamily() const { + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + return M_FONTDATA->m_family; } int wxFont::GetFontId() const { + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + return M_FONTDATA->m_fontId; } int wxFont::GetStyle() const { + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + return M_FONTDATA->m_style; } int wxFont::GetWeight() const { + wxCHECK_MSG( Ok(), 0, wxT("invalid font") ); + return M_FONTDATA->m_weight; } bool wxFont::GetUnderlined() const { + wxCHECK_MSG( Ok(), FALSE, wxT("invalid font") ); + return M_FONTDATA->m_underlined; } wxString wxFont::GetFaceName() const { - wxString str; - if ( M_FONTDATA ) - str = M_FONTDATA->m_faceName; - return str; + wxCHECK_MSG( Ok(), wxT(""), wxT("invalid font") ); + + return M_FONTDATA->m_faceName; } wxFontEncoding wxFont::GetEncoding() const { + wxCHECK_MSG( Ok(), wxFONTENCODING_DEFAULT, wxT("invalid font") ); + return M_FONTDATA->m_encoding; } -wxNativeFontInfo *wxFont::GetNativeFontInfo() const +// ---------------------------------------------------------------------------- +// wxNativeFontInfo +// ---------------------------------------------------------------------------- + +bool wxNativeFontInfo::FromString(const wxString& s) +{ + long l; + + wxStringTokenizer tokenizer(s, _T(";")); + + wxString token = tokenizer.GetNextToken(); + // + // Ignore the version for now + // + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfHeight = l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfWidth = l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfEscapement = l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfOrientation = l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfWeight = l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfItalic = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfUnderline = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfStrikeOut = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfCharSet = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfOutPrecision = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfClipPrecision = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfQuality = (BYTE)l; + + token = tokenizer.GetNextToken(); + if ( !token.ToLong(&l) ) + return FALSE; + lf.lfPitchAndFamily = (BYTE)l; + + token = tokenizer.GetNextToken(); + if(!token) + return FALSE; + wxStrcpy(lf.lfFaceName, token.c_str()); + + return TRUE; +} + +wxString wxNativeFontInfo::ToString() const { - if( M_FONTDATA->m_nativeFontInfoOk ) - return new wxNativeFontInfo(M_FONTDATA->m_nativeFontInfo); - - return 0; + wxString s; + + s.Printf(_T("%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%d;%s"), + 0, // version, in case we want to change the format later + lf.lfHeight, + lf.lfWidth, + lf.lfEscapement, + lf.lfOrientation, + lf.lfWeight, + lf.lfItalic, + lf.lfUnderline, + lf.lfStrikeOut, + lf.lfCharSet, + lf.lfOutPrecision, + lf.lfClipPrecision, + lf.lfQuality, + lf.lfPitchAndFamily, + lf.lfFaceName); + + return s; }