X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/828621c2ea0c43af4082218ba33b5e4137283db9..6344162a81f74b3fbab0803405eebc0c0b83e797:/src/os2/font.cpp diff --git a/src/os2/font.cpp b/src/os2/font.cpp index e4abc8de91..7b9f1890e6 100644 --- a/src/os2/font.cpp +++ b/src/os2/font.cpp @@ -28,6 +28,7 @@ #include "wx/utils.h" #include "wx/app.h" #include "wx/font.h" + #include "wx/log.h" #endif // WX_PRECOMP #include "wx/os2/private.h" @@ -108,8 +109,13 @@ 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 @@ -343,14 +349,19 @@ void wxFontRefData::Init( 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() { @@ -363,6 +374,11 @@ bool wxFontRefData::Alloc( { wxString sFaceName; long flId = m_hFont; + long lRc; + short nIndex = 0; + PFONTMETRICS pFM = NULL; + ERRORID vError; + wxString sError; if (!m_bNativeFontInfoOk) { @@ -376,23 +392,32 @@ bool wxFontRefData::Alloc( ); m_bNativeFontInfoOk = TRUE; } - - if(::GpiCreateLogFont( m_hPS - ,NULL - ,flId - ,&m_vNativeFontInfo.fa - ) != GPI_ERROR) + else + { + 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; - + } if (!m_hFont) { + vError = ::WinGetLastError(vHabmain); + sError = wxPMErrorToStr(vError); wxLogLastError("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); // @@ -400,17 +425,43 @@ bool wxFontRefData::Alloc( // 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) + // + // 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 = wxROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Times New Roman MT 30") == 0) + m_nFamily = wxROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "@Times New Roman MT 30") == 0) m_nFamily = wxROMAN; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "WarpSans") == 0) + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Tms Rmn") == 0) + m_nFamily = wxROMAN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "WarpSans") == 0) + m_nFamily = wxDECORATIVE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helvetica") == 0) + m_nFamily = wxSWISS; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Helv") == 0) m_nFamily = wxSWISS; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Script") == 0) + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Script") == 0) m_nFamily = wxSCRIPT; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Courier New") == 0) + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier New") == 0) + m_nFamily = wxTELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Courier") == 0) + m_nFamily = wxTELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Monospaced") == 0) + m_nFamily = wxTELETYPE; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System VIO") == 0) m_nFamily = wxMODERN; - else if (strcmp(m_vNativeFontInfo.fa.szFacename, "Courier") == 0) + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "System Proportional") == 0) m_nFamily = wxMODERN; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Arial") == 0) + m_nFamily = wxSWISS; + else if (strcmp(m_vNativeFontInfo.fm.szFamilyname, "Swiss") == 0) + m_nFamily = wxSWISS; else m_nFamily = wxSWISS; @@ -475,10 +526,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; @@ -546,14 +593,36 @@ wxFontFamily wxNativeFontInfo::GetFamily() const // // Extract family from facename // - if (strcmp(fa.szFacename, "Times New Roman") == 0) + if (strcmp(fm.szFamilyname, "Times New Roman") == 0) + nFamily = wxROMAN; + else if (strcmp(fm.szFamilyname, "Times New Roman MT 30") == 0) nFamily = wxROMAN; - else if (strcmp(fa.szFacename, "WarpSans") == 0) + else if (strcmp(fm.szFamilyname, "@Times New Roman MT 30") == 0) + nFamily = wxROMAN; + else if (strcmp(fm.szFamilyname, "Tms Rmn") == 0) + nFamily = wxROMAN; + else if (strcmp(fm.szFamilyname, "WarpSans") == 0) + nFamily = wxDECORATIVE; + else if (strcmp(fm.szFamilyname, "Helvetica") == 0) + nFamily = wxSWISS; + else if (strcmp(fm.szFamilyname, "Helv") == 0) nFamily = wxSWISS; - else if (strcmp(fa.szFacename, "Script") == 0) + else if (strcmp(fm.szFamilyname, "Script") == 0) nFamily = wxSCRIPT; - else if (strcmp(fa.szFacename, "Courier New") == 0) + else if (strcmp(fm.szFamilyname, "Courier New") == 0) + nFamily = wxTELETYPE; + else if (strcmp(fm.szFamilyname, "Courier") == 0) + nFamily = wxTELETYPE; + else if (strcmp(fm.szFamilyname, "System Monospaced") == 0) + nFamily = wxTELETYPE; + else if (strcmp(fm.szFamilyname, "System VIO") == 0) nFamily = wxMODERN; + else if (strcmp(fm.szFamilyname, "System Proportional") == 0) + nFamily = wxMODERN; + else if (strcmp(fm.szFamilyname, "Arial") == 0) + nFamily = wxSWISS; + else if (strcmp(fm.szFamilyname, "Swiss") == 0) + nFamily = wxSWISS; else nFamily = wxSWISS; return (wxFontFamily)nFamily; @@ -639,29 +708,32 @@ void wxNativeFontInfo::SetFamily( switch (eFamily) { case wxSCRIPT: - sFacename = _T("Script"); + sFacename = wxT("Tms Rmn"); break; case wxDECORATIVE: - sFacename = _T("Times New Roman"); + sFacename = wxT("WarpSans"); break; case wxROMAN: - sFacename = _T("Times New Roman"); + sFacename = wxT("Tms Rmn"); break; case wxTELETYPE: + sFacename = wxT("Courier") ; + break; + case wxMODERN: - sFacename = _T("Courier New"); + sFacename = wxT("System VIO") ; break; case wxSWISS: - sFacename = _T("WarpSans"); + sFacename = wxT("Helv") ; break; case wxDEFAULT: default: - sFacename = _T("Helv"); + sFacename = wxT("System VIO") ; } if (!wxStrlen(fa.szFacename) ) @@ -680,8 +752,7 @@ void wxNativeFontInfo::SetEncoding( ,&vInfo )) { -#if wxUSE_FONTMAP - if (wxTheFontMapper->GetAltForEncoding( eEncoding + if (wxFontMapper::Get()->GetAltForEncoding( eEncoding ,&vInfo )) { @@ -696,7 +767,6 @@ void wxNativeFontInfo::SetEncoding( } } else -#endif // wxUSE_FONTMAP { // unsupported encoding, replace with the default vInfo.charset = 850; @@ -1003,7 +1073,7 @@ void wxFont::SetEncoding( RealizeResource(); } // end of wxFont::SetEncoding -void wxFont::SetNativeFontInfo( +void wxFont::DoSetNativeFontInfo( const wxNativeFontInfo& rInfo ) { @@ -1098,5 +1168,5 @@ void wxFont::SetPS( M_FONTDATA->SetPS(hPS); RealizeResource(); -} // end of wxFont::SetUnderlined +} // end of wxFont::SetPS