X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=backends%2Fvoice%2Fdefault_ani_processing.c;h=c0b3a066c86e4821d95fc191ed984b01a2a4986a;hb=f844e4e165654a5b5b0908f4d2ac84b048631ebb;hp=b4a7ebbda4644ef1b88cb43d29fcecc291826b85;hpb=ef51cb94c6901feb6af866f16392a3ce9b2ef9ae;p=platform%2Fcore%2Fuifw%2Flibpui.git diff --git a/backends/voice/default_ani_processing.c b/backends/voice/default_ani_processing.c index b4a7ebb..c0b3a06 100644 --- a/backends/voice/default_ani_processing.c +++ b/backends/voice/default_ani_processing.c @@ -25,6 +25,8 @@ #include "../default_backend.h" +static default_frame_info_t *ani_frame = NULL; + static void _ani_backend_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_processing_get_led_rgb(default_frame_info_t *frame, int led_idx, un *b = (frame->leds[led_idx].color & LED_MASK_BLUE); } -static void -_ani_backend_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_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_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_processing_frame_cb(void *data, int serial) buffer->ptr[4*i + 2] = g; /* GREEN */ buffer->ptr[4*i + 3] = r; /* RED */ } - _ani_backend_processing_free_frame(frame); + backend_util_cleanup_frame(frame); e = pui_backend_ani_set_buffer(ani, buffer); @@ -164,6 +148,10 @@ _ani_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_processing_frame_cb, info->interval / 1000.0); if (!ret) { @@ -195,6 +183,11 @@ _ani_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; }