default_backend: do not allocate frame whenever each frames
[platform/core/uifw/libpui.git] / backends / system / default_ani_system_processing.c
index e4ac723..713a90a 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_system_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,35 +39,17 @@ _ani_backend_system_processing_get_led_rgb(default_frame_info_t *frame, int led_
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_system_processing_free_frame(default_frame_info_t *frame)
-{
-       if (!frame) return;
-
-       if (frame->leds) free(frame->leds);
-       free(frame);
-}
-
 static default_frame_info_t *
 _ani_backend_system_processing_get_frame(default_ani_info *ani_info)
 {
-       default_frame_info_t *frame, *key_frame;
-
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
+       default_frame_info_t *key_frame;
 
        key_frame = &ani_info->frames[0];
-       frame->num_led = key_frame->num_led;
-       frame->leds = (default_led_info_t *)calloc(sizeof(default_led_info_t), frame->num_led);
-       if (!frame->leds)
-       {
-               free(frame);
-               return NULL;
-       }
+
        for (int i = 0; i < key_frame->num_led; i++)
        {
                int idx = (i - ani_info->frame_idx + key_frame->num_led) % key_frame->num_led;
-               frame->leds[idx] = key_frame->leds[i];
+               ani_frame->leds[idx] = key_frame->leds[i];
        }
        ani_info->frame_idx++;
        if (ani_info->frame_idx >= key_frame->num_led)
@@ -75,7 +59,7 @@ _ani_backend_system_processing_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -109,7 +93,7 @@ _ani_backend_system_processing_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_system_processing_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -164,6 +148,10 @@ _ani_system_processing_start(pui_ani_t *ani, int repeat)
        info->frame_idx = 0;
        info->repeat_cur = 0;
 
+       if (!ani_frame)
+               ani_frame = backend_util_alloc_frame(info);
+       ERROR_CHECK(ani_frame, return PUI_INT_ERROR_INVALID_RESOURCES, "Failed to alloc memory for frame\n");
+
        ret = pui_backend_ani_add_frame_cb(ani, _ani_backend_system_processing_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -195,6 +183,11 @@ _ani_system_processing_stop(pui_ani_t *ani, pui_bool force)
        else
                pui_backend_ani_status_update(ani, PUI_ANI_STATUS_STOPPED);
 
+       if (ani_frame)
+       {
+               backend_util_free_frame(ani_frame);
+               ani_frame = NULL;
+       }
 
        return e;
 }