27
27
#include <stdio.h>
28
28
#include <string.h>
29
29
30
+ #include "py/binary.h"
30
31
#include "py/runtime.h"
31
32
32
33
#if MICROPY_PY_FRAMEBUF
@@ -52,13 +53,14 @@ typedef struct _mp_framebuf_p_t {
52
53
} mp_framebuf_p_t ;
53
54
54
55
// constants for formats
55
- #define FRAMEBUF_MVLSB (0)
56
- #define FRAMEBUF_RGB565 (1)
57
- #define FRAMEBUF_GS2_HMSB (5)
58
- #define FRAMEBUF_GS4_HMSB (2)
59
- #define FRAMEBUF_GS8 (6)
60
- #define FRAMEBUF_MHLSB (3)
61
- #define FRAMEBUF_MHMSB (4)
56
+ #define FRAMEBUF_MVLSB (0)
57
+ #define FRAMEBUF_RGB565_BE (1)
58
+ #define FRAMEBUF_RGB565_LE (7)
59
+ #define FRAMEBUF_GS2_HMSB (5)
60
+ #define FRAMEBUF_GS4_HMSB (2)
61
+ #define FRAMEBUF_GS8 (6)
62
+ #define FRAMEBUF_MHLSB (3)
63
+ #define FRAMEBUF_MHMSB (4)
62
64
63
65
// Functions for MHLSB and MHMSB
64
66
@@ -114,16 +116,27 @@ STATIC void mvlsb_fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w, in
114
116
115
117
// Functions for RGB565 format
116
118
119
+ STATIC void rgb565_flip_endian (uint32_t * col , uint8_t format ) {
120
+ if ((MP_ENDIANNESS_LITTLE && format == FRAMEBUF_RGB565_BE ) || (MP_ENDIANNESS_BIG && format == FRAMEBUF_RGB565_LE )) {
121
+ * col = ((* col & 0xff ) << 8 ) | ((* col >> 8 ) & 0xff );
122
+ }
123
+ }
124
+
117
125
STATIC void rgb565_setpixel (const mp_obj_framebuf_t * fb , int x , int y , uint32_t col ) {
126
+ rgb565_flip_endian (& col , fb -> format );
118
127
((uint16_t * )fb -> buf )[x + y * fb -> stride ] = col ;
119
128
}
120
129
121
130
STATIC uint32_t rgb565_getpixel (const mp_obj_framebuf_t * fb , int x , int y ) {
122
- return ((uint16_t * )fb -> buf )[x + y * fb -> stride ];
131
+ uint32_t col = ((uint16_t * )fb -> buf )[x + y * fb -> stride ];
132
+ rgb565_flip_endian (& col , fb -> format );
133
+ return col ;
123
134
}
124
135
125
136
STATIC void rgb565_fill_rect (const mp_obj_framebuf_t * fb , int x , int y , int w , int h , uint32_t col ) {
137
+ rgb565_flip_endian (& col , fb -> format );
126
138
uint16_t * b = & ((uint16_t * )fb -> buf )[x + y * fb -> stride ];
139
+
127
140
while (h -- ) {
128
141
for (int ww = w ; ww ; -- ww ) {
129
142
* b ++ = col ;
@@ -228,14 +241,25 @@ STATIC void gs8_fill_rect(const mp_obj_framebuf_t *fb, int x, int y, int w, int
228
241
229
242
STATIC mp_framebuf_p_t formats [] = {
230
243
[FRAMEBUF_MVLSB ] = {mvlsb_setpixel , mvlsb_getpixel , mvlsb_fill_rect },
231
- [FRAMEBUF_RGB565 ] = {rgb565_setpixel , rgb565_getpixel , rgb565_fill_rect },
244
+ [FRAMEBUF_RGB565_BE ] = {rgb565_setpixel , rgb565_getpixel , rgb565_fill_rect },
245
+ [FRAMEBUF_RGB565_LE ] = {rgb565_setpixel , rgb565_getpixel , rgb565_fill_rect },
232
246
[FRAMEBUF_GS2_HMSB ] = {gs2_hmsb_setpixel , gs2_hmsb_getpixel , gs2_hmsb_fill_rect },
233
247
[FRAMEBUF_GS4_HMSB ] = {gs4_hmsb_setpixel , gs4_hmsb_getpixel , gs4_hmsb_fill_rect },
234
248
[FRAMEBUF_GS8 ] = {gs8_setpixel , gs8_getpixel , gs8_fill_rect },
235
249
[FRAMEBUF_MHLSB ] = {mono_horiz_setpixel , mono_horiz_getpixel , mono_horiz_fill_rect },
236
250
[FRAMEBUF_MHMSB ] = {mono_horiz_setpixel , mono_horiz_getpixel , mono_horiz_fill_rect },
237
251
};
238
252
253
+ STATIC inline size_t bytes_per_pixel (const mp_obj_framebuf_t * fb ) {
254
+ switch (fb -> format ) {
255
+ case FRAMEBUF_RGB565_BE :
256
+ case FRAMEBUF_RGB565_LE :
257
+ return 2 ;
258
+ default :
259
+ return 1 ;
260
+ }
261
+ }
262
+
239
263
static inline void setpixel (const mp_obj_framebuf_t * fb , int x , int y , uint32_t col ) {
240
264
formats [fb -> format ].setpixel (fb , x , y , col );
241
265
}
@@ -281,7 +305,8 @@ STATIC mp_obj_t framebuf_make_new(const mp_obj_type_t *type, size_t n_args, size
281
305
282
306
switch (o -> format ) {
283
307
case FRAMEBUF_MVLSB :
284
- case FRAMEBUF_RGB565 :
308
+ case FRAMEBUF_RGB565_BE :
309
+ case FRAMEBUF_RGB565_LE :
285
310
break ;
286
311
case FRAMEBUF_MHLSB :
287
312
case FRAMEBUF_MHMSB :
@@ -306,7 +331,7 @@ STATIC mp_int_t framebuf_get_buffer(mp_obj_t self_in, mp_buffer_info_t *bufinfo,
306
331
(void )flags ;
307
332
mp_obj_framebuf_t * self = MP_OBJ_TO_PTR (self_in );
308
333
bufinfo -> buf = self -> buf ;
309
- bufinfo -> len = self -> stride * self -> height * (self -> format == FRAMEBUF_RGB565 ? 2 : 1 );
334
+ bufinfo -> len = self -> stride * self -> height * bytes_per_pixel (self );
310
335
bufinfo -> typecode = 'B' ; // view framebuf as bytes
311
336
return 0 ;
312
337
}
@@ -630,7 +655,13 @@ STATIC const mp_rom_map_elem_t framebuf_module_globals_table[] = {
630
655
{ MP_ROM_QSTR (MP_QSTR_FrameBuffer1 ), MP_ROM_PTR (& legacy_framebuffer1_obj ) },
631
656
{ MP_ROM_QSTR (MP_QSTR_MVLSB ), MP_ROM_INT (FRAMEBUF_MVLSB ) },
632
657
{ MP_ROM_QSTR (MP_QSTR_MONO_VLSB ), MP_ROM_INT (FRAMEBUF_MVLSB ) },
633
- { MP_ROM_QSTR (MP_QSTR_RGB565 ), MP_ROM_INT (FRAMEBUF_RGB565 ) },
658
+ #if MP_ENDIANNESS_BIG
659
+ { MP_ROM_QSTR (MP_QSTR_RGB565 ), MP_ROM_INT (FRAMEBUF_RGB565_BE ) },
660
+ #else
661
+ { MP_ROM_QSTR (MP_QSTR_RGB565 ), MP_ROM_INT (FRAMEBUF_RGB565_LE ) },
662
+ #endif
663
+ { MP_ROM_QSTR (MP_QSTR_RGB565_BE ), MP_ROM_INT (FRAMEBUF_RGB565_BE ) },
664
+ { MP_ROM_QSTR (MP_QSTR_RGB565_LE ), MP_ROM_INT (FRAMEBUF_RGB565_LE ) },
634
665
{ MP_ROM_QSTR (MP_QSTR_GS2_HMSB ), MP_ROM_INT (FRAMEBUF_GS2_HMSB ) },
635
666
{ MP_ROM_QSTR (MP_QSTR_GS4_HMSB ), MP_ROM_INT (FRAMEBUF_GS4_HMSB ) },
636
667
{ MP_ROM_QSTR (MP_QSTR_GS8 ), MP_ROM_INT (FRAMEBUF_GS8 ) },
0 commit comments