3030
3131#include "py/runtime.h"
3232#include "py/objproperty.h"
33+ #include "shared/runtime/context_manager_helpers.h"
34+ #include "shared-bindings/util.h"
3335#include "supervisor/shared/translate/translate.h"
3436#include "shared-bindings/gifio/OnDiskGif.h"
3537
@@ -125,11 +127,34 @@ STATIC mp_obj_t gifio_ondiskgif_make_new(const mp_obj_type_t *type, size_t n_arg
125127 return MP_OBJ_FROM_PTR (self );
126128}
127129
130+ STATIC void check_for_deinit (gifio_ondiskgif_t * self ) {
131+ if (common_hal_gifio_ondiskgif_deinited (self )) {
132+ raise_deinited_error ();
133+ }
134+ }
135+
136+ //| def __enter__(self) -> OnDiskGif:
137+ //| """No-op used by Context Managers."""
138+ //| ...
139+ // Provided by context manager helper.
140+
141+ //| def __exit__(self) -> None:
142+ //| """Automatically deinitializes the GIF when exiting a context. See
143+ //| :ref:`lifetime-and-contextmanagers` for more info."""
144+ //| ...
145+ STATIC mp_obj_t gifio_ondiskgif_obj___exit__ (size_t n_args , const mp_obj_t * args ) {
146+ (void )n_args ;
147+ common_hal_gifio_ondiskgif_deinit (args [0 ]);
148+ return mp_const_none ;
149+ }
150+ STATIC MP_DEFINE_CONST_FUN_OBJ_VAR_BETWEEN (gifio_ondiskgif___exit___obj , 4 , 4 , gifio_ondiskgif_obj___exit__ );
151+
128152//| width: int
129153//| """Width of the gif. (read only)"""
130154STATIC mp_obj_t gifio_ondiskgif_obj_get_width (mp_obj_t self_in ) {
131155 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
132156
157+ check_for_deinit (self );
133158 return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_width (self ));
134159}
135160
@@ -143,6 +168,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_width_obj,
143168STATIC mp_obj_t gifio_ondiskgif_obj_get_height (mp_obj_t self_in ) {
144169 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
145170
171+ check_for_deinit (self );
146172 return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_height (self ));
147173}
148174
@@ -155,6 +181,8 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_height_obj,
155181//| """The bitmap used to hold the current frame."""
156182STATIC mp_obj_t gifio_ondiskgif_obj_get_bitmap (mp_obj_t self_in ) {
157183 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
184+
185+ check_for_deinit (self );
158186 return common_hal_gifio_ondiskgif_get_bitmap (self );
159187}
160188
@@ -168,6 +196,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_bitmap_obj,
168196STATIC mp_obj_t gifio_ondiskgif_obj_next_frame (mp_obj_t self_in ) {
169197 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
170198
199+ check_for_deinit (self );
171200 return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_next_frame (self , true) / 1000 );
172201}
173202
@@ -179,6 +208,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(gifio_ondiskgif_next_frame_obj, gifio_ondiskgif_obj_ne
179208STATIC mp_obj_t gifio_ondiskgif_obj_get_duration (mp_obj_t self_in ) {
180209 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
181210
211+ check_for_deinit (self );
182212 return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_duration (self ) / 1000 );
183213}
184214
@@ -192,6 +222,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_duration_obj,
192222STATIC mp_obj_t gifio_ondiskgif_obj_get_frame_count (mp_obj_t self_in ) {
193223 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
194224
225+ check_for_deinit (self );
195226 return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_frame_count (self ));
196227}
197228
@@ -205,6 +236,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_frame_count_obj,
205236STATIC mp_obj_t gifio_ondiskgif_obj_get_min_delay (mp_obj_t self_in ) {
206237 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
207238
239+ check_for_deinit (self );
208240 return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_min_delay (self ) / 1000 );
209241}
210242
@@ -219,6 +251,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_min_delay_obj,
219251STATIC mp_obj_t gifio_ondiskgif_obj_get_max_delay (mp_obj_t self_in ) {
220252 gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
221253
254+ check_for_deinit (self );
222255 return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_max_delay (self ) / 1000 );
223256}
224257
@@ -228,6 +261,9 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_max_delay_obj,
228261 (mp_obj_t )& gifio_ondiskgif_get_max_delay_obj );
229262
230263STATIC const mp_rom_map_elem_t gifio_ondiskgif_locals_dict_table [] = {
264+ { MP_ROM_QSTR (MP_QSTR_deinit ), MP_ROM_PTR (& gifio_ondiskgif_deinit_obj ) },
265+ { MP_ROM_QSTR (MP_QSTR___enter__ ), MP_ROM_PTR (& default___enter___obj ) },
266+ { MP_ROM_QSTR (MP_QSTR___exit__ ), MP_ROM_PTR (& gifio_ondiskgif___exit___obj ) },
231267 { MP_ROM_QSTR (MP_QSTR_height ), MP_ROM_PTR (& gifio_ondiskgif_height_obj ) },
232268 { MP_ROM_QSTR (MP_QSTR_bitmap ), MP_ROM_PTR (& gifio_ondiskgif_bitmap_obj ) },
233269 { MP_ROM_QSTR (MP_QSTR_width ), MP_ROM_PTR (& gifio_ondiskgif_width_obj ) },
0 commit comments