@@ -72,14 +72,15 @@ static void parse_byteorder(mp_obj_t byteorder_obj, pixelbuf_byteorder_details_t
72
72
//|
73
73
STATIC mp_obj_t pixelbuf_pixelbuf_make_new (const mp_obj_type_t * type , size_t n_args , const mp_obj_t * pos_args , mp_map_t * kw_args ) {
74
74
mp_arg_check_num (n_args , kw_args , 1 , MP_OBJ_FUN_ARGS_MAX , true);
75
- enum { ARG_size , ARG_byteorder , ARG_brightness , ARG_auto_write , ARG_header , ARG_trailer };
75
+ enum { ARG_size , ARG_byteorder , ARG_brightness , ARG_auto_write , ARG_header , ARG_trailer , ARG_width };
76
76
static const mp_arg_t allowed_args [] = {
77
77
{ MP_QSTR_size , MP_ARG_REQUIRED | MP_ARG_INT },
78
78
{ MP_QSTR_byteorder , MP_ARG_KW_ONLY | MP_ARG_OBJ , { .u_obj = MP_OBJ_NEW_QSTR (MP_QSTR_BGR ) } },
79
79
{ MP_QSTR_brightness , MP_ARG_KW_ONLY | MP_ARG_OBJ , { .u_obj = mp_const_none } },
80
80
{ MP_QSTR_auto_write , MP_ARG_KW_ONLY | MP_ARG_BOOL , {.u_bool = false} },
81
81
{ MP_QSTR_header , MP_ARG_KW_ONLY | MP_ARG_OBJ , { .u_obj = mp_const_none } },
82
82
{ MP_QSTR_trailer , MP_ARG_KW_ONLY | MP_ARG_OBJ , { .u_obj = mp_const_none } },
83
+ { MP_QSTR_width , MP_ARG_KW_ONLY | MP_ARG_OBJ , { .u_obj = mp_const_none } },
83
84
};
84
85
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
85
86
mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
@@ -89,7 +90,11 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
89
90
90
91
mp_buffer_info_t header_bufinfo ;
91
92
mp_buffer_info_t trailer_bufinfo ;
93
+ int width = -1 ;
92
94
95
+ if (args [ARG_width ].u_obj != mp_const_none ) {
96
+ width = MP_OBJ_SMALL_INT_VALUE (args [ARG_width ].u_obj );
97
+ }
93
98
if (!mp_get_buffer (args [ARG_header ].u_obj , & header_bufinfo , MP_BUFFER_READ )) {
94
99
header_bufinfo .buf = NULL ;
95
100
header_bufinfo .len = 0 ;
@@ -114,7 +119,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
114
119
self -> base .type = & pixelbuf_pixelbuf_type ;
115
120
common_hal__pixelbuf_pixelbuf_construct (self , args [ARG_size ].u_int ,
116
121
& byteorder_details , brightness , args [ARG_auto_write ].u_bool , header_bufinfo .buf ,
117
- header_bufinfo .len , trailer_bufinfo .buf , trailer_bufinfo .len );
122
+ header_bufinfo .len , trailer_bufinfo .buf , trailer_bufinfo .len , width );
118
123
119
124
return MP_OBJ_FROM_PTR (self );
120
125
}
@@ -277,6 +282,27 @@ STATIC mp_obj_t pixelbuf_pixelbuf_fill(mp_obj_t self_in, mp_obj_t value) {
277
282
}
278
283
STATIC MP_DEFINE_CONST_FUN_OBJ_2 (pixelbuf_pixelbuf_fill_obj , pixelbuf_pixelbuf_fill );
279
284
285
+ STATIC size_t pixelbuf_get_index (mp_obj_t self_in , mp_obj_t index_in ) {
286
+ size_t length = common_hal__pixelbuf_pixelbuf_get_len (self_in );
287
+ int16_t width = common_hal__pixelbuf_pixelbuf_get_width (self_in );
288
+ if (width != -1 && MP_OBJ_IS_TYPE (index_in , & mp_type_tuple )) {
289
+ size_t x = mp_get_index (mp_obj_get_type (self_in ),
290
+ width ,
291
+ mp_obj_tuple_subscr (index_in ,
292
+ MP_OBJ_NEW_SMALL_INT (0 ),
293
+ MP_OBJ_SENTINEL ),
294
+ false);
295
+ size_t y = mp_get_index (mp_obj_get_type (self_in ),
296
+ common_hal__pixelbuf_pixelbuf_get_height (self_in ),
297
+ mp_obj_tuple_subscr (index_in ,
298
+ MP_OBJ_NEW_SMALL_INT (1 ),
299
+ MP_OBJ_SENTINEL ),
300
+ false);
301
+ return x + width * y ;
302
+ } else {
303
+ return mp_get_index (self_in , length , index_in , false);
304
+ }
305
+ }
280
306
281
307
//| .. method:: __getitem__(index)
282
308
//|
@@ -353,8 +379,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
353
379
}
354
380
#endif
355
381
} else { // Single index rather than slice.
356
- size_t length = common_hal__pixelbuf_pixelbuf_get_len (self_in );
357
- size_t index = mp_get_index (mp_obj_get_type (self_in ), length , index_in , false);
382
+ size_t index = pixelbuf_get_index (self_in , index_in );
358
383
359
384
if (value == MP_OBJ_SENTINEL ) { // Get
360
385
return common_hal__pixelbuf_pixelbuf_get_pixel (self_in , index );
0 commit comments