default_backend: do not allocate frame whenever each frames
[platform/core/uifw/libpui.git] / backends / notification / default_ani_error.c
index 9f1a18d..2520af8 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_error_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,46 +39,27 @@ _ani_backend_error_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigne
        *b = (frame->leds[led_idx].color & LED_MASK_BLUE);
 }
 
-static void
-_ani_backend_error_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_error_get_frame(default_ani_info *ani_info)
 {
 /* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
 #define BLINK_FRAME 2
-       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;
-       }
 
        if (ani_info->frame_idx % BLINK_FRAME == 0)
        {
                for (int i = 0; i < key_frame->num_led; i++)
                {
-                       frame->leds[i].color = key_frame->leds[i].color;
+                       ani_frame->leds[i].color = key_frame->leds[i].color;
                }
        }
        else
        {
                for (int i = 0; i < key_frame->num_led; i++)
                {
-                       frame->leds[i].color = 0x000000;
+                       ani_frame->leds[i].color = 0x000000;
                }
        }
 
@@ -88,7 +71,7 @@ _ani_backend_error_get_frame(default_ani_info *ani_info)
                ani_info->frame_idx = 0;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 
@@ -123,7 +106,7 @@ _ani_backend_error_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_error_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -173,6 +156,10 @@ _ani_error_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_error_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -204,6 +191,11 @@ _ani_error_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;
 }