]>
git.saurik.com Git - wxWidgets.git/blob - src/gtk/font.cpp
7de3862b47820172e47a68f768db6542158ccfc7
   1 ///////////////////////////////////////////////////////////////////////////// 
   4 // Author:      Robert Roebling 
   6 // Copyright:   (c) 1998 Robert Roebling, Julian Smart and Markus Holzem 
   7 // Licence:       wxWindows licence 
   8 ///////////////////////////////////////////////////////////////////////////// 
  11 #pragma implementation "font.h" 
  17 #include "wx/gdicmn.h" 
  18 #include "wx/tokenzr.h" 
  23 //----------------------------------------------------------------------------- 
  25 //----------------------------------------------------------------------------- 
  28 extern wxFontNameDirectory *wxTheFontNameDirectory; 
  31 //----------------------------------------------------------------------------- 
  33 //----------------------------------------------------------------------------- 
  35 class wxFontRefData
: public wxObjectRefData
 
  40     wxFontRefData( const wxFontRefData
& data 
); 
  43     wxList    m_scaled_xfonts
; 
  45     int       m_family
, m_style
, m_weight
; 
  55 wxFontRefData::wxFontRefData() : m_scaled_xfonts(wxKEY_INTEGER
) 
  57     m_byXFontName 
= FALSE
; 
  63     m_font 
= (GdkFont 
*) NULL
; 
  66 wxFontRefData::wxFontRefData( const wxFontRefData
& data 
) : m_scaled_xfonts(wxKEY_INTEGER
) 
  68     m_byXFontName 
= FALSE
; 
  69     m_pointSize 
= data
.m_pointSize
; 
  70     m_family 
= data
.m_family
; 
  71     m_style 
= data
.m_style
; 
  72     m_weight 
= data
.m_weight
; 
  73     m_underlined 
= data
.m_underlined
; 
  74     m_faceName 
= data
.m_faceName
; 
  75     m_font 
= (GdkFont 
*) NULL
; 
  76     if (data
.m_font
) m_font 
= gdk_font_ref( data
.m_font 
); 
  79 wxFontRefData::~wxFontRefData() 
  81     wxNode 
*node 
= m_scaled_xfonts
.First(); 
  84         GdkFont 
*font 
= (GdkFont
*)node
->Data(); 
  85         wxNode 
*next 
= node
->Next(); 
  86         gdk_font_unref( font 
); 
  89     if (m_font
) gdk_font_unref( m_font 
); 
  92 //----------------------------------------------------------------------------- 
  94 #define M_FONTDATA ((wxFontRefData *)m_refData) 
  96 IMPLEMENT_DYNAMIC_CLASS(wxFont
, wxGDIObject
) 
 100     if (wxTheFontList
) wxTheFontList
->Append( this ); 
 103 wxFont::wxFont( GdkFont 
*font
, char *xFontName 
) 
 105     if (!xFontName
) return; 
 107     m_refData 
= new wxFontRefData(); 
 109 //  M_FONTDATA->m_byXFontName = TRUE; 
 110     M_FONTDATA
->m_font 
= font
; 
 114     wxString 
fontname( xFontName 
); 
 115     wxStringTokenizer 
tn( fontname
, _T("-") ); 
 117     tn
.GetNextToken();                           // foundry 
 119     M_FONTDATA
->m_faceName 
= tn
.GetNextToken();  // courier 
 121     tmp 
= tn
.GetNextToken().MakeUpper(); 
 122     if (tmp 
== _T("BOLD")) M_FONTDATA
->m_weight 
= wxBOLD
; 
 124     tmp 
= tn
.GetNextToken().MakeUpper(); 
 125     if (tmp 
== _T("I")) M_FONTDATA
->m_style 
= wxITALIC
; 
 126     if (tmp 
== _T("O")) M_FONTDATA
->m_style 
= wxITALIC
; 
 128     tn
.GetNextToken();                           // set width 
 129     tn
.GetNextToken();                           // ? 
 130     tn
.GetNextToken();                           // pixel size 
 132     tmp 
= tn
.GetNextToken();                     // pointsize 
 133     int num 
