2626
2727#include "py/obj.h"
2828#include "py/objarray.h"
29+ #include "py/objtype.h"
2930#include "py/mphal.h"
3031#include "py/runtime.h"
3132#include "py/binary.h"
@@ -223,13 +224,20 @@ STATIC mp_obj_t pixelbuf_pixelbuf_make_new(const mp_obj_type_t *type, size_t n_a
223224 return MP_OBJ_FROM_PTR (self );
224225}
225226
227+
228+ // Helper to ensure we have the native super class instead of a subclass.
229+ static pixelbuf_pixelbuf_obj_t * native_pixelbuf (mp_obj_t pixelbuf_obj ) {
230+ mp_obj_t native_pixelbuf = mp_instance_cast_to_native_base (pixelbuf_obj , & pixelbuf_pixelbuf_type );
231+ mp_obj_assert_native_inited (native_pixelbuf );
232+ return MP_OBJ_TO_PTR (native_pixelbuf );
233+ }
234+
226235//| .. attribute:: bpp
227236//|
228237//| The number of bytes per pixel in the buffer (read-only)
229238//|
230239STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_bpp (mp_obj_t self_in ) {
231- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
232- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
240+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
233241 return mp_obj_new_int_from_uint (self -> byteorder .bpp );
234242}
235243MP_DEFINE_CONST_FUN_OBJ_1 (pixelbuf_pixelbuf_get_bpp_obj , pixelbuf_pixelbuf_obj_get_bpp );
@@ -252,16 +260,14 @@ const mp_obj_property_t pixelbuf_pixelbuf_bpp_obj = {
252260//| In DotStar mode
253261//|
254262STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_brightness (mp_obj_t self_in ) {
255- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
256- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
263+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
257264 return mp_obj_new_float (self -> brightness );
258265}
259266MP_DEFINE_CONST_FUN_OBJ_1 (pixelbuf_pixelbuf_get_brightness_obj , pixelbuf_pixelbuf_obj_get_brightness );
260267
261268
262269STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_brightness (mp_obj_t self_in , mp_obj_t value ) {
263- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
264- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
270+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
265271 self -> brightness = mp_obj_float_get (value );
266272 if (self -> brightness > 1 )
267273 self -> brightness = 1 ;
@@ -298,16 +304,14 @@ void pixelbuf_recalculate_brightness(pixelbuf_pixelbuf_obj_t *self) {
298304//| Whether to automatically write the pixels after each update.
299305//|
300306STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_auto_write (mp_obj_t self_in ) {
301- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
302- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
307+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
303308 return mp_obj_new_bool (self -> auto_write );
304309}
305310MP_DEFINE_CONST_FUN_OBJ_1 (pixelbuf_pixelbuf_get_auto_write_obj , pixelbuf_pixelbuf_obj_get_auto_write );
306311
307312
308313STATIC mp_obj_t pixelbuf_pixelbuf_obj_set_auto_write (mp_obj_t self_in , mp_obj_t value ) {
309- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
310- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
314+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
311315 self -> auto_write = mp_obj_is_true (value );
312316 return mp_const_none ;
313317}
@@ -328,8 +332,7 @@ const mp_obj_property_t pixelbuf_pixelbuf_auto_write_obj = {
328332//| actual pixels.
329333//|
330334STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_buf (mp_obj_t self_in ) {
331- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
332- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
335+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
333336 return mp_obj_new_bytearray_by_ref (self -> bytes , self -> buf );
334337}
335338MP_DEFINE_CONST_FUN_OBJ_1 (pixelbuf_pixelbuf_get_buf_obj , pixelbuf_pixelbuf_obj_get_buf );
@@ -346,8 +349,7 @@ const mp_obj_property_t pixelbuf_pixelbuf_buf_obj = {
346349//| byteorder string for the buffer (read-only)
347350//|
348351STATIC mp_obj_t pixelbuf_pixelbuf_obj_get_byteorder (mp_obj_t self_in ) {
349- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
350- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
352+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
351353 return mp_obj_new_str (self -> byteorder .order , strlen (self -> byteorder .order ));
352354}
353355MP_DEFINE_CONST_FUN_OBJ_1 (pixelbuf_pixelbuf_get_byteorder_str , pixelbuf_pixelbuf_obj_get_byteorder );
@@ -360,8 +362,7 @@ const mp_obj_property_t pixelbuf_pixelbuf_byteorder_str = {
360362};
361363
362364STATIC mp_obj_t pixelbuf_pixelbuf_unary_op (mp_unary_op_t op , mp_obj_t self_in ) {
363- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
364- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
365+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
365366 switch (op ) {
366367 case MP_UNARY_OP_BOOL : return mp_const_true ;
367368 case MP_UNARY_OP_LEN : return MP_OBJ_NEW_SMALL_INT (self -> pixels );
@@ -375,8 +376,7 @@ STATIC mp_obj_t pixelbuf_pixelbuf_unary_op(mp_unary_op_t op, mp_obj_t self_in) {
375376//|
376377
377378STATIC mp_obj_t pixelbuf_pixelbuf_show (mp_obj_t self_in ) {
378- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
379- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
379+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
380380 call_write_function (self );
381381 return mp_const_none ;
382382}
@@ -398,15 +398,13 @@ void call_write_function(pixelbuf_pixelbuf_obj_t *self) {
398398//| Sets the pixel value at the given index.
399399//|
400400STATIC mp_obj_t pixelbuf_pixelbuf_subscr (mp_obj_t self_in , mp_obj_t index_in , mp_obj_t value ) {
401- mp_check_self (MP_OBJ_IS_TYPE (self_in , & pixelbuf_pixelbuf_type ));
402-
403401 if (value == MP_OBJ_NULL ) {
404402 // delete item
405403 // slice deletion
406404 return MP_OBJ_NULL ; // op not supported
407405 }
408406
409- pixelbuf_pixelbuf_obj_t * self = MP_OBJ_TO_PTR (self_in );
407+ pixelbuf_pixelbuf_obj_t * self = native_pixelbuf (self_in );
410408 if (0 ) {
411409#if MICROPY_PY_BUILTINS_SLICE
412410 } else if (MP_OBJ_IS_TYPE (index_in , & mp_type_slice )) {
0 commit comments