Skip to content

Commit 1878509

Browse files
gmarullclaude
andcommitted
fw/applib/graphics: fix bitblt overflow for display widths > 255
The `row_bits_left` variable in the tiled bitblt functions was declared as `uint8_t`, causing silent truncation when `dest_rect.size.w` exceeds 255 pixels. On Gabbro (260x260), this truncates 260 to 4, which triggers a PBL_ASSERTN crash in `bitblt_bitmap_into_bitmap_tiled_1bit_to_8bit` when the scroll layer draws its 1-bit shadow bitmaps. Change the type to `int16_t` to match `dest_rect.size.w` (GRect uses int16_t for dimensions). Fixes #903 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> Signed-off-by: Gerard Marull-Paretas <gerard@teslabs.com>
1 parent 65ed91f commit 1878509

File tree

3 files changed

+3
-3
lines changed

3 files changed

+3
-3
lines changed

src/fw/applib/graphics/1_bit/bitblt_private.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -108,7 +108,7 @@ void bitblt_bitmap_into_bitmap_tiled_palette_to_1bit(GBitmap* dest_bitmap,
108108
RowLookUp look_up = look_ups[dest_y % 2];
109109

110110
int16_t src_x = src_begin_x + src_origin_offset.x;
111-
uint8_t row_bits_left = dest_rect.size.w;
111+
int16_t row_bits_left = dest_rect.size.w;
112112
uint32_t *dest_block = (uint32_t *)dest_block_x_begin + (dest_y * dest_row_length_words);
113113

114114
const uint32_t *dest_block_end = dest_block + num_dest_blocks_per_row;

src/fw/applib/graphics/8_bit/bitblt_private.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,7 @@ void bitblt_bitmap_into_bitmap_tiled_1bit_to_8bit(GBitmap* dest_bitmap,
289289
MIN(32, src_bitmap->bounds.size.w + src_line_start_idx - (src_origin_offset.x % 32));
290290
const uint8_t src_line_wrap_end_idx = MIN(32, src_bitmap->bounds.size.w + src_line_wrap_idx);
291291

292-
uint8_t row_bits_left = dest_rect.size.w;
292+
int16_t row_bits_left = dest_rect.size.w;
293293
uint32_t * const src_block_begin =
294294
(uint32_t *)src_block_x_begin + (src_y * src_row_length_words);
295295
uint32_t *src_block = src_block_begin;

src/fw/applib/graphics/bitblt.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ void bitblt_bitmap_into_bitmap_tiled_1bit_to_1bit(GBitmap* dest_bitmap,
5959

6060
int8_t src_dest_shift = 32 + dest_shift_at_line_begin - src_shift_at_line_begin;
6161
uint8_t dest_shift = dest_shift_at_line_begin;
62-
uint8_t row_bits_left = dest_rect.size.w;
62+
int16_t row_bits_left = dest_rect.size.w;
6363
uint32_t *dest_block = (uint32_t *)dest_block_x_begin + (dest_y * dest_row_length_words);
6464
uint32_t * const src_block_begin = (uint32_t *)src_block_x_begin + (src_y * src_row_length_words);
6565
uint32_t *src_block = src_block_begin;

0 commit comments

Comments
 (0)