=  wxStrtol (tmp
.c_str(), (wxChar 
**) NULL
, 10); 
 134     M_FONTDATA
->m_pointSize 
= num 
/ 10; 
 136     tn
.GetNextToken();                           // x-res 
 137     tn
.GetNextToken();                           // y-res 
 139     tmp 
= tn
.GetNextToken().MakeUpper(); 
 140     if (tmp 
== _T("M")) M_FONTDATA
->m_family 
= wxMODERN
; 
 141     else if (M_FONTDATA
->m_faceName 
== _T("TIMES")) M_FONTDATA
->m_family 
= wxROMAN
; 
 142     else if (M_FONTDATA
->m_faceName 
== _T("HELVETICA")) M_FONTDATA
->m_family 
= wxSWISS
; 
 143     else if (M_FONTDATA
->m_faceName 
== _T("LUCIDATYPEWRITER")) M_FONTDATA
->m_family 
= wxTELETYPE
; 
 144     else if (M_FONTDATA
->m_faceName 
== _T("LUCIDA")) M_FONTDATA
->m_family 
= wxDECORATIVE
; 
 145     else if (M_FONTDATA
->m_faceName 
== _T("UTOPIA")) M_FONTDATA
->m_family 
= wxSCRIPT
; 
 148 wxFont::wxFont( int pointSize
, int family
, int style
, int weight
, bool underlined
, const wxString
& face 
) 
 150     m_refData 
= new wxFontRefData(); 
 152     if (family 
== wxDEFAULT
) 
 153         M_FONTDATA
->m_family 
= wxSWISS
; 
 155         M_FONTDATA
->m_family 
= family
; 
 157     if (!face
.IsEmpty()) M_FONTDATA
->m_faceName 
= face
; 
 159     if (style 
== wxDEFAULT
) 
 160         M_FONTDATA
->m_style 
= wxNORMAL
; 
 162         M_FONTDATA
->m_style 
= style
; 
 164     if (weight 
== wxDEFAULT
) 
 165         M_FONTDATA
->m_weight 
= wxNORMAL
; 
 167         M_FONTDATA
->m_weight 
= weight
; 
 169     if (pointSize 
== wxDEFAULT
) 
 170         M_FONTDATA
->m_pointSize 
= 12; 
 172         M_FONTDATA
->m_pointSize 
= pointSize
; 
 174     M_FONTDATA
->m_underlined 
= underlined
; 
 176     if (wxTheFontList
) wxTheFontList
->Append( this ); 
 180 wxFont::wxFont( const wxFont
& font 
) 
 184     if (wxTheFontList
) wxTheFontList
->Append( this ); 
 189     if (wxTheFontList
) wxTheFontList
->DeleteObject( this ); 
 192 wxFont
& wxFont::operator = ( const wxFont
& font 
) 
 194     if (*this == font
) return (*this); 
 199 bool wxFont::operator == ( const wxFont
& font 
) const 
 201     return m_refData 
== font
.m_refData
; 
 204 bool wxFont::operator != ( const wxFont
& font 
) const 
 206     return m_refData 
!= font
.m_refData
; 
 209 bool wxFont::Ok() const 
 211     return (m_refData 
!= NULL
); 
 214 int wxFont::GetPointSize() const 
 216     wxCHECK_MSG( Ok(), 0, _T("invalid font") ); 
 218     return M_FONTDATA
->m_pointSize
; 
 221 wxString 
wxFont::GetFaceName() const 
 223     wxCHECK_MSG( Ok(), _T(""), _T("invalid font") ); 
 225     return M_FONTDATA
->m_faceName
; 
 228 int wxFont::GetFamily() const 
 230     wxCHECK_MSG( Ok(), 0, _T("invalid font") ); 
 232     return M_FONTDATA
->m_family
; 
 235 wxString 
wxFont::GetFamilyString() const 
 237     wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); 
 239     switch (M_FONTDATA
->m_family
) 
 241         case wxDECORATIVE
:   return wxString(_T("wxDECORATIVE")); 
 242         case wxROMAN
:        return wxString(_T("wxROMAN")); 
 243         case wxSCRIPT
:       return wxString(_T("wxSCRIPT")); 
 244         case wxSWISS
