1 ///////////////////////////////////////////////////////////////////////////// 
   2 // Name:        src/common/gdicmn.cpp 
   3 // Purpose:     Common GDI classes 
   4 // Author:      Julian Smart 
   8 // Copyright:   (c) Julian Smart 
   9 // Licence:     wxWindows licence 
  10 ///////////////////////////////////////////////////////////////////////////// 
  12 // For compilers that support precompilation, includes "wx.h". 
  13 #include "wx/wxprec.h" 
  19 #include "wx/gdicmn.h" 
  20 #include "wx/gdiobj.h" 
  26     #include "wx/palette.h" 
  28     #include "wx/iconbndl.h" 
  29     #include "wx/cursor.h" 
  30     #include "wx/settings.h" 
  31     #include "wx/bitmap.h" 
  32     #include "wx/colour.h" 
  38 IMPLEMENT_ABSTRACT_CLASS(wxGDIObject
, wxObject
) 
  41 WXDLLIMPEXP_DATA_CORE(wxBrushList
*) wxTheBrushList
; 
  42 WXDLLIMPEXP_DATA_CORE(wxFontList
*)  wxTheFontList
; 
  43 WXDLLIMPEXP_DATA_CORE(wxPenList
*)   wxThePenList
; 
  45 WXDLLIMPEXP_DATA_CORE(wxColourDatabase
*) wxTheColourDatabase
; 
  47 WXDLLIMPEXP_DATA_CORE(wxBitmap
)  wxNullBitmap
; 
  48 WXDLLIMPEXP_DATA_CORE(wxBrush
)   wxNullBrush
; 
  49 WXDLLIMPEXP_DATA_CORE(wxColour
)  wxNullColour
; 
  50 WXDLLIMPEXP_DATA_CORE(wxCursor
)  wxNullCursor
; 
  51 WXDLLIMPEXP_DATA_CORE(wxFont
)    wxNullFont
; 
  52 WXDLLIMPEXP_DATA_CORE(wxIcon
)    wxNullIcon
; 
  53 WXDLLIMPEXP_DATA_CORE(wxPen
)     wxNullPen
; 
  55 WXDLLIMPEXP_DATA_CORE(wxPalette
) wxNullPalette
; 
  57 WXDLLIMPEXP_DATA_CORE(wxIconBundle
) wxNullIconBundle
; 
  59 const wxSize 
wxDefaultSize(wxDefaultCoord
, wxDefaultCoord
); 
  60 const wxPoint 
wxDefaultPosition(wxDefaultCoord
, wxDefaultCoord
); 
  62 #include "wx/listimpl.cpp" 
  63 WX_DEFINE_LIST(wxPointList
) 
  66 #if wxUSE_EXTENDED_RTTI 
  70 template<> void wxStringReadValue(const wxString 
&s 
, wxPoint 
&data 
) 
  72     wxSscanf(s
, wxT("%d,%d"), &data
.x 
, &data
.y 
) ; 
  75 template<> void wxStringWriteValue(wxString 
&s 
, const wxPoint 
&data 
) 
  77     s 
= wxString::Format(wxT("%d,%d"), data
.x 
, data
.y 
) ; 
  80 wxCUSTOM_TYPE_INFO(wxPoint
, wxToStringConverter
<wxPoint
> , wxFromStringConverter
<wxPoint
>) 
  82 template<> void wxStringReadValue(const wxString 
&s 
, wxSize 
&data 
) 
  84     wxSscanf(s
, wxT("%d,%d"), &data
.x 
, &data
.y 
) ; 
  87 template<> void wxStringWriteValue(wxString 
&s 
, const wxSize 
&data 
) 
  89     s 
= wxString::Format(wxT("%d,%d"), data
.x 
, data
.y 
) ; 
  92 wxCUSTOM_TYPE_INFO(wxSize
, wxToStringConverter
<wxSize
> , wxFromStringConverter
<wxSize
>) 
  96 wxRect::wxRect(const wxPoint
& point1
, const wxPoint
& point2
) 
 100     width 
= point2
.x 
- point1
.x
; 
 101     height 
= point2
.y 
- point1
.y
; 
 118 wxRect
& wxRect::Union(const wxRect
& rect
) 
 120     // ignore empty rectangles: union with an empty rectangle shouldn't extend 
 121     // this one to (0, 0) 
 122     if ( !width 
|| !height 
) 
 126     else if ( rect
.width 
&& rect
.height 
) 
 128         int x1 
