@@ -299,24 +299,49 @@ STATIC mp_obj_t badge_eink_png(mp_obj_t obj_x, mp_obj_t obj_y, mp_obj_t obj_file
299
299
{
300
300
int x = mp_obj_get_int (obj_x );
301
301
int y = mp_obj_get_int (obj_y );
302
- const char * filename = mp_obj_str_get_str (obj_filename );
303
302
304
303
if (x >= BADGE_EINK_WIDTH || y >= BADGE_EINK_HEIGHT )
305
304
{
306
305
return mp_const_none ;
307
306
}
308
307
309
- struct lib_file_reader * fr = lib_file_new (filename , 1024 );
310
- if (fr == NULL )
311
- {
312
- nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "Could not open file '%s'!" ,filename ));
313
- return mp_const_none ;
308
+ lib_reader_read_t reader ;
309
+ void * reader_p ;
310
+
311
+ bool is_bytes = MP_OBJ_IS_TYPE (obj_filename , & mp_type_bytes );
312
+
313
+ if (is_bytes ) {
314
+ size_t len ;
315
+ const uint8_t * png_data = (const uint8_t * ) mp_obj_str_get_data (obj_filename , & len );
316
+ struct lib_mem_reader * mr = lib_mem_new (png_data , len );
317
+ if (mr == NULL )
318
+ {
319
+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "out of memory!" ));
320
+ return mp_const_none ;
321
+ }
322
+ reader = (lib_reader_read_t ) & lib_mem_read ;
323
+ reader_p = mr ;
324
+
325
+ } else {
326
+ const char * filename = mp_obj_str_get_str (obj_filename );
327
+ struct lib_file_reader * fr = lib_file_new (filename , 1024 );
328
+ if (fr == NULL )
329
+ {
330
+ nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "Could not open file '%s'!" ,filename ));
331
+ return mp_const_none ;
332
+ }
333
+ reader = (lib_reader_read_t ) & lib_file_read ;
334
+ reader_p = fr ;
314
335
}
315
336
316
- struct lib_png_reader * pr = lib_png_new (( lib_reader_read_t ) & lib_file_read , fr );
337
+ struct lib_png_reader * pr = lib_png_new (reader , reader_p );
317
338
if (pr == NULL )
318
339
{
319
- lib_file_destroy (fr );
340
+ if (is_bytes ) {
341
+ lib_mem_destroy (reader_p );
342
+ } else {
343
+ lib_file_destroy (reader_p );
344
+ }
320
345
nlr_raise (mp_obj_new_exception_msg_varg (& mp_type_ValueError , "out of memory." ));
321
346
return mp_const_none ;
322
347
}
@@ -325,7 +350,11 @@ STATIC mp_obj_t badge_eink_png(mp_obj_t obj_x, mp_obj_t obj_y, mp_obj_t obj_file
325
350
uint32_t dst_min_y = y < 0 ? - y : 0 ;
326
351
int res = lib_png_load_image (pr , & badge_eink_fb [y * BADGE_EINK_WIDTH + x ], dst_min_x , dst_min_y , BADGE_EINK_WIDTH - x , BADGE_EINK_HEIGHT - y , BADGE_EINK_WIDTH );
327
352
lib_png_destroy (pr );
328
- lib_file_destroy (fr );
353
+ if (is_bytes ) {
354
+ lib_mem_destroy (reader_p );
355
+ } else {
356
+ lib_file_destroy (reader_p );
357
+ }
329
358
330
359
if (res < 0 )
331
360
{
0 commit comments