:        return wxString(_T("wxSWISS")); 
 245         case wxMODERN
:       return wxString(_T("wxMODERN")); 
 246         case wxTELETYPE
:     return wxString(_T("wxTELETYPE")); 
 247         default:             return _T("wxDEFAULT"); 
 253 int wxFont::GetStyle() const 
 255     wxCHECK_MSG( Ok(), 0, _T("invalid font") ); 
 257     return M_FONTDATA
->m_style
; 
 260 wxString 
wxFont::GetStyleString() const 
 262     wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); 
 264     switch (M_FONTDATA
->m_style
) 
 266         case wxNORMAL
:   return wxString(_T("wxNORMAL")); 
 267         case wxSLANT
:    return wxString(_T("wxSLANT")); 
 268         case wxITALIC
:   return wxString(_T("wxITALIC")); 
 269         default:         return wxString(_T("wxDEFAULT")); 
 272     return wxString(_T("wxDEFAULT")); 
 275 int wxFont::GetWeight() const 
 277     wxCHECK_MSG( Ok(), 0, _T("invalid font") ); 
 279     return M_FONTDATA
->m_weight
; 
 282 wxString 
wxFont::GetWeightString() const 
 284     wxCHECK_MSG( Ok(), _T("wxDEFAULT"), _T("invalid font") ); 
 286     switch (M_FONTDATA
->m_weight
) 
 288         case wxNORMAL
:   return wxString(_T("wxNORMAL")); 
 289         case wxBOLD
:     return wxString(_T("wxBOLD")); 
 290         case wxLIGHT
:    return wxString(_T("wxLIGHT")); 
 291         default:         return wxString(_T("wxDEFAULT")); 
 294     return wxString(_T("wxDEFAULT")); 
 297 bool wxFont::GetUnderlined() const 
 299     wxCHECK_MSG( Ok(), FALSE
, _T("invalid font") ); 
 301     return M_FONTDATA
->m_underlined
; 
 304 void wxFont::Unshare() 
 308         m_refData 
= new wxFontRefData(); 
 312         wxFontRefData
* ref 
= new wxFontRefData(*(wxFontRefData
*)m_refData
); 
 318 void wxFont::SetPointSize(int pointSize
) 
 322     M_FONTDATA
->m_pointSize 
= pointSize
; 
 325 void wxFont::SetFamily(int family
) 
 329     M_FONTDATA
->m_family 
= family
; 
 332 void wxFont::SetStyle(int style
) 
 336     M_FONTDATA
->m_style 
= style
; 
 339 void wxFont::SetWeight(int weight
) 
 343     M_FONTDATA
->m_weight 
= weight
; 
 346 void wxFont::SetFaceName(const wxString
& faceName
) 
 350     M_FONTDATA
->m_faceName 
= faceName
; 
 353 void wxFont::SetUnderlined(bool underlined
) 
 357     M_FONTDATA
->m_underlined 
= underlined
; 
 360 //----------------------------------------------------------------------------- 
 361 // get internal representation of font 
 362 //----------------------------------------------------------------------------- 
 364 static GdkFont 
*wxLoadQueryNearestFont( int point_size
, int family
, int style
, int weight
, 
 365                                         bool underlined
, const wxString 
&facename 
); 
 367 GdkFont 
*wxFont::GetInternalFont( float scale 
) const 
 371         wxFAIL_MSG( _T("invalid font") ); 
 372         return (GdkFont
*) NULL
; 
 375     /* short cut if the special X font constructor has been used */ 
 376     if (M_FONTDATA
->m_byXFontName
) return M_FONTDATA
->m_font
; 
 378     long int_scale 
= long(scale 
* 100.0 + 0.5); /* key for fontlist */ 
 379     int point_scale 
= (M_FONTDATA
->m_pointSize 
* 10 * int_scale
) / 100; 
 380     GdkFont 
*font 
= (GdkFont 
*) NULL
; 
 382     wxNode 
*node 
= M_FONTDATA
->m_scaled_xfonts
.Find(int_scale
); 
 385         font 
