Skip to content

Commit b23a71b

Browse files
Skyler84Gadgetoid
authored andcommitted
JPEGDEC: Backport width/height changes from pngdec.
Open JPEG file or stream to read width/height before decode.
1 parent 6b23c15 commit b23a71b

File tree

1 file changed

+40
-27
lines changed

1 file changed

+40
-27
lines changed

micropython/modules/jpegdec/jpegdec.cpp

Lines changed: 40 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ typedef struct _JPEG_obj_t {
2626
mp_obj_t file;
2727
mp_buffer_info_t buf;
2828
ModPicoGraphics_obj_t *graphics;
29+
int width;
30+
int height;
2931
} _JPEG_obj_t;
3032

3133

@@ -174,6 +176,30 @@ mp_event_handle_nowait();
174176
return 1;
175177
}
176178

179+
void jpegdec_open_helper(_JPEG_obj_t *self) {
180+
int result = -1;
181+
182+
if(mp_obj_is_str(self->file)){
183+
GET_STR_DATA_LEN(self->file, str, str_len);
184+
185+
result = self->jpeg->open(
186+
(const char*)str,
187+
jpegdec_open_callback,
188+
jpegdec_close_callback,
189+
jpegdec_read_callback,
190+
jpegdec_seek_callback,
191+
JPEGDraw);
192+
193+
// Source is a buffer
194+
} else {
195+
mp_get_buffer_raise(self->file, &self->buf, MP_BUFFER_READ);
196+
197+
result = self->jpeg->openRAM((uint8_t *)self->buf.buf, self->buf.len, JPEGDraw);
198+
}
199+
200+
if(result != 1) mp_raise_msg(&mp_type_RuntimeError, "JPEG: could not read file/buffer.");
201+
}
202+
177203
mp_obj_t _JPEG_make_new(const mp_obj_type_t *type, size_t n_args, size_t n_kw, const mp_obj_t *all_args) {
178204
enum {
179205
ARG_picographics
@@ -208,6 +234,11 @@ mp_obj_t _JPEG_openFILE(mp_obj_t self_in, mp_obj_t filename) {
208234

209235
self->file = filename;
210236

237+
jpegdec_open_helper(self);
238+
self->width = self->jpeg->getWidth();
239+
self->height = self->jpeg->getHeight();
240+
self->jpeg->close();
241+
211242
return mp_const_true;
212243
}
213244

@@ -219,6 +250,11 @@ mp_obj_t _JPEG_openRAM(mp_obj_t self_in, mp_obj_t buffer) {
219250

220251
self->file = buffer;
221252

253+
jpegdec_open_helper(self);
254+
self->width = self->jpeg->getWidth();
255+
self->height = self->jpeg->getHeight();
256+
self->jpeg->close();
257+
222258
return mp_const_true;
223259
}
224260

@@ -244,30 +280,7 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
244280

245281
current_flags = args[ARG_dither].u_obj == mp_const_false ? FLAG_NO_DITHER : 0;
246282

247-
// Just-in-time open of the filename/buffer we stored in self->file via open_RAM or open_file
248-
249-
// Source is a filename
250-
int result = -1;
251-
252-
if(mp_obj_is_str(self->file)){
253-
GET_STR_DATA_LEN(self->file, str, str_len);
254-
255-
result = self->jpeg->open(
256-
(const char*)str,
257-
jpegdec_open_callback,
258-
jpegdec_close_callback,
259-
jpegdec_read_callback,
260-
jpegdec_seek_callback,
261-
JPEGDraw);
262-
263-
// Source is a buffer
264-
} else {
265-
mp_get_buffer_raise(self->file, &self->buf, MP_BUFFER_READ);
266-
267-
result = self->jpeg->openRAM((uint8_t *)self->buf.buf, self->buf.len, JPEGDraw);
268-
}
269-
270-
if(result != 1) mp_raise_msg(&mp_type_RuntimeError, "JPEG: could not read file/buffer.");
283+
jpegdec_open_helper(self);
271284

272285
// Force a specific data output type to best match our PicoGraphics buffer
273286
switch(self->graphics->graphics->pen_type) {
@@ -293,7 +306,7 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
293306
// We need to store a pointer to the PicoGraphics surface
294307
self->jpeg->setUserPointer((void *)self->graphics->graphics);
295308

296-
result = self->jpeg->decode(x, y, f);
309+
int result = self->jpeg->decode(x, y, f);
297310

298311
current_flags = 0;
299312

@@ -306,13 +319,13 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
306319
// get_width
307320
mp_obj_t _JPEG_getWidth(mp_obj_t self_in) {
308321
_JPEG_obj_t *self = MP_OBJ_TO_PTR2(self_in, _JPEG_obj_t);
309-
return mp_obj_new_int(self->jpeg->getWidth());
322+
return mp_obj_new_int(self->width);
310323
}
311324

312325
// get_height
313326
mp_obj_t _JPEG_getHeight(mp_obj_t self_in) {
314327
_JPEG_obj_t *self = MP_OBJ_TO_PTR2(self_in, _JPEG_obj_t);
315-
return mp_obj_new_int(self->jpeg->getHeight());
328+
return mp_obj_new_int(self->height);
316329
}
317330

318331
}

0 commit comments

Comments
 (0)