30
30
31
31
#include "py/runtime.h"
32
32
#include "py/objproperty.h"
33
+ #include "shared/runtime/context_manager_helpers.h"
34
+ #include "shared-bindings/util.h"
33
35
#include "supervisor/shared/translate/translate.h"
34
36
#include "shared-bindings/gifio/OnDiskGif.h"
35
37
@@ -125,11 +127,34 @@ STATIC mp_obj_t gifio_ondiskgif_make_new(const mp_obj_type_t *type, size_t n_arg
125
127
return MP_OBJ_FROM_PTR (self );
126
128
}
127
129
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
+
128
152
//| width: int
129
153
//| """Width of the gif. (read only)"""
130
154
STATIC mp_obj_t gifio_ondiskgif_obj_get_width (mp_obj_t self_in ) {
131
155
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
132
156
157
+ check_for_deinit (self );
133
158
return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_width (self ));
134
159
}
135
160
@@ -143,6 +168,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_width_obj,
143
168
STATIC mp_obj_t gifio_ondiskgif_obj_get_height (mp_obj_t self_in ) {
144
169
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
145
170
171
+ check_for_deinit (self );
146
172
return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_height (self ));
147
173
}
148
174
@@ -155,6 +181,8 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_height_obj,
155
181
//| """The bitmap used to hold the current frame."""
156
182
STATIC mp_obj_t gifio_ondiskgif_obj_get_bitmap (mp_obj_t self_in ) {
157
183
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
184
+
185
+ check_for_deinit (self );
158
186
return common_hal_gifio_ondiskgif_get_bitmap (self );
159
187
}
160
188
@@ -168,6 +196,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_bitmap_obj,
168
196
STATIC mp_obj_t gifio_ondiskgif_obj_next_frame (mp_obj_t self_in ) {
169
197
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
170
198
199
+ check_for_deinit (self );
171
200
return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_next_frame (self , true) / 1000 );
172
201
}
173
202
@@ -179,6 +208,7 @@ MP_DEFINE_CONST_FUN_OBJ_1(gifio_ondiskgif_next_frame_obj, gifio_ondiskgif_obj_ne
179
208
STATIC mp_obj_t gifio_ondiskgif_obj_get_duration (mp_obj_t self_in ) {
180
209
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
181
210
211
+ check_for_deinit (self );
182
212
return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_duration (self ) / 1000 );
183
213
}
184
214
@@ -192,6 +222,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_duration_obj,
192
222
STATIC mp_obj_t gifio_ondiskgif_obj_get_frame_count (mp_obj_t self_in ) {
193
223
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
194
224
225
+ check_for_deinit (self );
195
226
return MP_OBJ_NEW_SMALL_INT (common_hal_gifio_ondiskgif_get_frame_count (self ));
196
227
}
197
228
@@ -205,6 +236,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_frame_count_obj,
205
236
STATIC mp_obj_t gifio_ondiskgif_obj_get_min_delay (mp_obj_t self_in ) {
206
237
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
207
238
239
+ check_for_deinit (self );
208
240
return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_min_delay (self ) / 1000 );
209
241
}
210
242
@@ -219,6 +251,7 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_min_delay_obj,
219
251
STATIC mp_obj_t gifio_ondiskgif_obj_get_max_delay (mp_obj_t self_in ) {
220
252
gifio_ondiskgif_t * self = MP_OBJ_TO_PTR (self_in );
221
253
254
+ check_for_deinit (self );
222
255
return mp_obj_new_float ((float )common_hal_gifio_ondiskgif_get_max_delay (self ) / 1000 );
223
256
}
224
257
@@ -228,6 +261,9 @@ MP_PROPERTY_GETTER(gifio_ondiskgif_max_delay_obj,
228
261
(mp_obj_t )& gifio_ondiskgif_get_max_delay_obj );
229
262
230
263
STATIC 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 ) },
231
267
{ MP_ROM_QSTR (MP_QSTR_height ), MP_ROM_PTR (& gifio_ondiskgif_height_obj ) },
232
268
{ MP_ROM_QSTR (MP_QSTR_bitmap ), MP_ROM_PTR (& gifio_ondiskgif_bitmap_obj ) },
233
269
{ MP_ROM_QSTR (MP_QSTR_width ), MP_ROM_PTR (& gifio_ondiskgif_width_obj ) },
0 commit comments