Added facenames support to wxFont

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@1273 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Robert Roebling
1998-12-28 16:03:19 +00:00
parent c5f885c034
commit 5705323ef1
2 changed files with 154 additions and 80 deletions

View File

@@ -13,6 +13,7 @@
#include "wx/font.h" #include "wx/font.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/log.h"
#include <strings.h> #include <strings.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -356,13 +357,6 @@ GdkFont *wxFont::GetInternalFont(float scale) const
} }
else else
{ {
/*
if (int_scale == 100) printf( "int_scale.\n" );
if (M_FONTDATA->m_style == wxSWISS) printf( "swiss.\n" );
if (M_FONTDATA->m_pointSize == 12) printf( "12.\n" );
if (M_FONTDATA->m_weight == wxNORMAL) printf( "normal.\n" );
if (M_FONTDATA->m_underlined == FALSE) printf( "false.\n" );
*/
if ((int_scale == 100) && if ((int_scale == 100) &&
(M_FONTDATA->m_family == wxSWISS) && (M_FONTDATA->m_family == wxSWISS) &&
(M_FONTDATA->m_style == wxNORMAL) && (M_FONTDATA->m_style == wxNORMAL) &&
@@ -380,8 +374,8 @@ GdkFont *wxFont::GetInternalFont(float scale) const
M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font ); M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
} }
if (!font) if (!font)
printf("could not load any font"); wxLogError("could not load any font");
// wxError("could not load any font", "wxFont");
return font; return font;
} }
@@ -547,7 +541,8 @@ enum {wxSTYLE_NORMAL, wxSTYLE_ITALIC, wxSTYLE_SLANT, wxNUM_STYLES};
static int WCoordinate(int w) static int WCoordinate(int w)
{ {
switch (w) { switch (w)
{
case wxBOLD: return wxWEIGHT_BOLD; case wxBOLD: return wxWEIGHT_BOLD;
case wxLIGHT: return wxWEIGHT_LIGHT; case wxLIGHT: return wxWEIGHT_LIGHT;
case wxNORMAL: case wxNORMAL:
@@ -557,7 +552,8 @@ static int WCoordinate(int w)
static int SCoordinate(int s) static int SCoordinate(int s)
{ {
switch (s) { switch (s)
{
case wxITALIC: return wxSTYLE_ITALIC; case wxITALIC: return wxSTYLE_ITALIC;
case wxSLANT: return wxSTYLE_SLANT; case wxSLANT: return wxSTYLE_SLANT;
case wxNORMAL: case wxNORMAL:
@@ -569,7 +565,8 @@ static int SCoordinate(int s)
// wxSuffixMap // wxSuffixMap
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxSuffixMap { class wxSuffixMap
{
public: public:
~wxSuffixMap(); ~wxSuffixMap();
@@ -582,10 +579,6 @@ public:
void Initialize(const char *, const char *); void Initialize(const char *, const char *);
}; };
//#if !USE_RESOURCES
#define wxGetResource(a, b, c) 0
//#endif
static void SearchResource(const char *prefix, const char **names, int count, char **v) static void SearchResource(const char *prefix, const char **names, int count, char **v)
{ {
int k, i, j; int k, i, j;
@@ -596,20 +589,33 @@ static void SearchResource(const char *prefix, const char **names, int count, ch
*v = (char *) NULL; *v = (char *) NULL;
internal = (char *) NULL; internal = (char *) NULL;
for (i = 0; i < k; i++) { for (i = 0; i < k; i++)
{
strcpy(resource, prefix); strcpy(resource, prefix);
for (j = 0; j < count; j++) { 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))) if (!(i & (1 << j)))
strcat(resource, names[j]); strcat(resource, names[j]);
else else
strcat(resource, "_"); strcat(resource, "_");
} }
if (wxGetResource(wxAPP_CLASS, (char *)resource, v))
return; /* we previously search the Xt-resources here */
if (!internal) {
if (!internal)
{
defaults = font_defaults; defaults = font_defaults;
while (*defaults) { while (*defaults)
if (!strcmp(*defaults, resource)) { {
if (!strcmp(*defaults, resource))
{
internal = defaults[1]; internal = defaults[1];
break; break;
} }
@@ -617,8 +623,26 @@ static void SearchResource(const char *prefix, const char **names, int count, ch
} }
} }
} }
if (internal) if (internal)
{
if (strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 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); *v = copystring(internal);
}
}
} }
wxSuffixMap::~wxSuffixMap() wxSuffixMap::~wxSuffixMap()
@@ -627,7 +651,8 @@ wxSuffixMap::~wxSuffixMap()
for (k = 0; k < wxNUM_WEIGHTS; ++k) for (k = 0; k < wxNUM_WEIGHTS; ++k)
for (j = 0; j < wxNUM_STYLES; ++j) for (j = 0; j < wxNUM_STYLES; ++j)
if (map[k][j]) { if (map[k][j])
{
delete[] map[k][j]; delete[] map[k][j];
map[k][j] = (char *) NULL; map[k][j] = (char *) NULL;
} }
@@ -640,15 +665,19 @@ void wxSuffixMap::Initialize(const char *resname, const char *devresname)
int i, j, k; int i, j, k;
const char *names[3]; const char *names[3];
for (k = 0; k < wxNUM_WEIGHTS; k++) { for (k = 0; k < wxNUM_WEIGHTS; k++)
switch (k) { {
switch (k)
{
case wxWEIGHT_NORMAL: weight = "Medium"; break; case wxWEIGHT_NORMAL: weight = "Medium"; break;
case wxWEIGHT_LIGHT: weight = "Light"; break; case wxWEIGHT_LIGHT: weight = "Light"; break;
case wxWEIGHT_BOLD: case wxWEIGHT_BOLD:
default: weight = "Bold"; default: weight = "Bold";
} }
for (j = 0; j < wxNUM_STYLES; j++) { for (j = 0; j < wxNUM_STYLES; j++)
switch (j) { {
switch (j)
{
case wxSTYLE_NORMAL: style = "Straight"; break; case wxSTYLE_NORMAL: style = "Straight"; break;
case wxSTYLE_ITALIC: style = "Italic"; break; case wxSTYLE_ITALIC: style = "Italic"; break;
case wxSTYLE_SLANT: case wxSTYLE_SLANT:
@@ -665,12 +694,16 @@ found:
int len, closer = 0, startpos = 0; int len, closer = 0, startpos = 0;
len = (v ? strlen(v) : 0); len = (v ? strlen(v) : 0);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++)
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) { {
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{')))
{
startpos = i; startpos = i;
closer = (v[i+1] == '[') ? ']' : '}'; closer = (v[i+1] == '[') ? ']' : '}';
++i; ++i;
} else if (v[i] == closer) { }
else if (v[i] == closer)
{
int newstrlen; int newstrlen;
const char *r = (char *) NULL; bool delete_r = FALSE; const char *r = (char *) NULL; bool delete_r = FALSE;
char *name; char *name;
@@ -678,7 +711,8 @@ found:
name = v + startpos + 2; name = v + startpos + 2;
v[i] = 0; v[i] = 0;
if (closer == '}') { if (closer == '}')
{
int i, count, len; int i, count, len;
char **names; char **names;
@@ -691,7 +725,8 @@ found:
names = new char*[count]; names = new char*[count];
names[0] = name; names[0] = name;
for (i = 0, count = 1; i < len; i++) for (i = 0, count = 1; i < len; i++)
if (name[i] == ',') { if (name[i] == ',')
{
names[count++] = name + i + 1; names[count++] = name + i + 1;
name[i] = 0; name[i] = 0;
} }
@@ -700,12 +735,13 @@ found:
delete_r = (r != 0); delete_r = (r != 0);
delete[] names; delete[] names;
if (!r) { if (!r)
{
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
if (!name[i]) if (!name[i])
name[i] = ','; name[i] = ',';
r = ""; r = "";
printf("Bad resource name \"%s\" in font lookup\n", name); wxLogError( "Bad resource name in font lookup." );
} }
} else if (!strcmp(name, "weight")) { } else if (!strcmp(name, "weight")) {
r = weight; r = weight;
@@ -715,7 +751,7 @@ found:
r = resname; r = resname;
} else { } else {
r = ""; r = "";
printf("Bad font macro name \"%s\"\n", name); wxLogError( "Bad font macro name." );
} }
// add r to v // add r to v
@@ -842,6 +878,7 @@ void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname
sprintf(resource, "Family%s", resname); sprintf(resource, "Family%s", resname);
SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam); SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
if (fam) if (fam)
{ {
if (!strcmp(fam, "Default")) family = wxDEFAULT; if (!strcmp(fam, "Default")) family = wxDEFAULT;

View File

@@ -13,6 +13,7 @@
#include "wx/font.h" #include "wx/font.h"
#include "wx/utils.h" #include "wx/utils.h"
#include "wx/log.h"
#include <strings.h> #include <strings.h>
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
@@ -356,13 +357,6 @@ GdkFont *wxFont::GetInternalFont(float scale) const
} }
else else
{ {
/*
if (int_scale == 100) printf( "int_scale.\n" );
if (M_FONTDATA->m_style == wxSWISS) printf( "swiss.\n" );
if (M_FONTDATA->m_pointSize == 12) printf( "12.\n" );
if (M_FONTDATA->m_weight == wxNORMAL) printf( "normal.\n" );
if (M_FONTDATA->m_underlined == FALSE) printf( "false.\n" );
*/
if ((int_scale == 100) && if ((int_scale == 100) &&
(M_FONTDATA->m_family == wxSWISS) && (M_FONTDATA->m_family == wxSWISS) &&
(M_FONTDATA->m_style == wxNORMAL) && (M_FONTDATA->m_style == wxNORMAL) &&
@@ -380,8 +374,8 @@ GdkFont *wxFont::GetInternalFont(float scale) const
M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font ); M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
} }
if (!font) if (!font)
printf("could not load any font"); wxLogError("could not load any font");
// wxError("could not load any font", "wxFont");
return font; return font;
} }
@@ -547,7 +541,8 @@ enum {wxSTYLE_NORMAL, wxSTYLE_ITALIC, wxSTYLE_SLANT, wxNUM_STYLES};
static int WCoordinate(int w) static int WCoordinate(int w)
{ {
switch (w) { switch (w)
{
case wxBOLD: return wxWEIGHT_BOLD; case wxBOLD: return wxWEIGHT_BOLD;
case wxLIGHT: return wxWEIGHT_LIGHT; case wxLIGHT: return wxWEIGHT_LIGHT;
case wxNORMAL: case wxNORMAL:
@@ -557,7 +552,8 @@ static int WCoordinate(int w)
static int SCoordinate(int s) static int SCoordinate(int s)
{ {
switch (s) { switch (s)
{
case wxITALIC: return wxSTYLE_ITALIC; case wxITALIC: return wxSTYLE_ITALIC;
case wxSLANT: return wxSTYLE_SLANT; case wxSLANT: return wxSTYLE_SLANT;
case wxNORMAL: case wxNORMAL:
@@ -569,7 +565,8 @@ static int SCoordinate(int s)
// wxSuffixMap // wxSuffixMap
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
class wxSuffixMap { class wxSuffixMap
{
public: public:
~wxSuffixMap(); ~wxSuffixMap();
@@ -582,10 +579,6 @@ public:
void Initialize(const char *, const char *); void Initialize(const char *, const char *);
}; };
//#if !USE_RESOURCES
#define wxGetResource(a, b, c) 0
//#endif
static void SearchResource(const char *prefix, const char **names, int count, char **v) static void SearchResource(const char *prefix, const char **names, int count, char **v)
{ {
int k, i, j; int k, i, j;
@@ -596,20 +589,33 @@ static void SearchResource(const char *prefix, const char **names, int count, ch
*v = (char *) NULL; *v = (char *) NULL;
internal = (char *) NULL; internal = (char *) NULL;
for (i = 0; i < k; i++) { for (i = 0; i < k; i++)
{
strcpy(resource, prefix); strcpy(resource, prefix);
for (j = 0; j < count; j++) { 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))) if (!(i & (1 << j)))
strcat(resource, names[j]); strcat(resource, names[j]);
else else
strcat(resource, "_"); strcat(resource, "_");
} }
if (wxGetResource(wxAPP_CLASS, (char *)resource, v))
return; /* we previously search the Xt-resources here */
if (!internal) {
if (!internal)
{
defaults = font_defaults; defaults = font_defaults;
while (*defaults) { while (*defaults)
if (!strcmp(*defaults, resource)) { {
if (!strcmp(*defaults, resource))
{
internal = defaults[1]; internal = defaults[1];
break; break;
} }
@@ -617,8 +623,26 @@ static void SearchResource(const char *prefix, const char **names, int count, ch
} }
} }
} }
if (internal) if (internal)
{
if (strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 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); *v = copystring(internal);
}
}
} }
wxSuffixMap::~wxSuffixMap() wxSuffixMap::~wxSuffixMap()
@@ -627,7 +651,8 @@ wxSuffixMap::~wxSuffixMap()
for (k = 0; k < wxNUM_WEIGHTS; ++k) for (k = 0; k < wxNUM_WEIGHTS; ++k)
for (j = 0; j < wxNUM_STYLES; ++j) for (j = 0; j < wxNUM_STYLES; ++j)
if (map[k][j]) { if (map[k][j])
{
delete[] map[k][j]; delete[] map[k][j];
map[k][j] = (char *) NULL; map[k][j] = (char *) NULL;
} }
@@ -640,15 +665,19 @@ void wxSuffixMap::Initialize(const char *resname, const char *devresname)
int i, j, k; int i, j, k;
const char *names[3]; const char *names[3];
for (k = 0; k < wxNUM_WEIGHTS; k++) { for (k = 0; k < wxNUM_WEIGHTS; k++)
switch (k) { {
switch (k)
{
case wxWEIGHT_NORMAL: weight = "Medium"; break; case wxWEIGHT_NORMAL: weight = "Medium"; break;
case wxWEIGHT_LIGHT: weight = "Light"; break; case wxWEIGHT_LIGHT: weight = "Light"; break;
case wxWEIGHT_BOLD: case wxWEIGHT_BOLD:
default: weight = "Bold"; default: weight = "Bold";
} }
for (j = 0; j < wxNUM_STYLES; j++) { for (j = 0; j < wxNUM_STYLES; j++)
switch (j) { {
switch (j)
{
case wxSTYLE_NORMAL: style = "Straight"; break; case wxSTYLE_NORMAL: style = "Straight"; break;
case wxSTYLE_ITALIC: style = "Italic"; break; case wxSTYLE_ITALIC: style = "Italic"; break;
case wxSTYLE_SLANT: case wxSTYLE_SLANT:
@@ -665,12 +694,16 @@ found:
int len, closer = 0, startpos = 0; int len, closer = 0, startpos = 0;
len = (v ? strlen(v) : 0); len = (v ? strlen(v) : 0);
for (i = 0; i < len; i++) { for (i = 0; i < len; i++)
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) { {
if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{')))
{
startpos = i; startpos = i;
closer = (v[i+1] == '[') ? ']' : '}'; closer = (v[i+1] == '[') ? ']' : '}';
++i; ++i;
} else if (v[i] == closer) { }
else if (v[i] == closer)
{
int newstrlen; int newstrlen;
const char *r = (char *) NULL; bool delete_r = FALSE; const char *r = (char *) NULL; bool delete_r = FALSE;
char *name; char *name;
@@ -678,7 +711,8 @@ found:
name = v + startpos + 2; name = v + startpos + 2;
v[i] = 0; v[i] = 0;
if (closer == '}') { if (closer == '}')
{
int i, count, len; int i, count, len;
char **names; char **names;
@@ -691,7 +725,8 @@ found:
names = new char*[count]; names = new char*[count];
names[0] = name; names[0] = name;
for (i = 0, count = 1; i < len; i++) for (i = 0, count = 1; i < len; i++)
if (name[i] == ',') { if (name[i] == ',')
{
names[count++] = name + i + 1; names[count++] = name + i + 1;
name[i] = 0; name[i] = 0;
} }
@@ -700,12 +735,13 @@ found:
delete_r = (r != 0); delete_r = (r != 0);
delete[] names; delete[] names;
if (!r) { if (!r)
{
for (i = 0; i < len; i++) for (i = 0; i < len; i++)
if (!name[i]) if (!name[i])
name[i] = ','; name[i] = ',';
r = ""; r = "";
printf("Bad resource name \"%s\" in font lookup\n", name); wxLogError( "Bad resource name in font lookup." );
} }
} else if (!strcmp(name, "weight")) { } else if (!strcmp(name, "weight")) {
r = weight; r = weight;
@@ -715,7 +751,7 @@ found:
r = resname; r = resname;
} else { } else {
r = ""; r = "";
printf("Bad font macro name \"%s\"\n", name); wxLogError( "Bad font macro name." );
} }
// add r to v // add r to v
@@ -842,6 +878,7 @@ void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname
sprintf(resource, "Family%s", resname); sprintf(resource, "Family%s", resname);
SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam); SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
if (fam) if (fam)
{ {
if (!strcmp(fam, "Default")) family = wxDEFAULT; if (!strcmp(fam, "Default")) family = wxDEFAULT;