1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: src/osx/carbon/renderer.cpp
3 // Purpose: implementation of wxRendererNative for Mac
4 // Author: Vadim Zeitlin
8 // Copyright: (c) 2003 Vadim Zeitlin <vadim@wxwindows.org>
9 // License: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // for compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
20 #include "wx/string.h"
22 #include "wx/bitmap.h"
23 #include "wx/settings.h"
24 #include "wx/dcclient.h"
25 #include "wx/toplevel.h"
28 #include "wx/renderer.h"
29 #include "wx/graphics.h"
30 #include "wx/dcgraph.h"
31 #include "wx/osx/private.h"
33 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
35 #include "wx/mstream.h"
36 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP
38 // check if we're currently in a paint event
39 inline bool wxInPaintEvent(wxWindow
* win
, wxDC
& dc
)
42 return ( win
->MacGetCGContextRef() != NULL
);
47 class WXDLLEXPORT wxRendererMac
: public wxDelegateRendererNative
50 // draw the header control button (used by wxListCtrl)
51 virtual int DrawHeaderButton( wxWindow
*win
,
55 wxHeaderSortIconType sortArrow
= wxHDR_SORT_ICON_NONE
,
56 wxHeaderButtonParams
* params
= NULL
);
58 virtual int GetHeaderButtonHeight(wxWindow
*win
);
60 // draw the expanded/collapsed icon for a tree control item
61 virtual void DrawTreeItemButton( wxWindow
*win
,
66 // draw a (vertical) sash
67 virtual void DrawSplitterSash( wxWindow
*win
,
74 virtual void DrawCheckBox(wxWindow
*win
,
79 virtual wxSize
GetCheckBoxSize(wxWindow
* win
);
81 virtual void DrawComboBoxDropButton(wxWindow
*win
,
86 virtual void DrawPushButton(wxWindow
*win
,
91 virtual void DrawItemSelectionRect(wxWindow
*win
,
96 virtual void DrawFocusRect(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
= 0);
98 virtual void DrawChoice(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
100 virtual void DrawComboBox(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
102 virtual void DrawTextCtrl(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
104 virtual void DrawRadioBitmap(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
106 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
107 virtual void DrawTitleBarBitmap(wxWindow
*win
,
110 wxTitleBarButton button
,
112 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP
115 void DrawMacThemeButton(wxWindow
*win
,
123 wxBitmap m_bmpTreeExpanded
;
124 wxBitmap m_bmpTreeCollapsed
;
127 // ============================================================================
129 // ============================================================================
132 wxRendererNative
& wxRendererNative::GetDefault()
134 static wxRendererMac s_rendererMac
;
136 return s_rendererMac
;
139 int wxRendererMac::DrawHeaderButton( wxWindow
*win
,
143 wxHeaderSortIconType sortArrow
,
144 wxHeaderButtonParams
* params
)
146 const wxCoord x
= rect
.x
;
147 const wxCoord y
= rect
.y
;
148 const wxCoord w
= rect
.width
;
149 const wxCoord h
= rect
.height
;
151 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
153 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
154 if ( !wxInPaintEvent(win
, dc
) )
156 win
->Refresh( &rect
);
160 CGContextRef cgContext
;
161 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
163 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
166 HIThemeButtonDrawInfo drawInfo
;
169 memset( &drawInfo
, 0, sizeof(drawInfo
) );
170 drawInfo
.version
= 0;
171 drawInfo
.kind
= kThemeListHeaderButton
;
172 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
173 drawInfo
.value
= (flags
& wxCONTROL_SELECTED
) ? kThemeButtonOn
: kThemeButtonOff
;
174 drawInfo
.adornment
= kThemeAdornmentNone
;
176 // The down arrow is drawn automatically, change it to an up arrow if needed.
177 if ( sortArrow
== wxHDR_SORT_ICON_UP
)
178 drawInfo
.adornment
= kThemeAdornmentHeaderButtonSortUp
;
180 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
182 // If we don't want any arrows we need to draw over the one already there
183 if ( (flags
& wxCONTROL_SELECTED
) && (sortArrow
== wxHDR_SORT_ICON_NONE
) )
185 // clip to the header rectangle
186 CGContextSaveGState( cgContext
);
187 CGContextClipToRect( cgContext
, headerRect
);
188 // but draw bigger than that so the arrow will get clipped off
189 headerRect
.size
.width
+= 25;
190 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
191 CGContextRestoreGState( cgContext
);
196 // Reserve room for the arrows before writing the label, and turn off the
197 // flags we've already handled
198 wxRect
newRect(rect
);
199 if ( (flags
& wxCONTROL_SELECTED
) && (sortArrow
!= wxHDR_SORT_ICON_NONE
) )
202 sortArrow
= wxHDR_SORT_ICON_NONE
;
204 flags
&= ~wxCONTROL_SELECTED
;
206 return DrawHeaderButtonContents(win
, dc
, newRect
, flags
, sortArrow
, params
);
210 int wxRendererMac::GetHeaderButtonHeight(wxWindow
* WXUNUSED(win
))
212 SInt32 standardHeight
;
215 errStatus
= GetThemeMetric( kThemeMetricListHeaderHeight
, &standardHeight
);
216 if (errStatus
== noErr
)
218 return standardHeight
;
223 void wxRendererMac::DrawTreeItemButton( wxWindow
*win
,
228 // now the wxGCDC is using native transformations
229 const wxCoord x
= rect
.x
;
230 const wxCoord y
= rect
.y
;
231 const wxCoord w
= rect
.width
;
232 const wxCoord h
= rect
.height
;
234 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
236 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
237 if ( !wxInPaintEvent(win
, dc
) )
239 win
->Refresh( &rect
);
243 CGContextRef cgContext
;
245 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
246 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
248 HIThemeButtonDrawInfo drawInfo
;
251 memset( &drawInfo
, 0, sizeof(drawInfo
) );
252 drawInfo
.version
= 0;
253 drawInfo
.kind
= kThemeDisclosureButton
;
254 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
255 // Apple mailing list posts say to use the arrow adornment constants, but those don't work.
256 // We need to set the value using the 'old' DrawThemeButton constants instead.
257 drawInfo
.value
= (flags
& wxCONTROL_EXPANDED
) ? kThemeDisclosureDown
: kThemeDisclosureRight
;
258 drawInfo
.adornment
= kThemeAdornmentNone
;
260 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
264 void wxRendererMac::DrawSplitterSash( wxWindow
*win
,
268 wxOrientation orient
,
269 int WXUNUSED(flags
) )
271 bool hasMetal
= win
->MacGetTopLevelWindow()->GetExtraStyle() & wxFRAME_EX_METAL
;
273 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight
, &height
);
275 if (orient
== wxVERTICAL
)
276 splitterRect
= CGRectMake( position
, 0, height
, size
.y
);
278 splitterRect
= CGRectMake( 0, position
, size
.x
, height
);
280 // under compositing we should only draw when called by the OS, otherwise just issue a redraw command
281 // strange redraw errors occur if we don't do this
283 if ( !wxInPaintEvent(win
, dc
) )
285 wxRect
rect( (int) splitterRect
.origin
.x
, (int) splitterRect
.origin
.y
, (int) splitterRect
.size
.width
,
286 (int) splitterRect
.size
.height
);
287 win
->RefreshRect( rect
);
291 CGContextRef cgContext
;
292 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
293 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
295 HIThemeBackgroundDrawInfo bgdrawInfo
;
296 bgdrawInfo
.version
= 0;
297 bgdrawInfo
.state
= kThemeStateActive
;
298 bgdrawInfo
.kind
= hasMetal
? kThemeBackgroundMetal
: kThemeBackgroundPlacard
;
301 HIThemeDrawBackground(&splitterRect
, &bgdrawInfo
, cgContext
, kHIThemeOrientationNormal
);
304 CGContextSetFillColorWithColor(cgContext
,win
->GetBackgroundColour().GetCGColor());
305 CGContextFillRect(cgContext
,splitterRect
);
308 HIThemeSplitterDrawInfo drawInfo
;
309 drawInfo
.version
= 0;
310 drawInfo
.state
= kThemeStateActive
;
311 drawInfo
.adornment
= hasMetal
? kHIThemeSplitterAdornmentMetal
: kHIThemeSplitterAdornmentNone
;
312 HIThemeDrawPaneSplitter( &splitterRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
);
317 wxRendererMac::DrawItemSelectionRect(wxWindow
* WXUNUSED(win
),
322 if ( !(flags
& wxCONTROL_SELECTED
) )
325 wxColour
col( wxMacCreateCGColorFromHITheme( (flags
& wxCONTROL_FOCUSED
) ?
326 kThemeBrushAlternatePrimaryHighlightColor
327 : kThemeBrushSecondaryHighlightColor
) );
328 wxBrush
selBrush( col
);
330 dc
.SetPen( *wxTRANSPARENT_PEN
);
331 dc
.SetBrush( selBrush
);
332 dc
.DrawRectangle( rect
);
337 wxRendererMac::DrawMacThemeButton(wxWindow
*win
,
344 // now the wxGCDC is using native transformations
345 const wxCoord x
= rect
.x
;
346 const wxCoord y
= rect
.y
;
347 const wxCoord w
= rect
.width
;
348 const wxCoord h
= rect
.height
;
350 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
352 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
353 if ( !wxInPaintEvent(win
, dc
) )
355 win
->Refresh( &rect
);
359 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
360 CGContextRef cgContext
;
361 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
363 HIThemeButtonDrawInfo drawInfo
;
366 memset( &drawInfo
, 0, sizeof(drawInfo
) );
367 drawInfo
.version
= 0;
368 drawInfo
.kind
= kind
;
369 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
370 drawInfo
.value
= (flags
& wxCONTROL_SELECTED
) ? kThemeButtonOn
: kThemeButtonOff
;
371 if (flags
& wxCONTROL_UNDETERMINED
)
372 drawInfo
.value
= kThemeButtonMixed
;
373 drawInfo
.adornment
= adornment
;
374 if (flags
& wxCONTROL_FOCUSED
)
375 drawInfo
.adornment
|= kThemeAdornmentFocus
;
377 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
382 wxRendererMac::DrawCheckBox(wxWindow
*win
,
387 if (flags
& wxCONTROL_CHECKED
)
388 flags
|= wxCONTROL_SELECTED
;
392 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
393 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
394 kind
= kThemeCheckBoxSmall
;
395 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
396 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
397 kind
= kThemeCheckBoxMini
;
399 kind
= kThemeCheckBox
;
402 DrawMacThemeButton(win
, dc
, rect
, flags
,
403 kind
, kThemeAdornmentNone
);
406 wxSize
wxRendererMac::GetCheckBoxSize(wxWindow
* WXUNUSED(win
))
409 SInt32 width
, height
;
412 errStatus
= GetThemeMetric(kThemeMetricCheckBoxWidth
, &width
);
413 if (errStatus
== noErr
)
415 size
.SetWidth(width
);
418 errStatus
= GetThemeMetric(kThemeMetricCheckBoxHeight
, &height
);
419 if (errStatus
== noErr
)
421 size
.SetHeight(height
);
428 wxRendererMac::DrawComboBoxDropButton(wxWindow
*win
,
434 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
435 kind
= kThemeArrowButtonSmall
;
436 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
437 kind
= kThemeArrowButtonMini
;
439 kind
= kThemeArrowButton
;
441 DrawMacThemeButton(win
, dc
, rect
, flags
,
442 kind
, kThemeAdornmentArrowDownArrow
);
446 wxRendererMac::DrawPushButton(wxWindow
*win
,
452 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
453 kind
= kThemeBevelButtonSmall
;
454 // There is no kThemeBevelButtonMini, but in this case, use Small
455 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
456 kind
= kThemeBevelButtonSmall
;
458 kind
= kThemeBevelButton
;
460 DrawMacThemeButton(win
, dc
, rect
, flags
,
461 kind
, kThemeAdornmentNone
);
465 wxRendererMac::DrawFocusRect(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
)
469 wxDelegateRendererNative::DrawFocusRect(win
, dc
, rect
, flags
);
473 CGRect cgrect
= CGRectMake( rect
.x
, rect
.y
, rect
.width
, rect
.height
) ;
475 HIThemeFrameDrawInfo info
;
477 memset( &info
, 0 , sizeof(info
) ) ;
481 info
.state
= kThemeStateActive
;
482 info
.isFocused
= true ;
484 CGContextRef cgContext
= (CGContextRef
) win
->MacGetCGContextRef() ;
485 wxASSERT( cgContext
) ;
487 HIThemeDrawFocusRect( &cgrect
, true , cgContext
, kHIThemeOrientationNormal
) ;
490 void wxRendererMac::DrawChoice(wxWindow
* win
, wxDC
& dc
,
491 const wxRect
& rect
, int flags
)
495 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
496 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
497 kind
= kThemePopupButtonSmall
;
498 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
499 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
500 kind
= kThemePopupButtonMini
;
502 kind
= kThemePopupButton
;
504 DrawMacThemeButton(win
, dc
, rect
, flags
, kind
, kThemeAdornmentNone
);
508 void wxRendererMac::DrawComboBox(wxWindow
* win
, wxDC
& dc
,
509 const wxRect
& rect
, int flags
)
513 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
514 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
515 kind
= kThemeComboBoxSmall
;
516 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
517 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
518 kind
= kThemeComboBoxMini
;
520 kind
= kThemeComboBox
;
522 DrawMacThemeButton(win
, dc
, rect
, flags
, kind
, kThemeAdornmentNone
);
525 void wxRendererMac::DrawRadioBitmap(wxWindow
* win
, wxDC
& dc
,
526 const wxRect
& rect
, int flags
)
530 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
531 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
532 kind
= kThemeRadioButtonSmall
;
533 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
534 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
535 kind
= kThemeRadioButtonMini
;
537 kind
= kThemeRadioButton
;
539 if (flags
& wxCONTROL_CHECKED
)
540 flags
|= wxCONTROL_SELECTED
;
542 DrawMacThemeButton(win
, dc
, rect
, flags
,
543 kind
, kThemeAdornmentNone
);
546 void wxRendererMac::DrawTextCtrl(wxWindow
* win
, wxDC
& dc
,
547 const wxRect
& rect
, int flags
)
549 const wxCoord x
= rect
.x
;
550 const wxCoord y
= rect
.y
;
551 const wxCoord w
= rect
.width
;
552 const wxCoord h
= rect
.height
;
554 dc
.SetBrush( *wxWHITE_BRUSH
);
555 dc
.SetPen( *wxTRANSPARENT_PEN
);
556 dc
.DrawRectangle(rect
);
558 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
560 HIRect hiRect
= CGRectMake( x
, y
, w
, h
);
561 if ( !wxInPaintEvent(win
, dc
) )
563 win
->Refresh( &rect
);
567 CGContextRef cgContext
;
569 cgContext
= (CGContextRef
) static_cast<wxGCDCImpl
*>(dc
.GetImpl())->GetGraphicsContext()->GetNativeContext();
572 HIThemeFrameDrawInfo drawInfo
;
574 memset( &drawInfo
, 0, sizeof(drawInfo
) );
575 drawInfo
.version
= 0;
576 drawInfo
.kind
= kHIThemeFrameTextFieldSquare
;
577 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
578 if (flags
& wxCONTROL_FOCUSED
)
579 drawInfo
.isFocused
= true;
581 HIThemeDrawFrame( &hiRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
);
586 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
588 void wxRendererMac::DrawTitleBarBitmap(wxWindow
*win
,
591 wxTitleBarButton button
,
594 // the files below were converted from the originals in art/osx/close*.png
595 // using misc/scripts/png2c.py script -- we must use PNG and not XPM for
596 // them because they use transparency and don't look right without it
598 /* close.png - 400 bytes */
599 static const unsigned char close_png
[] = {
600 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
601 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
602 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
603 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
604 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
605 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
606 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
607 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
608 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
609 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
610 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
611 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x00,
612 0xef, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0xa5,
613 0xd2, 0x31, 0x4a, 0x03, 0x41, 0x18, 0xc5, 0xf1,
614 0xdf, 0xc6, 0x55, 0x02, 0xb2, 0x18, 0xb0, 0x33,
615 0x8d, 0xd8, 0x6e, 0x8a, 0x14, 0xa6, 0xb2, 0xc9,
616 0x21, 0x72, 0x0b, 0xdb, 0x5c, 0x45, 0x98, 0x3b,
617 0x24, 0xc7, 0x99, 0x6d, 0x2d, 0x04, 0xd3, 0x09,
618 0x42, 0x48, 0x65, 0x60, 0x6c, 0x76, 0x65, 0x1c,
619 0x14, 0x45, 0x5f, 0x35, 0xfc, 0xe7, 0x3d, 0xe6,
620 0x9b, 0x8f, 0x57, 0xf9, 0xac, 0x06, 0x97, 0x98,
621 0xe0, 0xbc, 0x67, 0x07, 0xbc, 0xe2, 0x05, 0xfb,
622 0xc1, 0x58, 0x65, 0xa1, 0x2b, 0x4c, 0xb3, 0x40,
623 0xa9, 0x03, 0x9e, 0xb1, 0x83, 0x93, 0x2c, 0x74,
624 0x83, 0xb1, 0xef, 0x75, 0x86, 0x0b, 0x1c, 0xb1,
625 0x1f, 0xf5, 0xe3, 0x4d, 0x51, 0x43, 0x08, 0xe1,
626 0xb6, 0x4c, 0x64, 0xac, 0xee, 0xbd, 0x0d, 0x5c,
627 0x63, 0x89, 0x65, 0x08, 0x61, 0x9d, 0x52, 0x4a,
628 0x31, 0xc6, 0xcd, 0xc0, 0x62, 0x8c, 0x9b, 0x94,
629 0x52, 0x0a, 0x21, 0xac, 0x07, 0xd6, 0x67, 0xcc,
630 0x33, 0xf0, 0x61, 0x8c, 0x31, 0x6e, 0xf2, 0x73,
631 0xee, 0xc1, 0xbc, 0xc2, 0x1d, 0x4e, 0xf3, 0xd1,
632 0x62, 0x8c, 0xf7, 0x6d, 0xdb, 0xae, 0xa0, 0xeb,
633 0xba, 0xed, 0x6c, 0x36, 0x7b, 0x28, 0xa6, 0x7f,
634 0x1b, 0xf9, 0xa3, 0xea, 0x7e, 0xcd, 0x93, 0xf2,
635 0xb5, 0xae, 0xeb, 0xb6, 0xd0, 0xb6, 0xed, 0x2a,
636 0xc6, 0xa8, 0x78, 0xf5, 0xf0, 0xaf, 0xe5, 0x34,
637 0x58, 0xe4, 0xe1, 0x62, 0x11, 0x25, 0x5b, 0xa0,
638 0x19, 0x9a, 0x33, 0x14, 0xa0, 0xfe, 0xe1, 0x6b,
639 0x47, 0x3c, 0x62, 0x37, 0x34, 0x67, 0xdf, 0xc3,
640 0x71, 0xdf, 0x90, 0xaf, 0x74, 0xc0, 0x93, 0xbe,
641 0x72, 0x55, 0x71, 0xf9, 0xeb, 0x92, 0xbf, 0x03,
642 0x70, 0x33, 0x76, 0x58, 0xe5, 0x41, 0xfb, 0x6d,
643 0x00, 0x00, 0x00, 0x20, 0x7a, 0x54, 0x58, 0x74,
644 0x74, 0x69, 0x66, 0x66, 0x3a, 0x72, 0x6f, 0x77,
645 0x73, 0x2d, 0x70, 0x65, 0x72, 0x2d, 0x73, 0x74,
646 0x72, 0x69, 0x70, 0x00, 0x00, 0x78, 0xda, 0x33,
647 0xb5, 0x30, 0x05, 0x00, 0x01, 0x47, 0x00, 0xa3,
648 0x38, 0xda, 0x77, 0x3b, 0x00, 0x00, 0x00, 0x00,
649 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
652 /* close_current.png - 421 bytes */
653 static const unsigned char close_current_png
[] = {
654 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
655 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
656 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
657 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
658 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
659 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
660 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
661 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
662 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
663 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
664 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
665 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x01,
666 0x04, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x9d,
667 0xd2, 0xbd, 0x4a, 0x43, 0x31, 0x00, 0xc5, 0xf1,
668 0xdf, 0x8d, 0x56, 0x44, 0x04, 0x45, 0xd0, 0xc5,
669 0x55, 0xdc, 0x0a, 0x8e, 0xed, 0xec, 0xe4, 0xec,
670 0x24, 0xd4, 0x67, 0x29, 0x59, 0xfa, 0x16, 0x9d,
671 0x7c, 0x07, 0x1d, 0x5c, 0xba, 0xa5, 0xa3, 0x28,
672 0x22, 0x94, 0xae, 0x2e, 0x1d, 0x4a, 0x5d, 0x55,
673 0xb8, 0x2e, 0x09, 0x5c, 0x4b, 0xfd, 0xa0, 0x67,
674 0x0a, 0x27, 0x39, 0xc9, 0x49, 0xf2, 0xaf, 0x7c,
675 0xd7, 0x01, 0x8e, 0x71, 0x84, 0xfd, 0xec, 0x2d,
676 0x30, 0xc3, 0x2b, 0xe6, 0x65, 0x61, 0xd5, 0x08,
677 0x9d, 0xe0, 0x14, 0x7b, 0x56, 0xeb, 0x0d, 0x13,
678 0x4c, 0x61, 0xa3, 0x11, 0x3a, 0xc3, 0x8e, 0x9f,
679 0xb5, 0x9d, 0x9b, 0xbc, 0x63, 0x1e, 0x72, 0xbd,
680 0x53, 0xb4, 0x20, 0xc6, 0xd8, 0x5e, 0x4e, 0x34,
681 0xbc, 0x56, 0x5e, 0x7b, 0x00, 0x6d, 0x5c, 0xe1,
682 0x2a, 0xc6, 0x38, 0xa8, 0xeb, 0xba, 0x4e, 0x29,
683 0xdd, 0x16, 0x2f, 0xa5, 0x74, 0x5b, 0xd7, 0x75,
684 0x1d, 0x63, 0x1c, 0x14, 0x0f, 0xed, 0x0a, 0xe7,
685 0xb9, 0x02, 0x48, 0x29, 0x5d, 0x77, 0x3a, 0x9d,
686 0x8b, 0xf1, 0x78, 0x7c, 0x07, 0x65, 0xdc, 0xed,
687 0x76, 0x6f, 0x1a, 0x25, 0x66, 0x15, 0x2e, 0xb1,
688 0xd5, 0xac, 0x56, 0xc2, 0xb0, 0x22, 0x04, 0xef,
689 0xc1, 0x9a, 0xda, 0xcc, 0xff, 0xf4, 0x6b, 0xd5,
690 0x94, 0x92, 0xa5, 0x53, 0x17, 0x6b, 0x3f, 0xce,
691 0x06, 0x3e, 0x71, 0x88, 0xed, 0xd1, 0x68, 0x34,
692 0x0b, 0x21, 0x4c, 0x7a, 0xbd, 0xde, 0x7d, 0xd9,
693 0x7a, 0x38, 0x1c, 0x3e, 0x86, 0x10, 0x26, 0xfd,
694 0x7e, 0xff, 0xa9, 0x01, 0xc2, 0x4b, 0x21, 0xa7,
695 0x00, 0xd0, 0xfa, 0xe3, 0x6a, 0x1f, 0x78, 0xc0,
696 0xb4, 0x90, 0x33, 0xcf, 0x44, 0xec, 0x66, 0x42,
697 0x56, 0xe9, 0x0d, 0xcf, 0x32, 0x72, 0xd5, 0xd2,
698 0xe4, 0xbf, 0x21, 0xff, 0x02, 0x4d, 0xb5, 0x74,
699 0x79, 0x60, 0x9f, 0x78, 0x78, 0x00, 0x00, 0x00,
700 0x20, 0x7a, 0x54, 0x58, 0x74, 0x74, 0x69, 0x66,
701 0x66, 0x3a, 0x72, 0x6f, 0x77, 0x73, 0x2d, 0x70,
702 0x65, 0x72, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70,
703 0x00, 0x00, 0x78, 0xda, 0x33, 0xb5, 0x30, 0x05,
704 0x00, 0x01, 0x47, 0x00, 0xa3, 0x38, 0xda, 0x77,
705 0x3b, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
706 0x44, 0xae, 0x42, 0x60, 0x82};
708 /* close_pressed.png - 458 bytes */
709 static const unsigned char close_pressed_png
[] = {
710 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
711 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
712 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
713 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
714 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
715 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
716 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
717 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
718 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
719 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
720 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
721 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x01,
722 0x29, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x9d,
723 0x92, 0x31, 0x6a, 0xc3, 0x40, 0x14, 0x44, 0x9f,
724 0x2c, 0xe1, 0xc2, 0x10, 0x08, 0xc4, 0xe0, 0x22,
725 0x76, 0x21, 0x04, 0x29, 0x13, 0xf0, 0x05, 0x54,
726 0xa5, 0x8a, 0x0f, 0xb2, 0x8d, 0x0e, 0xa0, 0x23,
727 0xa8, 0x56, 0xa3, 0x03, 0xe8, 0x08, 0xba, 0x80,
728 0xba, 0xb0, 0x45, 0x0a, 0x97, 0x02, 0x23, 0x58,
729 0x83, 0x40, 0x60, 0x61, 0x08, 0x11, 0x04, 0x57,
730 0x69, 0xf6, 0xc3, 0x46, 0x38, 0x24, 0x64, 0xca,
731 0xd9, 0x19, 0xe6, 0xff, 0xfd, 0xe3, 0xf1, 0x1d,
732 0x2b, 0x20, 0x02, 0x36, 0xc0, 0xd2, 0x72, 0x27,
733 0xe0, 0x08, 0x1c, 0x80, 0x5e, 0x84, 0x9e, 0x63,
734 0x7a, 0x04, 0xb6, 0xc0, 0x1d, 0xd7, 0x31, 0x00,
735 0x6f, 0xc0, 0x1e, 0xc0, 0x77, 0x4c, 0x31, 0x70,
736 0xc3, 0xcf, 0x58, 0xd8, 0x49, 0x3e, 0x81, 0x7e,
737 0x66, 0xc7, 0xdb, 0x02, 0x73, 0x80, 0xdd, 0x6e,
738 0xb7, 0x9a, 0x3a, 0x1c, 0x6e, 0x6e, 0xb5, 0x2b,
739 0x1f, 0x78, 0x02, 0x1e, 0x44, 0x90, 0x65, 0xd9,
740 0x8b, 0xef, 0xfb, 0xef, 0x5a, 0xeb, 0x33, 0x40,
741 0x92, 0x24, 0x51, 0x9a, 0xa6, 0xcf, 0xc6, 0x98,
742 0xae, 0x69, 0x9a, 0xd1, 0x26, 0x8f, 0x81, 0x8d,
743 0x07, 0xa0, 0xaa, 0xaa, 0x3e, 0x0c, 0xc3, 0x5a,
744 0x29, 0x15, 0x0b, 0xa7, 0x94, 0x8a, 0x8b, 0xa2,
745 0xa8, 0xab, 0xaa, 0xea, 0x9d, 0x21, 0x36, 0x81,
746 0xf3, 0x7b, 0x00, 0xe4, 0x79, 0x7e, 0x10, 0x03,
747 0x40, 0x51, 0x14, 0xb5, 0x70, 0x0e, 0x96, 0x33,
748 0xfe, 0x89, 0xc0, 0xde, 0x69, 0x2d, 0x44, 0x92,
749 0x24, 0x91, 0x8c, 0xe7, 0x26, 0x4f, 0x52, 0x4f,
750 0x81, 0x3d, 0xee, 0x5a, 0x3e, 0x47, 0x4c, 0xae,
751 0x50, 0x29, 0x15, 0xb7, 0x6d, 0xfb, 0xe1, 0xec,
752 0x79, 0xf4, 0x81, 0x0b, 0x70, 0x0f, 0x2c, 0x9a,
753 0xa6, 0x19, 0x8d, 0x31, 0x5d, 0x59, 0x96, 0x47,
754 0x31, 0x69, 0xad, 0xcf, 0xc6, 0x98, 0xce, 0x31,
755 0x0d, 0x80, 0x96, 0xe6, 0x48, 0x01, 0xe6, 0xbf,
756 0xac, 0x76, 0x01, 0x6a, 0x60, 0x2f, 0xcd, 0xe9,
757 0x6d, 0x23, 0x6e, 0xed, 0x9d, 0xae, 0x61, 0x00,
758 0x5e, 0xb1, 0x95, 0xf3, 0x26, 0x8f, 0x7f, 0x2e,
759 0xf9, 0x17, 0x50, 0x59, 0x74, 0x13, 0x34, 0x41,
760 0x04, 0x5a, 0x00, 0x00, 0x00, 0x20, 0x7a, 0x54,
761 0x58, 0x74, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x72,
762 0x6f, 0x77, 0x73, 0x2d, 0x70, 0x65, 0x72, 0x2d,
763 0x73, 0x74, 0x72, 0x69, 0x70, 0x00, 0x00, 0x78,
764 0xda, 0x33, 0xb5, 0x30, 0x05, 0x00, 0x01, 0x47,
765 0x00, 0xa3, 0x38, 0xda, 0x77, 0x3b, 0x00, 0x00,
766 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
769 // currently we only support the close bitmap here
770 if ( button
!= wxTITLEBAR_BUTTON_CLOSE
)
772 m_rendererNative
.DrawTitleBarBitmap(win
, dc
, rect
, button
, flags
);
776 // choose the correct image depending on flags
780 if ( flags
& wxCONTROL_PRESSED
)
782 data
= close_pressed_png
;
783 len
= WXSIZEOF(close_pressed_png
);
785 else if ( flags
& wxCONTROL_CURRENT
)
787 data
= close_current_png
;
788 len
= WXSIZEOF(close_current_png
);
793 len
= WXSIZEOF(close_png
);
797 wxMemoryInputStream
mis(data
, len
);
798 wxImage
image(mis
, wxBITMAP_TYPE_PNG
);
800 wxASSERT_MSG( bmp
.IsOk(), "failed to load embedded PNG image?" );
802 // and draw it centering it in the provided rectangle: we don't scale the
803 // image because this is really not going to look good for such a small
805 dc
.DrawBitmap(bmp
, wxRect(bmp
.GetSize()).CenterIn(rect
).GetPosition());
808 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP