diff options
author | Michael Drake <tlsa@netsurf-browser.org> | 2022-11-03 17:35:24 +0000 |
---|---|---|
committer | Michael Drake <tlsa@netsurf-browser.org> | 2022-11-04 11:28:49 +0000 |
commit | f429a4f329cfaebc3e6644cac9610b89c74d9ba2 (patch) | |
tree | 300a287db6f94801fdaa536a4a32554408e39d86 /include/nsgif.h | |
parent | cb7f357b58c85bc089221060aa57a6c4ea5e9c06 (diff) | |
download | libnsgif-f429a4f329cfaebc3e6644cac9610b89c74d9ba2.tar.gz libnsgif-f429a4f329cfaebc3e6644cac9610b89c74d9ba2.tar.bz2 |
API: Add call to indicate input data is complete
By distinguising between waiting for more data and a broken
truncated file, we can decode what we can of any final truncated
frame.
Diffstat (limited to 'include/nsgif.h')
-rw-r--r-- | include/nsgif.h | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/include/nsgif.h b/include/nsgif.h index 208bc27..7e6aa83 100644 --- a/include/nsgif.h +++ b/include/nsgif.h @@ -90,6 +90,11 @@ typedef enum { NSGIF_ERR_END_OF_DATA, /** + * Can't supply more data after calling \ref nsgif_data_complete. + */ + NSGIF_ERR_DATA_COMPLETE, + + /** * The current frame cannot be displayed. */ NSGIF_ERR_FRAME_DISPLAY, @@ -277,6 +282,8 @@ void nsgif_destroy(nsgif_t *gif); * several times, as more data is available (e.g. slow network fetch) the data * already given to \ref nsgif_data_scan must be provided each time. * + * Once all the data has been provided, call \ref nsgif_data_complete. + * * For example, if you call \ref nsgif_data_scan with 25 bytes of data, and then * fetch another 10 bytes, you would need to call \ref nsgif_data_scan with a * size of 35 bytes, and the whole 35 bytes must be contiguous memory. It is @@ -300,12 +307,34 @@ nsgif_error nsgif_data_scan( const uint8_t *data); /** + * Tell libnsgif that all the gif data has been provided. + * + * Call this after calling \ref nsgif_data_scan with the the entire GIF + * source data. You can call \ref nsgif_data_scan multiple times up until + * this is called, and after this is called, \ref nsgif_data_scan will + * return an error. + * + * You can decode a GIF before this is called, however, it will fail to + * decode any truncated final frame data and will not perform loops when + * driven via \ref nsgif_frame_prepare (because it doesn't know if there + * will be more frames supplied in future data). + * + * \param[in] gif The \ref nsgif_t object. + */ +void nsgif_data_complete( + nsgif_t *gif); + +/** * Prepare to show a frame. * * If this is the last frame of an animation with a finite loop count, the * returned `delay_cs` will be \ref NSGIF_INFINITE, indicating that the frame * should be shown forever. * + * Note that if \ref nsgif_data_complete has not been called on this gif, + * animated GIFs will not loop back to the start. Instead it will return + * \ref NSGIF_ERR_END_OF_DATA. + * * \param[in] gif The \ref nsgif_t object. * \param[out] area The area in pixels that must be redrawn. * \param[out] delay_cs Time to wait after frame_new before next frame in cs. |