Skip to content

Commit

Permalink
Merge pull request #152 from FoamyGuy/refresh_fix
Browse files Browse the repository at this point in the history
Refresh Fix for TileGrid
  • Loading branch information
FoamyGuy authored Jan 22, 2025
2 parents a42ece2 + 51e8109 commit c35bd2c
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 18 deletions.
4 changes: 0 additions & 4 deletions displayio/_bitmap.py
Original file line number Diff line number Diff line change
Expand Up @@ -199,10 +199,6 @@ def _write_pixel(self, x: int, y: int, value: int) -> None:
elif bytes_per_value == 4:
struct.pack_into("<I", row, x * 4, value)

def _finish_refresh(self):
self._dirty_area.x1 = 0
self._dirty_area.x2 = 0

def fill(self, value: int) -> None:
"""Fills the bitmap with the supplied palette index value."""
if self._read_only:
Expand Down
45 changes: 31 additions & 14 deletions displayio/_tilegrid.py
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ def __init__(
self._tiles_in_bitmap = self._bitmap_width_in_tiles * (
bitmap_height // tile_height
)
self._needs_refresh = True

def _update_transform(self, absolute_transform):
"""Update the parent transform and child transforms"""
Expand All @@ -131,6 +132,7 @@ def _update_transform(self, absolute_transform):
self._update_current_y()

def _update_current_x(self):
self._needs_refresh = True
if self._transpose_xy:
width = self._pixel_height
else:
Expand Down Expand Up @@ -168,6 +170,7 @@ def _update_current_x(self):
)

def _update_current_y(self):
self._needs_refresh = True
if self._transpose_xy:
height = self._pixel_width
else:
Expand Down Expand Up @@ -404,20 +407,21 @@ def _fill_area(
return full_coverage

def _finish_refresh(self):
first_draw = self._previous_area.x1 == self._previous_area.x2
hidden = self._hidden_tilegrid or self._hidden_by_parent
if not first_draw and hidden:
self._previous_area.x2 = self._previous_area.x1
elif self._moved or first_draw:
self._current_area.copy_into(self._previous_area)

self._moved = False
self._full_change = False
self._partial_change = False
if isinstance(self._pixel_shader, (Palette, ColorConverter)):
self._pixel_shader._finish_refresh() # pylint: disable=protected-access
if isinstance(self._bitmap, Bitmap):
self._bitmap._finish_refresh() # pylint: disable=protected-access
if not self._needs_refresh:
first_draw = self._previous_area.x1 == self._previous_area.x2
hidden = self._hidden_tilegrid or self._hidden_by_parent
if not first_draw and hidden:
self._previous_area.x2 = self._previous_area.x1
elif self._moved or first_draw:
self._current_area.copy_into(self._previous_area)

self._moved = False
self._full_change = False
self._partial_change = False
if isinstance(self._pixel_shader, (Palette, ColorConverter)):
self._pixel_shader._finish_refresh() # pylint: disable=protected-access
if isinstance(self._bitmap, Bitmap):
self._bitmap._finish_refresh() # pylint: disable=protected-access

def _get_refresh_areas(self, areas: list[Area]) -> None:
# pylint: disable=invalid-name, too-many-branches, too-many-statements
Expand All @@ -429,14 +433,17 @@ def _get_refresh_areas(self, areas: list[Area]) -> None:
self._rendered_hidden = True
if not first_draw:
areas.append(self._previous_area)
self._needs_refresh = False
return
if self._moved and not first_draw:
self._previous_area.union(self._current_area, self._dirty_area)
if self._dirty_area.size() < 2 * self._pixel_width * self._pixel_height:
areas.append(self._dirty_area)
self._needs_refresh = False
return
areas.append(self._current_area)
areas.append(self._previous_area)
self._needs_refresh = False
return

tail = areas[-1] if areas else None
Expand All @@ -459,6 +466,7 @@ def _get_refresh_areas(self, areas: list[Area]) -> None:
)
if self._full_change or first_draw:
areas.append(self._current_area)
self._needs_refresh = False
return

if self._partial_change:
Expand Down Expand Up @@ -502,14 +510,17 @@ def _get_refresh_areas(self, areas: list[Area]) -> None:
self._dirty_area.x1,
)
areas.append(self._dirty_area)
self._needs_refresh = False

def _set_hidden(self, hidden: bool) -> None:
self._needs_refresh = True
self._hidden_tilegrid = hidden
self._rendered_hidden = False
if not hidden:
self._full_change = True

def _set_hidden_by_parent(self, hidden: bool) -> None:
self._needs_refresh = True
self._hidden_by_parent = hidden
self._rendered_hidden = False
if not hidden:
Expand All @@ -528,6 +539,7 @@ def _set_all_tiles(self, tile_index: int) -> None:
self._full_change = True

def _set_tile(self, x: int, y: int, tile_index: int) -> None:
self._needs_refresh = True
self._tiles[y * self._width_in_tiles + x] = tile_index
temp_area = Area()
if not self._partial_change:
Expand Down Expand Up @@ -608,6 +620,7 @@ def flip_x(self, value: bool):
if not isinstance(value, bool):
raise TypeError("Flip X should be a boolean type")
if self._flip_x != value:
self._needs_refresh = True
self._flip_x = value
self._full_change = True

Expand All @@ -621,6 +634,7 @@ def flip_y(self, value: bool):
if not isinstance(value, bool):
raise TypeError("Flip Y should be a boolean type")
if self._flip_y != value:
self._needs_refresh = True
self._flip_y = value
self._full_change = True

Expand All @@ -636,6 +650,7 @@ def transpose_xy(self, value: bool) -> None:
if not isinstance(value, bool):
raise TypeError("Transpose XY should be a boolean type")
if self._transpose_xy != value:
self._needs_refresh = True
self._transpose_xy = value
if self._pixel_width == self._pixel_height:
self._full_change = True
Expand All @@ -660,6 +675,7 @@ def pixel_shader(self, new_pixel_shader: Union[ColorConverter, Palette]) -> None

self._pixel_shader = new_pixel_shader
self._full_change = True
self._needs_refresh = True

@property
def bitmap(self) -> Union[Bitmap, OnDiskBitmap]:
Expand All @@ -681,6 +697,7 @@ def bitmap(self, new_bitmap: Union[Bitmap, OnDiskBitmap]) -> None:
):
raise ValueError("New bitmap must be same size as old bitmap")

self._needs_refresh = True
self._bitmap = new_bitmap
self._full_change = True

Expand Down

0 comments on commit c35bd2c

Please sign in to comment.