From 78b24355965d94400bfd4d869680fb25f9fb5229 Mon Sep 17 00:00:00 2001 From: RuiwenTang Date: Fri, 12 Jan 2024 10:43:50 +0800 Subject: [PATCH] gl_engine: fix radial gradient not render correctly root cause: the gradient shader not taking into account FillSpread property --- src/renderer/gl_engine/tvgGlRenderer.cpp | 2 ++ src/renderer/gl_engine/tvgGlShaderSrc.cpp | 10 ++++++++++ 2 files changed, 12 insertions(+) diff --git a/src/renderer/gl_engine/tvgGlRenderer.cpp b/src/renderer/gl_engine/tvgGlRenderer.cpp index 1a429ae1..fecb9088 100644 --- a/src/renderer/gl_engine/tvgGlRenderer.cpp +++ b/src/renderer/gl_engine/tvgGlRenderer.cpp @@ -568,6 +568,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla gradientBlock.nStops[0] = stopCnt * 1.f; gradientBlock.nStops[1] = NOISE_LEVEL; + gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; for (uint32_t i = 0; i < stopCnt; ++i) { gradientBlock.stopPoints[i] = stops[i].offset; gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; @@ -600,6 +601,7 @@ void GlRenderer::drawPrimitive(GlShape& sdata, const Fill* fill, RenderUpdateFla gradientBlock.nStops[0] = stopCnt * 1.f; gradientBlock.nStops[1] = NOISE_LEVEL; + gradientBlock.nStops[2] = static_cast(fill->spread()) * 1.f; for (uint32_t i = 0; i < stopCnt; ++i) { gradientBlock.stopPoints[i] = stops[i].offset; gradientBlock.stopColors[i * 4 + 0] = stops[i].r / 255.f; diff --git a/src/renderer/gl_engine/tvgGlShaderSrc.cpp b/src/renderer/gl_engine/tvgGlShaderSrc.cpp index 28a974a2..bcec1fe5 100644 --- a/src/renderer/gl_engine/tvgGlShaderSrc.cpp +++ b/src/renderer/gl_engine/tvgGlShaderSrc.cpp @@ -90,12 +90,22 @@ float gradientStop(int index) \n float gradientWrap(float d) \n { \n + int spread = int(uGradientInfo.nStops[2]); \n + \n + if (spread == 0) { /* pad */ \n + return clamp(d, 0.0, 1.0); \n + } \n + \n int i = 1; \n while (d > 1.0) { \n d = d - 1.0; \n i *= -1; \n } \n \n + if (spread == 2) { /* Reflect */ \n + return smoothstep(0.0, 1.0, d); \n + } \n + \n if (i == 1) \n return smoothstep(0.0, 1.0, d); \n else \n