Allow selecting wxGraphicsRenderer to use in the drawing sample.

In particular, allow switching between GDI+ and Direct2D under Windows, which
is very convenient for comparing the rendering results.

This can also be useful when using Cairo.

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@77692 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin 2014-09-14 01:00:09 +00:00
parent 04fd25a730
commit dc6830bded

View File

@ -84,51 +84,7 @@ protected:
bool LoadImages();
};
class MyCanvas;
// Define a new frame type: this is going to be our main frame
class MyFrame : public wxFrame
{
public:
// ctor(s)
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
// event handlers (these functions should _not_ be virtual)
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnClip(wxCommandEvent& event);
#if wxUSE_GRAPHICS_CONTEXT
void OnGraphicContext(wxCommandEvent& event);
#endif
void OnBuffer(wxCommandEvent& event);
void OnCopy(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnShow(wxCommandEvent &event);
void OnOption(wxCommandEvent &event);
#if wxUSE_COLOURDLG
wxColour SelectColour();
#endif // wxUSE_COLOURDLG
void PrepareDC(wxDC& dc) wxOVERRIDE;
int m_backgroundMode;
int m_textureBackground;
wxMappingMode m_mapMode;
double m_xUserScale;
double m_yUserScale;
int m_xLogicalOrigin;
int m_yLogicalOrigin;
bool m_xAxisReversed,
m_yAxisReversed;
wxColour m_colourForeground, // these are _text_ colours
m_colourBackground;
wxBrush m_backgroundBrush;
MyCanvas *m_canvas;
private:
// any class wishing to process wxWidgets events must use this macro
wxDECLARE_EVENT_TABLE();
};
class MyFrame;
// define a scrollable canvas for drawing onto
class MyCanvas: public wxScrolledWindow
@ -146,7 +102,8 @@ public:
// set or remove the clipping region
void Clip(bool clip) { m_clip = clip; Refresh(); }
#if wxUSE_GRAPHICS_CONTEXT
void UseGraphicContext(bool use) { m_useContext = use; Refresh(); }
void UseGraphicRenderer(wxGraphicsRenderer* renderer)
{ m_renderer = renderer; Refresh(); }
#endif
void UseBuffer(bool use) { m_useBuffer = use; Refresh(); }
@ -189,13 +146,88 @@ private:
wxPoint m_anchorpoint;
wxPoint m_currentpoint;
#if wxUSE_GRAPHICS_CONTEXT
bool m_useContext ;
wxGraphicsRenderer* m_renderer;
#endif
bool m_useBuffer;
wxDECLARE_EVENT_TABLE();
};
// Define a new frame type: this is going to be our main frame
class MyFrame : public wxFrame
{
public:
// ctor(s)
MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size);
// event handlers (these functions should _not_ be virtual)
void OnQuit(wxCommandEvent& event);
void OnAbout(wxCommandEvent& event);
void OnClip(wxCommandEvent& event);
#if wxUSE_GRAPHICS_CONTEXT
void OnGraphicContextNone(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(NULL);
}
void OnGraphicContextDefault(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDefaultRenderer());
}
#if wxUSE_CAIRO
void OnGraphicContextCairo(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetCairoRenderer());
}
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
void OnGraphicContextGDIPlus(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetGDIPlusRenderer());
}
#endif
#if wxUSE_GRAPHICS_DIRECT2D
void OnGraphicContextDirect2D(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDirect2DRenderer());
}
#endif
#endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT
void OnBuffer(wxCommandEvent& event);
void OnCopy(wxCommandEvent& event);
void OnSave(wxCommandEvent& event);
void OnShow(wxCommandEvent &event);
void OnOption(wxCommandEvent &event);
#if wxUSE_COLOURDLG
wxColour SelectColour();
#endif // wxUSE_COLOURDLG
void PrepareDC(wxDC& dc) wxOVERRIDE;
int m_backgroundMode;
int m_textureBackground;
wxMappingMode m_mapMode;
double m_xUserScale;
double m_yUserScale;
int m_xLogicalOrigin;
int m_yLogicalOrigin;
bool m_xAxisReversed,
m_yAxisReversed;
wxColour m_colourForeground, // these are _text_ colours
m_colourBackground;
wxBrush m_backgroundBrush;
MyCanvas *m_canvas;
private:
// any class wishing to process wxWidgets events must use this macro
wxDECLARE_EVENT_TABLE();
};
// ----------------------------------------------------------------------------
// constants
// ----------------------------------------------------------------------------
@ -226,10 +258,22 @@ enum
File_ShowGradients,
MenuShow_Last = File_ShowGradients,
File_Clip,
#if wxUSE_GRAPHICS_CONTEXT
File_GraphicContext,
File_DC,
File_GC_Default,
#if wxUSE_CAIRO
File_GC_Cairo,
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
File_GC_GDIPlus,
#endif
#if wxUSE_GRAPHICS_DIRECT2D
File_GC_Direct2D,
#endif
#endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT
File_Clip,
File_Buffer,
File_Copy,
File_Save,
@ -412,7 +456,7 @@ MyCanvas::MyCanvas(MyFrame *parent)
m_clip = false;
m_rubberBand = false;
#if wxUSE_GRAPHICS_CONTEXT
m_useContext = false;
m_renderer = NULL;
#endif
m_useBuffer = false;
}
@ -1323,7 +1367,7 @@ void MyCanvas::DrawGradients(wxDC& dc)
dc.GradientFillLinear(r4, *wxBLACK, *wxGREEN, wxWEST);
#if wxUSE_GRAPHICS_CONTEXT
if (m_useContext)
if (m_renderer)
{
wxGCDC &gdc = (wxGCDC&)dc;
wxGraphicsContext *gc = gdc.GetGraphicsContext();
@ -1540,29 +1584,22 @@ void MyCanvas::Draw(wxDC& pdc)
{
#if wxUSE_GRAPHICS_CONTEXT
wxGCDC gdc;
wxGraphicsRenderer* const renderer = wxGraphicsRenderer::
#if TEST_CAIRO_EVERYWHERE
GetCairoRenderer()
#else
GetDefaultRenderer()
#endif
;
if ( m_useContext )
if ( m_renderer )
{
wxGraphicsContext* context;
if ( wxPaintDC *paintdc = wxDynamicCast(&pdc, wxPaintDC) )
{
context = renderer->CreateContext(*paintdc);
context = m_renderer->CreateContext(*paintdc);
}
else if ( wxMemoryDC *memdc = wxDynamicCast(&pdc, wxMemoryDC) )
{
context = renderer->CreateContext(*memdc);
context = m_renderer->CreateContext(*memdc);
}
#if wxUSE_METAFILE && defined(wxMETAFILE_IS_ENH)
else if ( wxMetafileDC *metadc = wxDynamicCast(&pdc, wxMetafileDC) )
{
context = renderer->CreateContext(*metadc);
context = m_renderer->CreateContext(*metadc);
}
#endif
else
@ -1574,7 +1611,7 @@ void MyCanvas::Draw(wxDC& pdc)
gdc.SetGraphicsContext(context);
}
wxDC &dc = m_useContext ? (wxDC&) gdc : (wxDC&) pdc ;
wxDC &dc = m_renderer ? (wxDC&) gdc : (wxDC&) pdc ;
#else
wxDC &dc = pdc ;
#endif
@ -1767,9 +1804,23 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
EVT_MENU (File_Quit, MyFrame::OnQuit)
EVT_MENU (File_About, MyFrame::OnAbout)
EVT_MENU (File_Clip, MyFrame::OnClip)
#if wxUSE_GRAPHICS_CONTEXT
EVT_MENU (File_GraphicContext, MyFrame::OnGraphicContext)
EVT_MENU (File_DC, MyFrame::OnGraphicContextNone)
EVT_MENU (File_GC_Default, MyFrame::OnGraphicContextDefault)
#if wxUSE_CAIRO
EVT_MENU (File_GC_Cairo, MyFrame::OnGraphicContextCairo)
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
EVT_MENU (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlus)
#endif
#if wxUSE_GRAPHICS_DIRECT2D
EVT_MENU (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2D)
#endif
#endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT
EVT_MENU (File_Buffer, MyFrame::OnBuffer)
EVT_MENU (File_Copy, MyFrame::OnCopy)
EVT_MENU (File_Save, MyFrame::OnSave)
@ -1808,10 +1859,23 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
#endif
wxMenu *menuFile = new wxMenu;
menuFile->AppendCheckItem(File_Clip, wxT("&Clip\tCtrl-C"), wxT("Clip/unclip drawing"));
#if wxUSE_GRAPHICS_CONTEXT
menuFile->AppendCheckItem(File_GraphicContext, wxT("&Use GraphicContext\tCtrl-Y"), wxT("Use GraphicContext"));
menuFile->AppendRadioItem(File_DC, "Use wx&DC\tShift-Ctrl-Y");
menuFile->AppendRadioItem(File_GC_Default, "Use default wx&GraphicContext\tCtrl-Y");
#if wxUSE_CAIRO
menuFile->AppendRadioItem(File_GC_Cairo, "Use &Cairo\tCtrl-O");
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
menuFile->AppendRadioItem(File_GC_GDIPlus, "Use &GDI+\tCtrl-+");
#endif
#if wxUSE_GRAPHICS_DIRECT2D
menuFile->AppendRadioItem(File_GC_Direct2D, "Use &Direct2D\tCtrl-2");
#endif
#endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT
menuFile->AppendSeparator();
menuFile->AppendCheckItem(File_Clip, wxT("&Clip\tCtrl-C"), wxT("Clip/unclip drawing"));
menuFile->AppendCheckItem(File_Buffer, wxT("&Use wx&BufferedPaintDC\tCtrl-Z"), wxT("Buffer painting"));
menuFile->AppendSeparator();
#if wxUSE_METAFILE && defined(wxMETAFILE_IS_ENH)
@ -1919,13 +1983,6 @@ void MyFrame::OnClip(wxCommandEvent& event)
m_canvas->Clip(event.IsChecked());
}
#if wxUSE_GRAPHICS_CONTEXT
void MyFrame::OnGraphicContext(wxCommandEvent& event)
{
m_canvas->UseGraphicContext(event.IsChecked());
}
#endif
void MyFrame::OnBuffer(wxCommandEvent& event)
{
m_canvas->UseBuffer(event.IsChecked());