@@ -51,7 +51,7 @@ extern const int32_t colorwheel(float pos);
51
51
//|
52
52
//| :class:`~_pixelbuf.PixelBuf` implements an RGB[W] bytearray abstraction.
53
53
//|
54
- //| .. class:: PixelBuf(size, buf, byteorder=BGR, bpp=3 )
54
+ //| .. class:: PixelBuf(size, buf, byteorder=BGR, brightness=0, rawbuf=None, offset=0, dotstar=False, auto_write=False, write_function=None, write_args=None )
55
55
//|
56
56
//| Create a PixelBuf object of the specified size, byteorder, and bits per pixel.
57
57
//|
@@ -66,14 +66,14 @@ extern const int32_t colorwheel(float pos);
66
66
//|
67
67
//| :param ~int size: Number of pixelsx
68
68
//| :param ~bytearray buf: Bytearray to store pixel data in
69
- //| :param ~_pixelbuf.ByteOrder byteorder: Byte order constant from `_pixelbuf` (also sets the bpp)
69
+ //| :param ~_pixelbuf.ByteOrder byteorder: Byte order constant from `_pixelbuf`
70
70
//| :param ~float brightness: Brightness (0 to 1.0, default 1.0)
71
71
//| :param ~bytearray rawbuf: Bytearray to store raw pixel colors in
72
72
//| :param ~int offset: Offset from start of buffer (default 0)
73
73
//| :param ~bool dotstar: Dotstar mode (default False)
74
74
//| :param ~bool auto_write: Whether to automatically write pixels (Default False)
75
75
//| :param ~callable write_function: (optional) Callable to use to send pixels
76
- //| :param ~list write_args: (optional) Tuple or list of args to pass to ``write_function``. The
76
+ //| :param ~list write_args: (optional) Tuple or list of args to pass to ``write_function``. The
77
77
//| PixelBuf instance is appended after these args.
78
78
//|
79
79
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 ) {
@@ -95,7 +95,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
95
95
mp_arg_val_t args [MP_ARRAY_SIZE (allowed_args )];
96
96
mp_arg_parse_all (n_args , pos_args , kw_args , MP_ARRAY_SIZE (allowed_args ), allowed_args , args );
97
97
98
- if (mp_obj_is_subclass_fast (args [ARG_byteorder ].u_obj , & pixelbuf_byteorder_type ))
98
+ if (mp_obj_is_subclass_fast (args [ARG_byteorder ].u_obj , & pixelbuf_byteorder_type ))
99
99
mp_raise_TypeError_varg (translate ("byteorder is not an instance of ByteOrder (got a %s)" ), mp_obj_get_type_str (args [ARG_byteorder ].u_obj ));
100
100
101
101
pixelbuf_byteorder_obj_t * byteorder = (args [ARG_byteorder ].u_obj == mp_const_none ) ? MP_OBJ_FROM_PTR (& byteorder_BGR ) : args [ARG_byteorder ].u_obj ;
@@ -122,7 +122,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
122
122
123
123
if (!MP_OBJ_IS_TYPE (args [ARG_write_args ].u_obj , & mp_type_list ) &&
124
124
!MP_OBJ_IS_TYPE (args [ARG_write_args ].u_obj , & mp_type_tuple ) &&
125
- args [ARG_write_args ].u_obj != mp_const_none )
125
+ args [ARG_write_args ].u_obj != mp_const_none )
126
126
{
127
127
mp_raise_ValueError (translate ("write_args must be a list, tuple, or None" ));
128
128
}
@@ -186,8 +186,8 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
186
186
else if (self -> brightness > 1 )
187
187
self -> brightness = 1 ;
188
188
}
189
-
190
- if (self -> dotstar_mode ) {
189
+
190
+ if (self -> dotstar_mode ) {
191
191
// Initialize the buffer with the dotstar start bytes.
192
192
// Header and end must be setup by caller
193
193
for (uint i = 0 ; i < self -> pixels * 4 ; i += 4 ) {
@@ -197,7 +197,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
197
197
}
198
198
}
199
199
}
200
-
200
+
201
201
return MP_OBJ_FROM_PTR (self );
202
202
}
203
203
@@ -227,7 +227,7 @@ const mp_obj_property_t pixelbuf_pixelbuf_bpp_obj = {
227
227
//| setting this value causes a recomputation of the values in buf.
228
228
//| If only a buf was provided, then the brightness only applies to
229
229
//| future pixel changes.
230
- //| In DotStar mode
230
+ //| In DotStar mode
231
231
//|
232
232
STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_brightness (mp_obj_t self_in ) {
233
233
mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
@@ -266,7 +266,7 @@ void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) {
266
266
// Compensate for shifted buffer (bpp=3 dotstar)
267
267
for (uint i = 0 ; i < self -> bytes ; i ++ ) {
268
268
// Don't adjust per-pixel luminance bytes in dotstar mode
269
- if (!self -> dotstar_mode || (i % 4 != 0 ))
269
+ if (!self -> dotstar_mode || (i % 4 != 0 ))
270
270
buf [i ] = rawbuf [i ] * self -> brightness ;
271
271
}
272
272
}
@@ -367,11 +367,13 @@ void call_write_function(pixelbuf_pixelbuf_obj_t *self) {
367
367
}
368
368
}
369
369
370
-
371
-
372
- //| .. method:: []
370
+ //| .. method:: __getitem__(index)
371
+ //|
372
+ //| Returns the pixel value at the given index.
373
373
//|
374
- //| Get or set pixels. Supports individual pixels and slices.
374
+ //| .. method:: __setitem__(index, value)
375
+ //|
376
+ //| Sets the pixel value at the given index.
375
377
//|
376
378
STATIC mp_obj_t pixelbuf_pixelbuf_subscr (mp_obj_t self_in , mp_obj_t index_in , mp_obj_t value ) {
377
379
mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
@@ -380,7 +382,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
380
382
// delete item
381
383
// slice deletion
382
384
return MP_OBJ_NULL ; // op not supported
383
- }
385
+ }
384
386
385
387
pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
386
388
if (0 ) {
@@ -390,7 +392,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
390
392
391
393
if (!mp_seq_get_fast_slice_indexes (self -> bytes , index_in , & slice ))
392
394
mp_raise_NotImplementedError (translate ("Only slices with step=1 (aka None) are supported" ));
393
- if ((slice .stop * self -> pixel_step ) > self -> bytes )
395
+ if ((slice .stop * self -> pixel_step ) > self -> bytes )
394
396
mp_raise_IndexError (translate ("Range out of bounds" ));
395
397
396
398
if (value == MP_OBJ_SENTINEL ) { // Get
@@ -422,8 +424,8 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
422
424
for (size_t i = slice .start ; i < slice .stop ; i ++ ) {
423
425
mp_obj_t * item = src_objs [i - slice .start ];
424
426
if (MP_OBJ_IS_TYPE (value , & mp_type_list ) || MP_OBJ_IS_TYPE (value , & mp_type_tuple ) || MP_OBJ_IS_INT (value )) {
425
- pixelbuf_set_pixel (self -> buf + (i * self -> pixel_step ),
426
- self -> two_buffers ? self -> rawbuf + (i * self -> pixel_step ) : NULL ,
427
+ pixelbuf_set_pixel (self -> buf + (i * self -> pixel_step ),
428
+ self -> two_buffers ? self -> rawbuf + (i * self -> pixel_step ) : NULL ,
427
429
self -> brightness , item , & self -> byteorder , self -> dotstar_mode );
428
430
}
429
431
}
@@ -438,14 +440,14 @@ STATIC mp_obj_t pixelbuf_pixelbuf_subscr(mp_obj_t self_in, mp_obj_t index_in, mp
438
440
} else { // Single index rather than slice.
439
441
size_t index = mp_get_index (self -> base .type , self -> pixels , index_in , false);
440
442
size_t offset = (index * self -> pixel_step );
441
- if (offset > self -> bytes )
443
+ if (offset > self -> bytes )
442
444
mp_raise_IndexError (translate ("Pixel beyond bounds of buffer" ));
443
445
444
446
if (value == MP_OBJ_SENTINEL ) { // Get
445
447
uint8_t * pixelstart = (uint8_t * )(self -> two_buffers ? self -> rawbuf : self -> buf ) + offset ;
446
448
return pixelbuf_get_pixel (pixelstart , & self -> byteorder , self -> dotstar_mode );
447
449
} else { // Store
448
- pixelbuf_set_pixel (self -> buf + offset , self -> two_buffers ? self -> rawbuf + offset : NULL ,
450
+ pixelbuf_set_pixel (self -> buf + offset , self -> two_buffers ? self -> rawbuf + offset : NULL ,
449
451
self -> brightness , value , & self -> byteorder , self -> dotstar_mode );
450
452
if (self -> auto_write )
451
453
call_write_function (self );
0 commit comments