@@ -26,6 +26,8 @@ typedef struct _JPEG_obj_t {
26
26
mp_obj_t file;
27
27
mp_buffer_info_t buf;
28
28
ModPicoGraphics_obj_t *graphics;
29
+ int width;
30
+ int height;
29
31
} _JPEG_obj_t;
30
32
31
33
@@ -174,6 +176,30 @@ mp_event_handle_nowait();
174
176
return 1 ;
175
177
}
176
178
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
+
177
203
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) {
178
204
enum {
179
205
ARG_picographics
@@ -208,6 +234,11 @@ mp_obj_t _JPEG_openFILE(mp_obj_t self_in, mp_obj_t filename) {
208
234
209
235
self->file = filename;
210
236
237
+ jpegdec_open_helper (self);
238
+ self->width = self->jpeg ->getWidth ();
239
+ self->height = self->jpeg ->getHeight ();
240
+ self->jpeg ->close ();
241
+
211
242
return mp_const_true;
212
243
}
213
244
@@ -219,6 +250,11 @@ mp_obj_t _JPEG_openRAM(mp_obj_t self_in, mp_obj_t buffer) {
219
250
220
251
self->file = buffer;
221
252
253
+ jpegdec_open_helper (self);
254
+ self->width = self->jpeg ->getWidth ();
255
+ self->height = self->jpeg ->getHeight ();
256
+ self->jpeg ->close ();
257
+
222
258
return mp_const_true;
223
259
}
224
260
@@ -244,30 +280,7 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
244
280
245
281
current_flags = args[ARG_dither].u_obj == mp_const_false ? FLAG_NO_DITHER : 0 ;
246
282
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);
271
284
272
285
// Force a specific data output type to best match our PicoGraphics buffer
273
286
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
293
306
// We need to store a pointer to the PicoGraphics surface
294
307
self->jpeg ->setUserPointer ((void *)self->graphics ->graphics );
295
308
296
- result = self->jpeg ->decode (x, y, f);
309
+ int result = self->jpeg ->decode (x, y, f);
297
310
298
311
current_flags = 0 ;
299
312
@@ -306,13 +319,13 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args
306
319
// get_width
307
320
mp_obj_t _JPEG_getWidth (mp_obj_t self_in) {
308
321
_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 );
310
323
}
311
324
312
325
// get_height
313
326
mp_obj_t _JPEG_getHeight (mp_obj_t self_in) {
314
327
_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 );
316
329
}
317
330
318
331
}
0 commit comments