#include "wx/font.h"
#include "wx/utils.h"
+#include "wx/log.h"
#include <strings.h>
+#include "gdk/gdk.h"
+
//-----------------------------------------------------------------------------
// local data
//-----------------------------------------------------------------------------
public:
wxFontRefData();
+ wxFontRefData( const wxFontRefData& data );
~wxFontRefData();
- wxList m_scaled_xfonts;
- int m_pointSize;
- int m_family, m_style, m_weight;
- bool m_underlined;
- int m_fontId;
- char* m_faceName;
+ wxList m_scaled_xfonts;
+ int m_pointSize;
+ int m_family, m_style, m_weight;
+ bool m_underlined;
+ int m_fontId;
+ wxString m_faceName;
- bool m_byXFontName;
- GdkFont *m_font;
+ bool m_byXFontName;
+ GdkFont *m_font;
friend wxFont;
};
m_weight = wxNORMAL;
m_underlined = FALSE;
m_fontId = 0;
- m_faceName = (char *) NULL;
m_font = (GdkFont *) NULL;
}
+wxFontRefData::wxFontRefData( const wxFontRefData& data ) : m_scaled_xfonts(wxKEY_INTEGER)
+{
+ m_byXFontName = FALSE;
+ m_pointSize = data.m_pointSize;
+ m_family = data.m_family;
+ m_style = data.m_style;
+ m_weight = data.m_weight;
+ m_underlined = data.m_underlined;
+ m_fontId = data.m_fontId;
+ m_faceName = data.m_faceName;
+ m_font = (GdkFont *) NULL;
+ if (data.m_font) m_font = gdk_font_ref( data.m_font );
+}
+
wxFontRefData::~wxFontRefData()
{
wxNode *node = m_scaled_xfonts.First();
gdk_font_unref( font );
node = next;
}
- if (m_faceName)
- {
- delete m_faceName;
- m_faceName = (char *) NULL;
- }
if (m_font) gdk_font_unref( m_font );
}
M_FONTDATA->m_font = gdk_font_load( xFontName );
}
-wxFont::wxFont(int PointSize, int FontIdOrFamily, int Style, int Weight,
- bool Underlined, const char* Face)
+wxFont::wxFont( int pointSize, int family, int style, int weight, bool underlined = FALSE,
+ const wxString& face = wxEmptyString )
{
m_refData = new wxFontRefData();
- if (FontIdOrFamily == wxDEFAULT) FontIdOrFamily = wxSWISS;
- M_FONTDATA->m_family = FontIdOrFamily;
-
- if ((M_FONTDATA->m_faceName = (Face) ? copystring(Face) : (char*)NULL) )
+ if (family == wxDEFAULT) family = wxSWISS;
+ M_FONTDATA->m_family = family;
+
+ if (!face.IsEmpty())
{
- M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( Face, FontIdOrFamily );
- M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
+ M_FONTDATA->m_faceName = face;
+ M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( face, family );
+ M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( family );
}
else
{
- M_FONTDATA->m_fontId = FontIdOrFamily;
- M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
+ M_FONTDATA->m_fontId = family;
+ M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( family );
}
- if (Style == wxDEFAULT) Style = wxNORMAL;
- M_FONTDATA->m_style = Style;
- if (Weight == wxDEFAULT) Weight = wxNORMAL;
- M_FONTDATA->m_weight = Weight;
- if (PointSize == wxDEFAULT) PointSize = 12;
- M_FONTDATA->m_pointSize = PointSize;
- M_FONTDATA->m_underlined = Underlined;
-
- if (wxTheFontList) wxTheFontList->Append( this );
-}
-
-wxFont::wxFont(int PointSize, const char *Face, int Family, int Style,
- int Weight, bool Underlined)
-{
- m_refData = new wxFontRefData();
-
- M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( Face, Family );
- M_FONTDATA->m_faceName = (Face) ? copystring(Face) : (char*)NULL;
- M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( M_FONTDATA->m_fontId );
- M_FONTDATA->m_style = Style;
- M_FONTDATA->m_weight = Weight;
- M_FONTDATA->m_pointSize = PointSize;
- M_FONTDATA->m_underlined = Underlined;
+ if (style == wxDEFAULT) style = wxNORMAL;
+ M_FONTDATA->m_style = style;
+ if (weight == wxDEFAULT) weight = wxNORMAL;
+ M_FONTDATA->m_weight = weight;
+ if (pointSize == wxDEFAULT) pointSize = 12;
+ M_FONTDATA->m_pointSize = pointSize;
+ M_FONTDATA->m_underlined = underlined;
if (wxTheFontList) wxTheFontList->Append( this );
+
}
wxFont::wxFont( const wxFont& font )
int wxFont::GetPointSize() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return 0;
- }
+ wxCHECK_MSG( Ok(), 0, "invalid font" );
return M_FONTDATA->m_pointSize;
}
-wxString wxFont::GetFaceString() const
-{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return "";
- }
-
- wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
- return s;
-}
-
wxString wxFont::GetFaceName() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return "";
- }
+ wxCHECK_MSG( Ok(), "", "invalid font" );
wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
return s;
int wxFont::GetFamily() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return 0;
- }
+ wxCHECK_MSG( Ok(), 0, "invalid font" );
return M_FONTDATA->m_family;
}
wxString wxFont::GetFamilyString() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return "wxDEFAULT";
- }
+ wxCHECK_MSG( Ok(), "wxDEFAULT", "invalid font" );
switch (M_FONTDATA->m_family)
{
int wxFont::GetFontId() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return 0;
- }
+ wxCHECK_MSG( Ok(), 0, "invalid font" );
return M_FONTDATA->m_fontId; // stub
}
int wxFont::GetStyle() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return 0;
- }
+ wxCHECK_MSG( Ok(), 0, "invalid font" );
return M_FONTDATA->m_style;
}
wxString wxFont::GetStyleString() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return "wxDEFAULT";
- }
+ wxCHECK_MSG( Ok(), "wxDEFAULT", "invalid font" );
switch (M_FONTDATA->m_style)
{
int wxFont::GetWeight() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return 0;
- }
+ wxCHECK_MSG( Ok(), 0, "invalid font" );
return M_FONTDATA->m_weight;
}
wxString wxFont::GetWeightString() const
{
- if (!Ok())
- {
- wxFAIL_MSG( "invalid font" );
- return "wxDEFAULT";
- }
+ wxCHECK_MSG( Ok(), "wxDEFAULT", "invalid font" );
switch (M_FONTDATA->m_weight)
{
bool wxFont::GetUnderlined() const
{
- if (!Ok())
+ wxCHECK_MSG( Ok(), FALSE, "invalid font" );
+
+ return M_FONTDATA->m_underlined;
+}
+
+void wxFont::Unshare()
+{
+ if (!m_refData)
{
- wxFAIL_MSG( "invalid font" );
- return FALSE;
+ m_refData = new wxFontRefData();
+ }
+ else
+ {
+ wxFontRefData* ref = new wxFontRefData(*(wxFontRefData*)m_refData);
+ UnRef();
+ m_refData = ref;
}
+}
- return M_FONTDATA->m_underlined;
+void wxFont::SetPointSize(int pointSize)
+{
+ Unshare();
+
+ M_FONTDATA->m_pointSize = pointSize;
+}
+
+void wxFont::SetFamily(int family)
+{
+ Unshare();
+
+ M_FONTDATA->m_family = family;
+}
+
+void wxFont::SetStyle(int style)
+{
+ Unshare();
+
+ M_FONTDATA->m_style = style;
+}
+
+void wxFont::SetWeight(int weight)
+{
+ Unshare();
+
+ M_FONTDATA->m_weight = weight;
+}
+
+void wxFont::SetFaceName(const wxString& faceName)
+{
+ Unshare();
+
+ M_FONTDATA->m_faceName = faceName;
+}
+
+void wxFont::SetUnderlined(bool underlined)
+{
+ Unshare();
+
+ M_FONTDATA->m_underlined = underlined;
}
//-----------------------------------------------------------------------------
}
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) &&
(M_FONTDATA->m_family == wxSWISS) &&
(M_FONTDATA->m_style == wxNORMAL) &&
M_FONTDATA->m_scaled_xfonts.Append( int_scale, (wxObject*)font );
}
if (!font)
- printf("could not load any font");
- // wxError("could not load any font", "wxFont");
+ wxLogError("could not load any font");
+
return font;
}
static int WCoordinate(int w)
{
- switch (w) {
+ switch (w)
+ {
case wxBOLD: return wxWEIGHT_BOLD;
case wxLIGHT: return wxWEIGHT_LIGHT;
case wxNORMAL:
static int SCoordinate(int s)
{
- switch (s) {
+ switch (s)
+ {
case wxITALIC: return wxSTYLE_ITALIC;
case wxSLANT: return wxSTYLE_SLANT;
case wxNORMAL:
// wxSuffixMap
//-----------------------------------------------------------------------------
-class wxSuffixMap {
+class wxSuffixMap
+{
public:
~wxSuffixMap();
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)
{
int k, i, j;
*v = (char *) NULL;
internal = (char *) NULL;
- for (i = 0; i < k; i++) {
+ for (i = 0; i < k; i++)
+ {
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)))
strcat(resource, names[j]);
else
strcat(resource, "_");
}
- if (wxGetResource(wxAPP_CLASS, (char *)resource, v))
- return;
- if (!internal) {
+
+ /* we previously search the Xt-resources here */
+
+ if (!internal)
+ {
defaults = font_defaults;
- while (*defaults) {
- if (!strcmp(*defaults, resource)) {
+ while (*defaults)
+ {
+ if (!strcmp(*defaults, resource))
+ {
internal = defaults[1];
break;
}
}
}
}
+
if (internal)
- *v = copystring(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);
+ }
+ }
}
wxSuffixMap::~wxSuffixMap()
for (k = 0; k < wxNUM_WEIGHTS; ++k)
for (j = 0; j < wxNUM_STYLES; ++j)
- if (map[k][j]) {
+ if (map[k][j])
+ {
delete[] map[k][j];
map[k][j] = (char *) NULL;
}
int i, j, k;
const char *names[3];
- for (k = 0; k < wxNUM_WEIGHTS; k++) {
- switch (k) {
+ 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";
+ default: weight = "Bold";
}
- for (j = 0; j < wxNUM_STYLES; j++) {
- switch (j) {
+ for (j = 0; j < wxNUM_STYLES; j++)
+ {
+ switch (j)
+ {
case wxSTYLE_NORMAL: style = "Straight"; break;
case wxSTYLE_ITALIC: style = "Italic"; break;
case wxSTYLE_SLANT:
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] == '{'))) {
+ 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) {
+ }
+ 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 == '}') {
+ if (closer == '}')
+ {
int i, count, len;
char **names;
names = new char*[count];
names[0] = name;
for (i = 0, count = 1; i < len; i++)
- if (name[i] == ',') {
+ if (name[i] == ',')
+ {
names[count++] = name + i + 1;
name[i] = 0;
}
delete_r = (r != 0);
delete[] names;
- if (!r) {
+ if (!r)
+ {
for (i = 0; i < len; i++)
if (!name[i])
name[i] = ',';
r = "";
- printf("Bad resource name \"%s\" in font lookup\n", name);
+ wxLogError( "Bad resource name in font lookup." );
}
} else if (!strcmp(name, "weight")) {
r = weight;
r = resname;
} else {
r = "";
- printf("Bad font macro name \"%s\"\n", name);
+ wxLogError( "Bad font macro name." );
}
// add r to v
// wxFontNameItem
//-----------------------------------------------------------------------------
-class wxFontNameItem : public wxObject {
+class wxFontNameItem : public wxObject
+{
DECLARE_DYNAMIC_CLASS(wxFontNameItem)
public:
wxFontNameItem(const char *name, int id, int family);
// Cleanup wxFontNameItems allocated
table->BeginFind();
wxNode *node = table->Next();
- while (node) {
+ while (node)
+ {
wxFontNameItem *item = (wxFontNameItem*)node->Data();
delete item;
node = table->Next();
sprintf(resource, "Family%s", resname);
SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam);
- if (fam) {
+
+ if (fam)
+ {
if (!strcmp(fam, "Default")) family = wxDEFAULT;
else if (!strcmp(fam, "Roman")) family = wxROMAN;
else if (!strcmp(fam, "Decorative")) family = wxDECORATIVE;
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;
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
if (item)
return item->GetScreenName(weight, style);
+
// font does not exist
return (char *) NULL;
}
wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font
if (item)
return item->GetPostScriptName(weight, style);
+
// font does not exist
return (char *) NULL;
}
wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font
if (item)
return item->GetName();
+
// font does not exist
return (char *) NULL;
}
table->BeginFind();
- while ( (node = table->Next()) ) {
+ while ( (node = table->Next()) )
+ {
wxFontNameItem *item = (wxFontNameItem*)node->Data();
if (!strcmp(name, item->name))
return item->id;
}
+
// font does not exist
return 0;
}
if (item)
return item->family;
+
// font does not exist
return wxDEFAULT;
}