gl_engine: add support for stroke/fill ordering

This commit is contained in:
Mira Grudzinska 2025-01-21 01:51:20 +01:00 committed by Hermet Park
parent 89e98b6fcb
commit 8f7103e109

View file

@ -1234,33 +1234,36 @@ bool GlRenderer::renderShape(RenderData data)
if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::GradientStroke)) drawDepth2 = currentPass()->nextDrawDepth(); if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::GradientStroke)) drawDepth2 = currentPass()->nextDrawDepth();
if (!sdata->clips.empty()) drawClip(sdata->clips); if (!sdata->clips.empty()) drawClip(sdata->clips);
if (flags & (RenderUpdateFlag::Color | RenderUpdateFlag::Gradient)) auto processFill = [&]() {
{ if (flags & (RenderUpdateFlag::Color | RenderUpdateFlag::Gradient)) {
auto gradient = sdata->rshape->fill; if (const auto& gradient = sdata->rshape->fill) {
if (gradient) drawPrimitive(*sdata, gradient, RenderUpdateFlag::Gradient, drawDepth1); drawPrimitive(*sdata, gradient, RenderUpdateFlag::Gradient, drawDepth1);
else { } else if (sdata->rshape->color[3] > 0) {
sdata->rshape->fillColor(&r, &g, &b, &a); sdata->rshape->fillColor(&r, &g, &b, &a);
if (a > 0)
{
drawPrimitive(*sdata, r, g, b, a, RenderUpdateFlag::Color, drawDepth1); drawPrimitive(*sdata, r, g, b, a, RenderUpdateFlag::Color, drawDepth1);
} }
} }
} };
if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::GradientStroke)) auto processStroke = [&]() {
{ if (!sdata->rshape->stroke) return;
auto gradient = sdata->rshape->strokeFill(); if (flags & (RenderUpdateFlag::Stroke | RenderUpdateFlag::GradientStroke)) {
if (gradient) { if (const auto& gradient = sdata->rshape->strokeFill()) {
drawPrimitive(*sdata, gradient, RenderUpdateFlag::GradientStroke, drawDepth2); drawPrimitive(*sdata, gradient, RenderUpdateFlag::GradientStroke, drawDepth2);
} else { } else if (sdata->rshape->strokeColor(&r, &g, &b, &a) && a > 0) {
if (sdata->rshape->strokeColor(&r, &g, &b, &a) && a > 0)
{
drawPrimitive(*sdata, r, g, b, a, RenderUpdateFlag::Stroke, drawDepth2); drawPrimitive(*sdata, r, g, b, a, RenderUpdateFlag::Stroke, drawDepth2);
} }
} }
};
if (sdata->rshape->stroke && sdata->rshape->stroke->strokeFirst) {
processStroke();
processFill();
} else {
processFill();
processStroke();
} }
return true; return true;