diff --git a/vstgui/lib/platform/linux/cairogradient.cpp b/vstgui/lib/platform/linux/cairogradient.cpp index 9488d9916..296141690 100644 --- a/vstgui/lib/platform/linux/cairogradient.cpp +++ b/vstgui/lib/platform/linux/cairogradient.cpp @@ -44,22 +44,24 @@ const PatternHandle& Gradient::getLinearGradient (CPoint start, CPoint end) cons } //------------------------------------------------------------------------ -const PatternHandle& Gradient::getRadialGradient () +const PatternHandle& Gradient::getRadialGradient (CPoint center, CCoord radius, + CPoint originOffset) const { if (!radialGradient) { - radialGradient = PatternHandle (cairo_pattern_create_radial (0, 0, 1, 0, 0, 1)); + radialGradient = PatternHandle ( + cairo_pattern_create_radial (center.x, center.y, 0., center.x, center.y, radius)); + for (auto& it : getColorStops ()) { cairo_pattern_add_color_stop_rgba ( - radialGradient, it.first, it.second.normRed (), - it.second.normGreen (), it.second.normBlue (), - it.second.normAlpha ()); + radialGradient, it.first, it.second.normRed (), + it.second.normGreen (), it.second.normBlue (), + it.second.normAlpha ()); } } return radialGradient; } - //------------------------------------------------------------------------ } // Cairo } // VSTGUI diff --git a/vstgui/lib/platform/linux/cairogradient.h b/vstgui/lib/platform/linux/cairogradient.h index 785247db9..e0eb8453c 100644 --- a/vstgui/lib/platform/linux/cairogradient.h +++ b/vstgui/lib/platform/linux/cairogradient.h @@ -20,7 +20,8 @@ class Gradient : public PlatformGradientBase ~Gradient () noexcept override; const PatternHandle& getLinearGradient (CPoint start, CPoint end) const; - const PatternHandle& getRadialGradient (); + const PatternHandle& getRadialGradient (CPoint center, CCoord radius, + CPoint originOffset) const; private: void changed () override; diff --git a/vstgui/lib/platform/linux/cairographicscontext.cpp b/vstgui/lib/platform/linux/cairographicscontext.cpp index ab620cc91..ed7e493fd 100644 --- a/vstgui/lib/platform/linux/cairographicscontext.cpp +++ b/vstgui/lib/platform/linux/cairographicscontext.cpp @@ -624,8 +624,33 @@ bool CairoGraphicsDeviceContext::fillRadialGradient (IPlatformGraphicsPath& path auto cairoPath = dynamic_cast (&path); if (!cairoPath) return false; - // TODO: Implementation - return false; + + auto cairoGradient = dynamic_cast (&gradient); + if (!cairoGradient) + return false; + impl->doInContext ([&] () { + std::unique_ptr alignedPath; + if (impl->state.drawMode.integralMode ()) + { + alignedPath = cairoPath->copyPixelAlign ([&] (CPoint p) { + p = pixelAlign (impl->state.tm, p); + return p; + }); + } + auto p = alignedPath ? alignedPath->getCairoPath () : cairoPath->getCairoPath (); + cairo_append_path (impl->context, p); + + const auto& radialGradient = + cairoGradient->getRadialGradient (center, radius, originOffset); + cairo_set_source (impl->context, radialGradient); + if (evenOdd) + cairo_set_fill_rule (impl->context, CAIRO_FILL_RULE_EVEN_ODD); + + cairo_arc (impl->context, 0, 0, 0, 0., M_PI * 2.); + cairo_fill (impl->context); + }); + + return true; } //------------------------------------------------------------------------