= wxMin(x
, rect
.x
); 
 129         int y1 
= wxMin(y
, rect
.y
); 
 130         int y2 
= wxMax(y 
+ height
, rect
.height 
+ rect
.y
); 
 131         int x2 
= wxMax(x 
+ width
, rect
.width 
+ rect
.x
); 
 138     //else: we're not empty and rect is empty 
 143 wxRect
& wxRect::Inflate(wxCoord dx
, wxCoord dy
) 
 147          // Don't allow deflate to eat more width than we have, 
 148          // a well-defined rectangle cannot have negative width. 
 154          // The inflate is valid. 
 161          // Don't allow deflate to eat more height than we have, 
 162          // a well-defined rectangle cannot have negative height. 
 168          // The inflate is valid. 
 176 bool wxRect::Contains(int cx
, int cy
) const 
 178     return ( (cx 
>= x
) && (cy 
>= y
) 
 179           && ((cy 
- y
) < height
) 
 180           && ((cx 
- x
) < width
) 
 184 bool wxRect::Contains(const wxRect
& rect
) const 
 186     return Contains(rect
.GetTopLeft()) && Contains(rect
.GetBottomRight()); 
 189 wxRect
& wxRect::Intersect(const wxRect
& rect
) 
 198     if ( x2 
> rect
.GetRight() ) 
 199         x2 
= rect
.GetRight(); 
 200     if ( y2 
> rect
.GetBottom() ) 
 201         y2 
= rect
.GetBottom(); 
 206     if ( width 
<= 0 || height 
<= 0 ) 
 215 bool wxRect::Intersects(const wxRect
& rect
) const 
 217     wxRect r 
= Intersect(rect
); 
 219     // if there is no intersection, both width and height are 0 
 223 wxRect
& wxRect::operator+=(const wxRect
& rect
) 
 225     *this = *this + rect
; 
 230 wxRect
& wxRect::operator*=(const wxRect
& rect
) 
 232     *this = *this * rect
; 
 237 wxRect 
operator+(const wxRect
& r1
, const wxRect
& r2
) 
 239     int x1 
= wxMin(r1
.x
, r2
.x
); 
 240     int y1 
= wxMin(r1
.y
, r2
.y
); 
 241     int y2 
= wxMax(r1
.y
+r1
.height
, r2
.height
+r2
.y
); 
 242     int x2 
= wxMax(r1
.x
+r1
.width
, r2
.width
+r2
.x
); 
 243     return wxRect(x1
, y1
, x2
-x1
, y2
-y1
); 
 246 wxRect 
operator*(const wxRect
& r1
, const wxRect
& r2
) 
 248     int x1 
= wxMax(r1
.x
, r2
.x
); 
 249     int y1 
= wxMax(r1
.y
, r2
.y
); 
 250     int y2 
= wxMin(r1
.y
+r1
.height
, r2
.height
+r2
.y
); 
 251     int x2 
= wxMin(r1
.x
+r1
.width
, r2
.width
+r2
.x
); 
 252     return wxRect(x1
, y1
, x2
-x1
, y2
-y1
); 
 255 // ============================================================================ 
 257 // ============================================================================ 
 259 // ---------------------------------------------------------------------------- 
 260 // wxColourDatabase ctor/dtor 
 261 // ---------------------------------------------------------------------------- 
 263 wxColourDatabase::wxColourDatabase () 
 265     // will be created on demand in Initialize() 
 269 wxColourDatabase::~wxColourDatabase () 
 273         WX_CLEAR_HASH_MAP(wxStringToColourHashMap
, *m_map
); 
 279     delete [] m_palTable
; 
 283 // Colour database stuff 
 284 void wxColourDatabase::Initialize() 
 288         // already initialized 
 292     m_map 
= new wxStringToColourHashMap
; 
 294     static const struct wxColourDesc
 
 301         {wxT("AQUAMARINE"),112, 219, 147}, 
 302         {wxT("BLACK"),0, 0, 0}, 
 303         {wxT("BLUE"), 0, 0, 255}, 
 304         {wxT("BLUE VIOLET"), 159, 95, 159}, 
 305         {wxT("BROWN"), 165, 42, 42}, 
 306         {wxT("CADET BLUE"), 95, 159, 159}, 
 307         {wxT("CORAL"), 255, 127, 0}, 
 308         {wxT("CORNFLOWER BLUE"), 66, 66, 111}, 
 309         {wxT("CYAN"), 0, 255, 255}, 
 310         {wxT("DARK GREY"), 47, 47, 47},   // ? 
 312         {wxT("DARK GREEN"), 47, 79, 47}, 
 313         {wxT("DARK OLIVE GREEN"), 79, 79, 47}, 
 314         {wxT("DARK ORCHID"), 153, 50, 204}, 
 315         {wxT("DARK SLATE BLUE"), 107, 35, 142}, 
 316         {wxT("DARK SLATE GREY"), 47, 79, 79}, 
 317         {wxT("DARK TURQUOISE"), 112, 147, 219}, 
 318         {wxT("DIM GREY"), 84, 84, 84}, 
 319         {wxT("FIREBRICK"), 142, 35, 35}, 
 320         {wxT("FOREST GREEN"), 35, 142, 35}, 
 321         {wxT("GOLD"), 204, 127, 50}, 
 322         {wxT("GOLDENROD"), 219, 219, 112}, 
 323         {wxT("GREY"), 128, 128, 128}, 
 324         {wxT("GREEN"), 0, 255, 0}, 
 325         {wxT("GREEN YELLOW"), 147, 219, 112}, 
 326         {wxT("INDIAN RED"), 79, 47, 47}, 
 327         {wxT("KHAKI"), 159, 159, 95}, 
 328         {wxT("LIGHT BLUE"), 191, 216, 216}, 
 329         {wxT("LIGHT GREY"), 192, 192, 192}, 
 330         {wxT("LIGHT STEEL BLUE"), 143, 143, 188}, 
 331         {wxT("LIME GREEN"), 50, 204, 50}, 
 332         {wxT("LIGHT MAGENTA"), 255, 0, 255}, 
 333         {wxT("MAGENTA"), 255, 0, 255}, 
 334         {wxT("MAROON"), 142, 35, 107}, 
 335         {wxT("MEDIUM AQUAMARINE"), 50, 204, 153}, 
 336         {wxT("MEDIUM GREY"), 100, 100, 100}, 
 337         {wxT("MEDIUM BLUE"), 50, 50, 204}, 
 338         {wxT("MEDIUM FOREST GREEN"), 107, 142, 35}, 
 339         {wxT("MEDIUM GOLDENROD"), 234, 234, 173}, 
 340         {wxT("MEDIUM ORCHID"), 147, 112, 219}, 
 341         {wxT("MEDIUM SEA GREEN"), 66, 111, 66}, 
 342         {wxT("MEDIUM SLATE BLUE"), 127, 0, 255}, 
 343         {wxT("MEDIUM SPRING GREEN"), 127, 255, 0}, 
 344         {wxT("MEDIUM TURQUOISE"), 112, 219, 219}, 
 345         {wxT("MEDIUM VIOLET RED"), 219, 112, 147}, 
 346         {wxT("MIDNIGHT BLUE"), 47, 47, 79}, 
 347         {wxT("NAVY"), 35, 35, 142}, 
 348         {wxT("ORANGE"), 204, 50, 50}, 
 349         {wxT("ORANGE RED"), 255, 0, 127}, 
 350         {wxT("ORCHID"), 219, 112, 219}, 
 351         {wxT("PALE GREEN"), 143, 188, 143}, 
 352         {wxT("PINK"), 255, 192, 203}, 
 353         {wxT("PLUM"), 234, 173, 234}, 
 354         {wxT("PURPLE"), 176, 0, 255}, 
 355         {wxT("RED"), 255, 0, 0}, 
 356         {wxT("SALMON"), 111, 66, 66}, 
 357         {wxT("SEA GREEN"), 35, 142, 107}, 
 358         {wxT("SIENNA"), 142, 107, 35}, 
 359         {wxT("SKY BLUE"), 50, 153, 204}, 
 360         {wxT("SLATE BLUE"), 0, 127, 255}, 
 361         {wxT("SPRING GREEN"), 0, 255, 127}, 
 362         {wxT("STEEL BLUE"), 35, 107, 142}, 
 363         {wxT("TAN"), 219, 147, 112}, 
 364         {wxT("THISTLE"), 216, 191, 216}, 
 365         {wxT("TURQUOISE"), 173, 234, 234}, 
 366         {wxT("VIOLET"), 79, 47, 79}, 
 367         {wxT("VIOLET RED"), 204, 50, 153}, 
 368         {wxT("WHEAT"), 216, 216, 191}, 
 369         {wxT("WHITE"), 255, 255, 255}, 
 370         {wxT("YELLOW"), 255, 255, 0}, 
 371         {wxT("YELLOW GREEN"), 153, 204, 50} 
 376     for ( n 
= 0; n 
< WXSIZEOF(wxColourTable
); n
++ ) 
 378         const wxColourDesc
& cc 
= wxColourTable
[n
]; 
 379         (*m_map
)[cc
.name
] = new wxColour(cc
.r
, cc
.g
, cc
.b
); 
 383     m_palTable 
= new long[n
]; 
 384     for ( n 
= 0; n 
< WXSIZEOF(wxColourTable
); n
++ ) 
 386         const wxColourDesc
& cc 
= wxColourTable
[n
]; 
 387         m_palTable
[n
] = OS2RGB(cc
.r
,cc
.g
,cc
.b
); 
 393 // ---------------------------------------------------------------------------- 
 394 // wxColourDatabase operations 
 395 // ---------------------------------------------------------------------------- 
 397 void wxColourDatabase::AddColour(const wxString
& name
, const wxColour
& colour
) 
 401     // canonicalize the colour names before using them as keys: they should be 
 403     wxString colName 
= name
; 
 406     // ... and we also allow both grey/gray 
 407     wxString colNameAlt 
= colName
; 
 408     if ( !colNameAlt
.Replace(_T("GRAY"), _T("GREY")) ) 
 410         // but in this case it is not necessary so avoid extra search below 
 414     wxStringToColourHashMap::iterator it 
= m_map
->find(colName
); 
 415     if ( it 
== m_map
->end() && !colNameAlt
.empty() ) 
 416         it 
= m_map
->find(colNameAlt
); 
 417     if ( it 
!= m_map
->end() ) 
 419         *(it
->second
) = colour
; 
 423         (*m_map
)[colName
] = new wxColour(colour
); 
 427 wxColour 
wxColourDatabase::Find(const wxString
& colour
) const 
 429     wxColourDatabase 
* const self 
= wxConstCast(this, wxColourDatabase
); 
 432     // make the comparaison case insensitive and also match both grey and gray 
 433     wxString colName 
= colour
; 
 435     wxString colNameAlt 
= colName
; 
 436     if ( !colNameAlt
.Replace(_T("GRAY"), _T("GREY")) ) 
 439     wxStringToColourHashMap::iterator it 
= m_map
->find(colName
); 
 440     if ( it 
== m_map
->end() && !colNameAlt
.empty() ) 
 441         it 
= m_map
->find(colNameAlt
); 
 442     if ( it 
!= m_map
->end() ) 
 443         return *(it
->second
); 
 445     // we did not find any result in existing colours: 
 446     // we won't use wxString -> wxColour conversion because the 
 447     // wxColour::Set(const wxString &) function which does that conversion 
 448     // internally uses this function (wxColourDatabase::Find) and we want 
 449     // to avoid infinite recursion ! 
 453 wxString 
wxColourDatabase::FindName(const wxColour
& colour
) const 
 455     wxColourDatabase 
* const self 
= wxConstCast(this, wxColourDatabase
); 
 458     typedef wxStringToColourHashMap::iterator iterator
; 
 460     for ( iterator it 
= m_map
->begin(), en 
= m_map
->end(); it 
!= en
; ++it 
) 
 462         if ( *(it
->second
) == colour 
) 
 466     return wxEmptyString
; 
 469 // ---------------------------------------------------------------------------- 
 470 // deprecated wxColourDatabase methods 
 471 // ---------------------------------------------------------------------------- 
 473 #if WXWIN_COMPATIBILITY_2_6 
 474 wxColour 
*wxColourDatabase::FindColour(const wxString
& name
) 
 476     // This function is deprecated, use Find() instead. 
 477     // Formerly this function sometimes would return a deletable pointer and 
 478     // sometimes a non-deletable one (when returning a colour from the database). 
 479     // Trying to delete the latter anyway results in problems, so probably 
 480     // nobody ever freed the pointers. Currently it always returns a new 
 481     // instance, which means there will be memory leaks. 
 482     wxLogDebug(wxT("wxColourDataBase::FindColour():") 
 483         wxT(" Please use wxColourDataBase::Find() instead")); 
 485     // using a static variable here is not the most elegant solution but unless 
 486     // we want to make wxStringToColourHashMap public (i.e. move it to the 
 487     // header) so that we could have a member function returning 
 488     // wxStringToColourHashMap::iterator, there is really no good way to do it 
 491     // and knowing that this function is going to disappear in the next release 
 492     // anyhow I don't want to waste time on this 
 494     static wxColour s_col
; 
 500     return new wxColour(s_col
); 
 502 #endif // WXWIN_COMPATIBILITY_2_6 
 504 // ============================================================================ 
 506 // ============================================================================ 
 508 static wxStockGDI gs_wxStockGDI_instance
; 
 509 wxStockGDI
* wxStockGDI::ms_instance 
= &gs_wxStockGDI_instance
; 
 510 wxObject
* wxStockGDI::ms_stockObject
[ITEMCOUNT
]; 
 512 wxStockGDI::wxStockGDI() 
 516 wxStockGDI::~wxStockGDI() 
 520 void wxStockGDI::DeleteAll() 
 522     for (unsigned i 
= 0; i 
< ITEMCOUNT
; i
++) 
 524         delete ms_stockObject
[i
]; 
 525         ms_stockObject
[i
] = NULL
; 
 529 const wxBrush
* wxStockGDI::GetBrush(Item item
) 
 531     wxBrush
* brush 
= static_cast<wxBrush
*>(ms_stockObject
[item
]); 
 537             brush 
= new wxBrush(*GetColour(COLOUR_BLACK
), wxBRUSHSTYLE_SOLID
); 
 540             brush 
= new wxBrush(*GetColour(COLOUR_BLUE
), wxBRUSHSTYLE_SOLID
); 
 543             brush 
= new wxBrush(*GetColour(COLOUR_CYAN
), wxBRUSHSTYLE_SOLID
); 
 546             brush 
= new wxBrush(*GetColour(COLOUR_GREEN
), wxBRUSHSTYLE_SOLID
); 
 549             brush 
= new wxBrush(wxColour(wxT("GREY")), wxBRUSHSTYLE_SOLID
); 
 551         case BRUSH_LIGHTGREY
: 
 552             brush 
= new wxBrush(*GetColour(COLOUR_LIGHTGREY
), wxBRUSHSTYLE_SOLID
); 
 554         case BRUSH_MEDIUMGREY
: 
 555             brush 
= new wxBrush(wxColour(wxT("MEDIUM GREY")), wxBRUSHSTYLE_SOLID
); 
 558             brush 
= new wxBrush(*GetColour(COLOUR_RED
), wxBRUSHSTYLE_SOLID
); 
 560         case BRUSH_TRANSPARENT
: 
 561             brush 
= new wxBrush(*GetColour(COLOUR_BLACK
), wxBRUSHSTYLE_TRANSPARENT
); 
 564             brush 
= new wxBrush(*GetColour(COLOUR_WHITE
), wxBRUSHSTYLE_SOLID
); 
 569         ms_stockObject
[item
] = brush
; 
 574 const wxColour
* wxStockGDI::GetColour(Item item
) 
 576     wxColour
* colour 
= static_cast<wxColour
*>(ms_stockObject
[item
]); 
 582             colour 
= new wxColour(0, 0, 0); 
 585             colour 
= new wxColour(0, 0, 255); 
 588             colour 
= new wxColour(wxT("CYAN")); 
 591             colour 
= new wxColour(0, 255, 0); 
 593         case COLOUR_LIGHTGREY
: 
 594             colour 
= new wxColour(wxT("LIGHT GREY")); 
 597             colour 
= new wxColour(255, 0, 0); 
 600             colour 
= new wxColour(255, 255, 255); 
 605         ms_stockObject
[item
] = colour
; 
 610 const wxCursor
* wxStockGDI::GetCursor(Item item
) 
 612     wxCursor
* cursor 
= static_cast<wxCursor
*>(ms_stockObject
[item
]); 
 618             cursor 
= new wxCursor(wxCURSOR_CROSS
); 
 620         case CURSOR_HOURGLASS
: 
 621             cursor 
= new wxCursor(wxCURSOR_WAIT
); 
 623         case CURSOR_STANDARD
: 
 624             cursor 
= new wxCursor(wxCURSOR_ARROW
); 
 629         ms_stockObject
[item
] = cursor
; 
 634 const wxFont
* wxStockGDI::GetFont(Item item
) 
 636     wxFont
* font 
= static_cast<wxFont
*>(ms_stockObject
[item
]); 
 642             font 
= new wxFont(GetFont(FONT_NORMAL
)->GetPointSize(), wxROMAN
, wxITALIC
, wxNORMAL
); 
 645             font 
= new wxFont(wxSystemSettings::GetFont(wxSYS_DEFAULT_GUI_FONT
)); 
 648             font 
= new wxFont(GetFont(FONT_NORMAL
)->GetPointSize() - 2, wxSWISS
, wxNORMAL
, wxNORMAL
); 
 651             font 
= new wxFont(GetFont(FONT_NORMAL
)->GetPointSize(), wxSWISS
, wxNORMAL
, wxNORMAL
); 
 656         ms_stockObject
[item
] = font
; 
 661 const wxPen
* wxStockGDI::GetPen(Item item
) 
 663     wxPen
* pen 
= static_cast<wxPen
*>(ms_stockObject
[item
]); 
 669             pen 
= new wxPen(*GetColour(COLOUR_BLACK
), 1, wxPENSTYLE_SOLID
); 
 671         case PEN_BLACKDASHED
: 
 672             pen 
= new wxPen(*GetColour(COLOUR_BLACK
), 1, wxPENSTYLE_SHORT_DASH
); 
 675             pen 
= new wxPen(*GetColour(COLOUR_CYAN
), 1, wxPENSTYLE_SOLID
); 
 678             pen 
= new wxPen(*GetColour(COLOUR_GREEN
), 1, wxPENSTYLE_SOLID
); 
 681             pen 
= new wxPen(wxColour(wxT("GREY")), 1, wxPENSTYLE_SOLID
); 
 684             pen 
= new wxPen(*GetColour(COLOUR_LIGHTGREY
), 1, wxPENSTYLE_SOLID
); 
 687             pen 
= new wxPen(wxColour(wxT("MEDIUM GREY")), 1, wxPENSTYLE_SOLID
); 
 690             pen 
= new wxPen(*GetColour(COLOUR_RED
), 1, wxPENSTYLE_SOLID
); 
 692         case PEN_TRANSPARENT
: 
 693             pen 
= new wxPen(*GetColour(COLOUR_BLACK
), 1, wxPENSTYLE_TRANSPARENT
); 
 696             pen 
= new wxPen(*GetColour(COLOUR_WHITE
), 1, wxPENSTYLE_SOLID
); 
 701         ms_stockObject
[item
] = pen
; 
 706 void wxInitializeStockLists() 
 708     wxTheColourDatabase 
= new wxColourDatabase
; 
 710     wxTheBrushList 
= new wxBrushList
; 
 711     wxThePenList 
= new wxPenList
; 
 712     wxTheFontList 
= new wxFontList
; 
 715 void wxDeleteStockLists() 
 717     wxDELETE(wxTheBrushList
); 
 718     wxDELETE(wxThePenList
); 
 719     wxDELETE(wxTheFontList
); 
 722 // ============================================================================ 
 723 // wxTheXXXList stuff (semi-obsolete) 
 724 // ============================================================================ 
 726 wxGDIObjListBase::wxGDIObjListBase() 
 730 wxGDIObjListBase::~wxGDIObjListBase() 
 732     for (wxList::compatibility_iterator node 
= list
.GetFirst(); node
; node 
= node
->GetNext()) 
 734         delete static_cast<wxObject
*>(node
->GetData()); 
 738 wxPen 
*wxPenList::FindOrCreatePen (const wxColour
& colour
, int width
, wxPenStyle style
) 
 740     for ( wxList::compatibility_iterator node 
= list
.GetFirst(); 
 742           node 
= node
->GetNext() ) 
 744         wxPen 
* const pen 
= (wxPen 
*) node
->GetData(); 
 745         if ( pen
->GetWidth () == width 
&& 
 746                 pen
->GetStyle () == style 
&& 
 747                     pen
->GetColour() == colour 
) 
 752     wxPen 
penTmp(colour
, width
, style
); 
 755         pen 
= new wxPen(penTmp
); 
 762 wxBrush 
*wxBrushList::FindOrCreateBrush (const wxColour
& colour
, wxBrushStyle style
) 
 764     for ( wxList::compatibility_iterator node 
= list
.GetFirst(); 
 766           node 
= node
->GetNext() ) 
 768         wxBrush 
* const brush 
= (wxBrush 
*) node
->GetData (); 
 769         if ( brush
->GetStyle() == style 
&& brush
->GetColour() == colour 
) 
 773     wxBrush
* brush 
= NULL
; 
 774     wxBrush 
brushTmp(colour
, style
); 
 777         brush 
= new wxBrush(brushTmp
); 
 784 wxFont 
*wxFontList::FindOrCreateFont(int pointSize
, 
 789                                      const wxString
& facename
, 
 790                                      wxFontEncoding encoding
) 
 793     wxList::compatibility_iterator node
; 
 794     for (node 
= list
.GetFirst(); node
; node 
= node
->GetNext()) 
 796         font 
= (wxFont 
*)node
->GetData(); 
 798              font
->GetPointSize () == pointSize 
&& 
 799              font
->GetStyle () == style 
&& 
 800              font
->GetWeight () == weight 
&& 
 801              font
->GetUnderlined () == underline 
) 
 803             wxFontFamily fontFamily 
