@@ -220,8 +220,8 @@ STATIC mp_obj_t displayio_bitmap_obj_blit(size_t n_args, const mp_obj_t *pos_arg
220220 check_for_deinit (self );
221221
222222 // Check x,y are within self (target) bitmap boundary
223- int16_t x = mp_arg_validate_int_range (args [ARG_x ].u_int , 0 , self -> width , MP_QSTR_x );
224- int16_t y = mp_arg_validate_int_range (args [ARG_y ].u_int , 0 , self -> height , MP_QSTR_y );
223+ int16_t x = mp_arg_validate_int_range (args [ARG_x ].u_int , 0 , MAX ( 0 , self -> width - 1 ) , MP_QSTR_x );
224+ int16_t y = mp_arg_validate_int_range (args [ARG_y ].u_int , 0 , MAX ( 0 , self -> height - 1 ) , MP_QSTR_y );
225225
226226 displayio_bitmap_t * source = mp_arg_validate_type (args [ARG_source ].u_obj , & displayio_bitmap_type , MP_QSTR_source_bitmap );
227227
@@ -232,8 +232,8 @@ STATIC mp_obj_t displayio_bitmap_obj_blit(size_t n_args, const mp_obj_t *pos_arg
232232 }
233233
234234 // Check x1,y1,x2,y2 are within source bitmap boundary
235- int16_t x1 = mp_arg_validate_int_range (args [ARG_x1 ].u_int , 0 , source -> width , MP_QSTR_x1 );
236- int16_t y1 = mp_arg_validate_int_range (args [ARG_y1 ].u_int , 0 , source -> height , MP_QSTR_y1 );
235+ int16_t x1 = mp_arg_validate_int_range (args [ARG_x1 ].u_int , 0 , MAX ( 0 , source -> width - 1 ) , MP_QSTR_x1 );
236+ int16_t y1 = mp_arg_validate_int_range (args [ARG_y1 ].u_int , 0 , MAX ( 0 , source -> height - 1 ) , MP_QSTR_y1 );
237237 int16_t x2 , y2 ;
238238 // if x2 or y2 is None, then set as the maximum size of the source bitmap
239239 if (args [ARG_x2 ].u_obj == mp_const_none ) {
0 commit comments