@@ -300,17 +300,20 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
300
300
size_t length = common_hal__pixelbuf_pixelbuf_get_len (self_in );
301
301
mp_seq_get_fast_slice_indexes (length , index_in , & slice );
302
302
303
- if (slice .step < 0 ) {
304
- mp_raise_IndexError (translate ("Negative step not supported" ));
303
+ size_t slice_len ;
304
+ if (slice .step > 0 ) {
305
+ slice_len = slice .stop - slice .start ;
306
+ } else {
307
+ slice_len = 1 + slice .start - slice .stop ;
308
+ }
309
+ if (slice .step > 1 || slice .step < -1 ) {
310
+ size_t step = slice .step > 0 ? slice .step : slice .step * -1 ;
311
+ slice_len = (slice_len / step ) + (slice_len % step ? 1 : 0 );
305
312
}
306
313
307
314
if (value == MP_OBJ_SENTINEL ) { // Get
308
- size_t len = slice .stop - slice .start ;
309
- if (slice .step > 1 ) {
310
- len = (len / slice .step ) + (len % slice .step ? 1 : 0 );
311
- }
312
- mp_obj_tuple_t * t = MP_OBJ_TO_PTR (mp_obj_new_tuple (len , NULL ));
313
- for (uint i = 0 ; i < len ; i ++ ) {
315
+ mp_obj_tuple_t * t = MP_OBJ_TO_PTR (mp_obj_new_tuple (slice_len , NULL ));
316
+ for (uint i = 0 ; i < slice_len ; i ++ ) {
314
317
t -> items [i ] = common_hal__pixelbuf_pixelbuf_get_pixel (self_in , i * slice .step + slice .start );
315
318
}
316
319
return MP_OBJ_FROM_PTR (t );
@@ -321,10 +324,6 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
321
324
mp_raise_ValueError (translate ("tuple/list required on RHS" ));
322
325
}
323
326
324
- size_t dst_len = (slice .stop - slice .start );
325
- if (slice .step > 1 ) {
326
- dst_len = (dst_len / slice .step ) + (dst_len % slice .step ? 1 : 0 );
327
- }
328
327
mp_obj_t * src_objs ;
329
328
size_t num_items ;
330
329
if (MP_OBJ_IS_TYPE (value , & mp_type_list )) {
@@ -336,12 +335,12 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
336
335
num_items = l -> len ;
337
336
src_objs = l -> items ;
338
337
}
339
- if (num_items != dst_len ) {
338
+ if (num_items != slice_len ) {
340
339
mp_raise_ValueError_varg (translate ("Unmatched number of items on RHS (expected %d, got %d)." ),
341
- dst_len , num_items );
340
+ slice_len , num_items );
342
341
}
343
342
344
- common_hal__pixelbuf_pixelbuf_set_pixels (self_in , slice .start , slice .stop , slice . step , src_objs );
343
+ common_hal__pixelbuf_pixelbuf_set_pixels (self_in , slice .start , slice .step , slice_len , src_objs );
345
344
return mp_const_none ;
346
345
#else
347
346
return MP_OBJ_NULL ; // op not supported
0 commit comments