From 46953a14262b62067de80b6ce16e0d3f42db004b Mon Sep 17 00:00:00 2001 From: Artur Wieczorek Date: Thu, 14 Jan 2016 22:44:37 +0100 Subject: [PATCH] Enable "Alpha screen" in drawing sample also if wxDC supports alpha transparency. For some systems (like OS X, GTK+ 3) drawing with transparency is supporting by native wxDC and in this case "Alpha screen" sample can be shown even if wxGraphicsContext is not used/enabled. For such wxDC's all drawing operations can be done directly without using wxGraphicsContext. --- samples/drawing/drawing.cpp | 50 ++++++++++++++++++++++--------------- 1 file changed, 30 insertions(+), 20 deletions(-) diff --git a/samples/drawing/drawing.cpp b/samples/drawing/drawing.cpp index 024251172a..34fd4f5571 100644 --- a/samples/drawing/drawing.cpp +++ b/samples/drawing/drawing.cpp @@ -48,6 +48,13 @@ #include "../sample.xpm" #endif +// Standard DC supports drawing with alpha on OSX and GTK3. +#if defined(__WXOSX__) || defined(__WXGTK3__) +#define wxDRAWING_DC_SUPPORTS_ALPHA 1 +#else +#define wxDRAWING_DC_SUPPORTS_ALPHA 0 +#endif // __WXOSX__ || __WXGTK3__ + // ---------------------------------------------------------------------------- // global variables // ---------------------------------------------------------------------------- @@ -131,8 +138,10 @@ protected: void DrawText(wxDC& dc); void DrawImages(wxDC& dc, DrawMode mode); void DrawWithLogicalOps(wxDC& dc); -#if wxUSE_GRAPHICS_CONTEXT +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT void DrawAlpha(wxDC& dc); +#endif +#if wxUSE_GRAPHICS_CONTEXT void DrawGraphics(wxGraphicsContext* gc); #endif void DrawRegions(wxDC& dc); @@ -286,8 +295,10 @@ enum File_ShowRegions, File_ShowCircles, File_ShowSplines, -#if wxUSE_GRAPHICS_CONTEXT +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT File_ShowAlpha, +#endif // wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT +#if wxUSE_GRAPHICS_CONTEXT File_ShowGraphics, #endif File_ShowGradients, @@ -1003,18 +1014,9 @@ void MyCanvas::DrawWithLogicalOps(wxDC& dc) } } -#if wxUSE_GRAPHICS_CONTEXT -#ifdef __WXGTK20__ -void MyCanvas::DrawAlpha(wxDC& WXUNUSED(dummyDC)) -#else +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT void MyCanvas::DrawAlpha(wxDC& dc) -#endif { -#ifdef __WXGTK__ - wxGCDC dc( this ); - PrepareDC( dc ); -#endif - wxDouble margin = 20 ; wxDouble width = 180 ; wxDouble radius = 30 ; @@ -1049,8 +1051,7 @@ void MyCanvas::DrawAlpha(wxDC& dc) dc.SetFont( wxFont( 40, wxFONTFAMILY_SWISS, wxFONTSTYLE_ITALIC, wxFONTWEIGHT_NORMAL ) ); dc.DrawText( wxT("Hello!"), 120, 80 ); } - -#endif +#endif // wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT #if wxUSE_GRAPHICS_CONTEXT @@ -1731,10 +1732,12 @@ void MyCanvas::Draw(wxDC& pdc) DrawWithLogicalOps(dc); break; -#if wxUSE_GRAPHICS_CONTEXT +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT case File_ShowAlpha: DrawAlpha(dc); break; +#endif // wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT +#if wxUSE_GRAPHICS_CONTEXT case File_ShowGraphics: DrawGraphics(gdc.GetGraphicsContext()); break; @@ -1890,9 +1893,9 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size) menuScreen->Append(File_ShowOps, wxT("&Raster operations screen\tF7")); menuScreen->Append(File_ShowRegions, wxT("Re&gions screen\tF8")); menuScreen->Append(File_ShowCircles, wxT("&Circles screen\tF9")); -#if wxUSE_GRAPHICS_CONTEXT +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT menuScreen->Append(File_ShowAlpha, wxT("&Alpha screen\tF10")); -#endif +#endif // wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT menuScreen->Append(File_ShowSplines, wxT("Spl&ines screen\tF11")); menuScreen->Append(File_ShowGradients, wxT("&Gradients screen\tF12")); #if wxUSE_GRAPHICS_CONTEXT @@ -2065,10 +2068,18 @@ void MyFrame::OnShow(wxCommandEvent& event) { const int show = event.GetId(); -#if wxUSE_GRAPHICS_CONTEXT +#if wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT // Make sure we do use a graphics context when selecting one of the screens // requiring it. +#if wxDRAWING_DC_SUPPORTS_ALPHA + // If DC supports drawing with alpha + // then GC is necessary only for graphics screen. + if ( show == File_ShowGraphics ) +#else // wxUSE_GRAPHICS_CONTEXT + // DC doesn't support drawing with alpha + // so GC is necessary both for alpha and graphics screen. if ( show == File_ShowAlpha || show == File_ShowGraphics ) +#endif // wxDRAWING_DC_SUPPORTS_ALPHA, wxUSE_GRAPHICS_CONTEXT { if ( !m_canvas->HasRenderer() ) m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDefaultRenderer()); @@ -2079,8 +2090,7 @@ void MyFrame::OnShow(wxCommandEvent& event) { m_menuItemUseDC->Enable(true); } -#endif // wxUSE_GRAPHICS_CONTEXT - +#endif // wxDRAWING_DC_SUPPORTS_ALPHA || wxUSE_GRAPHICS_CONTEXT m_canvas->ToShow(show); }