coded wxFont!

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/branches/WX_2_2_BRANCH@7434 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
David Webster
2000-05-19 18:16:39 +00:00
parent 7b271e861b
commit 70b6f373b0

View File

@@ -183,6 +183,9 @@ wxFont::~wxFont()
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// real implementation // real implementation
// Boris' Kovalenko comments:
// Because OS/2 fonts are associated with PS we can not create the font
// here, but we may check that font definition is true
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
bool wxFont::RealizeResource() bool wxFont::RealizeResource()
@@ -196,7 +199,24 @@ bool wxFont::RealizeResource()
return TRUE; return TRUE;
} }
int ff_family = 0; HPS hps;
FATTRS fAttrs;
FACENAMEDESC fName;
LONG fLid;
fAttrs.usRecordLength = sizeof(FATTRS);
fAttrs.fsFontUse = FATTR_FONTUSE_OUTLINE | // only outline fonts allowed
FATTR_FONTUSE_TRANSFORMABLE; // may be transformed
fAttrs.fsType = 0;
fAttrs.lMaxBaselineExt = fAttrs.lAveCharWidth = 0;
fAttrs.idRegistry = 0;
fAttrs.lMatch = 0;
fName.usSize = sizeof(FACENAMEDESC);
fName.usWidthClass = FWIDTH_NORMAL;
fName.usReserved = 0;
fName.flOptions = 0;
wxString ff_face; wxString ff_face;
// OS/2 combines the family with styles to give a facename // OS/2 combines the family with styles to give a facename
@@ -204,42 +224,27 @@ bool wxFont::RealizeResource()
switch ( M_FONTDATA->m_family ) switch ( M_FONTDATA->m_family )
{ {
case wxSCRIPT: case wxSCRIPT:
// ff_family = FF_SCRIPT ;
ff_face = wxT("Script") ;
break ;
case wxDECORATIVE: case wxDECORATIVE:
// ff_family = FF_DECORATIVE;
break;
case wxROMAN: case wxROMAN:
// ff_family = FF_ROMAN;
ff_face = wxT("Times New Roman") ; ff_face = wxT("Times New Roman") ;
break; break;
case wxTELETYPE: case wxTELETYPE:
case wxMODERN: case wxMODERN:
// ff_family = FF_MODERN; ff_face = wxT("Courier") ;
ff_face = wxT("Courier New") ;
break; break;
case wxSWISS: case wxSWISS:
// ff_family = FF_SWISS;
ff_face = wxT("Arial") ;
break;
case wxDEFAULT: case wxDEFAULT:
default: default:
// ff_family = FF_SWISS; ff_face = wxT("Helvetica") ;
ff_face = wxT("Arial") ;
} }
BYTE ff_italic;
switch ( M_FONTDATA->m_style ) switch ( M_FONTDATA->m_style )
{ {
case wxITALIC: case wxITALIC:
case wxSLANT: case wxSLANT:
ff_italic = 1; fAttrs.fsSelection = FATTR_SEL_ITALIC;
break; break;
default: default:
@@ -247,10 +252,9 @@ bool wxFont::RealizeResource()
// fall through // fall through
case wxNORMAL: case wxNORMAL:
ff_italic = 0; fAttrs.fsSelection = 0;
} }
int ff_weight = 0;
switch ( M_FONTDATA->m_weight ) switch ( M_FONTDATA->m_weight )
{ {
default: default:
@@ -258,68 +262,20 @@ bool wxFont::RealizeResource()
// fall through // fall through
case wxNORMAL: case wxNORMAL:
// ff_weight = FW_NORMAL; fName.usWeightClass = FWEIGHT_NORMAL;
break; break;
case wxLIGHT: case wxLIGHT:
// ff_weight = FW_LIGHT; fName.usWeightClass = FWEIGHT_LIGHT;
break; break;
case wxBOLD: case wxBOLD:
// ff_weight = FW_BOLD; fName.usWeightClass = FWEIGHT_BOLD;
break; break;
} }
const wxChar* pzFace; if( M_FONTDATA->m_underlined )
if ( M_FONTDATA->m_faceName.IsEmpty() ) fAttrs.fsSelection |= FATTR_SEL_UNDERSCORE;
pzFace = ff_face;
else
pzFace = M_FONTDATA->m_faceName ;
#if 0
/* Always calculate fonts using the screen DC (is this the best strategy?)
* There may be confusion if a font is selected into a printer
* DC (say), because the height will be calculated very differently.
*/
// What sort of display is it?
int technology = ::GetDeviceCaps(dc, TECHNOLOGY);
int nHeight;
if (technology != DT_RASDISPLAY && technology != DT_RASPRINTER)
{
// Have to get screen DC Caps, because a metafile will return 0.
HDC dc2 = ::GetDC(NULL);
nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc2, LOGPIXELSY)/72;
::ReleaseDC(NULL, dc2);
}
else
{
nHeight = M_FONTDATA->m_pointSize*GetDeviceCaps(dc, LOGPIXELSY)/72;
}
#endif // 0
#if 0
// Have to get screen DC Caps, because a metafile will return 0.
HDC dc2 = ::GetDC(NULL);
ppInch = ::GetDeviceCaps(dc2, LOGPIXELSY);
::ReleaseDC(NULL, dc2);
#endif // 0
// New behaviour: apparently ppInch varies according to Large/Small Fonts
// setting in Windows. This messes up fonts. So, set ppInch to a constant
// 96 dpi.
static const int ppInch = 96;
#if wxFONT_SIZE_COMPATIBILITY
// Incorrect, but compatible with old wxWindows behaviour
int nHeight = (M_FONTDATA->m_pointSize*ppInch/72);
#else
// Correct for Windows compatibility
int nHeight = - (M_FONTDATA->m_pointSize*ppInch/72);
#endif
BYTE ff_underline = M_FONTDATA->m_underlined;
wxFontEncoding encoding = M_FONTDATA->m_encoding; wxFontEncoding encoding = M_FONTDATA->m_encoding;
if ( encoding == wxFONTENCODING_DEFAULT ) if ( encoding == wxFONTENCODING_DEFAULT )
@@ -327,52 +283,51 @@ bool wxFont::RealizeResource()
encoding = wxFont::GetDefaultEncoding(); encoding = wxFont::GetDefaultEncoding();
} }
DWORD charset;
switch ( encoding ) switch ( encoding )
{ {
case wxFONTENCODING_ISO8859_1: case wxFONTENCODING_ISO8859_1:
case wxFONTENCODING_ISO8859_15: case wxFONTENCODING_ISO8859_15:
case wxFONTENCODING_CP1250: case wxFONTENCODING_CP1250:
// charset = ANSI_CHARSET; fAttrs.usCodePage = 1250;
break; break;
case wxFONTENCODING_ISO8859_2: case wxFONTENCODING_ISO8859_2:
case wxFONTENCODING_CP1252: case wxFONTENCODING_CP1252:
// charset = EASTEUROPE_CHARSET; fAttrs.usCodePage = 1252;
break; break;
case wxFONTENCODING_ISO8859_4: case wxFONTENCODING_ISO8859_4:
case wxFONTENCODING_ISO8859_10: case wxFONTENCODING_ISO8859_10:
// charset = BALTIC_CHARSET; fAttrs.usCodePage = 850; // what is baltic?
break; break;
case wxFONTENCODING_ISO8859_5: case wxFONTENCODING_ISO8859_5:
case wxFONTENCODING_CP1251: case wxFONTENCODING_CP1251:
// charset = RUSSIAN_CHARSET; fAttrs.usCodePage = 1251;
break; break;
case wxFONTENCODING_ISO8859_6: case wxFONTENCODING_ISO8859_6:
// charset = ARABIC_CHARSET; fAttrs.usCodePage = 850; // what is arabic?
break; break;
case wxFONTENCODING_ISO8859_7: case wxFONTENCODING_ISO8859_7:
// charset = GREEK_CHARSET; fAttrs.usCodePage = 850; // what is greek
break; break;
case wxFONTENCODING_ISO8859_8: case wxFONTENCODING_ISO8859_8:
// charset = HEBREW_CHARSET; fAttrs.usCodePage = 850; // what is hebrew?
break; break;
case wxFONTENCODING_ISO8859_9: case wxFONTENCODING_ISO8859_9:
// charset = TURKISH_CHARSET; fAttrs.usCodePage = 857;
break; break;
case wxFONTENCODING_ISO8859_11: case wxFONTENCODING_ISO8859_11:
// charset = THAI_CHARSET; fAttrs.usCodePage = 850; // what is thai
break; break;
case wxFONTENCODING_CP437: case wxFONTENCODING_CP437:
// charset = OEM_CHARSET; fAttrs.usCodePage = 437;
break; break;
default: default:
@@ -380,32 +335,58 @@ bool wxFont::RealizeResource()
// fall through // fall through
case wxFONTENCODING_SYSTEM: case wxFONTENCODING_SYSTEM:
// charset = ANSI_CHARSET; fAttrs.usCodePage = 850; // what is ANSI?
break; break;
} }
// TODO: // Now cheking
WXHFONT hFont = 0; fLid = 1;
// HFONT hFont = ::CreateFont hps = ::WinGetPS( HWND_DESKTOP );
// (
// nHeight, // height long numLids = ::GpiQueryNumberSetIds( hps );
// 0, // width (choose best) long gpiError;
// 0, // escapement
// 0, // orientation // First we should generate unique id
// ff_weight, // weight if( numLids )
// ff_italic, // italic? {
// ff_underline, // underlined? long Types[255];
// 0, // strikeout? STR8 Names[255];
// charset, // charset long lIds[255];
// OUT_DEFAULT_PRECIS, // precision
// CLIP_DEFAULT_PRECIS, // clip precision if( !GpiQuerySetIds(hps, numLids, Types, Names, lIds) )
// PROOF_QUALITY, // quality of match {
// DEFAULT_PITCH | // fixed or variable ::WinReleasePS( hps );
// ff_family, // family id return 0;
// pzFace // face name }
// );
for(unsigned long LCNum = 0; LCNum < numLids; LCNum++)
if(lIds[LCNum] == fLid)
++fLid;
if(fLid > 254) // wow, no id available!
{
::WinReleasePS( hps );
return 0;
}
}
// now building facestring
if(::GpiQueryFaceString(hps, ff_face.c_str(), &fName, FACESIZE, fAttrs.szFacename) == GPI_ERROR)
{
::WinReleasePS( hps );
return 0;
}
// now creating font
WXHFONT hFont = (WXHFONT)0;
if(::GpiCreateLogFont(hps, NULL, fLid, &fAttrs) != GPI_ERROR)
M_FONTDATA->m_hFont = hFont = (WXHFONT)1;
if( hFont )
::GpiDeleteSetId(hps, fLid);
::WinReleasePS( hps );
M_FONTDATA->m_hFont = (WXHFONT)hFont;
if ( !hFont ) if ( !hFont )
{ {
wxLogLastError("CreateFont"); wxLogLastError("CreateFont");