@@ -36,24 +36,19 @@ typedef struct {
3636
3737static void prv_inbox_received (DictionaryIterator * iterator , void * context );
3838static ManagedImage * prv_find_image (int image_id );
39- static int16_t prv_find_image_index (int image_id );
40- static bool prv_image_id_compare (void * image_id , void * object );
41- static void prv_destroy_image (ManagedImage * image );
42- static bool prv_foreach_destroy (void * object , void * context );
39+ static void prv_destroy_image ();
4340static void prv_handle_new_image (int image_id , size_t size , DictionaryIterator * iterator );
4441static void prv_handle_image_chunk (int image_id , size_t offset , DictionaryIterator * iterator );
4542static void prv_handle_image_complete (int image_id );
46- static bool prv_handle_memory_pressure (void * context );
4743
44+
45+ static ManagedImage s_managed_image = {0 };
46+ static uint8_t s_image_storage [PBL_IF_COLOR_ELSE (3800 , 1900 )] = {0 };
4847static EventHandle * s_appmessage_handle ;
49- static LinkedRoot * s_image_list ;
50- static ManagedImage * s_cached_image_ref = NULL ;
5148
5249void image_manager_init () {
53- s_image_list = linked_list_create_root ();
5450 events_app_message_request_inbox_size (1024 );
5551 s_appmessage_handle = events_app_message_register_inbox_received (prv_inbox_received , NULL );
56- memory_pressure_register_callback (prv_handle_memory_pressure , 0 , NULL );
5752}
5853
5954void image_manager_deinit () {
@@ -94,63 +89,32 @@ GSize image_manager_get_size(int image_id) {
9489}
9590
9691void image_manager_destroy_image (int image_id ) {
97- int16_t image_idx = prv_find_image_index (image_id );
98- if (image_idx < 0 ) {
92+ if (s_managed_image .image_id != image_id ) {
9993 return ;
10094 }
101- ManagedImage * image = linked_list_get (s_image_list , image_idx );
102- prv_destroy_image (image );
103- linked_list_remove (s_image_list , image_idx );
95+ prv_destroy_image ();
10496}
10597
10698void image_manager_destroy_all_images () {
107- linked_list_foreach (s_image_list , prv_foreach_destroy , NULL );
108- linked_list_clear (s_image_list );
99+ prv_destroy_image ();
109100}
110101
111102static ManagedImage * prv_find_image (int image_id ) {
112- if (s_cached_image_ref != NULL && s_cached_image_ref -> image_id == image_id ) {
113- return s_cached_image_ref ;
114- }
115- int16_t idx = prv_find_image_index (image_id );
116- if (idx >= 0 ) {
117- return linked_list_get (s_image_list , idx );
103+ if (s_managed_image .image_id != image_id ) {
104+ return NULL ;
118105 }
119- return NULL ;
120- }
121-
122- static int16_t prv_find_image_index (int image_id ) {
123- return linked_list_find_compare (s_image_list , & image_id , prv_image_id_compare );
106+ return & s_managed_image ;
124107}
125108
126- static bool prv_image_id_compare (void * image_id , void * object ) {
127- ManagedImage * image = object ;
128- return image -> image_id == * (int * )image_id ;
129- }
130-
131- static void prv_destroy_image (ManagedImage * image ) {
132- image -> status = ImageStatusDestroyed ;
133- if (image -> callback ) {
134- image -> callback (image -> image_id , ImageStatusDestroyed , image -> context );
135- }
136- if (image -> bitmap ) {
137- gbitmap_destroy (image -> bitmap );
138- image -> bitmap = NULL ;
109+ static void prv_destroy_image () {
110+ s_managed_image .status = ImageStatusDestroyed ;
111+ if (s_managed_image .callback ) {
112+ s_managed_image .callback (s_managed_image .image_id , ImageStatusDestroyed , s_managed_image .context );
139113 }
140- if (image -> data ) {
141- free ( image -> data );
142- image -> data = NULL ;
114+ if (s_managed_image . bitmap ) {
115+ gbitmap_destroy ( s_managed_image . bitmap );
116+ s_managed_image . bitmap = NULL ;
143117 }
144- if (s_cached_image_ref == image ) {
145- s_cached_image_ref = NULL ;
146- }
147- free (image );
148- }
149-
150- static bool prv_foreach_destroy (void * object , void * context ) {
151- ManagedImage * image = object ;
152- prv_destroy_image (image );
153- return true;
154118}
155119
156120static void prv_inbox_received (DictionaryIterator * iterator , void * context ) {
@@ -183,19 +147,16 @@ static void prv_handle_new_image(int image_id, size_t size, DictionaryIterator *
183147 tuple = dict_find (iterator , MESSAGE_KEY_IMAGE_HEIGHT );
184148 int16_t height = tuple -> value -> int32 ;
185149 BOBBY_LOG (APP_LOG_LEVEL_DEBUG , "New image: %d, size: %d, width: %d, height: %d" , image_id , size , width , height );
186- ManagedImage * image = bmalloc (sizeof (ManagedImage ));
187- if (!image ) {
188- BOBBY_LOG (APP_LOG_LEVEL_WARNING , "Failed to allocate memory for image" );
189- return ;
150+ if (s_managed_image .image_id != 0 ) {
151+ prv_destroy_image ();
190152 }
191- image -> image_id = image_id ;
192- image -> status = ImageStatusCreated ;
193- image -> callback = NULL ;
194- image -> data = bmalloc (size );
195- image -> size = size ;
196- image -> bitmap = NULL ;
197- image -> image_size = GSize (width , height );
198- linked_list_append (s_image_list , image );
153+ s_managed_image .image_id = image_id ;
154+ s_managed_image .status = ImageStatusCreated ;
155+ s_managed_image .callback = NULL ;
156+ s_managed_image .data = s_image_storage ;
157+ s_managed_image .size = size ;
158+ s_managed_image .bitmap = NULL ;
159+ s_managed_image .image_size = GSize (width , height );
199160}
200161
201162static void prv_handle_image_chunk (int image_id , size_t offset , DictionaryIterator * iterator ) {
@@ -245,15 +206,3 @@ static void prv_handle_image_complete(int image_id) {
245206 image -> callback (image -> image_id , ImageStatusCompleted , image -> context );
246207 }
247208}
248-
249-
250- static bool prv_handle_memory_pressure (void * context ) {
251- if (linked_list_count (s_image_list ) == 0 ) {
252- return false;
253- }
254- BOBBY_LOG (APP_LOG_LEVEL_WARNING , "Memory pressure! Destroying the oldest image." );
255- ManagedImage * image = linked_list_get (s_image_list , 0 );
256- prv_destroy_image (image );
257- linked_list_remove (s_image_list , 0 );
258- return true;
259- }
0 commit comments