default_backend: do not allocate frame whenever each frames
[platform/core/uifw/libpui.git] / backends / notification / default_ani_alarm.c
index 31d58b7..c915d75 100644 (file)
@@ -25,6 +25,8 @@
 
 #include "../default_backend.h"
 
+static default_frame_info_t *ani_frame = NULL;
+
 static void
 _ani_backend_alarm_get_led_rgb(default_frame_info_t *frame, int led_idx, unsigned int *r, unsigned int *g, unsigned int *b)
 {
@@ -37,29 +39,17 @@ _ani_backend_alarm_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_alarm_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_alarm_get_frame(default_ani_info *ani_info)
 {
 /* FIXME: ALAMR_FRAME need to changed after we imply animation type, suchas ease function */
 #define ALARM_FRAME 18
-       default_frame_info_t *frame, *key_frame, *key_frame2;
+       default_frame_info_t *key_frame, *key_frame2;
        int idx, idx2;
        unsigned int r, g, b, r2, g2, b2;
        int r3, g3, b3;
        double div;
 
-       frame = (default_frame_info_t *)calloc(sizeof(default_frame_info_t), 1);
-       if (!frame) return NULL;
-
        if (ani_info->frame_idx == 0)
        {
                ani_info->frame_max = (unsigned int)(ani_info->frames[ani_info->key_frame_cur].frame_duration / ani_info->interval);
@@ -68,19 +58,11 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
        idx = ani_info->key_frame_cur;
        key_frame = &ani_info->frames[idx];
 
-       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->key_frame_cur < ALARM_FRAME)
        {
                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
@@ -97,7 +79,7 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
                        g3 = (int)(g2 - g) * div + g;
                        b3 = (int)(b2 - b) * div + b;
 
-                       frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
+                       ani_frame->leds[i].color = (r3 << 16) + (g3 << 8) + (b3);
                }
        }
 
@@ -110,7 +92,7 @@ _ani_backend_alarm_get_frame(default_ani_info *ani_info)
                        ani_info->repeat_cur++;
        }
 
-       return frame;
+       return ani_frame;
 }
 
 static pui_bool
@@ -144,7 +126,7 @@ _ani_backend_alarm_frame_cb(void *data, int serial)
                buffer->ptr[4*i + 2] = g; /* GREEN */
                buffer->ptr[4*i + 3] = r; /* RED */
        }
-       _ani_backend_alarm_free_frame(frame);
+       backend_util_cleanup_frame(frame);
 
        e = pui_backend_ani_set_buffer(ani, buffer);
 
@@ -194,6 +176,10 @@ _ani_alarm_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_alarm_frame_cb, info->interval / 1000.0);
        if (!ret)
        {
@@ -225,6 +211,11 @@ _ani_alarm_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;
 }