= (GdkFont
*)node
->Data(); 
 390         if ((int_scale == 100) && 
 391                 (M_FONTDATA->m_family == wxSWISS) && 
 392                 (M_FONTDATA->m_style == wxNORMAL) && 
 393                 (M_FONTDATA->m_pointSize == 12) && 
 394                 (M_FONTDATA->m_weight == wxNORMAL) && 
 395                 (M_FONTDATA->m_underlined == FALSE)) 
 397             font = gdk_font_load( "-adobe-helvetica-medium-r-normal--*-120-*-*-*-*-*-*" ); 
 402             font 
= wxLoadQueryNearestFont( point_scale
, M_FONTDATA
->m_family
, M_FONTDATA
->m_style
, 
 403                     M_FONTDATA
->m_weight
, M_FONTDATA
->m_underlined
, M_FONTDATA
->m_faceName 
); 
 405         M_FONTDATA
->m_scaled_xfonts
.Append( int_scale
, (wxObject
*)font 
); 
 410         wxLogError(_T("could not load any font")); 
 416 //----------------------------------------------------------------------------- 
 417 // local utilities to find a X font 
 418 //----------------------------------------------------------------------------- 
 420 static GdkFont
*wxLoadQueryFont( int pointSize
, int family
, int style
, int weight
, 
 421                                 bool WXUNUSED(underlined
), const wxString 
&facename 
) 
 423     wxChar 
*xfamily 
= (wxChar
*) NULL
; 
 424     wxChar 
*xstyle 
= (wxChar
*) NULL
; 
 425     wxChar 
*xweight 
= (wxChar
*) NULL
; 
 429         case wxDECORATIVE
: xfamily 
= _T("lucida"); break; 
 430         case wxROMAN
:      xfamily 
= _T("times");  break; 
 431         case wxMODERN
:     xfamily 
= _T("courier"); break; 
 432         case wxSWISS
:      xfamily 
= _T("helvetica"); break; 
 433         case wxTELETYPE
:   xfamily 
= _T("lucidatypewriter"); break; 
 434         case wxSCRIPT
:     xfamily 
= _T("utopia"); break; 
 435         default:           xfamily 
= _T("*"); 
 438     if (!facename
.IsEmpty()) 
 440         wxSprintf( wxBuffer
, _T("-*-%s-*-*-normal-*-*-*-*-*-*-*-*-*"), facename
.c_str() ); 
 441         GdkFont 
*test 
= gdk_font_load( wxConvCurrent
->cWX2MB(wxBuffer
) ); 
 444             gdk_font_unref( test 
); 
 445             xfamily 
= WXSTRINGCAST facename
; 
 451         case wxITALIC
:     xstyle 
= _T("i"); break; 
 452         case wxSLANT
:      xstyle 
= _T("o"); break; 
 453         case wxNORMAL
:     xstyle 
= _T("r"); break; 
 454         default:           xstyle 
= _T("*"); break; 
 458         case wxBOLD
:       xweight 
= _T("bold"); break; 
 460         case wxNORMAL
:     xweight 
= _T("medium"); break; 
 461         default:           xweight 
= _T("*"); break; 
 464     wxSprintf( wxBuffer
, _T("-*-%s-%s-%s-normal-*-*-%d-*-*-*-*-*-*"), 
 465         xfamily
, xweight
, xstyle
, pointSize
); 
 467     return gdk_font_load( wxConvCurrent
->cWX2MB(wxBuffer
) ); 
 470 static GdkFont 
*wxLoadQueryNearestFont( int point_size
, int family
, int style
, int weight
, 
 471                                         bool underlined
, const wxString 
&facename 
) 
 473     GdkFont 
*font 
= wxLoadQueryFont( point_size
, family
, style
, weight
, underlined
, facename 
); 
 477         /* search up and down by stepsize 10 */ 
 478         int max_size 
= point_size 
+ 20 * (1 + (point_size
/180)); 
 479         int min_size 
= point_size 
- 20 * (1 + (point_size
/180)); 
 483         /* Search for smaller size (approx.) */ 
 484         for (i
=point_size
-10; !font 
&& i 
>= 10 && i 
>= min_size
; i 
-= 10) 
 485             font 
