Merge branch 'drawing-lines'

Fix drawing of dotted/hatched lines in wxMSW and some drawing sample
improvements.

Closes #7097.

See https://github.com/wxWidgets/wxWidgets/pull/1771
This commit is contained in:
Vadim Zeitlin
2020-03-27 20:22:17 +01:00
2 changed files with 33 additions and 40 deletions

View File

@@ -203,31 +203,16 @@ public:
m_canvas->UseGraphicRenderer(NULL);
}
void OnGraphicContextNoneUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == NULL);
}
void OnGraphicContextDefault(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDefaultRenderer());
}
void OnGraphicContextDefaultUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->IsDefaultRenderer());
}
#if wxUSE_CAIRO
void OnGraphicContextCairo(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetCairoRenderer());
}
void OnGraphicContextCairoUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetCairoRenderer());
}
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
@@ -235,22 +220,12 @@ public:
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetGDIPlusRenderer());
}
void OnGraphicContextGDIPlusUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetGDIPlusRenderer());
}
#endif
#if wxUSE_GRAPHICS_DIRECT2D
void OnGraphicContextDirect2D(wxCommandEvent& WXUNUSED(event))
{
m_canvas->UseGraphicRenderer(wxGraphicsRenderer::GetDirect2DRenderer());
}
void OnGraphicContextDirect2DUpdateUI(wxUpdateUIEvent& event)
{
event.Check(m_canvas->GetRenderer() == wxGraphicsRenderer::GetDirect2DRenderer());
}
#endif
#endif // __WXMSW__
void OnAntiAliasing(wxCommandEvent& event)
@@ -639,7 +614,7 @@ void MyCanvas::DrawTestPoly(wxDC& dc)
void MyCanvas::DrawTestLines( int x, int y, int width, wxDC &dc )
{
dc.SetPen( wxPen( *wxBLACK, width ) );
dc.SetBrush( *wxRED_BRUSH );
dc.SetBrush( *wxWHITE_BRUSH );
dc.DrawText(wxString::Format("Testing lines of width %d", width), x + 10, y - 10);
dc.DrawRectangle( x+10, y+10, 100, 190 );
@@ -2230,21 +2205,16 @@ wxBEGIN_EVENT_TABLE(MyFrame, wxFrame)
#if wxUSE_GRAPHICS_CONTEXT
EVT_MENU (File_GC_Default, MyFrame::OnGraphicContextDefault)
EVT_UPDATE_UI (File_GC_Default, MyFrame::OnGraphicContextDefaultUpdateUI)
EVT_MENU (File_DC, MyFrame::OnGraphicContextNone)
EVT_UPDATE_UI (File_DC, MyFrame::OnGraphicContextNoneUpdateUI)
#if wxUSE_CAIRO
EVT_MENU (File_GC_Cairo, MyFrame::OnGraphicContextCairo)
EVT_UPDATE_UI (File_GC_Cairo, MyFrame::OnGraphicContextCairoUpdateUI)
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
EVT_MENU (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlus)
EVT_UPDATE_UI (File_GC_GDIPlus, MyFrame::OnGraphicContextGDIPlusUpdateUI)
#endif
#if wxUSE_GRAPHICS_DIRECT2D
EVT_MENU (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2D)
EVT_UPDATE_UI (File_GC_Direct2D, MyFrame::OnGraphicContextDirect2DUpdateUI)
#endif
#endif // __WXMSW__
EVT_MENU (File_AntiAliasing, MyFrame::OnAntiAliasing)
@@ -2292,17 +2262,39 @@ MyFrame::MyFrame(const wxString& title, const wxPoint& pos, const wxSize& size)
wxMenu *menuFile = new wxMenu;
#if wxUSE_GRAPHICS_CONTEXT
menuFile->AppendCheckItem(File_GC_Default, "Use default wx&GraphicContext\t1");
m_menuItemUseDC = menuFile->AppendRadioItem(File_DC, "Use wx&DC\t0");
// Number the different renderer choices consecutively, starting from 0.
int accel = 0;
m_menuItemUseDC = menuFile->AppendRadioItem
(
File_DC,
wxString::Format("Use wx&DC\t%d", accel++)
);
menuFile->AppendRadioItem
(
File_GC_Default,
wxString::Format("Use default wx&GraphicContext\t%d", accel++)
);
#if wxUSE_CAIRO
menuFile->AppendRadioItem(File_GC_Cairo, "Use &Cairo\t2");
menuFile->AppendRadioItem
(
File_GC_Cairo,
wxString::Format("Use &Cairo\t%d", accel++)
);
#endif // wxUSE_CAIRO
#ifdef __WXMSW__
#if wxUSE_GRAPHICS_GDIPLUS
menuFile->AppendRadioItem(File_GC_GDIPlus, "Use &GDI+\t3");
menuFile->AppendRadioItem
(
File_GC_GDIPlus,
wxString::Format("Use &GDI+\t%d", accel++)
);
#endif
#if wxUSE_GRAPHICS_DIRECT2D
menuFile->AppendRadioItem(File_GC_Direct2D, "Use &Direct2D\t4");
menuFile->AppendRadioItem
(
File_GC_Direct2D,
wxString::Format("Use &Direct2D\t%d", accel++)
);
#endif
#endif // __WXMSW__
#endif // wxUSE_GRAPHICS_CONTEXT

View File

@@ -284,9 +284,7 @@ bool wxPenRefData::Alloc()
// CreatePen()
if ( m_join == wxJOIN_ROUND &&
m_cap == wxCAP_ROUND &&
m_style != wxPENSTYLE_USER_DASH &&
m_style != wxPENSTYLE_STIPPLE &&
(m_width <= 1 || m_style == wxPENSTYLE_SOLID) )
m_style == wxPENSTYLE_SOLID )
{
m_hPen = ::CreatePen(ConvertPenStyle(m_style), m_width, col);
}
@@ -358,7 +356,10 @@ bool wxPenRefData::Alloc()
dash = NULL;
}
m_hPen = ::ExtCreatePen(styleMSW, m_width, &lb, m_nbDash, (LPDWORD)dash);
// Note that width can't be 0 for ExtCreatePen(), unlike for CreatePen().
int width = m_width == 0 ? 1 : m_width;
m_hPen = ::ExtCreatePen(styleMSW, width, &lb, m_nbDash, (LPDWORD)dash);
delete [] dash;
}