Improve graphic List<T> fill/stroke paint handling (#4240)

* Fix empty color list ignoring paint target

* Avoid cloning renderable lists for paint presence checks

* Refactor after code review by gemini

* Make singular matrix check more robust

* Extract transform_is_invertible helper; clarify has_paint_at docs

---------

Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
YohYamasaki
2026-06-19 22:42:49 +02:00
committed by GitHub
parent 5f100946f2
commit 3bf32443ed
3 changed files with 34 additions and 21 deletions

View File

@@ -1,4 +1,4 @@
use crate::renderer::{RenderParams, format_transform_matrix};
use crate::renderer::{RenderParams, format_transform_matrix, transform_is_invertible};
use crate::{Render, RenderSvgSegmentList, SvgRender};
use core_types::color::SRGBA8;
use core_types::list::List;
@@ -65,7 +65,9 @@ impl RenderExt for List<Color> {
_render_params: &RenderParams,
target: PaintTarget,
) -> Self::Output {
let Some(color) = self.element(0) else { return r#" fill="none""#.to_string() };
let Some(color) = self.element(0) else {
return format!(r#" {}="none""#, target.paint_attr());
};
let mut result = format!(r##" {}="#{}""##, target.paint_attr(), SRGBA8::from(*color).to_rgb_hex());
if color.a() < 1. {
@@ -117,7 +119,7 @@ impl RenderExt for List<GradientStops> {
let start = transform_points.transform_point2(DVec2::ZERO);
let end = transform_points.transform_point2(DVec2::X);
let gradient_transform = if transformed_bounds.matrix2.determinant() != 0. {
let gradient_transform = if transform_is_invertible(transformed_bounds) {
transformed_bounds.inverse()
} else {
DAffine2::IDENTITY // Ignore if the transform cannot be inverted (the bounds are zero). See issue #1944.