1 /** 2 * @file lv_image_decoder.h 3 * 4 */ 5 6 #ifndef LV_IMAGE_DECODER_H 7 #define LV_IMAGE_DECODER_H 8 9 #ifdef __cplusplus 10 extern "C" { 11 #endif 12 13 /********************* 14 * INCLUDES 15 *********************/ 16 #include "../lv_conf_internal.h" 17 18 #include "lv_draw_buf.h" 19 #include "../misc/lv_fs.h" 20 #include "../misc/lv_types.h" 21 #include "../misc/lv_area.h" 22 23 /********************* 24 * DEFINES 25 *********************/ 26 27 /********************** 28 * TYPEDEFS 29 **********************/ 30 31 /** 32 * Source of image.*/ 33 typedef enum { 34 LV_IMAGE_SRC_VARIABLE, /** Binary/C variable*/ 35 LV_IMAGE_SRC_FILE, /** File in filesystem*/ 36 LV_IMAGE_SRC_SYMBOL, /** Symbol (@ref lv_symbol_def.h)*/ 37 LV_IMAGE_SRC_UNKNOWN, /** Unknown source*/ 38 } lv_image_src_t; 39 40 /** 41 * Get info from an image and store in the `header` 42 * @param decoder pointer to decoder object 43 * @param dsc pointer to decoder descriptor 44 * @param header store the info here 45 * @return LV_RESULT_OK: info written correctly; LV_RESULT_INVALID: failed 46 */ 47 typedef lv_result_t (*lv_image_decoder_info_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc, 48 lv_image_header_t * header); 49 50 /** 51 * Open an image for decoding. Prepare it as it is required to read it later 52 * @param decoder pointer to the decoder the function associated with 53 * @param dsc pointer to decoder descriptor. `src`, `color` are already initialized in it. 54 */ 55 typedef lv_result_t (*lv_image_decoder_open_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); 56 57 /** 58 * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` values to `LV_COORD_MIN` on first call. 59 * Required only if the "open" function can't return with the whole decoded pixel array. 60 * @param decoder pointer to the decoder the function associated with 61 * @param dsc pointer to decoder descriptor 62 * @param full_area input parameter. the full area to decode after enough subsequent calls 63 * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. 64 * the decoded area is stored here after each call. 65 * @return LV_RESULT_OK: ok; LV_RESULT_INVALID: failed or there is nothing left to decode 66 */ 67 typedef lv_result_t (*lv_image_decoder_get_area_cb_t)(lv_image_decoder_t * decoder, 68 lv_image_decoder_dsc_t * dsc, 69 const lv_area_t * full_area, lv_area_t * decoded_area); 70 71 /** 72 * Close the pending decoding. Free resources etc. 73 * @param decoder pointer to the decoder the function associated with 74 * @param dsc pointer to decoder descriptor 75 */ 76 typedef void (*lv_image_decoder_close_f_t)(lv_image_decoder_t * decoder, lv_image_decoder_dsc_t * dsc); 77 78 /********************** 79 * GLOBAL PROTOTYPES 80 **********************/ 81 82 /** 83 * Get information about an image. 84 * Try the created image decoder one by one. Once one is able to get info that info will be used. 85 * @param src the image source. Can be 86 * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register()`) 87 * 2) Variable: Pointer to an `lv_image_dsc_t` variable 88 * 3) Symbol: E.g. `LV_SYMBOL_OK` 89 * @param header the image info will be stored here 90 * @return LV_RESULT_OK: success; LV_RESULT_INVALID: wasn't able to get info about the image 91 */ 92 lv_result_t lv_image_decoder_get_info(const void * src, lv_image_header_t * header); 93 94 /** 95 * Open an image. 96 * Try the created image decoders one by one. Once one is able to open the image that decoder is saved in `dsc` 97 * @param dsc describes a decoding session. Simply a pointer to an `lv_image_decoder_dsc_t` variable. 98 * @param src the image source. Can be 99 * 1) File name: E.g. "S:folder/img1.png" (The drivers needs to registered via `lv_fs_drv_register())`) 100 * 2) Variable: Pointer to an `lv_image_dsc_t` variable 101 * 3) Symbol: E.g. `LV_SYMBOL_OK` 102 * @param args args about how the image should be opened. 103 * @return LV_RESULT_OK: opened the image. `dsc->decoded` and `dsc->header` are set. 104 * LV_RESULT_INVALID: none of the registered image decoders were able to open the image. 105 */ 106 lv_result_t lv_image_decoder_open(lv_image_decoder_dsc_t * dsc, const void * src, const lv_image_decoder_args_t * args); 107 108 /** 109 * Decode `full_area` pixels incrementally by calling in a loop. Set `decoded_area` to `LV_COORD_MIN` on first call. 110 * @param dsc image decoder descriptor 111 * @param full_area input parameter. the full area to decode after enough subsequent calls 112 * @param decoded_area input+output parameter. set the values to `LV_COORD_MIN` for the first call and to reset decoding. 113 * the decoded area is stored here after each call. 114 * @return LV_RESULT_OK: success; LV_RESULT_INVALID: an error occurred or there is nothing left to decode 115 */ 116 lv_result_t lv_image_decoder_get_area(lv_image_decoder_dsc_t * dsc, const lv_area_t * full_area, 117 lv_area_t * decoded_area); 118 119 /** 120 * Close a decoding session 121 * @param dsc pointer to `lv_image_decoder_dsc_t` used in `lv_image_decoder_open` 122 */ 123 void lv_image_decoder_close(lv_image_decoder_dsc_t * dsc); 124 125 /** 126 * Create a new image decoder 127 * @return pointer to the new image decoder 128 */ 129 lv_image_decoder_t * lv_image_decoder_create(void); 130 131 /** 132 * Delete an image decoder 133 * @param decoder pointer to an image decoder 134 */ 135 void lv_image_decoder_delete(lv_image_decoder_t * decoder); 136 137 /** 138 * Get the next image decoder in the linked list of image decoders 139 * @param decoder pointer to an image decoder or NULL to get the first one 140 * @return the next image decoder or NULL if no more image decoder exists 141 */ 142 lv_image_decoder_t * lv_image_decoder_get_next(lv_image_decoder_t * decoder); 143 144 /** 145 * Set a callback to get information about the image 146 * @param decoder pointer to an image decoder 147 * @param info_cb a function to collect info about an image (fill an `lv_image_header_t` struct) 148 */ 149 void lv_image_decoder_set_info_cb(lv_image_decoder_t * decoder, lv_image_decoder_info_f_t info_cb); 150 151 /** 152 * Set a callback to open an image 153 * @param decoder pointer to an image decoder 154 * @param open_cb a function to open an image 155 */ 156 void lv_image_decoder_set_open_cb(lv_image_decoder_t * decoder, lv_image_decoder_open_f_t open_cb); 157 158 /** 159 * Set a callback to a decoded line of an image 160 * @param decoder pointer to an image decoder 161 * @param read_line_cb a function to read a line of an image 162 */ 163 void lv_image_decoder_set_get_area_cb(lv_image_decoder_t * decoder, lv_image_decoder_get_area_cb_t read_line_cb); 164 165 /** 166 * Set a callback to close a decoding session. E.g. close files and free other resources. 167 * @param decoder pointer to an image decoder 168 * @param close_cb a function to close a decoding session 169 */ 170 void lv_image_decoder_set_close_cb(lv_image_decoder_t * decoder, lv_image_decoder_close_f_t close_cb); 171 172 lv_cache_entry_t * lv_image_decoder_add_to_cache(lv_image_decoder_t * decoder, 173 lv_image_cache_data_t * search_key, 174 const lv_draw_buf_t * decoded, void * user_data); 175 176 /** 177 * Check the decoded image, make any modification if decoder `args` requires. 178 * @note A new draw buf will be allocated if provided `decoded` is not modifiable or stride mismatch etc. 179 * @param dsc pointer to a decoder descriptor 180 * @param decoded pointer to a decoded image to post process to meet dsc->args requirement. 181 * @return post processed draw buffer, when it differs with `decoded`, it's newly allocated. 182 */ 183 lv_draw_buf_t * lv_image_decoder_post_process(lv_image_decoder_dsc_t * dsc, lv_draw_buf_t * decoded); 184 185 /********************** 186 * MACROS 187 **********************/ 188 189 #ifdef __cplusplus 190 } /*extern "C"*/ 191 #endif 192 193 #endif /*LV_IMAGE_DECODER_H*/ 194