@@ -628,16 +628,24 @@ impl OutputDamageTracker {
628628 let mut force_effect_redraw = false ;
629629
630630 // add the damage for elements gone that are not covered an opaque region
631- let elements_gone = self . last_state . elements . iter ( ) . filter ( |( id, _) | {
632- element_render_states
633- . states
634- . get ( id)
635- . map ( |state| state. presentation_state == RenderElementPresentationState :: Skipped )
636- . unwrap_or ( true )
637- } ) ;
631+ let mut elements_gone = self
632+ . last_state
633+ . elements
634+ . iter ( )
635+ . filter ( |( id, _) | {
636+ element_render_states
637+ . states
638+ . get ( id)
639+ . map ( |state| state. presentation_state == RenderElementPresentationState :: Skipped )
640+ . unwrap_or ( true )
641+ } )
642+ . peekable ( ) ;
643+
644+ if elements_gone. peek ( ) . is_some ( ) {
645+ force_effect_redraw = true ;
646+ }
638647
639648 for ( _, state) in elements_gone {
640- force_effect_redraw = true ;
641649 self . damage . extend (
642650 state
643651 . last_instances
@@ -695,24 +703,29 @@ impl OutputDamageTracker {
695703 self . opaque_regions_index [ z_index] . start
696704 } ;
697705 let element_geometry = element. geometry ( output_scale) ;
698- let intersection = element_geometry. intersection ( output_geo) ;
706+ // SAFETY: render_elements only contains elements overlapping with the output geometry
707+ let intersection = element_geometry. intersection ( output_geo) . unwrap ( ) ;
699708 let element_state = element_render_states. states . get_mut ( element. id ( ) ) . unwrap ( ) ;
700709 let with_element_state = with_states
701710 . as_ref ( )
702711 . and_then ( |states| states. states . get ( element. id ( ) ) ) ;
703712
704713 if element_state. needs_capture
705714 || with_element_state. is_some_and ( |state| state. needs_capture )
706- || intersection. is_some_and ( |i| self . damage . iter ( ) . skip ( damage_index) . any ( |d| d. overlaps ( i) ) )
715+ || self
716+ . damage
717+ . iter ( )
718+ . skip ( damage_index)
719+ . any ( |d| d. overlaps ( intersection) )
707720 {
708721 element_state. needs_capture = true ;
709- self . damage . push ( intersection. unwrap ( ) ) ;
722+ self . damage . push ( intersection) ;
710723 // also drop all opaque regions on top, so they don't block re-drawing below the blur element
711724 for region in self . opaque_regions . iter_mut ( ) . take ( opaque_regions_index) {
712725 // we want to leave `self.opaque_regions_index` intact,
713726 // fixing it up would be very involved, so lets do the next best thing
714727 // and keep at least part of the opaque region, if possible.
715- * region = Rectangle :: subtract_rect ( * region, intersection. unwrap ( ) )
728+ * region = Rectangle :: subtract_rect ( * region, intersection)
716729 . into_iter ( )
717730 . next ( )
718731 . unwrap_or_default ( ) ;
@@ -918,25 +931,26 @@ impl OutputDamageTracker {
918931 element_damage,
919932 ) ;
920933
934+ let element_src = element. src ( ) ;
921935 if states
922936 . element_render_state ( element_id. clone ( ) )
923937 . is_some_and ( |state| state. needs_capture )
924938 {
925939 let cache = self
926940 . last_state
927941 . effects_cache
928- . entry ( element . id ( ) . clone ( ) )
942+ . entry ( element_id . clone ( ) )
929943 . or_default ( ) ;
930- element. capture_framebuffer ( & mut frame, element . src ( ) , element_geometry, cache) ?;
944+ element. capture_framebuffer ( & mut frame, element_src , element_geometry, cache) ?;
931945 }
932946
933947 element. draw (
934948 & mut frame,
935- element . src ( ) ,
949+ element_src ,
936950 element_geometry,
937951 & element_damage,
938952 & element_opaque_regions,
939- self . last_state . effects_cache . get ( element . id ( ) ) ,
953+ self . last_state . effects_cache . get ( element_id ) ,
940954 ) ?;
941955 }
942956
0 commit comments