Skip to content
This repository was archived by the owner on Oct 28, 2023. It is now read-only.

Commit d1f07c7

Browse files
authored
Merge pull request SHA2017-badge#202 from SHA2017-badge/basvs-read-png-from-bytestr
Read PNG files directly from byte-string.
2 parents d62d6bc + 50e4b75 commit d1f07c7

File tree

2 files changed

+39
-9
lines changed

2 files changed

+39
-9
lines changed

esp32/modbadge.c

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -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
299299
{
300300
int x = mp_obj_get_int(obj_x);
301301
int y = mp_obj_get_int(obj_y);
302-
const char* filename = mp_obj_str_get_str(obj_filename);
303302

304303
if (x >= BADGE_EINK_WIDTH || y >= BADGE_EINK_HEIGHT)
305304
{
306305
return mp_const_none;
307306
}
308307

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;
314335
}
315336

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);
317338
if (pr == NULL)
318339
{
319-
lib_file_destroy(fr);
340+
if (is_bytes) {
341+
lib_mem_destroy(reader_p);
342+
} else {
343+
lib_file_destroy(reader_p);
344+
}
320345
nlr_raise(mp_obj_new_exception_msg_varg(&mp_type_ValueError, "out of memory."));
321346
return mp_const_none;
322347
}
@@ -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
325350
uint32_t dst_min_y = y < 0 ? -y : 0;
326351
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);
327352
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+
}
329358

330359
if (res < 0)
331360
{

esp32/modbadge.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#include "badge_vibrator.h"
1414
#include "badge_nvs.h"
1515

16+
#include "mem_reader.h"
1617
#include "file_reader.h"
1718
#include "png_reader.h"
1819

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy