@@ -230,7 +230,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_brightness(mp_obj_t self_in, mp_obj_t
230230 if (self -> two_buffers )
231231 pixelbuf_recalculate_brightness (self );
232232 if (self -> auto_write )
233- call_show (self_in );
233+ call_show (self_in , 'b' );
234234 return mp_const_none ;
235235}
236236MP_DEFINE_CONST_FUN_OBJ_2 (pixelbuf_pixelbuf_set_brightness_obj , pixelbuf_pixelbuf_obj_set_brightness );
@@ -253,7 +253,7 @@ void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) {
253253 }
254254}
255255
256- mp_obj_t call_show (mp_obj_t self_in ) {
256+ mp_obj_t call_show (mp_obj_t self_in , char origin ) {
257257 mp_obj_t dest [2 ];
258258 mp_load_method (self_in , MP_QSTR_show , dest );
259259 return mp_call_method_n_kw (0 , 0 , dest );
@@ -356,29 +356,35 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
356356 }
357357
358358 pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
359+
359360 if (0 ) {
360361#if MICROPY_PY_BUILTINS_SLICE
361362 } else if (MP_OBJ_IS_TYPE (index_in , & mp_type_slice )) {
362363 mp_bound_slice_t slice ;
363364
364- if (!mp_seq_get_fast_slice_indexes (self -> bytes , index_in , & slice ))
365- // TODO support stepping!!!
366- mp_raise_NotImplementedError (translate ("Only slices with step=1 (aka None) are supported" ));
365+ mp_seq_get_fast_slice_indexes (self -> bytes , index_in , & slice );
366+
367367 if ((slice .stop * self -> pixel_step ) > self -> bytes )
368368 mp_raise_IndexError (translate ("Range out of bounds" ));
369+ if (slice .step < 0 )
370+ mp_raise_IndexError (translate ("Negative step not supported" ));
369371
370372 if (value == MP_OBJ_SENTINEL ) { // Get
371373 size_t len = slice .stop - slice .start ;
372374 uint8_t * readbuf = self -> two_buffers ? self -> rawbuf : self -> buf ;
373- return pixelbuf_get_pixel_array (readbuf + slice .start , len , & self -> byteorder , self -> pixel_step , self -> byteorder .is_dotstar );
375+ return pixelbuf_get_pixel_array (readbuf + slice .start , len , & self -> byteorder , self -> pixel_step , slice . step , self -> byteorder .is_dotstar );
374376 } else { // Set
375377 #if MICROPY_PY_ARRAY_SLICE_ASSIGN
376378
377379 if (!(MP_OBJ_IS_TYPE (value , & mp_type_list ) || MP_OBJ_IS_TYPE (value , & mp_type_tuple )))
378380 mp_raise_ValueError (translate ("tuple/list required on RHS" ));
379381
380- size_t dst_len = slice .stop - slice .start ;
381-
382+ size_t dst_len = (slice .stop - slice .start );
383+ dst_len = (slice .stop - slice .start ) / slice .step ;
384+ if (slice .step > 1 ) {
385+ if ((slice .stop - slice .start ) % slice .step )
386+ dst_len ++ ;
387+ }
382388 mp_obj_t * src_objs ;
383389 size_t num_items ;
384390 if (MP_OBJ_IS_TYPE (value , & mp_type_list )) {
@@ -394,16 +400,17 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
394400 mp_raise_ValueError_varg (translate ("Unmatched number of items on RHS (expected %d, got %d)." ),
395401 dst_len , num_items );
396402
397- for (size_t i = slice .start ; i < slice .stop ; i ++ ) {
403+ size_t target_i = slice .start ;
404+ for (size_t i = slice .start ; target_i < slice .stop ; i ++ , target_i += slice .step ) {
398405 mp_obj_t * item = src_objs [i - slice .start ];
399406 if (MP_OBJ_IS_TYPE (value , & mp_type_list ) || MP_OBJ_IS_TYPE (value , & mp_type_tuple ) || MP_OBJ_IS_INT (value )) {
400- pixelbuf_set_pixel (self -> buf + (i * self -> pixel_step ),
407+ pixelbuf_set_pixel (self -> buf + (target_i * self -> pixel_step ),
401408 self -> two_buffers ? self -> rawbuf + (i * self -> pixel_step ) : NULL ,
402409 self -> brightness , item , & self -> byteorder , self -> byteorder .is_dotstar );
403410 }
404411 }
405412 if (self -> auto_write )
406- call_show (self_in );
413+ call_show (self_in , 's' );
407414 return mp_const_none ;
408415 #else
409416 return MP_OBJ_NULL ; // op not supported
@@ -423,7 +430,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
423430 pixelbuf_set_pixel (self -> buf + offset , self -> two_buffers ? self -> rawbuf + offset : NULL ,
424431 self -> brightness , value , & self -> byteorder , self -> byteorder .is_dotstar );
425432 if (self -> auto_write )
426- call_show (self_in );
433+ call_show (self_in , 'i' );
427434 return mp_const_none ;
428435 }
429436 }
0 commit comments