kopia lustrzana https://github.com/pimoroni/pimoroni-pico
				
				
				
			JPEGDEC: Backport width/height changes from pngdec.
Open JPEG file or stream to read width/height before decode.pull/899/head
							rodzic
							
								
									6b23c1526d
								
							
						
					
					
						commit
						b23a71b889
					
				|  | @ -26,6 +26,8 @@ typedef struct _JPEG_obj_t { | |||
|     mp_obj_t file; | ||||
|     mp_buffer_info_t buf; | ||||
|     ModPicoGraphics_obj_t *graphics; | ||||
|     int width; | ||||
|     int height; | ||||
| } _JPEG_obj_t; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -174,6 +176,30 @@ mp_event_handle_nowait(); | |||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| void jpegdec_open_helper(_JPEG_obj_t *self) { | ||||
|     int result = -1; | ||||
| 
 | ||||
|     if(mp_obj_is_str(self->file)){ | ||||
|         GET_STR_DATA_LEN(self->file, str, str_len); | ||||
| 
 | ||||
|         result = self->jpeg->open( | ||||
|             (const char*)str, | ||||
|             jpegdec_open_callback, | ||||
|             jpegdec_close_callback, | ||||
|             jpegdec_read_callback, | ||||
|             jpegdec_seek_callback, | ||||
|             JPEGDraw); | ||||
| 
 | ||||
|     // Source is a buffer
 | ||||
|     } else { | ||||
|         mp_get_buffer_raise(self->file, &self->buf, MP_BUFFER_READ); | ||||
| 
 | ||||
|         result = self->jpeg->openRAM((uint8_t *)self->buf.buf, self->buf.len, JPEGDraw); | ||||
|     } | ||||
| 
 | ||||
|     if(result != 1) mp_raise_msg(&mp_type_RuntimeError, "JPEG: could not read file/buffer."); | ||||
| } | ||||
| 
 | ||||
| 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) { | ||||
|     enum { | ||||
|         ARG_picographics | ||||
|  | @ -208,6 +234,11 @@ mp_obj_t _JPEG_openFILE(mp_obj_t self_in, mp_obj_t filename) { | |||
| 
 | ||||
|     self->file = filename; | ||||
| 
 | ||||
|     jpegdec_open_helper(self);  | ||||
|     self->width = self->jpeg->getWidth();  | ||||
|     self->height = self->jpeg->getHeight();  | ||||
|     self->jpeg->close(); | ||||
| 
 | ||||
|     return mp_const_true; | ||||
| } | ||||
| 
 | ||||
|  | @ -219,6 +250,11 @@ mp_obj_t _JPEG_openRAM(mp_obj_t self_in, mp_obj_t buffer) { | |||
| 
 | ||||
|     self->file = buffer; | ||||
| 
 | ||||
|     jpegdec_open_helper(self);  | ||||
|     self->width = self->jpeg->getWidth();  | ||||
|     self->height = self->jpeg->getHeight();  | ||||
|     self->jpeg->close(); | ||||
| 
 | ||||
|     return mp_const_true; | ||||
| } | ||||
| 
 | ||||
|  | @ -244,30 +280,7 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args | |||
| 
 | ||||
|     current_flags = args[ARG_dither].u_obj == mp_const_false ? FLAG_NO_DITHER : 0; | ||||
| 
 | ||||
|     // Just-in-time open of the filename/buffer we stored in self->file via open_RAM or open_file
 | ||||
| 
 | ||||
|     // Source is a filename
 | ||||
|     int result = -1; | ||||
| 
 | ||||
|     if(mp_obj_is_str(self->file)){ | ||||
|         GET_STR_DATA_LEN(self->file, str, str_len); | ||||
| 
 | ||||
|         result = self->jpeg->open( | ||||
|             (const char*)str, | ||||
|             jpegdec_open_callback, | ||||
|             jpegdec_close_callback, | ||||
|             jpegdec_read_callback, | ||||
|             jpegdec_seek_callback, | ||||
|             JPEGDraw); | ||||
| 
 | ||||
|     // Source is a buffer
 | ||||
|     } else { | ||||
|         mp_get_buffer_raise(self->file, &self->buf, MP_BUFFER_READ); | ||||
| 
 | ||||
|         result = self->jpeg->openRAM((uint8_t *)self->buf.buf, self->buf.len, JPEGDraw); | ||||
|     } | ||||
|      | ||||
|     if(result != 1) mp_raise_msg(&mp_type_RuntimeError, "JPEG: could not read file/buffer."); | ||||
|     jpegdec_open_helper(self); | ||||
| 
 | ||||
|     // Force a specific data output type to best match our PicoGraphics buffer
 | ||||
|     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 | |||
|     // We need to store a pointer to the PicoGraphics surface
 | ||||
|     self->jpeg->setUserPointer((void *)self->graphics->graphics); | ||||
| 
 | ||||
|     result = self->jpeg->decode(x, y, f); | ||||
|     int result = self->jpeg->decode(x, y, f); | ||||
| 
 | ||||
|     current_flags = 0; | ||||
| 
 | ||||
|  | @ -306,13 +319,13 @@ mp_obj_t _JPEG_decode(size_t n_args, const mp_obj_t *pos_args, mp_map_t *kw_args | |||
| // get_width
 | ||||
| mp_obj_t _JPEG_getWidth(mp_obj_t self_in) { | ||||
|     _JPEG_obj_t *self = MP_OBJ_TO_PTR2(self_in, _JPEG_obj_t); | ||||
|     return mp_obj_new_int(self->jpeg->getWidth()); | ||||
|     return mp_obj_new_int(self->width); | ||||
| } | ||||
| 
 | ||||
| // get_height
 | ||||
| mp_obj_t _JPEG_getHeight(mp_obj_t self_in) { | ||||
|     _JPEG_obj_t *self = MP_OBJ_TO_PTR2(self_in, _JPEG_obj_t); | ||||
|     return mp_obj_new_int(self->jpeg->getHeight()); | ||||
|     return mp_obj_new_int(self->height); | ||||
| } | ||||
| 
 | ||||
| } | ||||
|  |  | |||
		Ładowanie…
	
		Reference in New Issue
	
	 Skyler Mansfield
						Skyler Mansfield