If we used 10% less inline functions in useless occasions,
we would have 50% less to debug. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@3809 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
@@ -20,12 +20,6 @@
|
|||||||
#include "wx/hash.h"
|
#include "wx/hash.h"
|
||||||
#include "wx/gdiobj.h"
|
#include "wx/gdiobj.h"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// conditional compilation
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#define wxUSE_FONTNAMEDIRECTORY 0
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// classes
|
// classes
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -36,20 +30,12 @@ class wxWindow;
|
|||||||
|
|
||||||
class wxFont;
|
class wxFont;
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
class wxFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global variables
|
// global variables
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern const wxChar* wxEmptyString;
|
extern const wxChar* wxEmptyString;
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
extern wxFontNameDirectory *wxTheFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxFont
|
// wxFont
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -120,36 +106,4 @@ private:
|
|||||||
DECLARE_DYNAMIC_CLASS(wxFont)
|
DECLARE_DYNAMIC_CLASS(wxFont)
|
||||||
};
|
};
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// wxFontDirectory
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxFontNameDirectory: public wxObject
|
|
||||||
{
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFontNameDirectory)
|
|
||||||
|
|
||||||
public:
|
|
||||||
wxFontNameDirectory();
|
|
||||||
~wxFontNameDirectory();
|
|
||||||
|
|
||||||
void Initialize();
|
|
||||||
void Initialize(int fontid, int family, const char *name);
|
|
||||||
|
|
||||||
int FindOrCreateFontId(const char *name, int family);
|
|
||||||
char* GetAFMName(int fontid, int weight, int style);
|
|
||||||
int GetFamily(int fontid);
|
|
||||||
int GetFontId(const char *name);
|
|
||||||
char* GetFontName(int fontid);
|
|
||||||
int GetNewFontId();
|
|
||||||
char* GetPostScriptName(int fontid, int weight, int style);
|
|
||||||
char* GetScreenName(int fontid, int weight, int style);
|
|
||||||
|
|
||||||
class wxHashTable *table;
|
|
||||||
int nextFontId;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // wxUSE_FONTNAMEDIRECTORY
|
|
||||||
|
|
||||||
#endif // __GTKFONTH__
|
#endif // __GTKFONTH__
|
||||||
|
@@ -20,12 +20,6 @@
|
|||||||
#include "wx/hash.h"
|
#include "wx/hash.h"
|
||||||
#include "wx/gdiobj.h"
|
#include "wx/gdiobj.h"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// conditional compilation
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#define wxUSE_FONTNAMEDIRECTORY 0
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// classes
|
// classes
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -36,20 +30,12 @@ class wxWindow;
|
|||||||
|
|
||||||
class wxFont;
|
class wxFont;
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
class wxFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// global variables
|
// global variables
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
|
||||||
extern const wxChar* wxEmptyString;
|
extern const wxChar* wxEmptyString;
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
extern wxFontNameDirectory *wxTheFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxFont
|
// wxFont
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -120,36 +106,4 @@ private:
|
|||||||
DECLARE_DYNAMIC_CLASS(wxFont)
|
DECLARE_DYNAMIC_CLASS(wxFont)
|
||||||
};
|
};
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// wxFontDirectory
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxFontNameDirectory: public wxObject
|
|
||||||
{
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFontNameDirectory)
|
|
||||||
|
|
||||||
public:
|
|
||||||
wxFontNameDirectory();
|
|
||||||
~wxFontNameDirectory();
|
|
||||||
|
|
||||||
void Initialize();
|
|
||||||
void Initialize(int fontid, int family, const char *name);
|
|
||||||
|
|
||||||
int FindOrCreateFontId(const char *name, int family);
|
|
||||||
char* GetAFMName(int fontid, int weight, int style);
|
|
||||||
int GetFamily(int fontid);
|
|
||||||
int GetFontId(const char *name);
|
|
||||||
char* GetFontName(int fontid);
|
|
||||||
int GetNewFontId();
|
|
||||||
char* GetPostScriptName(int fontid, int weight, int style);
|
|
||||||
char* GetScreenName(int fontid, int weight, int style);
|
|
||||||
|
|
||||||
class wxHashTable *table;
|
|
||||||
int nextFontId;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // wxUSE_FONTNAMEDIRECTORY
|
|
||||||
|
|
||||||
#endif // __GTKFONTH__
|
#endif // __GTKFONTH__
|
||||||
|
619
src/gtk/font.cpp
619
src/gtk/font.cpp
@@ -29,14 +29,6 @@
|
|||||||
|
|
||||||
#include "gdk/gdk.h"
|
#include "gdk/gdk.h"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// local data
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
extern wxFontNameDirectory *wxTheFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxFontRefData
|
// wxFontRefData
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -50,14 +42,8 @@ public:
|
|||||||
int weight = wxDEFAULT,
|
int weight = wxDEFAULT,
|
||||||
bool underlined = FALSE,
|
bool underlined = FALSE,
|
||||||
const wxString& faceName = wxEmptyString,
|
const wxString& faceName = wxEmptyString,
|
||||||
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
|
wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
|
||||||
: m_scaled_xfonts(wxKEY_INTEGER)
|
|
||||||
{
|
|
||||||
Init(size, family, style, weight, underlined, faceName, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontRefData( const wxFontRefData& data );
|
wxFontRefData( const wxFontRefData& data );
|
||||||
|
|
||||||
virtual ~wxFontRefData();
|
virtual ~wxFontRefData();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -71,18 +57,14 @@ protected:
|
|||||||
wxFontEncoding encoding);
|
wxFontEncoding encoding);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxList m_scaled_xfonts;
|
wxList m_scaled_xfonts;
|
||||||
|
int m_pointSize;
|
||||||
int m_pointSize;
|
int m_family,
|
||||||
int m_family,
|
m_style,
|
||||||
m_style,
|
m_weight;
|
||||||
m_weight;
|
bool m_underlined;
|
||||||
bool m_underlined;
|
wxString m_faceName;
|
||||||
wxString m_faceName;
|
wxFontEncoding m_encoding;
|
||||||
wxFontEncoding m_encoding;
|
|
||||||
|
|
||||||
bool m_byXFontName;
|
|
||||||
GdkFont *m_font;
|
|
||||||
|
|
||||||
friend wxFont;
|
friend wxFont;
|
||||||
};
|
};
|
||||||
@@ -127,19 +109,21 @@ void wxFontRefData::Init(int pointSize,
|
|||||||
|
|
||||||
m_underlined = underlined;
|
m_underlined = underlined;
|
||||||
m_encoding = encoding;
|
m_encoding = encoding;
|
||||||
|
|
||||||
m_byXFontName = FALSE;
|
|
||||||
m_font = (GdkFont *) NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFontRefData::wxFontRefData( const wxFontRefData& data )
|
wxFontRefData::wxFontRefData( const wxFontRefData& data )
|
||||||
: m_scaled_xfonts(wxKEY_INTEGER)
|
: m_scaled_xfonts(wxKEY_INTEGER)
|
||||||
{
|
{
|
||||||
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
||||||
data.m_underlined, data.m_faceName, data.m_encoding);
|
data.m_underlined, data.m_faceName, data.m_encoding);
|
||||||
|
}
|
||||||
|
|
||||||
if (data.m_font)
|
wxFontRefData::wxFontRefData(int size, int family, int style,
|
||||||
m_font = gdk_font_ref( data.m_font );
|
int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding )
|
||||||
|
: m_scaled_xfonts(wxKEY_INTEGER)
|
||||||
|
{
|
||||||
|
Init(size, family, style, weight,
|
||||||
|
underlined, faceName, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFontRefData::~wxFontRefData()
|
wxFontRefData::~wxFontRefData()
|
||||||
@@ -152,9 +136,6 @@ wxFontRefData::~wxFontRefData()
|
|||||||
gdk_font_unref( font );
|
gdk_font_unref( font );
|
||||||
node = next;
|
node = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_font)
|
|
||||||
gdk_font_unref( m_font );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -174,15 +155,10 @@ wxFont::wxFont( GdkFont *font, char *xFontName )
|
|||||||
if (!xFontName)
|
if (!xFontName)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// VZ: this ctor ddidn't append the font to wxTheFontList before, but
|
|
||||||
// there is no reason to not do it, is there?
|
|
||||||
Init();
|
Init();
|
||||||
|
|
||||||
m_refData = new wxFontRefData();
|
m_refData = new wxFontRefData();
|
||||||
|
|
||||||
// M_FONTDATA->m_byXFontName = TRUE;
|
|
||||||
M_FONTDATA->m_font = font;
|
|
||||||
|
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
|
|
||||||
wxString fontname( xFontName );
|
wxString fontname( xFontName );
|
||||||
@@ -230,8 +206,6 @@ bool wxFont::Create( int pointSize,
|
|||||||
m_refData = new wxFontRefData(pointSize, family, style, weight,
|
m_refData = new wxFontRefData(pointSize, family, style, weight,
|
||||||
underlined, face, encoding);
|
underlined, face, encoding);
|
||||||
|
|
||||||
Init();
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,10 +349,6 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
|
|||||||
return (GdkFont*) NULL;
|
return (GdkFont*) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* short cut if the special X font constructor has been used */
|
|
||||||
if (M_FONTDATA->m_byXFontName)
|
|
||||||
return M_FONTDATA->m_font;
|
|
||||||
|
|
||||||
long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
|
long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
|
||||||
int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
|
int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
|
||||||
GdkFont *font = (GdkFont *) NULL;
|
GdkFont *font = (GdkFont *) NULL;
|
||||||
@@ -423,556 +393,3 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
|
|||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// local utilities to find a X font
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// wow, what's this stuff? Is it used/useful? (VZ)
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// face names and index functions
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
static char *font_defaults[] = {
|
|
||||||
"FamilyDefault", "Default",
|
|
||||||
"FamilyRoman", "Roman",
|
|
||||||
"FamilyDecorative", "Decorative",
|
|
||||||
"FamilyModern", "Modern",
|
|
||||||
"FamilyTeletype", "Teletype",
|
|
||||||
"FamilySwiss", "Swiss",
|
|
||||||
"FamilyScript", "Script",
|
|
||||||
|
|
||||||
"AfmMedium", "",
|
|
||||||
"AfmBold", "Bo",
|
|
||||||
"AfmLight", "",
|
|
||||||
"AfmStraight", "",
|
|
||||||
"AfmItalic", "${AfmSlant}",
|
|
||||||
"AfmSlant", "O",
|
|
||||||
"AfmRoman", "Ro",
|
|
||||||
"AfmTimes", "Times",
|
|
||||||
"AfmHelvetica", "Helv",
|
|
||||||
"AfmCourier", "Cour",
|
|
||||||
|
|
||||||
"Afm___", "${AfmTimes,$[weight],$[style]}",
|
|
||||||
|
|
||||||
"AfmTimes__", "${AfmTimes}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
"AfmTimesMediumStraight", "${AfmTimes}${AfmRoman}",
|
|
||||||
"AfmTimesLightStraight", "${AfmTimes}${AfmRoman}",
|
|
||||||
"AfmTimes_Italic", "${AfmTimes}$[weight]${AfmItalic}",
|
|
||||||
"AfmTimes_Slant", "${AfmTimes}$[weight]${AfmItalic}",
|
|
||||||
|
|
||||||
"AfmSwiss__", "${AfmHelvetica}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
"AfmModern__", "${AfmCourier}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
|
|
||||||
"AfmTeletype__", "${AfmModern,$[weight],$[style]}",
|
|
||||||
|
|
||||||
"PostScriptMediumStraight", "",
|
|
||||||
"PostScriptMediumItalic", "-Oblique",
|
|
||||||
"PostScriptMediumSlant", "-Oblique",
|
|
||||||
"PostScriptLightStraight", "",
|
|
||||||
"PostScriptLightItalic", "-Oblique",
|
|
||||||
"PostScriptLightSlant", "-Oblique",
|
|
||||||
"PostScriptBoldStraight", "-Bold",
|
|
||||||
"PostScriptBoldItalic", "-BoldOblique",
|
|
||||||
"PostScriptBoldSlant", "-BoldOblique",
|
|
||||||
|
|
||||||
#if WX_NORMALIZED_PS_FONTS
|
|
||||||
"PostScript___", "${PostScriptTimes,$[weight],$[style]}",
|
|
||||||
#else
|
|
||||||
"PostScriptRoman__", "${PostScriptTimes,$[weight],$[style]}",
|
|
||||||
"PostScript___", "LucidaSans${PostScript$[weight]$[style]}",
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"PostScriptTimesMedium", "",
|
|
||||||
"PostScriptTimesLight", "",
|
|
||||||
"PostScriptTimesBold", "Bold",
|
|
||||||
|
|
||||||
"PostScriptTimes__", "Times${PostScript$[weight]$[style]}",
|
|
||||||
"PostScriptTimesMediumStraight", "Times-Roman",
|
|
||||||
"PostScriptTimesLightStraight", "Times-Roman",
|
|
||||||
"PostScriptTimes_Slant", "Times-${PostScriptTimes$[weight]}Italic",
|
|
||||||
"PostScriptTimes_Italic", "Times-${PostScriptTimes$[weight]}Italic",
|
|
||||||
|
|
||||||
"PostScriptSwiss__", "Helvetica${PostScript$[weight]$[style]}",
|
|
||||||
"PostScriptModern__", "Courier${PostScript$[weight]$[style]}",
|
|
||||||
|
|
||||||
"PostScriptTeletype__", "${PostScriptModern,$[weight],$[style]}",
|
|
||||||
|
|
||||||
#if !WX_NORMALIZED_PS_FONTS
|
|
||||||
"PostScriptScript__", "Zapf-Chancery-MediumItalic",
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"ScreenMedium", "medium",
|
|
||||||
"ScreenBold", "bold",
|
|
||||||
"ScreenLight", "light",
|
|
||||||
"ScreenStraight", "r",
|
|
||||||
"ScreenItalic", "i",
|
|
||||||
"ScreenSlant", "o",
|
|
||||||
|
|
||||||
"ScreenDefaultBase", "*-times",
|
|
||||||
|
|
||||||
"ScreenRomanBase", "*-times",
|
|
||||||
"ScreenDecorativeBase", "*-helvetica",
|
|
||||||
"ScreenModernBase", "*-courier",
|
|
||||||
"ScreenTeletypeBase", "*-lucidatypewriter",
|
|
||||||
"ScreenSwissBase", "*-lucida",
|
|
||||||
"ScreenScriptBase", "*-zapfchancery",
|
|
||||||
|
|
||||||
"ScreenStdSuffix", "-${Screen$[weight]}-${Screen$[style]}"
|
|
||||||
"-normal-*-*-%d-*-*-*-*-*-*",
|
|
||||||
|
|
||||||
"Screen___",
|
|
||||||
"-${ScreenDefaultBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenRoman__",
|
|
||||||
"-${ScreenRomanBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenDecorative__",
|
|
||||||
"-${ScreenDecorativeBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenModern__",
|
|
||||||
"-${ScreenModernBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenTeletype__",
|
|
||||||
"-${ScreenTeletypeBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenSwiss__",
|
|
||||||
"-${ScreenSwissBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenScript__",
|
|
||||||
"-${ScreenScriptBase}${ScreenStdSuffix}",
|
|
||||||
(char *) NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {wxWEIGHT_NORMAL, wxWEIGHT_BOLD, wxWEIGHT_LIGHT, wxNUM_WEIGHTS};
|
|
||||||
enum {wxSTYLE_NORMAL, wxSTYLE_ITALIC, wxSTYLE_SLANT, wxNUM_STYLES};
|
|
||||||
|
|
||||||
static int WCoordinate(int w)
|
|
||||||
{
|
|
||||||
switch (w)
|
|
||||||
{
|
|
||||||
case wxBOLD: return wxWEIGHT_BOLD;
|
|
||||||
case wxLIGHT: return wxWEIGHT_LIGHT;
|
|
||||||
case wxNORMAL:
|
|
||||||
default: return wxWEIGHT_NORMAL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int SCoordinate(int s)
|
|
||||||
{
|
|
||||||
switch (s)
|
|
||||||
{
|
|
||||||
case wxITALIC: return wxSTYLE_ITALIC;
|
|
||||||
case wxSLANT: return wxSTYLE_SLANT;
|
|
||||||
case wxNORMAL:
|
|
||||||
default: return wxSTYLE_NORMAL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxSuffixMap
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxSuffixMap
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
~wxSuffixMap();
|
|
||||||
|
|
||||||
inline char *GetName(int weight, int style)
|
|
||||||
{
|
|
||||||
return ( map [WCoordinate(weight)] [SCoordinate(style)] );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *map[wxNUM_WEIGHTS][wxNUM_STYLES];
|
|
||||||
void Initialize(const char *, const char *);
|
|
||||||
};
|
|
||||||
|
|
||||||
static void SearchResource(const char *prefix, const char **names, int count, char **v)
|
|
||||||
{
|
|
||||||
int k, i, j;
|
|
||||||
char resource[1024], **defaults, *internal;
|
|
||||||
|
|
||||||
k = 1 << count;
|
|
||||||
|
|
||||||
*v = (char *) NULL;
|
|
||||||
internal = (char *) NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
|
||||||
strcpy(resource, prefix);
|
|
||||||
for (j = 0; j < count; j++)
|
|
||||||
{
|
|
||||||
// upon failure to find a matching fontname
|
|
||||||
// in the default fonts above, we substitute more
|
|
||||||
// and more values by _ so that at last ScreenMyFontBoldNormal
|
|
||||||
// would turn into Screen___ and this will then get
|
|
||||||
// converted to -${ScreenDefaultBase}${ScreenStdSuffix}
|
|
||||||
|
|
||||||
if (!(i & (1 << j)))
|
|
||||||
strcat(resource, names[j]);
|
|
||||||
else
|
|
||||||
strcat(resource, "_");
|
|
||||||
}
|
|
||||||
|
|
||||||
// we previously search the Xt-resources here
|
|
||||||
|
|
||||||
if (!internal)
|
|
||||||
{
|
|
||||||
defaults = font_defaults;
|
|
||||||
while (*defaults)
|
|
||||||
{
|
|
||||||
if (!strcmp(*defaults, resource))
|
|
||||||
{
|
|
||||||
internal = defaults[1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
defaults += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (internal)
|
|
||||||
{
|
|
||||||
if ((strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 0) &&
|
|
||||||
(strcmp(names[0], "Default") != 0))
|
|
||||||
{
|
|
||||||
// we did not find any font name in the standard list.
|
|
||||||
// this can (hopefully does) mean that someone supplied
|
|
||||||
// the facename in the wxFont constructor so we insert
|
|
||||||
// it here
|
|
||||||
|
|
||||||
strcpy( resource,"-*-" ); // any producer
|
|
||||||
strcat( resource, names[0] ); // facename
|
|
||||||
strcat( resource, "${ScreenStdSuffix}" ); // add size params later on
|
|
||||||
*v = copystring(resource);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*v = copystring(internal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxSuffixMap::~wxSuffixMap()
|
|
||||||
{
|
|
||||||
int k, j;
|
|
||||||
|
|
||||||
for (k = 0; k < wxNUM_WEIGHTS; ++k)
|
|
||||||
for (j = 0; j < wxNUM_STYLES; ++j)
|
|
||||||
if (map[k][j])
|
|
||||||
{
|
|
||||||
delete[] map[k][j];
|
|
||||||
map[k][j] = (char *) NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxSuffixMap::Initialize(const char *resname, const char *devresname)
|
|
||||||
{
|
|
||||||
const char *weight, *style;
|
|
||||||
char *v;
|
|
||||||
int i, j, k;
|
|
||||||
const char *names[3];
|
|
||||||
|
|
||||||
for (k = 0; k < wxNUM_WEIGHTS; k++)
|
|
||||||
{
|
|
||||||
switch (k)
|
|
||||||
{
|
|
||||||
case wxWEIGHT_NORMAL: weight = "Medium"; break;
|
|
||||||
case wxWEIGHT_LIGHT: weight = "Light"; break;
|
|
||||||
case wxWEIGHT_BOLD:
|
|
||||||
default: weight = "Bold";
|
|
||||||
}
|
|
||||||
for (j = 0; j < wxNUM_STYLES; j++)
|
|
||||||
{
|
|
||||||
switch (j)
|
|
||||||
{
|
|
||||||
case wxSTYLE_NORMAL: style = "Straight"; break;
|
|
||||||
case wxSTYLE_ITALIC: style = "Italic"; break;
|
|
||||||
case wxSTYLE_SLANT:
|
|
||||||
default: style = "Slant";
|
|
||||||
}
|
|
||||||
names[0] = resname;
|
|
||||||
names[1] = weight;
|
|
||||||
names[2] = style;
|
|
||||||
|
|
||||||
SearchResource(devresname, names, 3, &v);
|
|
||||||
|
|
||||||
// Expand macros in the found string:
|
|
||||||
found:
|
|
||||||
int len, closer = 0, startpos = 0;
|
|
||||||
|
|
||||||
len = (v ? strlen(v) : 0);
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
{
|
|
||||||
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{')))
|
|
||||||
{
|
|
||||||
startpos = i;
|
|
||||||
closer = (v[i+1] == '[') ? ']' : '}';
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
else if (v[i] == closer)
|
|
||||||
{
|
|
||||||
int newstrlen;
|
|
||||||
const char *r = (char *) NULL; bool delete_r = FALSE;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
name = v + startpos + 2;
|
|
||||||
v[i] = 0;
|
|
||||||
|
|
||||||
if (closer == '}')
|
|
||||||
{
|
|
||||||
int i, count, len;
|
|
||||||
char **names;
|
|
||||||
|
|
||||||
for (i = 0, count = 1; name[i]; i++)
|
|
||||||
if (name[i] == ',')
|
|
||||||
count++;
|
|
||||||
|
|
||||||
len = i;
|
|
||||||
|
|
||||||
names = new char*[count];
|
|
||||||
names[0] = name;
|
|
||||||
for (i = 0, count = 1; i < len; i++)
|
|
||||||
if (name[i] == ',')
|
|
||||||
{
|
|
||||||
names[count++] = name + i + 1;
|
|
||||||
name[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SearchResource("", (const char **)names, count, (char **)&r);
|
|
||||||
delete_r = (r != 0);
|
|
||||||
delete[] names;
|
|
||||||
|
|
||||||
if (!r)
|
|
||||||
{
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
if (!name[i])
|
|
||||||
name[i] = ',';
|
|
||||||
r = "";
|
|
||||||
wxLogError( "Bad resource name in font lookup." );
|
|
||||||
}
|
|
||||||
} else if (!strcmp(name, "weight")) {
|
|
||||||
r = weight;
|
|
||||||
} else if (!strcmp(name, "style")) {
|
|
||||||
r = style;
|
|
||||||
} else if (!strcmp(name, "family")) {
|
|
||||||
r = resname;
|
|
||||||
} else {
|
|
||||||
r = "";
|
|
||||||
wxLogError( "Bad font macro name." );
|
|
||||||
}
|
|
||||||
|
|
||||||
// add r to v
|
|
||||||
newstrlen = strlen(r);
|
|
||||||
char *naya = new char[startpos + newstrlen + len - i];
|
|
||||||
memcpy(naya, v, startpos);
|
|
||||||
memcpy(naya + startpos, r, newstrlen);
|
|
||||||
memcpy(naya + startpos + newstrlen, v + i + 1, len - i);
|
|
||||||
if (delete_r)
|
|
||||||
delete[] (char*)r;
|
|
||||||
delete[] v;
|
|
||||||
v = naya;
|
|
||||||
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We have a final value:
|
|
||||||
map[k][j] = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxFontNameItem
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxFontNameItem : public wxObject
|
|
||||||
{
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFontNameItem)
|
|
||||||
public:
|
|
||||||
wxFontNameItem(const char *name, int id, int family);
|
|
||||||
~wxFontNameItem();
|
|
||||||
|
|
||||||
inline char* GetScreenName(int w, int s) {return screen.GetName(w, s);}
|
|
||||||
inline char* GetPostScriptName(int w, int s) {return printing.GetName(w, s);}
|
|
||||||
inline char* GetAFMName(int w, int s) {return afm.GetName(w, s);}
|
|
||||||
inline char* GetName() {return name;}
|
|
||||||
inline int GetFamily() {return family;}
|
|
||||||
inline int GetId() {return id;}
|
|
||||||
inline bool IsRoman() {return isroman;}
|
|
||||||
#if defined(__WXDEBUG__)
|
|
||||||
void Dump(ostream& str);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int id;
|
|
||||||
int family;
|
|
||||||
char *name;
|
|
||||||
wxSuffixMap screen, printing, afm;
|
|
||||||
bool isroman;
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxFontNameItem, wxObject)
|
|
||||||
|
|
||||||
wxFontNameItem::wxFontNameItem(const char *Name, int Id, int Family)
|
|
||||||
{
|
|
||||||
name = copystring(Name);
|
|
||||||
id = Id;
|
|
||||||
family = Family;
|
|
||||||
|
|
||||||
screen. Initialize(name, "Screen");
|
|
||||||
printing.Initialize(name, "PostScript");
|
|
||||||
afm. Initialize(name, "Afm");
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontNameItem::~wxFontNameItem()
|
|
||||||
{
|
|
||||||
if (name)
|
|
||||||
delete[] name;
|
|
||||||
name = (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__WXDEBUG__)
|
|
||||||
void wxFontNameItem::Dump(ostream& str)
|
|
||||||
{
|
|
||||||
str << "wxFontNameItem(" << name << ")";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxFontDirectory
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
|
|
||||||
|
|
||||||
wxFontNameDirectory::wxFontNameDirectory()
|
|
||||||
{
|
|
||||||
table = new wxHashTable(wxKEY_INTEGER, 20);
|
|
||||||
nextFontId = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontNameDirectory::~wxFontNameDirectory()
|
|
||||||
{
|
|
||||||
// Cleanup wxFontNameItems allocated
|
|
||||||
table->BeginFind();
|
|
||||||
wxNode *node = table->Next();
|
|
||||||
while (node)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)node->Data();
|
|
||||||
delete item;
|
|
||||||
node = table->Next();
|
|
||||||
}
|
|
||||||
delete table;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetNewFontId()
|
|
||||||
{
|
|
||||||
return (nextFontId--);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxFontNameDirectory::Initialize()
|
|
||||||
{
|
|
||||||
Initialize(wxDEFAULT, wxDEFAULT, "Default");
|
|
||||||
Initialize(wxDECORATIVE, wxDECORATIVE, "Decorative");
|
|
||||||
Initialize(wxROMAN, wxROMAN, "Roman");
|
|
||||||
Initialize(wxMODERN, wxMODERN, "Modern");
|
|
||||||
Initialize(wxTELETYPE, wxTELETYPE, "Teletype");
|
|
||||||
Initialize(wxSWISS, wxSWISS, "Swiss");
|
|
||||||
Initialize(wxSCRIPT, wxSCRIPT, "Script");
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname)
|
|
||||||
{
|
|
||||||
char *fam, resource[256];
|
|
||||||
|
|
||||||
sprintf(resource, "Family%s", resname);
|
|
||||||
SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
|
|
||||||
|
|
||||||
if (fam)
|
|
||||||
{
|
|
||||||
if (!strcmp(fam, "Default")) family = wxDEFAULT;
|
|
||||||
else if (!strcmp(fam, "Roman")) family = wxROMAN;
|
|
||||||
else if (!strcmp(fam, "Decorative")) family = wxDECORATIVE;
|
|
||||||
else if (!strcmp(fam, "Modern")) family = wxMODERN;
|
|
||||||
else if (!strcmp(fam, "Teletype")) family = wxTELETYPE;
|
|
||||||
else if (!strcmp(fam, "Swiss")) family = wxSWISS;
|
|
||||||
else if (!strcmp(fam, "Script")) family = wxSCRIPT;
|
|
||||||
delete[] fam; // free resource
|
|
||||||
}
|
|
||||||
table->Put(fontid, new wxFontNameItem(resname, fontid, family));
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::FindOrCreateFontId(const char *name, int family)
|
|
||||||
{
|
|
||||||
int id;
|
|
||||||
|
|
||||||
// font exists -> return id
|
|
||||||
if ( (id = GetFontId(name)) ) return id;
|
|
||||||
|
|
||||||
// create new font
|
|
||||||
Initialize(id=GetNewFontId(), family, name);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetScreenName(weight, style);
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetPostScriptName(weight, style);
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetAFMName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetAFMName(weight, style);
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetFontName(int fontid)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetName();
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetFontId(const char *name)
|
|
||||||
{
|
|
||||||
wxNode *node;
|
|
||||||
|
|
||||||
table->BeginFind();
|
|
||||||
|
|
||||||
while ( (node = table->Next()) )
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)node->Data();
|
|
||||||
if (!strcmp(name, item->name))
|
|
||||||
return item->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetFamily(int fontid)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid);
|
|
||||||
|
|
||||||
if (item)
|
|
||||||
return item->family;
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return wxDEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // 0
|
|
||||||
|
@@ -29,14 +29,6 @@
|
|||||||
|
|
||||||
#include "gdk/gdk.h"
|
#include "gdk/gdk.h"
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
// local data
|
|
||||||
// ----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
#if wxUSE_FONTNAMEDIRECTORY
|
|
||||||
extern wxFontNameDirectory *wxTheFontNameDirectory;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// wxFontRefData
|
// wxFontRefData
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -50,14 +42,8 @@ public:
|
|||||||
int weight = wxDEFAULT,
|
int weight = wxDEFAULT,
|
||||||
bool underlined = FALSE,
|
bool underlined = FALSE,
|
||||||
const wxString& faceName = wxEmptyString,
|
const wxString& faceName = wxEmptyString,
|
||||||
wxFontEncoding encoding = wxFONTENCODING_DEFAULT)
|
wxFontEncoding encoding = wxFONTENCODING_DEFAULT);
|
||||||
: m_scaled_xfonts(wxKEY_INTEGER)
|
|
||||||
{
|
|
||||||
Init(size, family, style, weight, underlined, faceName, encoding);
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontRefData( const wxFontRefData& data );
|
wxFontRefData( const wxFontRefData& data );
|
||||||
|
|
||||||
virtual ~wxFontRefData();
|
virtual ~wxFontRefData();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
@@ -71,18 +57,14 @@ protected:
|
|||||||
wxFontEncoding encoding);
|
wxFontEncoding encoding);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxList m_scaled_xfonts;
|
wxList m_scaled_xfonts;
|
||||||
|
int m_pointSize;
|
||||||
int m_pointSize;
|
int m_family,
|
||||||
int m_family,
|
m_style,
|
||||||
m_style,
|
m_weight;
|
||||||
m_weight;
|
bool m_underlined;
|
||||||
bool m_underlined;
|
wxString m_faceName;
|
||||||
wxString m_faceName;
|
wxFontEncoding m_encoding;
|
||||||
wxFontEncoding m_encoding;
|
|
||||||
|
|
||||||
bool m_byXFontName;
|
|
||||||
GdkFont *m_font;
|
|
||||||
|
|
||||||
friend wxFont;
|
friend wxFont;
|
||||||
};
|
};
|
||||||
@@ -127,19 +109,21 @@ void wxFontRefData::Init(int pointSize,
|
|||||||
|
|
||||||
m_underlined = underlined;
|
m_underlined = underlined;
|
||||||
m_encoding = encoding;
|
m_encoding = encoding;
|
||||||
|
|
||||||
m_byXFontName = FALSE;
|
|
||||||
m_font = (GdkFont *) NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFontRefData::wxFontRefData( const wxFontRefData& data )
|
wxFontRefData::wxFontRefData( const wxFontRefData& data )
|
||||||
: m_scaled_xfonts(wxKEY_INTEGER)
|
: m_scaled_xfonts(wxKEY_INTEGER)
|
||||||
{
|
{
|
||||||
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
Init(data.m_pointSize, data.m_family, data.m_style, data.m_weight,
|
||||||
data.m_underlined, data.m_faceName, data.m_encoding);
|
data.m_underlined, data.m_faceName, data.m_encoding);
|
||||||
|
}
|
||||||
|
|
||||||
if (data.m_font)
|
wxFontRefData::wxFontRefData(int size, int family, int style,
|
||||||
m_font = gdk_font_ref( data.m_font );
|
int weight, bool underlined, const wxString& faceName, wxFontEncoding encoding )
|
||||||
|
: m_scaled_xfonts(wxKEY_INTEGER)
|
||||||
|
{
|
||||||
|
Init(size, family, style, weight,
|
||||||
|
underlined, faceName, encoding);
|
||||||
}
|
}
|
||||||
|
|
||||||
wxFontRefData::~wxFontRefData()
|
wxFontRefData::~wxFontRefData()
|
||||||
@@ -152,9 +136,6 @@ wxFontRefData::~wxFontRefData()
|
|||||||
gdk_font_unref( font );
|
gdk_font_unref( font );
|
||||||
node = next;
|
node = next;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (m_font)
|
|
||||||
gdk_font_unref( m_font );
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
@@ -174,15 +155,10 @@ wxFont::wxFont( GdkFont *font, char *xFontName )
|
|||||||
if (!xFontName)
|
if (!xFontName)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
// VZ: this ctor ddidn't append the font to wxTheFontList before, but
|
|
||||||
// there is no reason to not do it, is there?
|
|
||||||
Init();
|
Init();
|
||||||
|
|
||||||
m_refData = new wxFontRefData();
|
m_refData = new wxFontRefData();
|
||||||
|
|
||||||
// M_FONTDATA->m_byXFontName = TRUE;
|
|
||||||
M_FONTDATA->m_font = font;
|
|
||||||
|
|
||||||
wxString tmp;
|
wxString tmp;
|
||||||
|
|
||||||
wxString fontname( xFontName );
|
wxString fontname( xFontName );
|
||||||
@@ -230,8 +206,6 @@ bool wxFont::Create( int pointSize,
|
|||||||
m_refData = new wxFontRefData(pointSize, family, style, weight,
|
m_refData = new wxFontRefData(pointSize, family, style, weight,
|
||||||
underlined, face, encoding);
|
underlined, face, encoding);
|
||||||
|
|
||||||
Init();
|
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -375,10 +349,6 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
|
|||||||
return (GdkFont*) NULL;
|
return (GdkFont*) NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* short cut if the special X font constructor has been used */
|
|
||||||
if (M_FONTDATA->m_byXFontName)
|
|
||||||
return M_FONTDATA->m_font;
|
|
||||||
|
|
||||||
long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
|
long int_scale = long(scale * 100.0 + 0.5); /* key for fontlist */
|
||||||
int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
|
int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
|
||||||
GdkFont *font = (GdkFont *) NULL;
|
GdkFont *font = (GdkFont *) NULL;
|
||||||
@@ -423,556 +393,3 @@ GdkFont *wxFont::GetInternalFont( float scale ) const
|
|||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// local utilities to find a X font
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
// wow, what's this stuff? Is it used/useful? (VZ)
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// face names and index functions
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
static char *font_defaults[] = {
|
|
||||||
"FamilyDefault", "Default",
|
|
||||||
"FamilyRoman", "Roman",
|
|
||||||
"FamilyDecorative", "Decorative",
|
|
||||||
"FamilyModern", "Modern",
|
|
||||||
"FamilyTeletype", "Teletype",
|
|
||||||
"FamilySwiss", "Swiss",
|
|
||||||
"FamilyScript", "Script",
|
|
||||||
|
|
||||||
"AfmMedium", "",
|
|
||||||
"AfmBold", "Bo",
|
|
||||||
"AfmLight", "",
|
|
||||||
"AfmStraight", "",
|
|
||||||
"AfmItalic", "${AfmSlant}",
|
|
||||||
"AfmSlant", "O",
|
|
||||||
"AfmRoman", "Ro",
|
|
||||||
"AfmTimes", "Times",
|
|
||||||
"AfmHelvetica", "Helv",
|
|
||||||
"AfmCourier", "Cour",
|
|
||||||
|
|
||||||
"Afm___", "${AfmTimes,$[weight],$[style]}",
|
|
||||||
|
|
||||||
"AfmTimes__", "${AfmTimes}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
"AfmTimesMediumStraight", "${AfmTimes}${AfmRoman}",
|
|
||||||
"AfmTimesLightStraight", "${AfmTimes}${AfmRoman}",
|
|
||||||
"AfmTimes_Italic", "${AfmTimes}$[weight]${AfmItalic}",
|
|
||||||
"AfmTimes_Slant", "${AfmTimes}$[weight]${AfmItalic}",
|
|
||||||
|
|
||||||
"AfmSwiss__", "${AfmHelvetica}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
"AfmModern__", "${AfmCourier}${Afm$[weight]}${Afm$[style]}",
|
|
||||||
|
|
||||||
"AfmTeletype__", "${AfmModern,$[weight],$[style]}",
|
|
||||||
|
|
||||||
"PostScriptMediumStraight", "",
|
|
||||||
"PostScriptMediumItalic", "-Oblique",
|
|
||||||
"PostScriptMediumSlant", "-Oblique",
|
|
||||||
"PostScriptLightStraight", "",
|
|
||||||
"PostScriptLightItalic", "-Oblique",
|
|
||||||
"PostScriptLightSlant", "-Oblique",
|
|
||||||
"PostScriptBoldStraight", "-Bold",
|
|
||||||
"PostScriptBoldItalic", "-BoldOblique",
|
|
||||||
"PostScriptBoldSlant", "-BoldOblique",
|
|
||||||
|
|
||||||
#if WX_NORMALIZED_PS_FONTS
|
|
||||||
"PostScript___", "${PostScriptTimes,$[weight],$[style]}",
|
|
||||||
#else
|
|
||||||
"PostScriptRoman__", "${PostScriptTimes,$[weight],$[style]}",
|
|
||||||
"PostScript___", "LucidaSans${PostScript$[weight]$[style]}",
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"PostScriptTimesMedium", "",
|
|
||||||
"PostScriptTimesLight", "",
|
|
||||||
"PostScriptTimesBold", "Bold",
|
|
||||||
|
|
||||||
"PostScriptTimes__", "Times${PostScript$[weight]$[style]}",
|
|
||||||
"PostScriptTimesMediumStraight", "Times-Roman",
|
|
||||||
"PostScriptTimesLightStraight", "Times-Roman",
|
|
||||||
"PostScriptTimes_Slant", "Times-${PostScriptTimes$[weight]}Italic",
|
|
||||||
"PostScriptTimes_Italic", "Times-${PostScriptTimes$[weight]}Italic",
|
|
||||||
|
|
||||||
"PostScriptSwiss__", "Helvetica${PostScript$[weight]$[style]}",
|
|
||||||
"PostScriptModern__", "Courier${PostScript$[weight]$[style]}",
|
|
||||||
|
|
||||||
"PostScriptTeletype__", "${PostScriptModern,$[weight],$[style]}",
|
|
||||||
|
|
||||||
#if !WX_NORMALIZED_PS_FONTS
|
|
||||||
"PostScriptScript__", "Zapf-Chancery-MediumItalic",
|
|
||||||
#endif
|
|
||||||
|
|
||||||
"ScreenMedium", "medium",
|
|
||||||
"ScreenBold", "bold",
|
|
||||||
"ScreenLight", "light",
|
|
||||||
"ScreenStraight", "r",
|
|
||||||
"ScreenItalic", "i",
|
|
||||||
"ScreenSlant", "o",
|
|
||||||
|
|
||||||
"ScreenDefaultBase", "*-times",
|
|
||||||
|
|
||||||
"ScreenRomanBase", "*-times",
|
|
||||||
"ScreenDecorativeBase", "*-helvetica",
|
|
||||||
"ScreenModernBase", "*-courier",
|
|
||||||
"ScreenTeletypeBase", "*-lucidatypewriter",
|
|
||||||
"ScreenSwissBase", "*-lucida",
|
|
||||||
"ScreenScriptBase", "*-zapfchancery",
|
|
||||||
|
|
||||||
"ScreenStdSuffix", "-${Screen$[weight]}-${Screen$[style]}"
|
|
||||||
"-normal-*-*-%d-*-*-*-*-*-*",
|
|
||||||
|
|
||||||
"Screen___",
|
|
||||||
"-${ScreenDefaultBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenRoman__",
|
|
||||||
"-${ScreenRomanBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenDecorative__",
|
|
||||||
"-${ScreenDecorativeBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenModern__",
|
|
||||||
"-${ScreenModernBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenTeletype__",
|
|
||||||
"-${ScreenTeletypeBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenSwiss__",
|
|
||||||
"-${ScreenSwissBase}${ScreenStdSuffix}",
|
|
||||||
"ScreenScript__",
|
|
||||||
"-${ScreenScriptBase}${ScreenStdSuffix}",
|
|
||||||
(char *) NULL
|
|
||||||
};
|
|
||||||
|
|
||||||
enum {wxWEIGHT_NORMAL, wxWEIGHT_BOLD, wxWEIGHT_LIGHT, wxNUM_WEIGHTS};
|
|
||||||
enum {wxSTYLE_NORMAL, wxSTYLE_ITALIC, wxSTYLE_SLANT, wxNUM_STYLES};
|
|
||||||
|
|
||||||
static int WCoordinate(int w)
|
|
||||||
{
|
|
||||||
switch (w)
|
|
||||||
{
|
|
||||||
case wxBOLD: return wxWEIGHT_BOLD;
|
|
||||||
case wxLIGHT: return wxWEIGHT_LIGHT;
|
|
||||||
case wxNORMAL:
|
|
||||||
default: return wxWEIGHT_NORMAL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static int SCoordinate(int s)
|
|
||||||
{
|
|
||||||
switch (s)
|
|
||||||
{
|
|
||||||
case wxITALIC: return wxSTYLE_ITALIC;
|
|
||||||
case wxSLANT: return wxSTYLE_SLANT;
|
|
||||||
case wxNORMAL:
|
|
||||||
default: return wxSTYLE_NORMAL;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxSuffixMap
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxSuffixMap
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
~wxSuffixMap();
|
|
||||||
|
|
||||||
inline char *GetName(int weight, int style)
|
|
||||||
{
|
|
||||||
return ( map [WCoordinate(weight)] [SCoordinate(style)] );
|
|
||||||
}
|
|
||||||
|
|
||||||
char *map[wxNUM_WEIGHTS][wxNUM_STYLES];
|
|
||||||
void Initialize(const char *, const char *);
|
|
||||||
};
|
|
||||||
|
|
||||||
static void SearchResource(const char *prefix, const char **names, int count, char **v)
|
|
||||||
{
|
|
||||||
int k, i, j;
|
|
||||||
char resource[1024], **defaults, *internal;
|
|
||||||
|
|
||||||
k = 1 << count;
|
|
||||||
|
|
||||||
*v = (char *) NULL;
|
|
||||||
internal = (char *) NULL;
|
|
||||||
|
|
||||||
for (i = 0; i < k; i++)
|
|
||||||
{
|
|
||||||
strcpy(resource, prefix);
|
|
||||||
for (j = 0; j < count; j++)
|
|
||||||
{
|
|
||||||
// upon failure to find a matching fontname
|
|
||||||
// in the default fonts above, we substitute more
|
|
||||||
// and more values by _ so that at last ScreenMyFontBoldNormal
|
|
||||||
// would turn into Screen___ and this will then get
|
|
||||||
// converted to -${ScreenDefaultBase}${ScreenStdSuffix}
|
|
||||||
|
|
||||||
if (!(i & (1 << j)))
|
|
||||||
strcat(resource, names[j]);
|
|
||||||
else
|
|
||||||
strcat(resource, "_");
|
|
||||||
}
|
|
||||||
|
|
||||||
// we previously search the Xt-resources here
|
|
||||||
|
|
||||||
if (!internal)
|
|
||||||
{
|
|
||||||
defaults = font_defaults;
|
|
||||||
while (*defaults)
|
|
||||||
{
|
|
||||||
if (!strcmp(*defaults, resource))
|
|
||||||
{
|
|
||||||
internal = defaults[1];
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
defaults += 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (internal)
|
|
||||||
{
|
|
||||||
if ((strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 0) &&
|
|
||||||
(strcmp(names[0], "Default") != 0))
|
|
||||||
{
|
|
||||||
// we did not find any font name in the standard list.
|
|
||||||
// this can (hopefully does) mean that someone supplied
|
|
||||||
// the facename in the wxFont constructor so we insert
|
|
||||||
// it here
|
|
||||||
|
|
||||||
strcpy( resource,"-*-" ); // any producer
|
|
||||||
strcat( resource, names[0] ); // facename
|
|
||||||
strcat( resource, "${ScreenStdSuffix}" ); // add size params later on
|
|
||||||
*v = copystring(resource);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*v = copystring(internal);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
wxSuffixMap::~wxSuffixMap()
|
|
||||||
{
|
|
||||||
int k, j;
|
|
||||||
|
|
||||||
for (k = 0; k < wxNUM_WEIGHTS; ++k)
|
|
||||||
for (j = 0; j < wxNUM_STYLES; ++j)
|
|
||||||
if (map[k][j])
|
|
||||||
{
|
|
||||||
delete[] map[k][j];
|
|
||||||
map[k][j] = (char *) NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxSuffixMap::Initialize(const char *resname, const char *devresname)
|
|
||||||
{
|
|
||||||
const char *weight, *style;
|
|
||||||
char *v;
|
|
||||||
int i, j, k;
|
|
||||||
const char *names[3];
|
|
||||||
|
|
||||||
for (k = 0; k < wxNUM_WEIGHTS; k++)
|
|
||||||
{
|
|
||||||
switch (k)
|
|
||||||
{
|
|
||||||
case wxWEIGHT_NORMAL: weight = "Medium"; break;
|
|
||||||
case wxWEIGHT_LIGHT: weight = "Light"; break;
|
|
||||||
case wxWEIGHT_BOLD:
|
|
||||||
default: weight = "Bold";
|
|
||||||
}
|
|
||||||
for (j = 0; j < wxNUM_STYLES; j++)
|
|
||||||
{
|
|
||||||
switch (j)
|
|
||||||
{
|
|
||||||
case wxSTYLE_NORMAL: style = "Straight"; break;
|
|
||||||
case wxSTYLE_ITALIC: style = "Italic"; break;
|
|
||||||
case wxSTYLE_SLANT:
|
|
||||||
default: style = "Slant";
|
|
||||||
}
|
|
||||||
names[0] = resname;
|
|
||||||
names[1] = weight;
|
|
||||||
names[2] = style;
|
|
||||||
|
|
||||||
SearchResource(devresname, names, 3, &v);
|
|
||||||
|
|
||||||
// Expand macros in the found string:
|
|
||||||
found:
|
|
||||||
int len, closer = 0, startpos = 0;
|
|
||||||
|
|
||||||
len = (v ? strlen(v) : 0);
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
{
|
|
||||||
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{')))
|
|
||||||
{
|
|
||||||
startpos = i;
|
|
||||||
closer = (v[i+1] == '[') ? ']' : '}';
|
|
||||||
++i;
|
|
||||||
}
|
|
||||||
else if (v[i] == closer)
|
|
||||||
{
|
|
||||||
int newstrlen;
|
|
||||||
const char *r = (char *) NULL; bool delete_r = FALSE;
|
|
||||||
char *name;
|
|
||||||
|
|
||||||
name = v + startpos + 2;
|
|
||||||
v[i] = 0;
|
|
||||||
|
|
||||||
if (closer == '}')
|
|
||||||
{
|
|
||||||
int i, count, len;
|
|
||||||
char **names;
|
|
||||||
|
|
||||||
for (i = 0, count = 1; name[i]; i++)
|
|
||||||
if (name[i] == ',')
|
|
||||||
count++;
|
|
||||||
|
|
||||||
len = i;
|
|
||||||
|
|
||||||
names = new char*[count];
|
|
||||||
names[0] = name;
|
|
||||||
for (i = 0, count = 1; i < len; i++)
|
|
||||||
if (name[i] == ',')
|
|
||||||
{
|
|
||||||
names[count++] = name + i + 1;
|
|
||||||
name[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
SearchResource("", (const char **)names, count, (char **)&r);
|
|
||||||
delete_r = (r != 0);
|
|
||||||
delete[] names;
|
|
||||||
|
|
||||||
if (!r)
|
|
||||||
{
|
|
||||||
for (i = 0; i < len; i++)
|
|
||||||
if (!name[i])
|
|
||||||
name[i] = ',';
|
|
||||||
r = "";
|
|
||||||
wxLogError( "Bad resource name in font lookup." );
|
|
||||||
}
|
|
||||||
} else if (!strcmp(name, "weight")) {
|
|
||||||
r = weight;
|
|
||||||
} else if (!strcmp(name, "style")) {
|
|
||||||
r = style;
|
|
||||||
} else if (!strcmp(name, "family")) {
|
|
||||||
r = resname;
|
|
||||||
} else {
|
|
||||||
r = "";
|
|
||||||
wxLogError( "Bad font macro name." );
|
|
||||||
}
|
|
||||||
|
|
||||||
// add r to v
|
|
||||||
newstrlen = strlen(r);
|
|
||||||
char *naya = new char[startpos + newstrlen + len - i];
|
|
||||||
memcpy(naya, v, startpos);
|
|
||||||
memcpy(naya + startpos, r, newstrlen);
|
|
||||||
memcpy(naya + startpos + newstrlen, v + i + 1, len - i);
|
|
||||||
if (delete_r)
|
|
||||||
delete[] (char*)r;
|
|
||||||
delete[] v;
|
|
||||||
v = naya;
|
|
||||||
|
|
||||||
goto found;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
// We have a final value:
|
|
||||||
map[k][j] = v;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxFontNameItem
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
class wxFontNameItem : public wxObject
|
|
||||||
{
|
|
||||||
DECLARE_DYNAMIC_CLASS(wxFontNameItem)
|
|
||||||
public:
|
|
||||||
wxFontNameItem(const char *name, int id, int family);
|
|
||||||
~wxFontNameItem();
|
|
||||||
|
|
||||||
inline char* GetScreenName(int w, int s) {return screen.GetName(w, s);}
|
|
||||||
inline char* GetPostScriptName(int w, int s) {return printing.GetName(w, s);}
|
|
||||||
inline char* GetAFMName(int w, int s) {return afm.GetName(w, s);}
|
|
||||||
inline char* GetName() {return name;}
|
|
||||||
inline int GetFamily() {return family;}
|
|
||||||
inline int GetId() {return id;}
|
|
||||||
inline bool IsRoman() {return isroman;}
|
|
||||||
#if defined(__WXDEBUG__)
|
|
||||||
void Dump(ostream& str);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
int id;
|
|
||||||
int family;
|
|
||||||
char *name;
|
|
||||||
wxSuffixMap screen, printing, afm;
|
|
||||||
bool isroman;
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_ABSTRACT_CLASS(wxFontNameItem, wxObject)
|
|
||||||
|
|
||||||
wxFontNameItem::wxFontNameItem(const char *Name, int Id, int Family)
|
|
||||||
{
|
|
||||||
name = copystring(Name);
|
|
||||||
id = Id;
|
|
||||||
family = Family;
|
|
||||||
|
|
||||||
screen. Initialize(name, "Screen");
|
|
||||||
printing.Initialize(name, "PostScript");
|
|
||||||
afm. Initialize(name, "Afm");
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontNameItem::~wxFontNameItem()
|
|
||||||
{
|
|
||||||
if (name)
|
|
||||||
delete[] name;
|
|
||||||
name = (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
#if defined(__WXDEBUG__)
|
|
||||||
void wxFontNameItem::Dump(ostream& str)
|
|
||||||
{
|
|
||||||
str << "wxFontNameItem(" << name << ")";
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
// wxFontDirectory
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
|
|
||||||
IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject)
|
|
||||||
|
|
||||||
wxFontNameDirectory::wxFontNameDirectory()
|
|
||||||
{
|
|
||||||
table = new wxHashTable(wxKEY_INTEGER, 20);
|
|
||||||
nextFontId = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
wxFontNameDirectory::~wxFontNameDirectory()
|
|
||||||
{
|
|
||||||
// Cleanup wxFontNameItems allocated
|
|
||||||
table->BeginFind();
|
|
||||||
wxNode *node = table->Next();
|
|
||||||
while (node)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)node->Data();
|
|
||||||
delete item;
|
|
||||||
node = table->Next();
|
|
||||||
}
|
|
||||||
delete table;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetNewFontId()
|
|
||||||
{
|
|
||||||
return (nextFontId--);
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxFontNameDirectory::Initialize()
|
|
||||||
{
|
|
||||||
Initialize(wxDEFAULT, wxDEFAULT, "Default");
|
|
||||||
Initialize(wxDECORATIVE, wxDECORATIVE, "Decorative");
|
|
||||||
Initialize(wxROMAN, wxROMAN, "Roman");
|
|
||||||
Initialize(wxMODERN, wxMODERN, "Modern");
|
|
||||||
Initialize(wxTELETYPE, wxTELETYPE, "Teletype");
|
|
||||||
Initialize(wxSWISS, wxSWISS, "Swiss");
|
|
||||||
Initialize(wxSCRIPT, wxSCRIPT, "Script");
|
|
||||||
}
|
|
||||||
|
|
||||||
void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname)
|
|
||||||
{
|
|
||||||
char *fam, resource[256];
|
|
||||||
|
|
||||||
sprintf(resource, "Family%s", resname);
|
|
||||||
SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
|
|
||||||
|
|
||||||
if (fam)
|
|
||||||
{
|
|
||||||
if (!strcmp(fam, "Default")) family = wxDEFAULT;
|
|
||||||
else if (!strcmp(fam, "Roman")) family = wxROMAN;
|
|
||||||
else if (!strcmp(fam, "Decorative")) family = wxDECORATIVE;
|
|
||||||
else if (!strcmp(fam, "Modern")) family = wxMODERN;
|
|
||||||
else if (!strcmp(fam, "Teletype")) family = wxTELETYPE;
|
|
||||||
else if (!strcmp(fam, "Swiss")) family = wxSWISS;
|
|
||||||
else if (!strcmp(fam, "Script")) family = wxSCRIPT;
|
|
||||||
delete[] fam; // free resource
|
|
||||||
}
|
|
||||||
table->Put(fontid, new wxFontNameItem(resname, fontid, family));
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::FindOrCreateFontId(const char *name, int family)
|
|
||||||
{
|
|
||||||
int id;
|
|
||||||
|
|
||||||
// font exists -> return id
|
|
||||||
if ( (id = GetFontId(name)) ) return id;
|
|
||||||
|
|
||||||
// create new font
|
|
||||||
Initialize(id=GetNewFontId(), family, name);
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetScreenName(weight, style);
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetPostScriptName(weight, style);
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetAFMName(int fontid, int weight, int style)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetAFMName(weight, style);
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
char *wxFontNameDirectory::GetFontName(int fontid)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
|
|
||||||
if (item)
|
|
||||||
return item->GetName();
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return (char *) NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetFontId(const char *name)
|
|
||||||
{
|
|
||||||
wxNode *node;
|
|
||||||
|
|
||||||
table->BeginFind();
|
|
||||||
|
|
||||||
while ( (node = table->Next()) )
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem*)node->Data();
|
|
||||||
if (!strcmp(name, item->name))
|
|
||||||
return item->id;
|
|
||||||
}
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int wxFontNameDirectory::GetFamily(int fontid)
|
|
||||||
{
|
|
||||||
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid);
|
|
||||||
|
|
||||||
if (item)
|
|
||||||
return item->family;
|
|
||||||
|
|
||||||
// font does not exist
|
|
||||||
return wxDEFAULT;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif // 0
|
|
||||||
|
Reference in New Issue
Block a user