= wxLoadQueryFont(i
, family
, style
, weight
, underlined
, facename 
); 
 487         /* Search for larger size (approx.) */ 
 488         for (i
=point_size
+10; !font 
&& i 
<= max_size
; i 
+= 10) 
 489             font 
= wxLoadQueryFont( i
, family
, style
, weight
, underlined
, facename 
); 
 491         /* Try default family */ 
 492         if (!font 
&& family 
!= wxDEFAULT
) 
 493             font 
= wxLoadQueryFont( point_size
, wxDEFAULT
, style
, weight
, underlined
, facename 
); 
 497             font 
= wxLoadQueryFont(120, wxDEFAULT
, wxNORMAL
, wxNORMAL
, underlined
, facename 
); 
 505 //----------------------------------------------------------------------------- 
 506 // face names and index functions 
 507 //----------------------------------------------------------------------------- 
 509 static char *font_defaults[] = { 
 510     "FamilyDefault", "Default", 
 511     "FamilyRoman", "Roman", 
 512     "FamilyDecorative", "Decorative", 
 513     "FamilyModern", "Modern", 
 514     "FamilyTeletype", "Teletype", 
 515     "FamilySwiss", "Swiss", 
 516     "FamilyScript", "Script", 
 522     "AfmItalic", "${AfmSlant}", 
 526     "AfmHelvetica", "Helv", 
 527     "AfmCourier", "Cour", 
 529     "Afm___", "${AfmTimes,$[weight],$[style]}", 
 531     "AfmTimes__", "${AfmTimes}${Afm$[weight]}${Afm$[style]}", 
 532     "AfmTimesMediumStraight", "${AfmTimes}${AfmRoman}", 
 533     "AfmTimesLightStraight", "${AfmTimes}${AfmRoman}", 
 534     "AfmTimes_Italic", "${AfmTimes}$[weight]${AfmItalic}", 
 535     "AfmTimes_Slant", "${AfmTimes}$[weight]${AfmItalic}", 
 537     "AfmSwiss__", "${AfmHelvetica}${Afm$[weight]}${Afm$[style]}", 
 538     "AfmModern__", "${AfmCourier}${Afm$[weight]}${Afm$[style]}", 
 540     "AfmTeletype__", "${AfmModern,$[weight],$[style]}", 
 542     "PostScriptMediumStraight", "", 
 543     "PostScriptMediumItalic", "-Oblique", 
 544     "PostScriptMediumSlant", "-Oblique", 
 545     "PostScriptLightStraight", "", 
 546     "PostScriptLightItalic", "-Oblique", 
 547     "PostScriptLightSlant", "-Oblique", 
 548     "PostScriptBoldStraight", "-Bold", 
 549     "PostScriptBoldItalic", "-BoldOblique", 
 550     "PostScriptBoldSlant", "-BoldOblique", 
 552 #if WX_NORMALIZED_PS_FONTS 
 553     "PostScript___", "${PostScriptTimes,$[weight],$[style]}", 
 555     "PostScriptRoman__", "${PostScriptTimes,$[weight],$[style]}", 
 556     "PostScript___", "LucidaSans${PostScript$[weight]$[style]}", 
 559     "PostScriptTimesMedium", "", 
 560     "PostScriptTimesLight", "", 
 561     "PostScriptTimesBold", "Bold", 
 563     "PostScriptTimes__", "Times${PostScript$[weight]$[style]}", 
 564     "PostScriptTimesMediumStraight", "Times-Roman", 
 565     "PostScriptTimesLightStraight", "Times-Roman", 
 566     "PostScriptTimes_Slant", "Times-${PostScriptTimes$[weight]}Italic", 
 567     "PostScriptTimes_Italic", "Times-${PostScriptTimes$[weight]}Italic", 
 569     "PostScriptSwiss__", "Helvetica${PostScript$[weight]$[style]}", 
 570     "PostScriptModern__", "Courier${PostScript$[weight]$[style]}", 
 572     "PostScriptTeletype__", "${PostScriptModern,$[weight],$[style]}", 
 574 #if !WX_NORMALIZED_PS_FONTS 
 575     "PostScriptScript__", "Zapf-Chancery-MediumItalic", 
 578     "ScreenMedium", "medium", 
 579     "ScreenBold", "bold", 
 580     "ScreenLight", "light", 
 581     "ScreenStraight", "r", 
 585     "ScreenDefaultBase", "*-times", 
 587     "ScreenRomanBase", "*-times", 
 588     "ScreenDecorativeBase", "*-helvetica", 
 589     "ScreenModernBase", "*-courier", 
 590     "ScreenTeletypeBase", "*-lucidatypewriter", 
 591     "ScreenSwissBase", "*-lucida", 
 592     "ScreenScriptBase", "*-zapfchancery", 
 594     "ScreenStdSuffix", "-${Screen$[weight]}-${Screen$[style]}" 
 595         "-normal-*-*-%d-*-*-*-*-*-*", 
 598     "-${ScreenDefaultBase}${ScreenStdSuffix}", 
 600     "-${ScreenRomanBase}${ScreenStdSuffix}", 
 601     "ScreenDecorative__", 
 602     "-${ScreenDecorativeBase}${ScreenStdSuffix}", 
 604     "-${ScreenModernBase}${ScreenStdSuffix}", 
 606     "-${ScreenTeletypeBase}${ScreenStdSuffix}", 
 608     "-${ScreenSwissBase}${ScreenStdSuffix}", 
 610     "-${ScreenScriptBase}${ScreenStdSuffix}", 
 614 enum {wxWEIGHT_NORMAL, wxWEIGHT_BOLD,  wxWEIGHT_LIGHT, wxNUM_WEIGHTS}; 
 615 enum {wxSTYLE_NORMAL,  wxSTYLE_ITALIC, wxSTYLE_SLANT,  wxNUM_STYLES}; 
 617 static int WCoordinate(int w) 
 621         case wxBOLD:   return wxWEIGHT_BOLD; 
 622         case wxLIGHT:  return wxWEIGHT_LIGHT; 
 624         default:       return wxWEIGHT_NORMAL; 
 628 static int SCoordinate(int s) 
 632         case wxITALIC: return wxSTYLE_ITALIC; 
 633         case wxSLANT:  return wxSTYLE_SLANT; 
 635         default:       return wxSTYLE_NORMAL; 
 639 //----------------------------------------------------------------------------- 
 641 //----------------------------------------------------------------------------- 
 648     inline char *GetName(int weight, int style) 
 650         return ( map [WCoordinate(weight)] [SCoordinate(style)] ); 
 653     char *map[wxNUM_WEIGHTS][wxNUM_STYLES]; 
 654     void Initialize(const char *, const char *); 
 657 static void SearchResource(const char *prefix, const char **names, int count, char **v) 
 660     char resource[1024], **defaults, *internal; 
 665     internal = (char *) NULL; 
 667     for (i = 0; i < k; i++) 
 669         strcpy(resource, prefix); 
 670         for (j = 0; j < count; j++) 
 672             // upon failure to find a matching fontname 
 673             //   in the default fonts above, we substitute more 
 674             //   and more values by _ so that at last ScreenMyFontBoldNormal 
 675             //   would turn into Screen___ and this will then get 
 676             //   converted to -${ScreenDefaultBase}${ScreenStdSuffix} 
 679                 strcat(resource, names[j]); 
 681                 strcat(resource, "_"); 
 684         // we previously search the Xt-resources here 
 688             defaults = font_defaults; 
 691                 if (!strcmp(*defaults, resource)) 
 693                     internal = defaults[1]; 
 703         if ((strcmp(internal,"-${ScreenDefaultBase}${ScreenStdSuffix}") == 0) && 
 704             (strcmp(names[0], "Default") != 0)) 
 706             // we did not find any font name in the standard list. 
 707             //   this can (hopefully does) mean that someone supplied 
 708             //   the facename in the wxFont constructor so we insert 
 711             strcpy( resource,"-*-" );                  // any producer 
 712             strcat( resource, names[0] );              // facename 
 713             strcat( resource, "${ScreenStdSuffix}" );  // add size params later on 
 714             *v = copystring(resource); 
 718             *v = copystring(internal); 
 723 wxSuffixMap::~wxSuffixMap() 
 727     for (k = 0; k < wxNUM_WEIGHTS; ++k) 
 728         for (j = 0; j < wxNUM_STYLES; ++j) 
 732                 map[k][j] = (char *) NULL; 
 736 void wxSuffixMap::Initialize(const char *resname, const char *devresname) 
 738     const char *weight, *style; 
 741     const char *names[3]; 
 743     for (k = 0; k < wxNUM_WEIGHTS; k++) 
 747             case wxWEIGHT_NORMAL: weight = "Medium"; break; 
 748             case wxWEIGHT_LIGHT:  weight = "Light"; break; 
 750             default:              weight = "Bold"; 
 752         for (j = 0; j < wxNUM_STYLES; j++) 
 756                 case wxSTYLE_NORMAL: style = "Straight"; break; 
 757                 case wxSTYLE_ITALIC: style = "Italic"; break; 
 759                 default:         style = "Slant"; 
 765             SearchResource(devresname, names, 3, &v); 
 767             // Expand macros in the found string: 
 769             int len, closer = 0, startpos = 0; 
 771             len = (v ? strlen(v) : 0); 
 772             for (i = 0; i < len; i++) 
 774                 if (v[i] == '$' && ((v[i+1] == '[') || (v[i+1] == '{'))) 
 777                     closer   = (v[i+1] == '[') ? ']' : '}'; 
 780                 else if (v[i] == closer) 
 783                     const char *r = (char *) NULL; bool delete_r = FALSE; 
 786                     name = v + startpos + 2; 
 794                         for (i = 0, count = 1; name[i]; i++) 
 800                         names = new char*[count]; 
 802                         for (i = 0, count = 1; i < len; i++) 
 805                                 names[count++] = name + i + 1; 
 809                         SearchResource("", (const char **)names, count, (char **)&r); 
 815                             for (i = 0; i < len; i++) 
 819                             wxLogError( "Bad resource name in font lookup." ); 
 821                     } else if (!strcmp(name, "weight")) { 
 823                     } else if (!strcmp(name, "style")) { 
 825                     } else if (!strcmp(name, "family")) { 
 829                         wxLogError( "Bad font macro name." ); 
 833                     newstrlen = strlen(r); 
 834                     char *naya = new char[startpos + newstrlen + len - i]; 
 835                     memcpy(naya, v, startpos); 
 836                     memcpy(naya + startpos, r, newstrlen); 
 837                     memcpy(naya + startpos + newstrlen, v + i + 1, len - i); 
 846             // We have a final value: 
 852 //----------------------------------------------------------------------------- 
 854 //----------------------------------------------------------------------------- 
 856 class wxFontNameItem : public wxObject 
 858     DECLARE_DYNAMIC_CLASS(wxFontNameItem) 
 860         wxFontNameItem(const char *name, int id, int family); 
 863         inline char* GetScreenName(int w, int s)     {return screen.GetName(w, s);} 
 864         inline char* GetPostScriptName(int w, int s) {return printing.GetName(w, s);} 
 865         inline char* GetAFMName(int w, int s)        {return afm.GetName(w, s);} 
 866         inline char* GetName()                   {return name;} 
 867         inline int   GetFamily()                 {return family;} 
 868         inline int   GetId()                     {return id;} 
 869         inline bool  IsRoman()                   {return isroman;} 
 870 #if defined(__WXDEBUG__) 
 871         void Dump(ostream& str); 
 877         wxSuffixMap screen, printing, afm; 
 881 IMPLEMENT_ABSTRACT_CLASS(wxFontNameItem, wxObject) 
 883 wxFontNameItem::wxFontNameItem(const char *Name, int Id, int Family) 
 885     name   = copystring(Name); 
 889     screen.  Initialize(name, "Screen"); 
 890     printing.Initialize(name, "PostScript"); 
 891     afm.     Initialize(name, "Afm"); 
 894 wxFontNameItem::~wxFontNameItem() 
 898     name = (char *) NULL; 
 901 #if defined(__WXDEBUG__) 
 902 void wxFontNameItem::Dump(ostream& str) 
 904     str << "wxFontNameItem(" << name << ")"; 
 908 //----------------------------------------------------------------------------- 
 910 //----------------------------------------------------------------------------- 
 912 IMPLEMENT_DYNAMIC_CLASS(wxFontNameDirectory, wxObject) 
 914 wxFontNameDirectory::wxFontNameDirectory() 
 916     table = new wxHashTable(wxKEY_INTEGER, 20); 
 920 wxFontNameDirectory::~wxFontNameDirectory() 
 922     // Cleanup wxFontNameItems allocated 
 924     wxNode *node = table->Next(); 
 927         wxFontNameItem *item = (wxFontNameItem*)node->Data(); 
 929         node = table->Next(); 
 934 int wxFontNameDirectory::GetNewFontId() 
 936     return (nextFontId--); 
 939 void wxFontNameDirectory::Initialize() 
 941     Initialize(wxDEFAULT,    wxDEFAULT,    "Default"); 
 942     Initialize(wxDECORATIVE, wxDECORATIVE, "Decorative"); 
 943     Initialize(wxROMAN,      wxROMAN,      "Roman"); 
 944     Initialize(wxMODERN,     wxMODERN,     "Modern"); 
 945     Initialize(wxTELETYPE,   wxTELETYPE,   "Teletype"); 
 946     Initialize(wxSWISS,      wxSWISS,      "Swiss"); 
 947     Initialize(wxSCRIPT,     wxSCRIPT,     "Script"); 
 950 void wxFontNameDirectory::Initialize(int fontid, int family, const char *resname) 
 952     char *fam, resource[256]; 
 954     sprintf(resource, "Family%s", resname); 
 955     SearchResource((const char *)resource, (const char **) NULL, 0, (char **)&fam); 
 959         if      (!strcmp(fam, "Default"))    family = wxDEFAULT; 
 960         else if (!strcmp(fam, "Roman"))        family = wxROMAN; 
 961         else if (!strcmp(fam, "Decorative"))    family = wxDECORATIVE; 
 962         else if (!strcmp(fam, "Modern"))    family = wxMODERN; 
 963         else if (!strcmp(fam, "Teletype"))    family = wxTELETYPE; 
 964         else if (!strcmp(fam, "Swiss"))        family = wxSWISS; 
 965         else if (!strcmp(fam, "Script"))    family = wxSCRIPT; 
 966         delete[] fam; // free resource 
 968     table->Put(fontid, new wxFontNameItem(resname, fontid, family)); 
 971 int wxFontNameDirectory::FindOrCreateFontId(const char *name, int family) 
 975     // font exists -> return id 
 976     if ( (id = GetFontId(name)) ) return id; 
 979     Initialize(id=GetNewFontId(), family, name); 
 983 char *wxFontNameDirectory::GetScreenName(int fontid, int weight, int style) 
 985     wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font 
 987         return item->GetScreenName(weight, style); 
 989     // font does not exist 
 990     return (char *) NULL; 
 993 char *wxFontNameDirectory::GetPostScriptName(int fontid, int weight, int style) 
 995     wxFontNameItem *item = (wxFontNameItem*)table->Get(fontid); // find font 
 997         return item->GetPostScriptName(weight, style); 
 999     // font does not exist 
1000     return (char *) NULL; 
1003 char *wxFontNameDirectory::GetAFMName(int fontid, int weight, int style) 
1005     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font 
1007         return item->GetAFMName(weight, style); 
1008     // font does not exist 
1009     return (char *) NULL; 
1012 char *wxFontNameDirectory::GetFontName(int fontid) 
1014     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); // find font 
1016         return item->GetName(); 
1018     // font does not exist 
1019     return (char *) NULL; 
1022 int wxFontNameDirectory::GetFontId(const char *name) 
1028     while ( (node = table->Next()) ) 
1030         wxFontNameItem *item = (wxFontNameItem*)node->Data(); 
1031         if (!strcmp(name, item->name)) 
1035     // font does not exist 
1039 int wxFontNameDirectory::GetFamily(int fontid) 
1041     wxFontNameItem *item = (wxFontNameItem *)table->Get(fontid); 
1044         return item->family; 
1046     // font does not exist