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:
195
src/os2/font.cpp
195
src/os2/font.cpp
@@ -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");
|
||||||
|
Reference in New Issue
Block a user