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 // Licence: wxWindows licence
10 ///////////////////////////////////////////////////////////////////////////////
12 // for compilers that support precompilation, includes "wx.h".
13 #include "wx/wxprec.h"
15 #if wxOSX_USE_COCOA_OR_CARBON
22 #include "wx/string.h"
24 #include "wx/bitmap.h"
25 #include "wx/settings.h"
26 #include "wx/dcclient.h"
27 #include "wx/toplevel.h"
30 #include "wx/renderer.h"
31 #include "wx/graphics.h"
32 #include "wx/dcgraph.h"
33 #include "wx/osx/private.h"
35 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
37 #include "wx/mstream.h"
38 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP
40 // check if we're currently in a paint event
41 inline bool wxInPaintEvent(wxWindow
* win
, wxDC
& dc
)
44 return ( win
->MacGetCGContextRef() != NULL
);
49 class WXDLLEXPORT wxRendererMac
: public wxDelegateRendererNative
52 // draw the header control button (used by wxListCtrl)
53 virtual int DrawHeaderButton( wxWindow
*win
,
57 wxHeaderSortIconType sortArrow
= wxHDR_SORT_ICON_NONE
,
58 wxHeaderButtonParams
* params
= NULL
);
60 virtual int GetHeaderButtonHeight(wxWindow
*win
);
62 // draw the expanded/collapsed icon for a tree control item
63 virtual void DrawTreeItemButton( wxWindow
*win
,
68 // draw a (vertical) sash
69 virtual void DrawSplitterSash( wxWindow
*win
,
76 virtual void DrawCheckBox(wxWindow
*win
,
81 virtual wxSize
GetCheckBoxSize(wxWindow
* win
);
83 virtual void DrawComboBoxDropButton(wxWindow
*win
,
88 virtual void DrawPushButton(wxWindow
*win
,
93 virtual void DrawItemSelectionRect(wxWindow
*win
,
98 virtual void DrawFocusRect(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
= 0);
100 virtual void DrawChoice(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
102 virtual void DrawComboBox(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
104 virtual void DrawTextCtrl(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
106 virtual void DrawRadioBitmap(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
=0);
108 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
109 virtual void DrawTitleBarBitmap(wxWindow
*win
,
112 wxTitleBarButton button
,
114 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP
117 void DrawMacThemeButton(wxWindow
*win
,
125 wxBitmap m_bmpTreeExpanded
;
126 wxBitmap m_bmpTreeCollapsed
;
129 // ============================================================================
131 // ============================================================================
134 wxRendererNative
& wxRendererNative::GetDefault()
136 static wxRendererMac s_rendererMac
;
138 return s_rendererMac
;
141 int wxRendererMac::DrawHeaderButton( wxWindow
*win
,
145 wxHeaderSortIconType sortArrow
,
146 wxHeaderButtonParams
* params
)
148 const wxCoord x
= rect
.x
;
149 const wxCoord y
= rect
.y
;
150 const wxCoord w
= rect
.width
;
151 const wxCoord h
= rect
.height
;
153 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
155 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
156 if ( !wxInPaintEvent(win
, dc
) )
158 win
->Refresh( &rect
);
162 CGContextRef cgContext
;
163 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
165 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
168 HIThemeButtonDrawInfo drawInfo
;
171 memset( &drawInfo
, 0, sizeof(drawInfo
) );
172 drawInfo
.version
= 0;
173 drawInfo
.kind
= kThemeListHeaderButton
;
174 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
175 drawInfo
.value
= (flags
& wxCONTROL_SELECTED
) ? kThemeButtonOn
: kThemeButtonOff
;
176 drawInfo
.adornment
= kThemeAdornmentNone
;
178 // The down arrow is drawn automatically, change it to an up arrow if needed.
179 if ( sortArrow
== wxHDR_SORT_ICON_UP
)
180 drawInfo
.adornment
= kThemeAdornmentHeaderButtonSortUp
;
182 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
184 // If we don't want any arrows we need to draw over the one already there
185 if ( (flags
& wxCONTROL_SELECTED
) && (sortArrow
== wxHDR_SORT_ICON_NONE
) )
187 // clip to the header rectangle
188 CGContextSaveGState( cgContext
);
189 CGContextClipToRect( cgContext
, headerRect
);
190 // but draw bigger than that so the arrow will get clipped off
191 headerRect
.size
.width
+= 25;
192 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
193 CGContextRestoreGState( cgContext
);
198 // Reserve room for the arrows before writing the label, and turn off the
199 // flags we've already handled
200 wxRect
newRect(rect
);
201 if ( (flags
& wxCONTROL_SELECTED
) && (sortArrow
!= wxHDR_SORT_ICON_NONE
) )
204 sortArrow
= wxHDR_SORT_ICON_NONE
;
206 flags
&= ~wxCONTROL_SELECTED
;
208 return DrawHeaderButtonContents(win
, dc
, newRect
, flags
, sortArrow
, params
);
212 int wxRendererMac::GetHeaderButtonHeight(wxWindow
* WXUNUSED(win
))
214 SInt32 standardHeight
;
217 errStatus
= GetThemeMetric( kThemeMetricListHeaderHeight
, &standardHeight
);
218 if (errStatus
== noErr
)
220 return standardHeight
;
225 void wxRendererMac::DrawTreeItemButton( wxWindow
*win
,
230 // now the wxGCDC is using native transformations
231 const wxCoord x
= rect
.x
;
232 const wxCoord y
= rect
.y
;
233 const wxCoord w
= rect
.width
;
234 const wxCoord h
= rect
.height
;
236 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
238 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
239 if ( !wxInPaintEvent(win
, dc
) )
241 win
->Refresh( &rect
);
245 CGContextRef cgContext
;
247 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
248 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
250 HIThemeButtonDrawInfo drawInfo
;
253 memset( &drawInfo
, 0, sizeof(drawInfo
) );
254 drawInfo
.version
= 0;
255 drawInfo
.kind
= kThemeDisclosureButton
;
256 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
257 // Apple mailing list posts say to use the arrow adornment constants, but those don't work.
258 // We need to set the value using the 'old' DrawThemeButton constants instead.
259 drawInfo
.value
= (flags
& wxCONTROL_EXPANDED
) ? kThemeDisclosureDown
: kThemeDisclosureRight
;
260 drawInfo
.adornment
= kThemeAdornmentNone
;
262 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
266 void wxRendererMac::DrawSplitterSash( wxWindow
*win
,
270 wxOrientation orient
,
271 int WXUNUSED(flags
) )
273 bool hasMetal
= win
->MacGetTopLevelWindow()->GetExtraStyle() & wxFRAME_EX_METAL
;
275 GetThemeMetric( kThemeMetricSmallPaneSplitterHeight
, &height
);
277 if (orient
== wxVERTICAL
)
278 splitterRect
= CGRectMake( position
, 0, height
, size
.y
);
280 splitterRect
= CGRectMake( 0, position
, size
.x
, height
);
282 // under compositing we should only draw when called by the OS, otherwise just issue a redraw command
283 // strange redraw errors occur if we don't do this
285 if ( !wxInPaintEvent(win
, dc
) )
287 wxRect
rect( (int) splitterRect
.origin
.x
, (int) splitterRect
.origin
.y
, (int) splitterRect
.size
.width
,
288 (int) splitterRect
.size
.height
);
289 win
->RefreshRect( rect
);
293 CGContextRef cgContext
;
294 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
295 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
297 HIThemeBackgroundDrawInfo bgdrawInfo
;
298 bgdrawInfo
.version
= 0;
299 bgdrawInfo
.state
= kThemeStateActive
;
300 bgdrawInfo
.kind
= hasMetal
? kThemeBackgroundMetal
: kThemeBackgroundPlacard
;
303 HIThemeDrawBackground(&splitterRect
, &bgdrawInfo
, cgContext
, kHIThemeOrientationNormal
);
306 CGContextSetFillColorWithColor(cgContext
,win
->GetBackgroundColour().GetCGColor());
307 CGContextFillRect(cgContext
,splitterRect
);
310 HIThemeSplitterDrawInfo drawInfo
;
311 drawInfo
.version
= 0;
312 drawInfo
.state
= kThemeStateActive
;
313 drawInfo
.adornment
= hasMetal
? kHIThemeSplitterAdornmentMetal
: kHIThemeSplitterAdornmentNone
;
314 HIThemeDrawPaneSplitter( &splitterRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
);
319 wxRendererMac::DrawItemSelectionRect(wxWindow
* WXUNUSED(win
),
324 if ( !(flags
& wxCONTROL_SELECTED
) )
327 wxColour
col( wxMacCreateCGColorFromHITheme( (flags
& wxCONTROL_FOCUSED
) ?
328 kThemeBrushAlternatePrimaryHighlightColor
329 : kThemeBrushSecondaryHighlightColor
) );
330 wxBrush
selBrush( col
);
332 dc
.SetPen( *wxTRANSPARENT_PEN
);
333 dc
.SetBrush( selBrush
);
334 dc
.DrawRectangle( rect
);
339 wxRendererMac::DrawMacThemeButton(wxWindow
*win
,
346 // now the wxGCDC is using native transformations
347 const wxCoord x
= rect
.x
;
348 const wxCoord y
= rect
.y
;
349 const wxCoord w
= rect
.width
;
350 const wxCoord h
= rect
.height
;
352 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
354 HIRect headerRect
= CGRectMake( x
, y
, w
, h
);
355 if ( !wxInPaintEvent(win
, dc
) )
357 win
->Refresh( &rect
);
361 wxGCDCImpl
*impl
= (wxGCDCImpl
*) dc
.GetImpl();
362 CGContextRef cgContext
;
363 cgContext
= (CGContextRef
) impl
->GetGraphicsContext()->GetNativeContext();
365 HIThemeButtonDrawInfo drawInfo
;
368 memset( &drawInfo
, 0, sizeof(drawInfo
) );
369 drawInfo
.version
= 0;
370 drawInfo
.kind
= kind
;
371 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
372 drawInfo
.value
= (flags
& wxCONTROL_SELECTED
) ? kThemeButtonOn
: kThemeButtonOff
;
373 if (flags
& wxCONTROL_UNDETERMINED
)
374 drawInfo
.value
= kThemeButtonMixed
;
375 drawInfo
.adornment
= adornment
;
376 if (flags
& wxCONTROL_FOCUSED
)
377 drawInfo
.adornment
|= kThemeAdornmentFocus
;
379 HIThemeDrawButton( &headerRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
, &labelRect
);
384 wxRendererMac::DrawCheckBox(wxWindow
*win
,
389 if (flags
& wxCONTROL_CHECKED
)
390 flags
|= wxCONTROL_SELECTED
;
394 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
395 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
396 kind
= kThemeCheckBoxSmall
;
397 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
398 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
399 kind
= kThemeCheckBoxMini
;
401 kind
= kThemeCheckBox
;
404 DrawMacThemeButton(win
, dc
, rect
, flags
,
405 kind
, kThemeAdornmentNone
);
408 wxSize
wxRendererMac::GetCheckBoxSize(wxWindow
* WXUNUSED(win
))
411 SInt32 width
, height
;
414 errStatus
= GetThemeMetric(kThemeMetricCheckBoxWidth
, &width
);
415 if (errStatus
== noErr
)
417 size
.SetWidth(width
);
420 errStatus
= GetThemeMetric(kThemeMetricCheckBoxHeight
, &height
);
421 if (errStatus
== noErr
)
423 size
.SetHeight(height
);
430 wxRendererMac::DrawComboBoxDropButton(wxWindow
*win
,
436 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
437 kind
= kThemeArrowButtonSmall
;
438 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
439 kind
= kThemeArrowButtonMini
;
441 kind
= kThemeArrowButton
;
443 DrawMacThemeButton(win
, dc
, rect
, flags
,
444 kind
, kThemeAdornmentArrowDownArrow
);
448 wxRendererMac::DrawPushButton(wxWindow
*win
,
454 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
455 kind
= kThemeBevelButtonSmall
;
456 // There is no kThemeBevelButtonMini, but in this case, use Small
457 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
|| (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
458 kind
= kThemeBevelButtonSmall
;
460 kind
= kThemeBevelButton
;
462 DrawMacThemeButton(win
, dc
, rect
, flags
,
463 kind
, kThemeAdornmentNone
);
467 wxRendererMac::DrawFocusRect(wxWindow
* win
, wxDC
& dc
, const wxRect
& rect
, int flags
)
471 wxDelegateRendererNative::DrawFocusRect(win
, dc
, rect
, flags
);
475 CGRect cgrect
= CGRectMake( rect
.x
, rect
.y
, rect
.width
, rect
.height
) ;
477 HIThemeFrameDrawInfo info
;
479 memset( &info
, 0 , sizeof(info
) ) ;
483 info
.state
= kThemeStateActive
;
484 info
.isFocused
= true ;
486 CGContextRef cgContext
= (CGContextRef
) win
->MacGetCGContextRef() ;
487 wxASSERT( cgContext
) ;
489 HIThemeDrawFocusRect( &cgrect
, true , cgContext
, kHIThemeOrientationNormal
) ;
492 void wxRendererMac::DrawChoice(wxWindow
* win
, wxDC
& dc
,
493 const wxRect
& rect
, int flags
)
497 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
498 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
499 kind
= kThemePopupButtonSmall
;
500 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
501 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
502 kind
= kThemePopupButtonMini
;
504 kind
= kThemePopupButton
;
506 DrawMacThemeButton(win
, dc
, rect
, flags
, kind
, kThemeAdornmentNone
);
510 void wxRendererMac::DrawComboBox(wxWindow
* win
, wxDC
& dc
,
511 const wxRect
& rect
, int flags
)
515 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
516 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
517 kind
= kThemeComboBoxSmall
;
518 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
519 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
520 kind
= kThemeComboBoxMini
;
522 kind
= kThemeComboBox
;
524 DrawMacThemeButton(win
, dc
, rect
, flags
, kind
, kThemeAdornmentNone
);
527 void wxRendererMac::DrawRadioBitmap(wxWindow
* win
, wxDC
& dc
,
528 const wxRect
& rect
, int flags
)
532 if (win
->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
||
533 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_SMALL
))
534 kind
= kThemeRadioButtonSmall
;
535 else if (win
->GetWindowVariant() == wxWINDOW_VARIANT_MINI
||
536 (win
->GetParent() && win
->GetParent()->GetWindowVariant() == wxWINDOW_VARIANT_MINI
))
537 kind
= kThemeRadioButtonMini
;
539 kind
= kThemeRadioButton
;
541 if (flags
& wxCONTROL_CHECKED
)
542 flags
|= wxCONTROL_SELECTED
;
544 DrawMacThemeButton(win
, dc
, rect
, flags
,
545 kind
, kThemeAdornmentNone
);
548 void wxRendererMac::DrawTextCtrl(wxWindow
* win
, wxDC
& dc
,
549 const wxRect
& rect
, int flags
)
551 const wxCoord x
= rect
.x
;
552 const wxCoord y
= rect
.y
;
553 const wxCoord w
= rect
.width
;
554 const wxCoord h
= rect
.height
;
556 dc
.SetBrush( *wxWHITE_BRUSH
);
557 dc
.SetPen( *wxTRANSPARENT_PEN
);
558 dc
.DrawRectangle(rect
);
560 dc
.SetBrush( *wxTRANSPARENT_BRUSH
);
562 HIRect hiRect
= CGRectMake( x
, y
, w
, h
);
563 if ( !wxInPaintEvent(win
, dc
) )
565 win
->Refresh( &rect
);
569 CGContextRef cgContext
;
571 cgContext
= (CGContextRef
) static_cast<wxGCDCImpl
*>(dc
.GetImpl())->GetGraphicsContext()->GetNativeContext();
574 HIThemeFrameDrawInfo drawInfo
;
576 memset( &drawInfo
, 0, sizeof(drawInfo
) );
577 drawInfo
.version
= 0;
578 drawInfo
.kind
= kHIThemeFrameTextFieldSquare
;
579 drawInfo
.state
= (flags
& wxCONTROL_DISABLED
) ? kThemeStateInactive
: kThemeStateActive
;
580 if (flags
& wxCONTROL_FOCUSED
)
581 drawInfo
.isFocused
= true;
583 HIThemeDrawFrame( &hiRect
, &drawInfo
, cgContext
, kHIThemeOrientationNormal
);
588 #ifdef wxHAS_DRAW_TITLE_BAR_BITMAP
590 void wxRendererMac::DrawTitleBarBitmap(wxWindow
*win
,
593 wxTitleBarButton button
,
596 // the files below were converted from the originals in art/osx/close*.png
597 // using misc/scripts/png2c.py script -- we must use PNG and not XPM for
598 // them because they use transparency and don't look right without it
600 /* close.png - 400 bytes */
601 static const unsigned char close_png
[] = {
602 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
603 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
604 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
605 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
606 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
607 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
608 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
609 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
610 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
611 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
612 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
613 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x00,
614 0xef, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0xa5,
615 0xd2, 0x31, 0x4a, 0x03, 0x41, 0x18, 0xc5, 0xf1,
616 0xdf, 0xc6, 0x55, 0x02, 0xb2, 0x18, 0xb0, 0x33,
617 0x8d, 0xd8, 0x6e, 0x8a, 0x14, 0xa6, 0xb2, 0xc9,
618 0x21, 0x72, 0x0b, 0xdb, 0x5c, 0x45, 0x98, 0x3b,
619 0x24, 0xc7, 0x99, 0x6d, 0x2d, 0x04, 0xd3, 0x09,
620 0x42, 0x48, 0x65, 0x60, 0x6c, 0x76, 0x65, 0x1c,
621 0x14, 0x45, 0x5f, 0x35, 0xfc, 0xe7, 0x3d, 0xe6,
622 0x9b, 0x8f, 0x57, 0xf9, 0xac, 0x06, 0x97, 0x98,
623 0xe0, 0xbc, 0x67, 0x07, 0xbc, 0xe2, 0x05, 0xfb,
624 0xc1, 0x58, 0x65, 0xa1, 0x2b, 0x4c, 0xb3, 0x40,
625 0xa9, 0x03, 0x9e, 0xb1, 0x83, 0x93, 0x2c, 0x74,
626 0x83, 0xb1, 0xef, 0x75, 0x86, 0x0b, 0x1c, 0xb1,
627 0x1f, 0xf5, 0xe3, 0x4d, 0x51, 0x43, 0x08, 0xe1,
628 0xb6, 0x4c, 0x64, 0xac, 0xee, 0xbd, 0x0d, 0x5c,
629 0x63, 0x89, 0x65, 0x08, 0x61, 0x9d, 0x52, 0x4a,
630 0x31, 0xc6, 0xcd, 0xc0, 0x62, 0x8c, 0x9b, 0x94,
631 0x52, 0x0a, 0x21, 0xac, 0x07, 0xd6, 0x67, 0xcc,
632 0x33, 0xf0, 0x61, 0x8c, 0x31, 0x6e, 0xf2, 0x73,
633 0xee, 0xc1, 0xbc, 0xc2, 0x1d, 0x4e, 0xf3, 0xd1,
634 0x62, 0x8c, 0xf7, 0x6d, 0xdb, 0xae, 0xa0, 0xeb,
635 0xba, 0xed, 0x6c, 0x36, 0x7b, 0x28, 0xa6, 0x7f,
636 0x1b, 0xf9, 0xa3, 0xea, 0x7e, 0xcd, 0x93, 0xf2,
637 0xb5, 0xae, 0xeb, 0xb6, 0xd0, 0xb6, 0xed, 0x2a,
638 0xc6, 0xa8, 0x78, 0xf5, 0xf0, 0xaf, 0xe5, 0x34,
639 0x58, 0xe4, 0xe1, 0x62, 0x11, 0x25, 0x5b, 0xa0,
640 0x19, 0x9a, 0x33, 0x14, 0xa0, 0xfe, 0xe1, 0x6b,
641 0x47, 0x3c, 0x62, 0x37, 0x34, 0x67, 0xdf, 0xc3,
642 0x71, 0xdf, 0x90, 0xaf, 0x74, 0xc0, 0x93, 0xbe,
643 0x72, 0x55, 0x71, 0xf9, 0xeb, 0x92, 0xbf, 0x03,
644 0x70, 0x33, 0x76, 0x58, 0xe5, 0x41, 0xfb, 0x6d,
645 0x00, 0x00, 0x00, 0x20, 0x7a, 0x54, 0x58, 0x74,
646 0x74, 0x69, 0x66, 0x66, 0x3a, 0x72, 0x6f, 0x77,
647 0x73, 0x2d, 0x70, 0x65, 0x72, 0x2d, 0x73, 0x74,
648 0x72, 0x69, 0x70, 0x00, 0x00, 0x78, 0xda, 0x33,
649 0xb5, 0x30, 0x05, 0x00, 0x01, 0x47, 0x00, 0xa3,
650 0x38, 0xda, 0x77, 0x3b, 0x00, 0x00, 0x00, 0x00,
651 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42, 0x60, 0x82
654 /* close_current.png - 421 bytes */
655 static const unsigned char close_current_png
[] = {
656 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
657 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
658 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
659 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
660 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
661 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
662 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
663 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
664 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
665 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
666 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
667 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x01,
668 0x04, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x9d,
669 0xd2, 0xbd, 0x4a, 0x43, 0x31, 0x00, 0xc5, 0xf1,
670 0xdf, 0x8d, 0x56, 0x44, 0x04, 0x45, 0xd0, 0xc5,
671 0x55, 0xdc, 0x0a, 0x8e, 0xed, 0xec, 0xe4, 0xec,
672 0x24, 0xd4, 0x67, 0x29, 0x59, 0xfa, 0x16, 0x9d,
673 0x7c, 0x07, 0x1d, 0x5c, 0xba, 0xa5, 0xa3, 0x28,
674 0x22, 0x94, 0xae, 0x2e, 0x1d, 0x4a, 0x5d, 0x55,
675 0xb8, 0x2e, 0x09, 0x5c, 0x4b, 0xfd, 0xa0, 0x67,
676 0x0a, 0x27, 0x39, 0xc9, 0x49, 0xf2, 0xaf, 0x7c,
677 0xd7, 0x01, 0x8e, 0x71, 0x84, 0xfd, 0xec, 0x2d,
678 0x30, 0xc3, 0x2b, 0xe6, 0x65, 0x61, 0xd5, 0x08,
679 0x9d, 0xe0, 0x14, 0x7b, 0x56, 0xeb, 0x0d, 0x13,
680 0x4c, 0x61, 0xa3, 0x11, 0x3a, 0xc3, 0x8e, 0x9f,
681 0xb5, 0x9d, 0x9b, 0xbc, 0x63, 0x1e, 0x72, 0xbd,
682 0x53, 0xb4, 0x20, 0xc6, 0xd8, 0x5e, 0x4e, 0x34,
683 0xbc, 0x56, 0x5e, 0x7b, 0x00, 0x6d, 0x5c, 0xe1,
684 0x2a, 0xc6, 0x38, 0xa8, 0xeb, 0xba, 0x4e, 0x29,
685 0xdd, 0x16, 0x2f, 0xa5, 0x74, 0x5b, 0xd7, 0x75,
686 0x1d, 0x63, 0x1c, 0x14, 0x0f, 0xed, 0x0a, 0xe7,
687 0xb9, 0x02, 0x48, 0x29, 0x5d, 0x77, 0x3a, 0x9d,
688 0x8b, 0xf1, 0x78, 0x7c, 0x07, 0x65, 0xdc, 0xed,
689 0x76, 0x6f, 0x1a, 0x25, 0x66, 0x15, 0x2e, 0xb1,
690 0xd5, 0xac, 0x56, 0xc2, 0xb0, 0x22, 0x04, 0xef,
691 0xc1, 0x9a, 0xda, 0xcc, 0xff, 0xf4, 0x6b, 0xd5,
692 0x94, 0x92, 0xa5, 0x53, 0x17, 0x6b, 0x3f, 0xce,
693 0x06, 0x3e, 0x71, 0x88, 0xed, 0xd1, 0x68, 0x34,
694 0x0b, 0x21, 0x4c, 0x7a, 0xbd, 0xde, 0x7d, 0xd9,
695 0x7a, 0x38, 0x1c, 0x3e, 0x86, 0x10, 0x26, 0xfd,
696 0x7e, 0xff, 0xa9, 0x01, 0xc2, 0x4b, 0x21, 0xa7,
697 0x00, 0xd0, 0xfa, 0xe3, 0x6a, 0x1f, 0x78, 0xc0,
698 0xb4, 0x90, 0x33, 0xcf, 0x44, 0xec, 0x66, 0x42,
699 0x56, 0xe9, 0x0d, 0xcf, 0x32, 0x72, 0xd5, 0xd2,
700 0xe4, 0xbf, 0x21, 0xff, 0x02, 0x4d, 0xb5, 0x74,
701 0x79, 0x60, 0x9f, 0x78, 0x78, 0x00, 0x00, 0x00,
702 0x20, 0x7a, 0x54, 0x58, 0x74, 0x74, 0x69, 0x66,
703 0x66, 0x3a, 0x72, 0x6f, 0x77, 0x73, 0x2d, 0x70,
704 0x65, 0x72, 0x2d, 0x73, 0x74, 0x72, 0x69, 0x70,
705 0x00, 0x00, 0x78, 0xda, 0x33, 0xb5, 0x30, 0x05,
706 0x00, 0x01, 0x47, 0x00, 0xa3, 0x38, 0xda, 0x77,
707 0x3b, 0x00, 0x00, 0x00, 0x00, 0x49, 0x45, 0x4e,
708 0x44, 0xae, 0x42, 0x60, 0x82};
710 /* close_pressed.png - 458 bytes */
711 static const unsigned char close_pressed_png
[] = {
712 0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a,
713 0x00, 0x00, 0x00, 0x0d, 0x49, 0x48, 0x44, 0x52,
714 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
715 0x08, 0x06, 0x00, 0x00, 0x00, 0x1f, 0x48, 0x2d,
716 0xd1, 0x00, 0x00, 0x00, 0x06, 0x62, 0x4b, 0x47,
717 0x44, 0x00, 0xff, 0x00, 0xff, 0x00, 0xff, 0xa0,
718 0xbd, 0xa7, 0x93, 0x00, 0x00, 0x00, 0x09, 0x70,
719 0x48, 0x59, 0x73, 0x00, 0x00, 0x0b, 0x12, 0x00,
720 0x00, 0x0b, 0x12, 0x01, 0xd2, 0xdd, 0x7e, 0xfc,
721 0x00, 0x00, 0x00, 0x09, 0x76, 0x70, 0x41, 0x67,
722 0x00, 0x00, 0x00, 0x0e, 0x00, 0x00, 0x00, 0x0e,
723 0x00, 0xb1, 0x5b, 0xf1, 0xf7, 0x00, 0x00, 0x01,
724 0x29, 0x49, 0x44, 0x41, 0x54, 0x28, 0xcf, 0x9d,
725 0x92, 0x31, 0x6a, 0xc3, 0x40, 0x14, 0x44, 0x9f,
726 0x2c, 0xe1, 0xc2, 0x10, 0x08, 0xc4, 0xe0, 0x22,
727 0x76, 0x21, 0x04, 0x29, 0x13, 0xf0, 0x05, 0x54,
728 0xa5, 0x8a, 0x0f, 0xb2, 0x8d, 0x0e, 0xa0, 0x23,
729 0xa8, 0x56, 0xa3, 0x03, 0xe8, 0x08, 0xba, 0x80,
730 0xba, 0xb0, 0x45, 0x0a, 0x97, 0x02, 0x23, 0x58,
731 0x83, 0x40, 0x60, 0x61, 0x08, 0x11, 0x04, 0x57,
732 0x69, 0xf6, 0xc3, 0x46, 0x38, 0x24, 0x64, 0xca,
733 0xd9, 0x19, 0xe6, 0xff, 0xfd, 0xe3, 0xf1, 0x1d,
734 0x2b, 0x20, 0x02, 0x36, 0xc0, 0xd2, 0x72, 0x27,
735 0xe0, 0x08, 0x1c, 0x80, 0x5e, 0x84, 0x9e, 0x63,
736 0x7a, 0x04, 0xb6, 0xc0, 0x1d, 0xd7, 0x31, 0x00,
737 0x6f, 0xc0, 0x1e, 0xc0, 0x77, 0x4c, 0x31, 0x70,
738 0xc3, 0xcf, 0x58, 0xd8, 0x49, 0x3e, 0x81, 0x7e,
739 0x66, 0xc7, 0xdb, 0x02, 0x73, 0x80, 0xdd, 0x6e,
740 0xb7, 0x9a, 0x3a, 0x1c, 0x6e, 0x6e, 0xb5, 0x2b,
741 0x1f, 0x78, 0x02, 0x1e, 0x44, 0x90, 0x65, 0xd9,
742 0x8b, 0xef, 0xfb, 0xef, 0x5a, 0xeb, 0x33, 0x40,
743 0x92, 0x24, 0x51, 0x9a, 0xa6, 0xcf, 0xc6, 0x98,
744 0xae, 0x69, 0x9a, 0xd1, 0x26, 0x8f, 0x81, 0x8d,
745 0x07, 0xa0, 0xaa, 0xaa, 0x3e, 0x0c, 0xc3, 0x5a,
746 0x29, 0x15, 0x0b, 0xa7, 0x94, 0x8a, 0x8b, 0xa2,
747 0xa8, 0xab, 0xaa, 0xea, 0x9d, 0x21, 0x36, 0x81,
748 0xf3, 0x7b, 0x00, 0xe4, 0x79, 0x7e, 0x10, 0x03,
749 0x40, 0x51, 0x14, 0xb5, 0x70, 0x0e, 0x96, 0x33,
750 0xfe, 0x89, 0xc0, 0xde, 0x69, 0x2d, 0x44, 0x92,
751 0x24, 0x91, 0x8c, 0xe7, 0x26, 0x4f, 0x52, 0x4f,
752 0x81, 0x3d, 0xee, 0x5a, 0x3e, 0x47, 0x4c, 0xae,
753 0x50, 0x29, 0x15, 0xb7, 0x6d, 0xfb, 0xe1, 0xec,
754 0x79, 0xf4, 0x81, 0x0b, 0x70, 0x0f, 0x2c, 0x9a,
755 0xa6, 0x19, 0x8d, 0x31, 0x5d, 0x59, 0x96, 0x47,
756 0x31, 0x69, 0xad, 0xcf, 0xc6, 0x98, 0xce, 0x31,
757 0x0d, 0x80, 0x96, 0xe6, 0x48, 0x01, 0xe6, 0xbf,
758 0xac, 0x76, 0x01, 0x6a, 0x60, 0x2f, 0xcd, 0xe9,
759 0x6d, 0x23, 0x6e, 0xed, 0x9d, 0xae, 0x61, 0x00,
760 0x5e, 0xb1, 0x95, 0xf3, 0x26, 0x8f, 0x7f, 0x2e,
761 0xf9, 0x17, 0x50, 0x59, 0x74, 0x13, 0x34, 0x41,
762 0x04, 0x5a, 0x00, 0x00, 0x00, 0x20, 0x7a, 0x54,
763 0x58, 0x74, 0x74, 0x69, 0x66, 0x66, 0x3a, 0x72,
764 0x6f, 0x77, 0x73, 0x2d, 0x70, 0x65, 0x72, 0x2d,
765 0x73, 0x74, 0x72, 0x69, 0x70, 0x00, 0x00, 0x78,
766 0xda, 0x33, 0xb5, 0x30, 0x05, 0x00, 0x01, 0x47,
767 0x00, 0xa3, 0x38, 0xda, 0x77, 0x3b, 0x00, 0x00,
768 0x00, 0x00, 0x49, 0x45, 0x4e, 0x44, 0xae, 0x42,
771 // currently we only support the close bitmap here
772 if ( button
!= wxTITLEBAR_BUTTON_CLOSE
)
774 m_rendererNative
.DrawTitleBarBitmap(win
, dc
, rect
, button
, flags
);
778 // choose the correct image depending on flags
782 if ( flags
& wxCONTROL_PRESSED
)
784 data
= close_pressed_png
;
785 len
= WXSIZEOF(close_pressed_png
);
787 else if ( flags
& wxCONTROL_CURRENT
)
789 data
= close_current_png
;
790 len
= WXSIZEOF(close_current_png
);
795 len
= WXSIZEOF(close_png
);
799 wxMemoryInputStream
mis(data
, len
);
800 wxImage
image(mis
, wxBITMAP_TYPE_PNG
);
802 wxASSERT_MSG( bmp
.IsOk(), "failed to load embedded PNG image?" );
804 // and draw it centering it in the provided rectangle: we don't scale the
805 // image because this is really not going to look good for such a small
807 dc
.DrawBitmap(bmp
, wxRect(bmp
.GetSize()).CenterIn(rect
).GetPosition());
810 #endif // wxHAS_DRAW_TITLE_BAR_BITMAP