wxMotif::wxFont supports encodings too (and shares 99% of font code with wxGTK)
git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3779 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
218
src/gtk/font.cpp
218
src/gtk/font.cpp
@@ -41,9 +41,6 @@
|
||||
// private functions
|
||||
// ----------------------------------------------------------------------------
|
||||
|
||||
// returns TRUE if there are any fonts matching this font spec
|
||||
static bool wxTestFontSpec(const wxString& fontspec);
|
||||
|
||||
static GdkFont *wxLoadQueryFont( int pointSize,
|
||||
int family,
|
||||
int style,
|
||||
@@ -450,221 +447,6 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
|
||||
// local utilities to find a X font
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
// returns TRUE if there are any fonts matching this font spec
|
||||
static bool wxTestFontSpec(const wxString& fontSpec)
|
||||
{
|
||||
GdkFont *test = gdk_font_load( wxConvCurrent->cWX2MB(fontSpec) );
|
||||
if ( test )
|
||||
{
|
||||
gdk_font_unref( test );
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static GdkFont *wxLoadQueryFont( int pointSize,
|
||||
int family,
|
||||
int style,
|
||||
int weight,
|
||||
bool WXUNUSED(underlined),
|
||||
const wxString &facename,
|
||||
wxFontEncoding encoding )
|
||||
{
|
||||
wxString xfamily;
|
||||
switch (family)
|
||||
{
|
||||
case wxDECORATIVE: xfamily = _T("lucida"); break;
|
||||
case wxROMAN: xfamily = _T("times"); break;
|
||||
case wxMODERN: xfamily = _T("courier"); break;
|
||||
case wxSWISS: xfamily = _T("helvetica"); break;
|
||||
case wxTELETYPE: xfamily = _T("lucidatypewriter"); break;
|
||||
case wxSCRIPT: xfamily = _T("utopia"); break;
|
||||
default: xfamily = _T("*");
|
||||
}
|
||||
|
||||
wxString fontSpec;
|
||||
if (!facename.IsEmpty())
|
||||
{
|
||||
fontSpec.Printf(_T("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"),
|
||||
facename.c_str());
|
||||
|
||||
if ( wxTestFontSpec(fontSpec) )
|
||||
{
|
||||
xfamily = facename;
|
||||
}
|
||||
//else: no such family, use default one instead
|
||||
}
|
||||
|
||||
wxString xstyle;
|
||||
switch (style)
|
||||
{
|
||||
case wxITALIC: xstyle = _T("i"); break;
|
||||
case wxSLANT: xstyle = _T("o"); break;
|
||||
case wxNORMAL: xstyle = _T("r"); break;
|
||||
default: xstyle = _T("*"); break;
|
||||
}
|
||||
|
||||
wxString xweight;
|
||||
switch (weight)
|
||||
{
|
||||
case wxBOLD: xweight = _T("bold"); break;
|
||||
case wxLIGHT:
|
||||
case wxNORMAL: xweight = _T("medium"); break;
|
||||
default: xweight = _T("*"); break;
|
||||
}
|
||||
|
||||
wxString xregistry, xencoding;
|
||||
if ( encoding == wxFONTENCODING_DEFAULT )
|
||||
{
|
||||
// use the apps default
|
||||
encoding = wxFont::GetDefaultEncoding();
|
||||
}
|
||||
|
||||
bool test = TRUE; // should we test for availability of encoding?
|
||||
switch ( encoding )
|
||||
{
|
||||
case wxFONTENCODING_ISO8859_1:
|
||||
case wxFONTENCODING_ISO8859_2:
|
||||
case wxFONTENCODING_ISO8859_3:
|
||||
case wxFONTENCODING_ISO8859_4:
|
||||
case wxFONTENCODING_ISO8859_5:
|
||||
case wxFONTENCODING_ISO8859_6:
|
||||
case wxFONTENCODING_ISO8859_7:
|
||||
case wxFONTENCODING_ISO8859_8:
|
||||
case wxFONTENCODING_ISO8859_9:
|
||||
case wxFONTENCODING_ISO8859_10:
|
||||
case wxFONTENCODING_ISO8859_11:
|
||||
case wxFONTENCODING_ISO8859_13:
|
||||
case wxFONTENCODING_ISO8859_14:
|
||||
case wxFONTENCODING_ISO8859_15:
|
||||
{
|
||||
int cp = encoding - wxFONTENCODING_ISO8859_1 + 1;
|
||||
xregistry = _T("iso8859");
|
||||
xencoding.Printf(_T("%d"), cp);
|
||||
}
|
||||
break;
|
||||
|
||||
case wxFONTENCODING_KOI8:
|
||||
xregistry = _T("koi8");
|
||||
if ( wxTestFontSpec(_T("-*-*-*-*-*-*-*-*-*-*-*-*-koi8-1")) )
|
||||
{
|
||||
xencoding = _T("1");
|
||||
|
||||
// test passed, no need to do it once more
|
||||
test = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
xencoding = _T("*");
|
||||
}
|
||||
break;
|
||||
|
||||
case wxFONTENCODING_CP1250:
|
||||
case wxFONTENCODING_CP1251:
|
||||
case wxFONTENCODING_CP1252:
|
||||
{
|
||||
int cp = encoding - wxFONTENCODING_CP1250 + 1250;
|
||||
fontSpec.Printf(_T("-*-*-*-*-*-*-*-*-*-*-*-*-microsoft-cp%d"),
|
||||
cp);
|
||||
if ( wxTestFontSpec(fontSpec) )
|
||||
{
|
||||
xregistry = _T("microsoft");
|
||||
xencoding.Printf(_T("cp%d"), cp);
|
||||
|
||||
// test passed, no need to do it once more
|
||||
test = FALSE;
|
||||
}
|
||||
else
|
||||
{
|
||||
// fall back to LatinX
|
||||
xregistry = _T("iso8859");
|
||||
xencoding.Printf(_T("%d"), cp - 1249);
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case wxFONTENCODING_SYSTEM:
|
||||
default:
|
||||
test = FALSE;
|
||||
xregistry =
|
||||
xencoding = _T("*");
|
||||
}
|
||||
|
||||
if ( test )
|
||||
{
|
||||
fontSpec.Printf(_T("-*-*-*-*-*-*-*-*-*-*-*-*-%s-%s"),
|
||||
xregistry.c_str(), xencoding.c_str());
|
||||
if ( !wxTestFontSpec(fontSpec) )
|
||||
{
|
||||
// this encoding isn't available - what to do?
|
||||
xregistry =
|
||||
xencoding = _T("*");
|
||||
}
|
||||
}
|
||||
|
||||
// construct the X font spec from our data
|
||||
fontSpec.Printf(_T("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-%s-%s"),
|
||||
xfamily.c_str(), xweight.c_str(), xstyle.c_str(),
|
||||
pointSize, xregistry.c_str(), xencoding.c_str());
|
||||
|
||||
return gdk_font_load( wxConvCurrent->cWX2MB(fontSpec) );
|
||||
}
|
||||
|
||||
static GdkFont *wxLoadQueryNearestFont( int pointSize,
|
||||
int family,
|
||||
int style,
|
||||
int weight,
|
||||
bool underlined,
|
||||
const wxString &facename,
|
||||
wxFontEncoding encoding )
|
||||
{
|
||||
GdkFont *font = wxLoadQueryFont( pointSize, family, style, weight,
|
||||
underlined, facename, encoding );
|
||||
|
||||
if (!font)
|
||||
{
|
||||
/* search up and down by stepsize 10 */
|
||||
int max_size = pointSize + 20 * (1 + (pointSize/180));
|
||||
int min_size = pointSize - 20 * (1 + (pointSize/180));
|
||||
|
||||
int i;
|
||||
|
||||
/* Search for smaller size (approx.) */
|
||||
for ( i = pointSize - 10; !font && i >= 10 && i >= min_size; i -= 10 )
|
||||
{
|
||||
font = wxLoadQueryFont(i, family, style, weight, underlined,
|
||||
facename, encoding );
|
||||
}
|
||||
|
||||
/* Search for larger size (approx.) */
|
||||
for ( i = pointSize + 10; !font && i <= max_size; i += 10 )
|
||||
{
|
||||
font = wxLoadQueryFont( i, family, style, weight, underlined,
|
||||
facename, encoding );
|
||||
}
|
||||
|
||||
/* Try default family */
|
||||
if ( !font && family != wxDEFAULT )
|
||||
{
|
||||
font = wxLoadQueryFont( pointSize, wxDEFAULT, style, weight,
|
||||
underlined, facename, encoding );
|
||||
}
|
||||
|
||||
/* Bogus font */
|
||||
if ( !font )
|
||||
{
|
||||
font = wxLoadQueryFont(120, wxDEFAULT, wxNORMAL, wxNORMAL,
|
||||
underlined, facename, encoding );
|
||||
}
|
||||
}
|
||||
|
||||
return font;
|
||||
}
|
||||
|
||||
// wow, what's this stuff? Is it used/useful? (VZ)
|
||||
#if 0
|
||||
|
||||
|
Reference in New Issue
Block a user