= (wxFontFamily
)font
->GetFamily(); 
 805 #if defined(__WXGTK__) 
 806             // under GTK the default family is wxSWISS, so looking for a font 
 807             // with wxDEFAULT family should return a wxSWISS one instead of 
 808             // creating a new one 
 809             bool same 
= (fontFamily 
== family
) || 
 810                         (fontFamily 
== wxFONTFAMILY_SWISS 
&& family 
== wxFONTFAMILY_DEFAULT
); 
 812             // VZ: but why elsewhere do we require an exact match? mystery... 
 813             bool same 
= fontFamily 
== family
; 
 816             // empty facename matches anything at all: this is bad because 
 817             // depending on which fonts are already created, we might get back 
 818             // a different font if we create it with empty facename, but it is 
 819             // still better than never matching anything in the cache at all 
 821             if ( same 
&& !facename
.empty() ) 
 823                 const wxString
& fontFace 
= font
->GetFaceName(); 
 825                 // empty facename matches everything 
 826                 same 
= !fontFace 
|| fontFace 
== facename
; 
 829             if ( same 
&& (encoding 
!= wxFONTENCODING_DEFAULT
) ) 
 831                 // have to match the encoding too 
 832                 same 
= font
->GetEncoding() == encoding
; 
 842     // font not found, create the new one 
 844     wxFont 
