// Name: font.cpp
// Purpose:
// Author: Robert Roebling
-// Created: 01/02/97
-// Id:
+// Id: $Id$
// Copyright: (c) 1998 Robert Roebling, Julian Smart and Markus Holzem
// Licence: wxWindows licence
/////////////////////////////////////////////////////////////////////////////
// local data
//-----------------------------------------------------------------------------
-static char *wx_font_family [] = {
- "wxDEFAULT", "wxDECORATIVE", "wxMODERN", "wxROMAN", "wxSCRIPT",
- "wxSWISS", "wxTELETYPE",
-};
-static char *wx_font_style [] = {
- "wxDEFAULT", "wxNORMAL", "wxSLANT", "wxITALIC",
-};
-static char *wx_font_weight [] = {
- "wxDEFAULT", "wxNORMAL", "wxBOLD", "wxLIGHT",
-};
-
-extern wxFontNameDirectory wxTheFontNameDirectory;
+extern wxFontNameDirectory *wxTheFontNameDirectory;
//-----------------------------------------------------------------------------
// wxFont
wxFontRefData::wxFontRefData(void) : m_scaled_xfonts(wxKEY_INTEGER)
{
m_byXFontName = FALSE;
- m_pointSize = -1;
- m_family = -1;
- m_style = -1;
- m_weight = -1;
+ m_pointSize = 12;
+ m_family = wxSWISS;
+ m_style = wxNORMAL;
+ m_weight = wxNORMAL;
m_underlined = FALSE;
m_fontId = 0;
- m_faceName = NULL;
- m_font = NULL;
-};
+ m_faceName = (char *) NULL;
+ m_font = (GdkFont *) NULL;
+}
wxFontRefData::~wxFontRefData(void)
{
wxNode *next = node->Next();
gdk_font_unref( font );
node = next;
- };
+ }
if (m_faceName)
{
delete m_faceName;
- m_faceName = NULL;
- };
+ m_faceName = (char *) NULL;
+ }
if (m_font) gdk_font_unref( m_font );
-};
+}
//-----------------------------------------------------------------------------
wxFont::wxFont(void)
{
if (wxTheFontList) wxTheFontList->Append( this );
-};
+}
wxFont::wxFont( char *xFontName )
{
M_FONTDATA->m_byXFontName = TRUE;
M_FONTDATA->m_font = gdk_font_load( xFontName );
-};
+}
wxFont::wxFont(int PointSize, int FontIdOrFamily, int Style, int Weight,
bool Underlined, const char* Face)
{
m_refData = new wxFontRefData();
+ if (FontIdOrFamily == wxDEFAULT) FontIdOrFamily = wxSWISS;
+ M_FONTDATA->m_family = FontIdOrFamily;
+
if ((M_FONTDATA->m_faceName = (Face) ? copystring(Face) : (char*)NULL) )
{
- M_FONTDATA->m_fontId = wxTheFontNameDirectory.FindOrCreateFontId( Face, FontIdOrFamily );
- M_FONTDATA->m_family = wxTheFontNameDirectory.GetFamily( FontIdOrFamily );
+ M_FONTDATA->m_fontId = wxTheFontNameDirectory->FindOrCreateFontId( Face, FontIdOrFamily );
+ M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
}
else
{
M_FONTDATA->m_fontId = FontIdOrFamily;
- M_FONTDATA->m_family = wxTheFontNameDirectory.GetFamily( FontIdOrFamily );
- };
+ M_FONTDATA->m_family = wxTheFontNameDirectory->GetFamily( FontIdOrFamily );
+ }
+
+ 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_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_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 (wxTheFontList) wxTheFontList->Append( this );
-};
+}
wxFont::wxFont( const wxFont& font )
{
Ref( font );
-};
+
+ if (wxTheFontList) wxTheFontList->Append( this );
+}
wxFont::wxFont( const wxFont* font )
{
UnRef();
if (font) Ref( *font );
-};
+
+ if (wxTheFontList) wxTheFontList->Append( this );
+}
wxFont::~wxFont(void)
{
if (wxTheFontList) wxTheFontList->DeleteObject( this );
-};
+}
wxFont& wxFont::operator = ( const wxFont& font )
{
if (*this == font) return (*this);
Ref( font );
return *this;
-};
+}
bool wxFont::operator == ( const wxFont& font )
{
return m_refData == font.m_refData;
-};
+}
bool wxFont::operator != ( const wxFont& font )
{
return m_refData != font.m_refData;
-};
+}
-bool wxFont::Ok()
+bool wxFont::Ok() const
{
return (m_refData != NULL);
-};
+}
int wxFont::GetPointSize(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return 0;
+ }
+
return M_FONTDATA->m_pointSize;
-};
+}
wxString wxFont::GetFaceString(void) const
{
- wxString s = wxTheFontNameDirectory.GetFontName( M_FONTDATA->m_fontId );
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return "";
+ }
+
+ wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
return s;
-};
+}
wxString wxFont::GetFaceName(void) const
{
- wxString s = wxTheFontNameDirectory.GetFontName( M_FONTDATA->m_fontId );
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return "";
+ }
+
+ wxString s = wxTheFontNameDirectory->GetFontName( M_FONTDATA->m_fontId );
return s;
-};
+}
int wxFont::GetFamily(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return 0;
+ }
+
return M_FONTDATA->m_family;
-};
+}
wxString wxFont::GetFamilyString(void) const
{
- wxString s = wx_font_family[M_FONTDATA->m_family];
- return s;
-};
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return "wxDEFAULT";
+ }
+
+ switch (M_FONTDATA->m_family)
+ {
+ case wxDECORATIVE: return wxString("wxDECORATIVE");
+ case wxROMAN: return wxString("wxROMAN");
+ case wxSCRIPT: return wxString("wxSCRIPT");
+ case wxSWISS: return wxString("wxSWISS");
+ case wxMODERN: return wxString("wxMODERN");
+ case wxTELETYPE: return wxString("wxTELETYPE");
+ default: return "wxDEFAULT";
+ }
+
+ return "wxDEFAULT";
+}
int wxFont::GetFontId(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return 0;
+ }
+
return M_FONTDATA->m_fontId; // stub
-};
+}
int wxFont::GetStyle(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return 0;
+ }
+
return M_FONTDATA->m_style;
-};
+}
wxString wxFont::GetStyleString(void) const
{
- wxString s = wx_font_style[M_FONTDATA->m_style];
- return s;
-};
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return "wxDEFAULT";
+ }
+
+ switch (M_FONTDATA->m_style)
+ {
+ case wxNORMAL: return wxString("wxNORMAL");
+ case wxSLANT: return wxString("wxSLANT");
+ case wxITALIC: return wxString("wxITALIC");
+ default: return wxString("wxDEFAULT");
+ }
+
+ return wxString("wxDEFAULT");
+}
int wxFont::GetWeight(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return 0;
+ }
+
return M_FONTDATA->m_weight;
-};
+}
wxString wxFont::GetWeightString(void) const
{
- wxString s = wx_font_weight[M_FONTDATA->m_weight];
- return s;
-};
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return "wxDEFAULT";
+ }
+
+ switch (M_FONTDATA->m_weight)
+ {
+ case wxNORMAL: return wxString("wxNORMAL");
+ case wxBOLD: return wxString("wxBOLD");
+ case wxLIGHT: return wxString("wxLIGHT");
+ default: return wxString("wxDEFAULT");
+ }
+
+ return wxString("wxDEFAULT");
+}
bool wxFont::GetUnderlined(void) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return FALSE;
+ }
+
return M_FONTDATA->m_underlined;
-};
+}
//-----------------------------------------------------------------------------
// get internal representation of font
int style, int weight,
bool underlined);
-GdkFont *wxFont::GetInternalFont(float scale)
+GdkFont *wxFont::GetInternalFont(float scale) const
{
+ if (!Ok())
+ {
+ wxFAIL_MSG( "invalid font" );
+ return (GdkFont*) NULL;
+ }
+
if (M_FONTDATA->m_byXFontName) return M_FONTDATA->m_font;
long int_scale = long(scale * 100.0 + 0.5); // key for fontlist
int point_scale = (M_FONTDATA->m_pointSize * 10 * int_scale) / 100;
- GdkFont *font = NULL;
+ GdkFont *font = (GdkFont *) NULL;
wxNode *node = M_FONTDATA->m_scaled_xfonts.Find(int_scale);
if (node)
}
else
{
- font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_fontId, M_FONTDATA->m_style,
- M_FONTDATA->m_weight, M_FONTDATA->m_underlined );
+/*
+ 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_pointSize == 12) &&
+ (M_FONTDATA->m_weight == wxNORMAL) &&
+ (M_FONTDATA->m_underlined == FALSE))
+ {
+ font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" );
+ }
+ else
+ {
+ font = wxLoadQueryNearestFont( point_scale, M_FONTDATA->m_fontId, M_FONTDATA->m_style,
+ M_FONTDATA->m_weight, M_FONTDATA->m_underlined );
+ }
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");
return font;
-};
+}
//-----------------------------------------------------------------------------
// local utilities to find a X font
int weight, bool WXUNUSED(underlined))
{
char buffer[512];
- char *name = wxTheFontNameDirectory.GetScreenName( fontid, weight, style );
+ char *name = wxTheFontNameDirectory->GetScreenName( fontid, weight, style );
if (!name)
name = "-*-*-*-*-*-*-*-%d-*-*-*-*-*-*";
"-${ScreenSwissBase}${ScreenStdSuffix}",
"ScreenScript__",
"-${ScreenScriptBase}${ScreenStdSuffix}",
- NULL
+ (char *) NULL
};
enum {wxWEIGHT_NORMAL, wxWEIGHT_BOLD, wxWEIGHT_LIGHT, wxNUM_WEIGHTS};
case wxNORMAL:
default: return wxWEIGHT_NORMAL;
}
-}
+};
static int SCoordinate(int s)
{
case wxNORMAL:
default: return wxSTYLE_NORMAL;
}
-}
+};
//-----------------------------------------------------------------------------
// wxSuffixMap
k = 1 << count;
- *v = NULL;
- internal = NULL;
+ *v = (char *) NULL;
+ internal = (char *) NULL;
for (i = 0; i < k; i++) {
strcpy(resource, prefix);
for (j = 0; j < wxNUM_STYLES; ++j)
if (map[k][j]) {
delete[] map[k][j];
- map[k][j] = NULL;
+ map[k][j] = (char *) NULL;
}
}
++i;
} else if (v[i] == closer) {
int newstrlen;
- const char *r = NULL; bool delete_r = FALSE;
+ const char *r = (char *) NULL; bool delete_r = FALSE;
char *name;
name = v + startpos + 2;
inline int GetFamily(void) {return family;}
inline int GetId(void) {return id;}
inline bool IsRoman(void) {return isroman;}
-#if WXDEBUG
+#if defined(__WXDEBUG__)
void Dump(ostream& str);
#endif
{
if (name)
delete[] name;
- name = NULL;
+ name = (char *) NULL;
}
-#if WXDEBUG
+#if defined(__WXDEBUG__)
void wxFontNameItem::Dump(ostream& str)
{
str << "wxFontNameItem(" << name << ")";
{
table = new wxHashTable(wxKEY_INTEGER, 20);
nextFontId = -1;
- Initialize();
}
wxFontNameDirectory::~wxFontNameDirectory()
char *fam, resource[256];
sprintf(resource, "Family%s", resname);
- SearchResource((const char *)resource, NULL, 0, (char **)&fam);
+ 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;
if (item)
return item->GetScreenName(weight, style);
// font does not exist
- return NULL;
+ return (char *) NULL;
}
char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style)
if (item)
return item->GetPostScriptName(weight, style);
// font does not exist
- return NULL;
+ return (char *) NULL;
}
char *wxFontNameDirectory::GetAFMName(int fontid, int weight, int style)
if (item)
return item->GetAFMName(weight, style);
// font does not exist
- return NULL;
+ return (char *) NULL;
}
char *wxFontNameDirectory::GetFontName(int fontid)
if (item)
return item->GetName();
// font does not exist
- return NULL;
+ return (char *) NULL;
}
int wxFontNameDirectory::GetFontId(const char *name)