From dfe76430cc5634ff611a08671e83fe9d8089cfdf Mon Sep 17 00:00:00 2001 From: Maarten Bent Date: Sun, 11 Aug 2019 18:25:09 +0200 Subject: [PATCH] Implement GradientFillLinear and GradientFillConcentric for wxSVGFileDC --- include/wx/dcsvg.h | 13 +++++++ src/common/dcsvg.cpp | 82 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 95 insertions(+) diff --git a/include/wx/dcsvg.h b/include/wx/dcsvg.h index 4773c6152c..d0176c2295 100644 --- a/include/wx/dcsvg.h +++ b/include/wx/dcsvg.h @@ -220,6 +220,16 @@ private: return false; } + virtual void DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection = wxEAST) wxOVERRIDE; + + virtual void DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) wxOVERRIDE; + virtual void DoGetSize(int * x, int *y) const wxOVERRIDE { if ( x ) @@ -276,6 +286,9 @@ private: // incremented in each SetClippingRegion() call. size_t m_clipUniqueId; + // Unique ID for every gradient. + size_t m_gradientUniqueId; + wxDECLARE_ABSTRACT_CLASS(wxSVGFileDCImpl); wxDECLARE_NO_COPY_CLASS(wxSVGFileDCImpl); }; diff --git a/src/common/dcsvg.cpp b/src/common/dcsvg.cpp index a02bbd6f5b..422b36b6c4 100644 --- a/src/common/dcsvg.cpp +++ b/src/common/dcsvg.cpp @@ -500,6 +500,8 @@ void wxSVGFileDCImpl::Init(const wxString &filename, int Width, int Height, m_clipUniqueId = 0; m_clipNestingLevel = 0; + m_gradientUniqueId = 0; + m_mm_to_pix_x = dpi / 25.4; m_mm_to_pix_y = dpi / 25.4; @@ -1015,6 +1017,86 @@ void wxSVGFileDCImpl::DoDrawEllipticArc(wxCoord x, wxCoord y, wxCoord w, wxCoord write(arcLine); } +void wxSVGFileDCImpl::DoGradientFillLinear(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + wxDirection nDirection) +{ + NewGraphicsIfNeeded(); + + float initOpacity; + float destOpacity; + wxString initCol = Col2SVG(initialColour, &initOpacity); + wxString destCol = Col2SVG(destColour, &destOpacity); + + const int x1 = ((nDirection & wxLEFT) > 0) ? 100 : 0; + const int y1 = ((nDirection & wxUP) > 0) ? 100 : 0; + const int x2 = ((nDirection & wxRIGHT) > 0) ? 100 : 0; + const int y2 = ((nDirection & wxDOWN) > 0) ? 100 : 0; + + wxString s; + s += wxS(" \n"); + s += wxString::Format(wxS(" \n"), + m_gradientUniqueId, x1, y1, x2, y2); + s += wxString::Format(wxS(" \n"), + initCol, NumStr(initOpacity)); + s += wxString::Format(wxS(" \n"), + destCol, NumStr(destOpacity)); + s += wxS(" \n"); + s += wxS(" \n"); + + s += wxString::Format(wxS(" \n"), + rect.x, rect.y, rect.width, rect.height, m_gradientUniqueId, + wxRenderMode(m_renderingMode), wxGetPenPattern(m_pen), wxGetBrushFill(m_brush)); + + m_gradientUniqueId++; + + write(s); + + CalcBoundingBox(rect.x, rect.y); + CalcBoundingBox(rect.x + rect.width, rect.y + rect.height); +} + +void wxSVGFileDCImpl::DoGradientFillConcentric(const wxRect& rect, + const wxColour& initialColour, + const wxColour& destColour, + const wxPoint& circleCenter) +{ + NewGraphicsIfNeeded(); + + float initOpacity; + float destOpacity; + wxString initCol = Col2SVG(initialColour, &initOpacity); + wxString destCol = Col2SVG(destColour, &destOpacity); + + const double cx = circleCenter.x * 100.0 / rect.GetWidth(); + const double cy = circleCenter.y * 100.0 / rect.GetHeight(); + const double fx = cx; + const double fd = cy; + + wxString s; + s += wxS(" \n"); + s += wxString::Format(wxS(" \n"), + m_gradientUniqueId, NumStr(cx), NumStr(cy), NumStr(fx), NumStr(fd)); + s += wxString::Format(wxS(" \n"), + initCol, NumStr(initOpacity)); + s += wxString::Format(wxS(" \n"), + destCol, NumStr(destOpacity)); + s += wxS(" \n"); + s += wxS(" \n"); + + s += wxString::Format(wxS(" \n"), + rect.x, rect.y, rect.width, rect.height, m_gradientUniqueId, + wxRenderMode(m_renderingMode), wxGetPenPattern(m_pen), wxGetBrushFill(m_brush)); + + m_gradientUniqueId++; + + write(s); + + CalcBoundingBox(rect.x, rect.y); + CalcBoundingBox(rect.x + rect.width, rect.y + rect.height); +} + void wxSVGFileDCImpl::DoSetClippingRegion(int x, int y, int width, int height) { wxString svg;