fontTmp(pointSize
, family
, style
, weight
, underline
, facename
, encoding
); 
 847         font 
= new wxFont(fontTmp
); 
 854 #if WXWIN_COMPATIBILITY_2_6 
 855 void wxBrushList::AddBrush(wxBrush
*) { } 
 856 void wxBrushList::RemoveBrush(wxBrush
*) { } 
 857 void wxFontList::AddFont(wxFont
*) { } 
 858 void wxFontList::RemoveFont(wxFont
*) { } 
 859 void wxPenList::AddPen(wxPen
*) { } 
 860 void wxPenList::RemovePen(wxPen
*) { } 
 863 wxSize 
wxGetDisplaySize() 
 866     wxDisplaySize(& x
, & y
); 
 870 wxRect 
wxGetClientDisplayRect() 
 872     int x
, y
, width
, height
; 
 873     wxClientDisplayRect(&x
, &y
, &width
, &height
);  // call plat-specific version 
 874     return wxRect(x
, y
, width
, height
); 
 877 wxSize 
wxGetDisplaySizeMM() 
 880     wxDisplaySizeMM(& x
, & y
); 
 884 wxSize 
wxGetDisplayPPI() 
 886     const wxSize pixels 
= wxGetDisplaySize(); 
 887     const wxSize mm 
= wxGetDisplaySizeMM(); 
 889     return wxSize((int)((pixels
.x 
* inches2mm
) / mm
.x
), 
 890                   (int)((pixels
.y 
* inches2mm
) / mm
.y
)); 
 893 wxResourceCache::~wxResourceCache () 
 895     wxList::compatibility_iterator node 
= GetFirst (); 
 897         wxObject 
*item 
= (wxObject 
*)node
->GetData(); 
 900         node 
= node
->GetNext ();