From 0f5275493fb90428590dffcf8b271d1f0e540b1f Mon Sep 17 00:00:00 2001 From: Phil Rittenhouse Date: Thu, 17 Apr 2025 09:54:31 -0400 Subject: [PATCH] Fixes for issue #158 Fixed area union logic Fixed _shape_set_dirty to add new position area to the dirty area Use int() to make sure circle radius is an integer --- displayio/_area.py | 4 ++-- vectorio/_circle.py | 2 +- vectorio/_vectorshape.py | 5 +++++ 3 files changed, 8 insertions(+), 3 deletions(-) diff --git a/displayio/_area.py b/displayio/_area.py index f7272dd..0b3dd80 100644 --- a/displayio/_area.py +++ b/displayio/_area.py @@ -87,10 +87,10 @@ class Area: def union(self, other, union): """Combine this area along with another into union""" if self.empty(): - self.copy_into(union) + other.copy_into(union) return if other.empty(): - other.copy_into(union) + self.copy_into(union) return union.x1 = min(self.x1, other.x1) diff --git a/vectorio/_circle.py b/vectorio/_circle.py index cc87351..f002800 100644 --- a/vectorio/_circle.py +++ b/vectorio/_circle.py @@ -61,7 +61,7 @@ class Circle(_VectorShape): def radius(self, value: int) -> None: if value < 1: raise ValueError("radius must be >= 1") - self._radius = abs(value) + self._radius = int(value) # other code assumes radius is an integer self._shape_set_dirty() @property diff --git a/vectorio/_vectorshape.py b/vectorio/_vectorshape.py index d3d1ddb..999f82e 100644 --- a/vectorio/_vectorshape.py +++ b/vectorio/_vectorshape.py @@ -122,9 +122,14 @@ class _VectorShape: self._get_screen_area(current_area) moved = current_area != self._current_area if moved: + # This will add _current_area (the old position) to dirty area self._current_area.union( self._ephemeral_dirty_area, self._ephemeral_dirty_area ) + # This will add the new position to the dirty area + current_area.union( + self._ephemeral_dirty_area, self._ephemeral_dirty_area + ) # Dirty area tracks the shape's footprint between draws. It's reset on refresh finish. current_area.copy_into(self._current_area) self._current_area_dirty = True -- 2.49.0