Merge pull request #7456 from penpot/elenatorro-12248-fix-shadows-order

🔧 Always return shadows in reverse order
This commit is contained in:
Alejandro Alonso 2025-10-07 13:16:49 +02:00 committed by GitHub
commit 90bfae3ec1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 20 additions and 8 deletions

View File

@ -13,7 +13,7 @@ pub fn render_fill_inner_shadows(
surface_id: SurfaceId, surface_id: SurfaceId,
) { ) {
if shape.has_fills() { if shape.has_fills() {
for shadow in shape.inner_shadows().rev().filter(|s| !s.hidden()) { for shadow in shape.inner_shadows_visible() {
render_fill_inner_shadow(render_state, shape, shadow, antialias, surface_id); render_fill_inner_shadow(render_state, shape, shadow, antialias, surface_id);
} }
} }
@ -38,7 +38,7 @@ pub fn render_stroke_inner_shadows(
surface_id: SurfaceId, surface_id: SurfaceId,
) { ) {
if !shape.has_fills() { if !shape.has_fills() {
for shadow in shape.inner_shadows().rev().filter(|s| !s.hidden()) { for shadow in shape.inner_shadows_visible() {
let filter = shadow.get_inner_shadow_filter(); let filter = shadow.get_inner_shadow_filter();
strokes::render( strokes::render(
render_state, render_state,
@ -61,7 +61,7 @@ pub fn render_text_path_stroke_drop_shadows(
stroke: &Stroke, stroke: &Stroke,
antialias: bool, antialias: bool,
) { ) {
for shadow in shape.drop_shadows().rev().filter(|s| !s.hidden()) { for shadow in shape.drop_shadows_visible() {
let stroke_shadow = shadow.get_drop_shadow_filter(); let stroke_shadow = shadow.get_drop_shadow_filter();
strokes::render_text_paths( strokes::render_text_paths(
render_state, render_state,
@ -84,7 +84,7 @@ pub fn render_text_path_stroke_inner_shadows(
stroke: &Stroke, stroke: &Stroke,
antialias: bool, antialias: bool,
) { ) {
for shadow in shape.inner_shadows().rev().filter(|s| !s.hidden()) { for shadow in shape.inner_shadows_visible() {
let stroke_shadow = shadow.get_inner_shadow_filter(); let stroke_shadow = shadow.get_inner_shadow_filter();
strokes::render_text_paths( strokes::render_text_paths(
render_state, render_state,

View File

@ -1005,24 +1005,36 @@ impl Shape {
self.shadows.clear(); self.shadows.clear();
} }
#[allow(dead_code)]
pub fn drop_shadows(&self) -> impl DoubleEndedIterator<Item = &Shadow> { pub fn drop_shadows(&self) -> impl DoubleEndedIterator<Item = &Shadow> {
self.shadows self.shadows
.iter() .iter()
.rev()
.filter(|shadow| shadow.style() == ShadowStyle::Drop) .filter(|shadow| shadow.style() == ShadowStyle::Drop)
} }
pub fn drop_shadows_visible(&self) -> impl DoubleEndedIterator<Item = &Shadow> { pub fn drop_shadows_visible(&self) -> impl DoubleEndedIterator<Item = &Shadow> {
self.shadows self.shadows
.iter() .iter()
.rev()
.filter(|shadow| shadow.style() == ShadowStyle::Drop && !shadow.hidden()) .filter(|shadow| shadow.style() == ShadowStyle::Drop && !shadow.hidden())
} }
#[allow(dead_code)]
pub fn inner_shadows(&self) -> impl DoubleEndedIterator<Item = &Shadow> { pub fn inner_shadows(&self) -> impl DoubleEndedIterator<Item = &Shadow> {
self.shadows self.shadows
.iter() .iter()
.rev()
.filter(|shadow| shadow.style() == ShadowStyle::Inner) .filter(|shadow| shadow.style() == ShadowStyle::Inner)
} }
pub fn inner_shadows_visible(&self) -> impl DoubleEndedIterator<Item = &Shadow> {
self.shadows
.iter()
.rev()
.filter(|shadow| shadow.style() == ShadowStyle::Inner && !shadow.hidden())
}
pub fn to_path_transform(&self) -> Option<Matrix> { pub fn to_path_transform(&self) -> Option<Matrix> {
match self.shape_type { match self.shape_type {
Type::Path(_) | Type::Bool(_) => { Type::Path(_) | Type::Bool(_) => {
@ -1201,8 +1213,8 @@ impl Shape {
} }
pub fn drop_shadow_paints(&self) -> Vec<skia_safe::Paint> { pub fn drop_shadow_paints(&self) -> Vec<skia_safe::Paint> {
let drop_shadows: Vec<&crate::shapes::shadows::Shadow> = let drop_shadows: Vec<&Shadow> = self.drop_shadows_visible().collect();
self.drop_shadows().rev().filter(|s| !s.hidden()).collect();
drop_shadows drop_shadows
.into_iter() .into_iter()
.map(|shadow| { .map(|shadow| {
@ -1215,8 +1227,8 @@ impl Shape {
} }
pub fn inner_shadow_paints(&self) -> Vec<skia_safe::Paint> { pub fn inner_shadow_paints(&self) -> Vec<skia_safe::Paint> {
let inner_shadows: Vec<&crate::shapes::shadows::Shadow> = let inner_shadows: Vec<&Shadow> = self.inner_shadows_visible().collect();
self.inner_shadows().rev().filter(|s| !s.hidden()).collect();
inner_shadows inner_shadows
.into_iter() .into_iter()
.map(|shadow| { .map(|shadow| {