]> git.saurik.com Git - wxWidgets.git/blobdiff - src/gtk/font.cpp
Removed references to DEBUG and WXDEBUG; cured Motif font problem; removed
[wxWidgets.git] / src / gtk / font.cpp
index 1418bc06617c1fd0595f64500f9df7f8f0ca4ba4..6a2d12c7af4576aa0a2eab1a65fcba4d1c7d1c4b 100644 (file)
@@ -2,8 +2,7 @@
 // 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
@@ -60,15 +48,15 @@ class wxFontRefData: public wxObjectRefData
 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)
 {
@@ -79,14 +67,14 @@ 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 );
-};
+}
 
 //-----------------------------------------------------------------------------
 
@@ -97,7 +85,7 @@ IMPLEMENT_DYNAMIC_CLASS(wxFont, wxGDIObject)
 wxFont::wxFont(void)
 {
   if (wxTheFontList) wxTheFontList->Append( this );
-};
+}
 
 wxFont::wxFont( char *xFontName )
 {
@@ -107,144 +95,245 @@ 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
@@ -255,13 +344,19 @@ static GdkFont *wxLoadQueryNearestFont(int point_size, int fontid,
                                           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) 
@@ -270,15 +365,34 @@ GdkFont *wxFont::GetInternalFont(float scale)
   } 
   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
@@ -288,7 +402,7 @@ static GdkFont *wxLoadQueryFont(int point_size, int fontid, int style,
                                    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-*-*-*-*-*-*";
@@ -434,7 +548,7 @@ static char *font_defaults[] = {
     "-${ScreenSwissBase}${ScreenStdSuffix}",
     "ScreenScript__",
     "-${ScreenScriptBase}${ScreenStdSuffix}",
-    NULL
+    (char *) NULL
 };
 
 enum {wxWEIGHT_NORMAL, wxWEIGHT_BOLD,  wxWEIGHT_LIGHT, wxNUM_WEIGHTS};
@@ -448,7 +562,7 @@ static int WCoordinate(int w)
     case wxNORMAL:
     default:       return wxWEIGHT_NORMAL;
     }
-}
+};
 
 static int SCoordinate(int s)
 {
@@ -458,7 +572,7 @@ static int SCoordinate(int s)
     case wxNORMAL:
     default:       return wxSTYLE_NORMAL;
     }
-}
+};
 
 //-----------------------------------------------------------------------------
 // wxSuffixMap
@@ -488,8 +602,8 @@ static void SearchResource(const char *prefix, const char **names, int count, ch
 
     k = 1 << count;
     
-    *v = NULL;
-    internal = NULL;
+    *v = (char *) NULL;
+    internal = (char *) NULL;
 
     for (i = 0; i < k; i++) {
        strcpy(resource, prefix);
@@ -524,7 +638,7 @@ wxSuffixMap::~wxSuffixMap(void)
        for (j = 0; j < wxNUM_STYLES; ++j)
            if (map[k][j]) {
                delete[] map[k][j];
-               map[k][j] = NULL;
+               map[k][j] = (char *) NULL;
            }
 }
 
@@ -567,7 +681,7 @@ void wxSuffixMap::Initialize(const char *resname, const char *devresname)
                    ++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;
@@ -650,7 +764,7 @@ public:
     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
 
@@ -678,10 +792,10 @@ wxFontNameItem::~wxFontNameItem(void)
 {
     if (name)
        delete[] name;
-    name = NULL;
+    name = (char *) NULL;
 }
 
-#if WXDEBUG
+#if defined(__WXDEBUG__)
 void wxFontNameItem::Dump(ostream& str)
 {
     str << "wxFontNameItem(" << name << ")";
@@ -698,7 +812,6 @@ wxFontNameDirectory::wxFontNameDirectory(void)
 {
     table = new wxHashTable(wxKEY_INTEGER, 20);
     nextFontId = -1;
-    Initialize();
 }
 
 wxFontNameDirectory::~wxFontNameDirectory()
@@ -735,7 +848,7 @@ void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname
     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;
@@ -766,7 +879,7 @@ char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style)
     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)
@@ -775,7 +888,7 @@ 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)
@@ -784,7 +897,7 @@ 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)
@@ -793,7 +906,7 @@ 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)