circle surface: apply Evas Vector again with refactored code
authorYoungbok Shin <youngb.shin@samsung.com>
Thu, 19 Apr 2018 07:49:19 +0000 (16:49 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Thu, 21 Jun 2018 22:26:36 +0000 (07:26 +0900)
The following things are changed.

- Surface will have a vector object and one vector root node.
  Each Circle object will have one vector node.
  It is able to attach/dettach object's vector nodes to/from a root node of Surface.

- The main object of Surface and Circle object is changed to elm_table from elm_image.
  The elm_table object will manage an elm_image object as BG and an vector object.
  [_eext_circle_object_init() is changed to _eext_circle_object_add()].
  And the function will add an elm_table object and return it.
  So, each type of Circle object don't have to call elm_image_add or elm_table_add seperately.

- No more memset/memcpy for bg image in every render job calls.

- Remove warning messages from all eext circle code.

Change-Id: I5952700903afee3f93d11912fc4bd40bdaa59e54

12 files changed:
inc/wearable/circle/efl_extension_circle_private.h
packaging/efl-extension.spec
src/CMakeLists.txt
src/wearable/circle/efl_extension_circle_object.c
src/wearable/circle/efl_extension_circle_object_datetime.c
src/wearable/circle/efl_extension_circle_object_genlist.c
src/wearable/circle/efl_extension_circle_object_item.c
src/wearable/circle/efl_extension_circle_object_progressbar.c
src/wearable/circle/efl_extension_circle_object_scroller.c
src/wearable/circle/efl_extension_circle_object_slider.c
src/wearable/circle/efl_extension_circle_object_spinner.c
src/wearable/circle/efl_extension_circle_surface.c

index a6046c3a7b24c3bfac7b54f15de31653f2b167d7..42c869bf26fa894f81ea62aad1f653ba06f8820c 100644 (file)
@@ -17,8 +17,6 @@
 #ifndef __EFL_EXTENSION_CIRCLE_PRIVATE_H__
 #define __EFL_EXTENSION_CIRCLE_PRIVATE_H__
 
-#include <cairo.h>
-
 #ifdef __cplusplus
 extern "C" {
 #endif
@@ -45,16 +43,16 @@ typedef enum
 
 struct _Eext_Circle_Surface {
    Evas_Object         *parent;
-   Evas_Object         *image_widget;
-   cairo_surface_t     *cairo_surface;
-   cairo_t             *cairo;
-   unsigned char       *buffer;
+   Evas_Object         *main_obj;
+   Evas_Object         *vg_obj;
+   Efl_VG              *vg_root;
+   Evas_Object         *bg_obj;
+   const char          *bg_file_path;
    Evas_Coord           w, h;
    Evas_Coord           center_x, center_y;
    Eext_Circle_Surface_Type type;
 
    Eina_List           *render_objs;
-
    Ecore_Job           *render_job;
 
    Eext_Circle_Surface *parent_surface;
@@ -68,18 +66,17 @@ struct _Eext_Circle_Color {
 };
 
 struct _Eext_Circle_Object {
-   Evas_Object          *image_widget;
+   Evas_Object          *main_obj;
    Evas_Object          *widget_object;
    void                 *widget_data;
    const char           *widget_type;
+   const char           *bg_file_path;
    Eext_Circle_Mirrored_State mirrored_state;
 
-   Eina_List           *bg_image_objs;
-   int                  bg_image_index;
-
    Eext_Circle_Surface  *surface;
    Eina_List            *items;
    Eina_List            *text_items;
+   Efl_VG               *vg_container;
 
    // del_func: Do only for widget_data.
    // Other things are handled by Eext_Circle_Object.
@@ -102,6 +99,9 @@ struct _Eext_Circle_Object_Item {
    const char *name;
    void *data;
 
+   //For rendering
+   Efl_VG *vg;
+
    // For text draw
    const char *text;
    const char *font;
@@ -234,7 +234,7 @@ struct _Eext_Circle_Object_Spinner_Data {
 ///////////////////////////////
 
 // Surface
-Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type);
+Eext_Circle_Surface *_eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circle_Surface_Type type);
 
 void _eext_circle_surface_finish(Eext_Circle_Surface *surface);
 
@@ -348,7 +348,7 @@ void _eext_circle_object_item_round_cap_enable_set(Eext_Circle_Object_Item *item
 Eina_Bool _eext_circle_object_item_round_cap_enable_get(const Eext_Circle_Object_Item *item);
 
 // Circle Common Private
-void _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_object, Eext_Circle_Surface *surface);
+Evas_Object *_eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_object, Eext_Circle_Surface *surface);
 
 void _eext_circle_object_finish(Evas_Object *obj, Eext_Circle_Object *circle_obj);
 
@@ -359,6 +359,8 @@ Eext_Circle_Object_Item *_eext_circle_object_item_get(const Eext_Circle_Object *
 void _eext_circle_object_hide(Eext_Circle_Object *obj);
 
 void _eext_circle_object_show(Eext_Circle_Object *obj);
+void _eext_circle_object_bg_file_path_set(Eext_Circle_Object *obj, const char *path);
+const char *_eext_circle_object_bg_file_path_get(Eext_Circle_Object *obj);
 
 /**
  * @}
index 972279f9a93366080fafff9e50918c2a47f459be..8f9c8991519e0c61df55326ab1d47bb3d7a71fdc 100644 (file)
@@ -19,7 +19,6 @@ BuildRequires:  pkgconfig(libsystemd)
 
 BuildRequires:  cmake
 BuildRequires:  gettext
-BuildRequires:  pkgconfig(cairo)
 BuildRequires:  eolian-devel
 Requires(post): /sbin/ldconfig
 Requires(postun): /sbin/ldconfig
index 50b04d79943ed9291340fa47d96c076bd2ca19bb..1f493eff1b21ec4a7badfcfc94ad49a03bdad274 100755 (executable)
@@ -73,7 +73,6 @@ IF(DEFINED WITH_X)
                ecore
                ecore-x
                elementary
-               cairo
                x11
                xext
                xi
@@ -89,7 +88,6 @@ ELSEIF(DEFINED WITH_WAYLAND)
                ecore-wl2
                ecore-input
                elementary
-               cairo
                fontconfig
                libsystemd
                )
@@ -101,7 +99,6 @@ ELSEIF(DEFINED WIN32)
                ecore
                elementary
                evil
-               cairo
                fontconfig
                )
 ELSE()
@@ -110,7 +107,6 @@ ELSE()
                eina
                ecore
                elementary
-               cairo
                fontconfig
                )
 ENDIF()
index f5ad11da03609cf5a732f7f0ade657c2faffc9e5..16072e6247c93d46c2bbf406df98c07014a31b59 100644 (file)
@@ -34,6 +34,8 @@ _eext_circle_object_del_cb(void *data,
         return;
      }
 
+   efl_unref(circle_obj->vg_container);
+
    if (circle_obj->del_func)
      circle_obj->del_func(circle_obj);
 
@@ -53,6 +55,8 @@ _eext_circle_object_del_cb(void *data,
    if (obj)
      evas_object_data_del(obj, EEXT_CIRCLE_OBJECT_TYPE);
 
+   _eext_circle_object_bg_file_path_set(circle_obj, NULL);
+
    free(circle_obj);
 }
 
@@ -108,14 +112,14 @@ _eext_circle_object_widget_object_show_cb(void *data,
    if (!circle_obj) return;
    if (circle_obj->visible) return;
 
-   if (evas_object_visible_get(circle_obj->image_widget))
+   if (evas_object_visible_get(circle_obj->main_obj))
      {
         circle_obj->visible = EINA_TRUE;
         _eext_circle_object_changed(circle_obj);
      }
    else
      {
-        evas_object_show(circle_obj->image_widget);
+        evas_object_show(circle_obj->main_obj);
      }
 }
 
@@ -127,14 +131,14 @@ _eext_circle_object_widget_object_hide_cb(void *data,
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   evas_object_hide(circle_obj->image_widget);
+   evas_object_hide(circle_obj->main_obj);
 }
 
 static void
 _eext_circle_object_widget_object_disabled_cb(void *data, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *main_obj = circle_obj->image_widget;
+   Evas_Object *main_obj = circle_obj->main_obj;
 
    if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
      eext_circle_object_disabled_set(main_obj, EINA_TRUE);
@@ -144,7 +148,7 @@ static void
 _eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void *event_info)
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
-   Evas_Object *main_obj = circle_obj->image_widget;
+   Evas_Object *main_obj = circle_obj->main_obj;
 
    if (eext_circle_object_disabled_get(main_obj) != elm_object_disabled_get(obj))
      eext_circle_object_disabled_set(main_obj, EINA_FALSE);
@@ -153,27 +157,28 @@ _eext_circle_object_widget_object_enabled_cb(void *data, Evas_Object *obj, void
 //////////////////////////////
 // Internal API //////////////
 //////////////////////////////
-void
-_eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
+Evas_Object *
+_eext_circle_object_add(Evas_Object *parent, Evas_Object *widget_obj, Eext_Circle_Surface *surface)
 {
    Eext_Circle_Object *circle_obj;
+   Evas_Object *obj;
+
+   obj = elm_table_add(parent);
 
    circle_obj = (Eext_Circle_Object *)calloc(1, sizeof(Eext_Circle_Object));
    // Obj is expected to be elm_image object.
-   circle_obj->image_widget = obj;
+   circle_obj->main_obj = obj;
    circle_obj->widget_object = widget_obj;
    circle_obj->widget_data = NULL;
    circle_obj->widget_type = EEXT_CIRCLE_OBJECT_TYPE;
    circle_obj->del_func = NULL;
    circle_obj->disabled_func = NULL;
+   circle_obj->vg_container = evas_vg_container_add(NULL);
 
-   evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
+   /* When circle object is deleted, it must call efl_unref() for vg_container */
+   efl_ref(circle_obj->vg_container);
 
-   //FIXME: It's for adjusting evas_image geometry.
-   //       Image object has weird geometry during the window calc own size.
-   //       We need to recalc image object after buffer memory copy in render time.
-   //       But now we don't have any way to call image's internal sizing eval function.
-   elm_image_aspect_fixed_set(obj, EINA_FALSE);
+   evas_object_data_set(obj, EEXT_CIRCLE_OBJECT_TYPE, circle_obj);
    evas_object_repeat_events_set(obj, EINA_TRUE);
 
    evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL, _eext_circle_object_del_cb, circle_obj);
@@ -195,9 +200,11 @@ _eext_circle_object_init(Evas_Object *obj, Evas_Object *widget_obj, Eext_Circle_
    else
      {
         Eext_Circle_Surface *private_surface =
-           _eext_circle_surface_init(circle_obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+           _eext_circle_surface_init(circle_obj->main_obj, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
         _eext_circle_surface_object_append(private_surface, circle_obj);
      }
+
+   return obj;
 }
 
 void
@@ -235,7 +242,7 @@ _eext_circle_object_item_get(const Eext_Circle_Object *obj, const char *name)
           return item;
      }
 
-   ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->image_widget, obj->widget_type);
+   ERR("There is no [%s] item in the given object[%p:%s]! It returns NULL!", name, obj->main_obj, obj->widget_type);
    return NULL;
 }
 
@@ -264,6 +271,34 @@ _eext_circle_object_show(Eext_Circle_Object *obj)
    _eext_circle_object_changed(obj);
 }
 
+void
+_eext_circle_object_bg_file_path_set(Eext_Circle_Object *obj, const char *path)
+{
+   if (!obj) return;
+   if (obj->bg_file_path == path) return;
+
+   if (obj->bg_file_path)
+     {
+        eina_stringshare_del(obj->bg_file_path);
+        obj->bg_file_path = NULL;
+     }
+
+   if (path)
+     {
+        obj->bg_file_path = eina_stringshare_add(path);
+     }
+
+   _eext_circle_object_changed(obj);
+}
+
+const char *
+_eext_circle_object_bg_file_path_get(Eext_Circle_Object *obj)
+{
+   if (!obj) return NULL;
+
+   return obj->bg_file_path;
+}
+
 /////////////////////////////////////////////////
 // EAPI /////////////////////////////////////////
 /////////////////////////////////////////////////
@@ -394,8 +429,7 @@ eext_circle_object_add(Evas_Object *parent, Eext_Circle_Surface *surface)
    Evas_Object *obj;
    Eext_Circle_Object_Item *item;
 
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
+   obj = _eext_circle_object_add(parent, NULL, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index 9abfe714ff8c8a3a6104f56d2a3d3a5dc6d3cc2a..e83fd6465da4a81086373e99e09c913e0c703a17 100644 (file)
@@ -163,6 +163,16 @@ _eext_circle_object_datetime_selected_field_object_get(Evas_Object *datetime)
    return NULL;
 }
 
+static void
+_eext_circle_object_datetime_bg_image_set(Eext_Circle_Object *obj, int index)
+{
+   char buf[PATH_MAX];
+
+   snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[index]);
+
+   _eext_circle_object_bg_file_path_set(obj, buf);
+}
+
 static void
 _eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_Bool anim)
 {
@@ -171,6 +181,7 @@ _eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_B
    Evas_Object *radio;
    struct tm t;
    int max_day;
+   int bg_image_index = BG_FILE_COUNT - 1;
    double picker_angle = 0.0;
 
    elm_datetime_value_get(datetime, &t);
@@ -184,36 +195,36 @@ _eext_circle_object_datetime_current_type_update(Eext_Circle_Object *obj, Eina_B
         switch (data->current_type)
           {
            case ELM_DATETIME_YEAR:
-              obj->bg_image_index = 5;
+              bg_image_index = 5;
               picker_angle = (double)(picker_mark_angle_year[(int)((t.tm_year + 1900) % PICKER_MARK_PARTITION_COUNT_YEAR)]);
               _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
               break;
            case ELM_DATETIME_MONTH:
-              obj->bg_image_index = 4;
+              bg_image_index = 4;
               picker_angle = (double)((t.tm_mon) * PICKER_MARK_ANGLE_MONTH);
               _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
               break;
            case ELM_DATETIME_DATE:
               max_day = _max_days_get(t.tm_year, t.tm_mon);
-              obj->bg_image_index = max_day % 28;
+              bg_image_index = max_day % 28;
               picker_angle = (double)(picker_mark_angle_day[max_day - MIN_DAYS_IN_MONTH][(t.tm_mday > max_day ? max_day:t.tm_mday) - 1]);
               _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
               break;
            case ELM_DATETIME_HOUR:
               picker_angle = (double)((t.tm_hour) * PICKER_MARK_ANGLE_HOUR);
               _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-              obj->bg_image_index = 6;
+              bg_image_index = 6;
               break;
            case ELM_DATETIME_MINUTE:
               picker_angle = (double)(t.tm_min * PICKER_MARK_ANGLE_MIN);
               _eext_circle_object_datetime_picker_mark_angle_set(obj, picker_angle, anim);
-              obj->bg_image_index = 6;
+              bg_image_index = 6;
               break;
            default:
               break;
           }
 
-        _eext_circle_object_changed(obj);
+        _eext_circle_object_datetime_bg_image_set(obj, bg_image_index);
      }
 }
 
@@ -429,7 +440,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info* info)
 
         return EINA_TRUE;
      }
-   if (obj == circle_obj->image_widget)
+   if (obj == circle_obj->main_obj)
      circle_obj->is_propagated = EINA_TRUE;
 
    //Send rotary active signal to selected radio to off animation(Tizen_2.3.2 UX)
@@ -554,14 +565,8 @@ _eext_circle_object_datetime_del_cb(Eext_Circle_Object *obj)
         obj->widget_data = NULL;
      }
 
-   if (obj->bg_image_objs)
-     {
-        eina_list_free(obj->bg_image_objs);
-        obj->bg_image_objs = NULL;
-     }
-
    eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+   eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
 }
 
 static void
@@ -570,33 +575,15 @@ _eext_circle_object_datetime_disabled_cb(Eext_Circle_Object *obj)
    if (obj->disabled)
      {
         eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
      }
    else
      {
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
         eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
      }
 }
 
-static void
-_eext_circle_object_datetime_bg_image_append(Eext_Circle_Object *obj)
-{
-   Evas_Object *bg_image;
-   char buf[PATH_MAX];
-   int i;
-
-   for (i = 0; i <= BG_FILE_COUNT; i++)
-     {
-        bg_image = elm_image_add(obj->widget_object);
-        snprintf(buf, sizeof(buf), "%s/%s.png", IMG_DIR, bg_file_name[i]);
-        elm_image_file_set(bg_image, buf, NULL);
-        obj->bg_image_objs = eina_list_append(obj->bg_image_objs, bg_image);
-     }
-
-   obj->bg_image_index = BG_FILE_COUNT;
-}
-
 static void
 _accessibility_item_make_trait(char *trait, char *unit, int trait_size)
 {
@@ -717,7 +704,7 @@ _accessibility_datetime_ampm_gesutre_cb(void *data, Elm_Atspi_Gesture_Info gestu
 static void
 _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void *event_info)
 {
-   char buf[255] = "";
+   char buf[PATH_MAX] = "";
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
    Evas_Object *datetime = circle_obj->widget_object;
    Elm_Datetime_Field_Type field_type = (Elm_Datetime_Field_Type)evas_object_data_get(obj, "_field_type");
@@ -730,9 +717,7 @@ _accessibility_datetime_radio_highlighted_cb(void *data, Evas_Object *obj, void
         Evas_Object *radio_obj = elm_object_part_content_get(datetime, buf);
         elm_radio_value_set(radio_obj, -1);
         _eext_circle_object_datetime_picker_mark_angle_set(circle_obj, -1, EINA_FALSE);
-        circle_obj->bg_image_index = 6;
-
-        _eext_circle_object_changed(circle_obj);
+        _eext_circle_object_datetime_bg_image_set(circle_obj, 6);
      }
    else
      {
@@ -758,6 +743,7 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
    obj->widget_type = EEXT_CIRCLE_OBJECT_DATETIME_TYPE;
    obj->del_func = _eext_circle_object_datetime_del_cb;
    obj->disabled_func = _eext_circle_object_datetime_disabled_cb;
+   //obj->bg_obj_get_func = _eext_circle_object_datetime_bg_obj_get_cb;
 
    data = (Eext_Circle_Object_Datetime_Data *)calloc(1, sizeof(Eext_Circle_Object_Datetime_Data));
    obj->widget_data = (void *)data;
@@ -816,10 +802,9 @@ _eext_circle_object_datetime_init(Eext_Circle_Object *obj, Evas_Object *datetime
 */
 
    eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
-
-   _eext_circle_object_datetime_bg_image_append(obj);
+   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
 
+   _eext_circle_object_datetime_bg_image_set(obj, BG_FILE_COUNT - 1);
 }
 
 EAPI Evas_Object *
@@ -829,8 +814,7 @@ eext_circle_object_datetime_add(Evas_Object *datetime, Eext_Circle_Surface *surf
 
    if (!datetime) return NULL;
 
-   obj = elm_image_add(datetime);
-   _eext_circle_object_init(obj, datetime, surface);
+   obj = _eext_circle_object_add(datetime, datetime, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index f62e5610ec2e3e5ce1db8e6f69f56ad5ad7d79ad..a4db34454821a0827ff618a5db15931622ad6bfb 100644 (file)
@@ -97,7 +97,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
 
         return EINA_TRUE;
      }
-   if (obj == circle_obj->image_widget)
+   if (obj == circle_obj->main_obj)
      circle_obj->is_propagated = EINA_TRUE;
    if (info->direction == EEXT_ROTARY_DIRECTION_CLOCKWISE)
      _eext_circle_object_genlist_region_show(circle_obj, EINA_TRUE);
@@ -371,7 +371,7 @@ _eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
                                            data->disabled_bg_color.a);
 
         eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
      }
    else
      {
@@ -390,7 +390,7 @@ _eext_circle_object_genlist_disabled_cb(Eext_Circle_Object *obj)
                                            data->bg_color.a);
 
         eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
      }
 }
 
@@ -457,7 +457,7 @@ _eext_circle_object_genlist_init(Eext_Circle_Object *obj, Evas_Object *genlist)
    evas_object_event_callback_add(obj->widget_object, EVAS_CALLBACK_SHOW, _eext_circle_object_genlist_show_cb, obj);
    evas_object_smart_callback_add(obj->widget_object, "scroll", _eext_circle_object_genlist_scroll_cb, obj);
    eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
 }
 
 EAPI Evas_Object *
@@ -467,8 +467,7 @@ eext_circle_object_genlist_add(Evas_Object *genlist, Eext_Circle_Surface *surfac
 
    if (!genlist) return NULL;
 
-   obj = elm_image_add(genlist);
-   _eext_circle_object_init(obj, genlist, surface);
+   obj = _eext_circle_object_add(genlist, genlist, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index d48aef7ce0a6c1573d3e1496eb4c1bd09f6b041e..5b6a2fe3453e6722f01b57d7492e494a936992cc 100644 (file)
@@ -328,7 +328,7 @@ _eext_circle_text_font_get(const char *text, const char *font_family)
 
    if (result == FcResultNoMatch)
      {
-        ERR("Fail to Load Family Name to draw %s [%X]", text, u_str);
+        ERR("Fail to Load Family Name to draw %s [%X]", text, (unsigned int)u_str);
         return NULL;
      }
 
@@ -399,6 +399,11 @@ _eext_circle_object_item_append(Eext_Circle_Object *obj, Eext_Circle_Object_Item
    obj->items = eina_list_append(obj->items, item);
    item->obj = obj;
 
+   if (obj->vg_container)
+     {
+        item->vg = evas_vg_shape_add(obj->vg_container);
+     }
+
    _eext_circle_object_changed(item->obj);
 }
 
@@ -422,6 +427,11 @@ _eext_circle_object_item_prepend(Eext_Circle_Object *obj, Eext_Circle_Object_Ite
    obj->items = eina_list_prepend(obj->items, item);
    item->obj = obj;
 
+   if (obj->vg_container)
+     {
+        item->vg = evas_vg_shape_add(obj->vg_container);
+     }
+
    _eext_circle_object_changed(item->obj);
 }
 
@@ -447,6 +457,11 @@ _eext_circle_object_item_insert_before(Eext_Circle_Object *obj, Eext_Circle_Obje
    obj->items = eina_list_prepend_relative(obj->items, item, before);
    item->obj = obj;
 
+   if (obj->vg_container)
+     {
+        item->vg = evas_vg_shape_add(obj->vg_container);
+     }
+
    _eext_circle_object_changed(item->obj);
 }
 
@@ -472,6 +487,11 @@ _eext_circle_object_item_insert_after(Eext_Circle_Object *obj, Eext_Circle_Objec
    obj->items = eina_list_append_relative(obj->items, item, after);
    item->obj = obj;
 
+   if (obj->vg_container)
+     {
+        item->vg = evas_vg_shape_add(obj->vg_container);
+     }
+
    _eext_circle_object_changed(item->obj);
 }
 
@@ -483,6 +503,12 @@ _eext_circle_object_item_remove(Eext_Circle_Object_Item *item)
    // You must have to free this item.
    item->obj->items = eina_list_remove(item->obj->items, item);
 
+   if (item->vg)
+     {
+        efl_parent_set(item->vg, NULL);
+        item->vg = NULL;
+     }
+
    _eext_circle_object_changed(item->obj);
    item->obj = NULL;
 }
index 1dd27669c6d49151dc354aedb97b607e7f73ee2f..704c379b33397df0feaca141631b9cdf40ca688b 100644 (file)
@@ -207,8 +207,7 @@ eext_circle_object_progressbar_add(Evas_Object *parent, Eext_Circle_Surface *sur
 
    if (!parent) return NULL;
 
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
+   obj = _eext_circle_object_add(parent, NULL, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index 70a960a28c004820ad904cb67efcb52c59f15c0d..010bdbae3bb1cdc047e825960c236ae2a9bafc22 100644 (file)
@@ -415,7 +415,7 @@ _eext_circle_object_scroller_rotary_changed_cb(void *data,
 
         return EINA_TRUE;
      }
-   if (obj == circle_obj->image_widget)
+   if (obj == circle_obj->main_obj)
      circle_obj->is_propagated = EINA_TRUE;
 
    elm_scroller_page_size_get(scroller, &h_pagesize, &v_pagesize);
@@ -493,7 +493,7 @@ _eext_circle_object_scroller_del_cb(Eext_Circle_Object *obj)
    evas_object_smart_callback_del_full(obj->widget_object, "scroll", _eext_circle_object_scroller_scroll_cb, obj);
    evas_object_smart_callback_del_full(obj->widget_object, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
    eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+   eext_rotary_object_event_callback_del(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb);
 
    if (data->bar_hide_timer)
      {
@@ -543,7 +543,7 @@ _eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
                                            data->disabled_bg_color.a);
 
         eext_rotary_object_event_callback_del(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb);
      }
    else
      {
@@ -576,7 +576,7 @@ _eext_circle_object_scroller_disabled_cb(Eext_Circle_Object *obj)
                                            data->horizontal_bg_color.a);
 
         eext_rotary_object_event_callback_add(obj->widget_object, _eext_circle_object_scroller_rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb, obj);
      }
 }
 
@@ -677,7 +677,7 @@ _eext_circle_object_scroller_init(Eext_Circle_Object *obj, Evas_Object *scroller
    evas_object_smart_callback_add(scroller, "content,resize", _eext_circle_object_scroller_content_resize_cb, obj);
 
    eext_rotary_object_event_callback_add(scroller, _eext_circle_object_scroller_rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _eext_circle_object_scroller_rotary_changed_cb, obj);
+   eext_rotary_object_event_callback_add(obj->main_obj, _eext_circle_object_scroller_rotary_changed_cb, obj);
 }
 
 EAPI Evas_Object *
@@ -687,8 +687,7 @@ eext_circle_object_scroller_add(Evas_Object *scroller, Eext_Circle_Surface *surf
 
    if (!scroller) return NULL;
 
-   obj = elm_image_add(scroller);
-   _eext_circle_object_init(obj, scroller, surface);
+   obj = _eext_circle_object_add(scroller, scroller, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index fc285fb00b2e6fda3a1a312b15a8b193a70d65b0..4d5467545789e7ab97330d03a6db6229784506d3 100644 (file)
@@ -171,7 +171,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
                                              data->disabled_bg_color.b,
                                              data->disabled_bg_color.a);
 
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
      }
    else
      {
@@ -188,7 +188,7 @@ _eext_circle_object_slider_disabled_cb(Eext_Circle_Object *obj)
                                              data->bg_color.b,
                                              data->bg_color.a);
 
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL);
      }
 }
 
@@ -241,7 +241,7 @@ _eext_circle_object_slider_init(Eext_Circle_Object *obj)
    _eext_circle_object_item_value_set(item, 0);
    _eext_circle_object_item_append(obj, item);
 
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, NULL);
+   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, NULL);
 }
 
 static char *
@@ -280,8 +280,7 @@ eext_circle_object_slider_add(Evas_Object *parent, Eext_Circle_Surface *surface)
 
    if (!parent) return NULL;
 
-   obj = elm_image_add(parent);
-   _eext_circle_object_init(obj, NULL, surface);
+   obj = _eext_circle_object_add(parent, NULL, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index 12cbf66c17f7547f2f70af56203b8895286fef4f..7fa44f701cf35c79953bfd8d73a7c6abbff4b194 100644 (file)
@@ -344,7 +344,7 @@ _rotary_changed_cb(void *data, Evas_Object *obj, Eext_Rotary_Event_Info *info)
 
         return EINA_TRUE;
      }
-   if (obj == circle_obj->image_widget)
+   if (obj == circle_obj->main_obj)
      circle_obj->is_propagated = EINA_TRUE;
 
    elm_layout_signal_emit(elm_object_part_content_get(circle_obj->widget_object, "elm.swallow.text_button"),
@@ -411,7 +411,7 @@ _eext_circle_object_spinner_del_cb(Eext_Circle_Object *obj)
      }
 
    eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-   eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+   eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
 }
 
 static void
@@ -420,12 +420,12 @@ _eext_circle_object_spinner_disabled_cb(Eext_Circle_Object *obj)
    if (obj->disabled)
      {
         eext_rotary_object_event_callback_del(obj->widget_object, _rotary_changed_cb);
-        eext_rotary_object_event_callback_del(obj->image_widget, _rotary_changed_cb);
+        eext_rotary_object_event_callback_del(obj->main_obj, _rotary_changed_cb);
      }
    else
      {
         eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-        eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+        eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
      }
 }
 
@@ -465,7 +465,7 @@ _eext_circle_object_spinner_init(Eext_Circle_Object *obj, Evas_Object *spinner)
    //
 
    eext_rotary_object_event_callback_add(obj->widget_object, _rotary_changed_cb, obj);
-   eext_rotary_object_event_callback_add(obj->image_widget, _rotary_changed_cb, obj);
+   eext_rotary_object_event_callback_add(obj->main_obj, _rotary_changed_cb, obj);
 }
 
 EAPI Evas_Object *
@@ -475,8 +475,7 @@ eext_circle_object_spinner_add(Evas_Object *spinner, Eext_Circle_Surface *surfac
 
    if (!spinner) return NULL;
 
-   obj = elm_image_add(spinner);
-   _eext_circle_object_init(obj, spinner, surface);
+   obj = _eext_circle_object_add(spinner, spinner, surface);
 
    EEXT_CIRCLE_OBJECT_GET(obj, circle_obj) return NULL;
 
index 22aadf4e438992b890dc1a646c92fb574aa321df..eee3e795a4737f4fb500d07e8c32c7872794f805 100644 (file)
@@ -22,108 +22,53 @@ static void _eext_circle_surface_del_internal(Eext_Circle_Surface *surface);
 static void _eext_circle_surface_render(void *data);
 
 static Evas_Object *
-_eext_circle_surface_image_widget_add(Evas_Object *parent)
+_eext_circle_surface_main_obj_add(Evas_Object *parent)
 {
-   Evas_Object *image_widget;
+   Evas_Object *main_obj;
 
-   image_widget = elm_image_add(parent);
+   main_obj = elm_table_add(parent);
 
-   if (!image_widget)
+   if (!main_obj)
      {
-        ERR("Failed to create elm_image_object");
+        ERR("Failed to create elm_table object.");
         return NULL;
      }
 
    //for accessibility
-   elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+   elm_atspi_accessible_role_set(main_obj, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
+   evas_object_repeat_events_set(main_obj, EINA_TRUE);
 
-   //FIXME: It's for adjusting evas_image geometry.
-   //       Image object has weird geometry during the window calc own size.
-   //       We need to recalc image object after buffer memory copy in render time.
-   //       But now we don't have any way to call image's internal sizing eval function.
-   elm_image_aspect_fixed_set(image_widget, EINA_FALSE);
-   evas_object_repeat_events_set(image_widget, EINA_TRUE);
-
-   return image_widget;
+   return main_obj;
 }
 
 static void
-_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
+_eext_circle_surface_vector_draw_arc(Efl_VG *vg,
                                     int line_width,
-                                    double center_x, double center_y, double radius,
-                                    double r, double g, double b, double a,
+                                    double surface_width, double radius,
+                                    int r, int g, int b, int a,
                                     double angle1, double angle2, Eina_Bool round_cap)
 {
-   cairo_set_line_width(cairo, line_width);
-
-   if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
-
-   cairo_set_source_rgba(cairo, r, g, b, a);
-
-   cairo_arc(cairo, center_x, center_y, radius,
-             angle1 * M_PI / 180, angle2 * M_PI / 180);
-   cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_cairo_draw_text(cairo_t *cairo,
-                                     const char *text, const char *font, int font_size,
-                                     cairo_font_slant_t slant, cairo_font_weight_t weight,
-                                     double center_x, double center_y, double radius,
-                                     double r, double g, double b, double a,
-                                     double angle, double rotate_angle)
-{
-   int x, y;
-
-   x = radius * cos(angle * M_PI / 180);
-   y = radius * sin(angle * M_PI / 180);
-   x += center_x;
-   y += center_y;
-
-   cairo_set_source_rgba(cairo, r, g, b, a);
-   cairo_set_font_size(cairo, font_size);
-   cairo_select_font_face(cairo, font, slant, weight);
-   cairo_move_to(cairo, x, y);
-   cairo_rotate(cairo, rotate_angle * M_PI / 180);
-   cairo_show_text(cairo, text);
-   cairo_stroke(cairo);
-}
-
-static void
-_eext_circle_surface_clear(Eext_Circle_Surface *surface)
-{
-   Evas_Object *image_object;
-   unsigned char *buffer;
-
-   if (!surface || !surface->image_widget) return;
-
-   image_object = elm_image_object_get(surface->image_widget);
+   evas_vg_shape_reset(vg);
 
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-   memset(buffer, 0, surface->w * surface->h * 4);
-   cairo_set_source_rgba(surface->cairo, 0, 0, 0, 0);
-   cairo_rectangle(surface->cairo, 0.0, 0.0, surface->w, surface->h);
-   cairo_fill(surface->cairo);
-}
-
-static void
-_eext_circle_bg_surface_memcpy(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
-{
-   Evas_Object *image_object, *bg_image, *bg_image_object;
-   unsigned char *buffer, *bg_buffer;
+   evas_vg_shape_stroke_width_set(vg, line_width);
 
-   if (!surface || !surface->image_widget) return;
+   r = (r * a) / 255;
+   g = (g * a) / 255;
+   b = (b * a) / 255;
+   evas_vg_shape_stroke_color_set(vg, r, g, b, a);
 
-   image_object = elm_image_object_get(surface->image_widget);
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
+   int x, y, w, h;
+   w = radius  * 2;
+   h = w;
+   x = (surface_width - w) / 2;
+   y = x;
 
-   bg_image = eina_list_nth(obj->bg_image_objs, obj->bg_image_index);
-   bg_image_object = elm_image_object_get(bg_image);
-   evas_object_image_size_set(bg_image_object, surface->w, surface->h);
-   evas_object_image_fill_set(bg_image_object, 0, 0, surface->w, surface->h);
-   bg_buffer = (unsigned char *)evas_object_image_data_get(bg_image_object, 0);
+   evas_vg_shape_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1);
 
-   memcpy(buffer, bg_buffer, surface->w * surface->h * 4);
+   if (round_cap)
+     evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_ROUND);
+   else
+     evas_vg_shape_stroke_cap_set(vg, EFL_GFX_CAP_BUTT);
 }
 
 static void
@@ -132,7 +77,7 @@ _eext_circle_surface_render(void *data)
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
    Eext_Circle_Object *render_obj;
    Eina_List *l, *ll;
-   Eina_Bool skip_surface_clear = EINA_FALSE;
+   const char *last_bg_file_path = NULL;
 
    if (!surface)
      {
@@ -144,28 +89,29 @@ _eext_circle_surface_render(void *data)
 
    EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
      {
-        if (!render_obj->visible)
-          continue;
+        Eext_Circle_Object_Item *item;
 
-        if (render_obj->bg_image_objs)
+        if ((!render_obj->visible) ||
+            (render_obj->visible_on_activate && !(render_obj->is_active)))
           {
-             _eext_circle_bg_surface_memcpy(surface, render_obj);
-             skip_surface_clear = EINA_TRUE;
-             break;
+             efl_parent_set(render_obj->vg_container, NULL);
+             continue;
+          }
+        else
+          {
+             efl_parent_set(render_obj->vg_container, surface->vg_root);
           }
-     }
-
-   if (!skip_surface_clear)
-     _eext_circle_surface_clear(surface);
-
-   EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
-     {
-        Eext_Circle_Object_Item *item;
 
-        if (!render_obj->visible)
-          continue;
-        if (render_obj->visible_on_activate && !(render_obj->is_active))
-          continue;
+        /* Find the last object's bg file path.
+         * Currently, only one bg image can be drawn. */
+        if (_eext_circle_object_bg_file_path_get(render_obj))
+          {
+             if ((!last_bg_file_path) ||
+                 (last_bg_file_path != _eext_circle_object_bg_file_path_get(render_obj)))
+               {
+                  last_bg_file_path = _eext_circle_object_bg_file_path_get(render_obj);
+               }
+          }
 
         EINA_LIST_FOREACH(render_obj->items, ll, item)
           {
@@ -181,8 +127,6 @@ _eext_circle_surface_render(void *data)
                        double angle1, angle2;
                        Eina_Bool is_mirrored = EINA_FALSE;
 
-                       cairo_save(surface->cairo);
-
                        if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_CONFIG)
                          is_mirrored = elm_config_mirrored_get();
                        else if (render_obj->mirrored_state == EEXT_CIRCLE_MIRRORED_ON)
@@ -190,48 +134,48 @@ _eext_circle_surface_render(void *data)
 
                        if (is_mirrored)
                          {
-                            angle1 = (item->draw.angle_offset + item->draw.angle + 90.0) * -1;
-                            angle2 = (item->draw.angle_offset + item->min_angle + 90.0) * -1;
+                            angle1 = (item->draw.angle_offset + item->min_angle) * -1;
+                            angle2 = (item->draw.angle_offset + item->draw.angle) * -1;
                          }
                        else
                          {
-                            angle1 = item->draw.angle_offset + item->min_angle - 90.0;
-                            angle2 = item->draw.angle_offset + item->draw.angle - 90.0;
+                            angle1 = item->draw.angle_offset + item->draw.angle;
+                            angle2 = item->draw.angle_offset + item->min_angle;
                          }
 
-                       _eext_circle_surface_cairo_draw_arc(surface->cairo, item->line_width,
-                                                           surface->center_x, surface->center_y, item->radius,
-                                                           (double)item->draw.color.r / 255,
-                                                           (double)item->draw.color.g / 255,
-                                                           (double)item->draw.color.b / 255,
-                                                           (double)item->draw.color.a / 255,
+                       _eext_circle_surface_vector_draw_arc(item->vg, item->line_width,
+                                                           surface->w, item->radius,
+                                                           item->draw.color.r,
+                                                           item->draw.color.g,
+                                                           item->draw.color.b,
+                                                           item->draw.color.a,
                                                            angle1,
                                                            angle2,
                                                            item->round_cap);
-                       cairo_restore(surface->cairo);
                     }
                }
-             else if (item->font_size)
-               {
-                  // Draw Text
-                  cairo_save(surface->cairo);
-                  _eext_circle_surface_cairo_draw_text(surface->cairo,
-                                                       item->text, item->selected_font, item->font_size,
-                                                       CAIRO_FONT_SLANT_NORMAL, CAIRO_FONT_WEIGHT_NORMAL,
-                                                       surface->center_x, surface->center_y, item->radius,
-                                                       (double)item->draw.color.r / 255,
-                                                       (double)item->draw.color.g / 255,
-                                                       (double)item->draw.color.b / 255,
-                                                       (double)item->draw.color.a / 255,
-                                                       item->draw.angle_offset + item->draw.angle - 90.0,
-                                                       item->draw.angle_offset + item->draw.angle);
-                  cairo_restore(surface->cairo);
-               }
           }
      }
 
-   evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
-                                     0, 0, surface->w, surface->h);
+   if (surface->bg_file_path != last_bg_file_path)
+     {
+        if (surface->bg_file_path)
+          {
+             eina_stringshare_del(surface->bg_file_path);
+             surface->bg_file_path = NULL;
+          }
+
+        if (last_bg_file_path)
+          {
+             surface->bg_file_path = eina_stringshare_add(last_bg_file_path);
+             elm_image_file_set(surface->bg_obj, surface->bg_file_path, NULL);
+             evas_object_color_set(surface->bg_obj, 255, 255, 255, 255);
+          }
+        else
+          {
+             evas_object_color_set(surface->bg_obj, 0, 0, 0, 0);
+          }
+     }
 }
 
 static void
@@ -244,76 +188,62 @@ _eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
 }
 
 static void
-_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
+_eext_circle_surface_vector_finish(Eext_Circle_Surface *surface)
 {
-   if (surface->cairo) cairo_destroy(surface->cairo);
-   if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
+   if (surface->vg_obj) evas_object_del(surface->vg_obj);
 
-   surface->cairo = NULL;
-   surface->cairo_surface = NULL;
+   surface->vg_obj = NULL;
+   surface->vg_root = NULL;
 }
 
 static void
-_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
+_eext_circle_surface_vector_init(Eext_Circle_Surface *surface)
 {
-   Evas_Object *image_object;
-   cairo_surface_t *cairo_surface;
-   cairo_t *cairo;
-   unsigned char *buffer;
-   int stride;
+   Efl_VG *root;
 
-   if (surface->cairo_surface || surface->cairo)
-     _eext_circle_surface_cairo_finish(surface);
+   /* Do nothing if vector is ready. */
+   if (surface->vg_obj && surface->vg_root)
+     return;
 
-   if (surface->image_widget == NULL)
+   if (surface->main_obj == NULL)
      {
         ERR("Fail to get buffer from image object!");
         return;
      }
 
-   image_object = elm_image_object_get(surface->image_widget);
-
-   buffer = (unsigned char *)evas_object_image_data_get(image_object, 1);
-   stride = evas_object_image_stride_get(image_object);
-   cairo_surface = cairo_image_surface_create_for_data(buffer, CAIRO_FORMAT_ARGB32,
-                                                       surface->w, surface->h, stride);
-   cairo = cairo_create(cairo_surface);
-   cairo_set_antialias(cairo, CAIRO_ANTIALIAS_BEST);
+   surface->vg_obj = evas_object_vg_add(evas_object_evas_get(surface->main_obj));
+   root = evas_vg_container_add(NULL);
+   evas_object_vg_root_node_set(surface->vg_obj, root);
+   surface->vg_root = root;
+   evas_object_repeat_events_set(surface->vg_obj, EINA_TRUE);
+   evas_object_smart_member_add(surface->vg_obj, surface->main_obj);
+   evas_object_show(surface->vg_obj);
 
-   surface->cairo_surface = cairo_surface;
-   surface->cairo = cairo;
+   evas_object_size_hint_weight_set(surface->vg_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(surface->vg_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_table_pack(surface->main_obj, surface->vg_obj, 0, 0, 1, 1);
 }
 
 static void
 _eext_circle_surface_update(Eext_Circle_Surface *surface)
 {
-   Evas_Object *image_object;
-
    if (!surface) return;
-   if (!evas_object_visible_get(surface->image_widget)) return;
+   if (!evas_object_visible_get(surface->main_obj)) return;
 
-   image_object = elm_image_object_get(surface->image_widget);
-   evas_object_geometry_get(surface->image_widget, NULL, NULL, &surface->w, &surface->h);
+   evas_object_geometry_get(surface->main_obj, NULL, NULL, &surface->w, &surface->h);
 
    surface->center_x = surface->w / 2;
    surface->center_y = surface->h / 2;
 
-   evas_object_image_size_set(image_object, surface->w, surface->h);
-   evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
-
    if ((surface->w != 0) && (surface->h != 0))
      {
         INF("Surface will be initialized!");
-        _eext_circle_surface_cairo_init(surface);
+        _eext_circle_surface_vector_init(surface);
         _eext_circle_surface_changed(surface);
      }
    else
      {
-        if (surface->cairo_surface || surface->cairo)
-          {
-             _eext_circle_surface_cairo_finish(surface);
-             _eext_circle_surface_render_finish(surface);
-          }
+        _eext_circle_surface_render_finish(surface);
      }
 }
 
@@ -347,7 +277,7 @@ _eext_circle_surface_hide_cb(void *data, Evas *e, Evas_Object *obj, void *event_
 {
    Eext_Circle_Surface *surface = (Eext_Circle_Surface *)data;
 
-   _eext_circle_surface_cairo_finish(surface);
+   _eext_circle_surface_vector_finish(surface);
    _eext_circle_surface_render_finish(surface);
 }
 
@@ -364,7 +294,7 @@ _eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, vo
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   evas_object_show(circle_obj->image_widget);
+   evas_object_show(circle_obj->main_obj);
    circle_obj->is_active = EINA_TRUE;
 
    // Previous view's circle object should not be disappeared while naviframe effect.
@@ -378,13 +308,13 @@ _eext_circle_surface_object_rotary_activated_cb(void *data, Evas_Object *obj, vo
 
              if (deact_obj && (deact_obj->surface->parent != circle_obj->surface->parent))
                {
-                  evas_object_show(deact_obj->image_widget);
+                  evas_object_show(deact_obj->main_obj);
                }
           }
         else if (circle_obj->surface->type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
           {
              if (circle_obj->surface->deactivated_obj)
-               evas_object_show(circle_obj->surface->deactivated_obj->image_widget);
+               evas_object_show(circle_obj->surface->deactivated_obj->main_obj);
           }
      }
 }
@@ -407,7 +337,7 @@ _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj,
 {
    Eext_Circle_Object *circle_obj = (Eext_Circle_Object *)data;
 
-   evas_object_hide(circle_obj->image_widget);
+   evas_object_hide(circle_obj->main_obj);
    circle_obj->is_active = EINA_FALSE;
 
    // Previous view's circle object should not be disappeared while naviframe effect.
@@ -421,9 +351,9 @@ _eext_circle_surface_object_rotary_deactivated_cb(void *data, Evas_Object *obj,
           return;
 
         if (deactivated_obj)
-          evas_object_event_callback_del_full(deactivated_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
+          evas_object_event_callback_del_full(deactivated_obj->main_obj, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, deactivated_obj);
         circle_obj->surface->parent_surface->deactivated_obj = circle_obj;
-        evas_object_event_callback_add(circle_obj->image_widget, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
+        evas_object_event_callback_add(circle_obj->main_obj, EVAS_CALLBACK_DEL, _deactivated_obj_del_cb, circle_obj);
      }
 }
 
@@ -442,14 +372,14 @@ _eext_circle_surface_naviframe_item_view_add(Evas_Object *layout)
      {
         surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
 
-        if (!surface->image_widget)
+        if (!surface->main_obj)
           {
              ERR("Surface doesn't have image widget for drawing. It returns NULL.");
              return NULL;
           }
 
-        INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
-        elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+        INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
+        elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj);
 
         return surface;
      }
@@ -481,7 +411,7 @@ static void _naviframe_item_push_cb(void *data, Evas_Object *obj, void *event_in
    EINA_LIST_FOREACH_SAFE(surface->render_objs, l, l_next, circle_obj)
      {
         Evas_Object *parent;
-        parent = elm_object_parent_widget_get(circle_obj->image_widget);
+        parent = elm_object_parent_widget_get(circle_obj->main_obj);
 
         while (parent)
           {
@@ -523,16 +453,16 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
         evas_object_event_callback_del(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb);
      }
 
-   _eext_circle_surface_cairo_finish(surface);
+   _eext_circle_surface_vector_finish(surface);
    _eext_circle_surface_render_finish(surface);
 
-   if (surface->image_widget)
+   if (surface->main_obj)
      {
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
-        surface->image_widget = NULL;
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb);
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb);
+        surface->main_obj = NULL;
         surface->w = surface->h = 0;
      }
 
@@ -546,15 +476,15 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
           {
              Eext_Circle_Surface *private_surface;
              INF("Private Surface will be initialized for widget[%p], circle_obj[%p]!",
-                  obj->image_widget, obj);
+                  obj->main_obj, obj);
 
              surface->render_objs = eina_list_remove_list(surface->render_objs, l);
 
              private_surface =
-                _eext_circle_surface_init(obj->image_widget, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
+                _eext_circle_surface_init(obj->main_obj, NULL, EEXT_CIRCLE_SURFACE_TYPE_PRIVATE);
              _eext_circle_surface_object_append(private_surface, obj);
 
-             evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+             evas_object_smart_callback_del(obj->main_obj, "rotary,activated",
                                             _eext_circle_surface_object_rotary_activated_cb);
              if (obj->widget_object)
                {
@@ -570,14 +500,38 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
           }
      }
 
+   if (surface->bg_file_path)
+     {
+        eina_stringshare_del(surface->bg_file_path);
+        surface->bg_file_path = NULL;
+     }
+
    free(surface);
 }
 
+static void
+_eext_circle_surface_common_init(Eext_Circle_Surface *surface)
+{
+   if (!surface || !surface->main_obj) return;
+
+   evas_object_event_callback_add(surface->main_obj, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
+   evas_object_event_callback_add(surface->main_obj, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
+   evas_object_event_callback_add(surface->main_obj, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
+   evas_object_event_callback_add(surface->main_obj, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
+
+   surface->bg_obj = elm_image_add(surface->main_obj);
+   evas_object_size_hint_weight_set(surface->bg_obj, EVAS_HINT_EXPAND, EVAS_HINT_EXPAND);
+   evas_object_size_hint_align_set(surface->bg_obj, EVAS_HINT_FILL, EVAS_HINT_FILL);
+   elm_table_pack(surface->main_obj, surface->bg_obj, 0, 0, 1, 1);
+   evas_object_color_set(surface->bg_obj, 0, 0, 0, 0);
+   evas_object_show(surface->bg_obj);
+}
+
 //////////////////////////
 // Internal API //////////
 //////////////////////////
 Eext_Circle_Surface *
-_eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_Circle_Surface_Type type)
+_eext_circle_surface_init(Evas_Object *main_obj, Evas_Object *parent, Eext_Circle_Surface_Type type)
 {
    Eext_Circle_Surface *surface;
 
@@ -590,6 +544,9 @@ _eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_C
 
    surface->type = type;
    surface->parent = parent;
+   surface->main_obj = main_obj;
+
+   _eext_circle_surface_common_init(surface);
 
    if (type == EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
      {
@@ -597,24 +554,9 @@ _eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_C
         evas_object_smart_callback_add(surface->parent, "item,pushed,internal", _naviframe_item_push_cb, surface);
         evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
      }
-   else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
+   else if (type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
      {
-        surface->image_widget = image_widget;
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
-        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
-     }
-   else
-     {
-        surface->image_widget = image_widget;
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_HIDE, _eext_circle_surface_hide_cb, surface);
-        evas_object_event_callback_add(surface->image_widget, EVAS_CALLBACK_SHOW, _eext_circle_surface_show_cb, surface);
         evas_object_event_callback_add(surface->parent, EVAS_CALLBACK_DEL, _eext_circle_surface_parent_del_cb, surface);
-        evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
      }
 
    return surface;
@@ -629,18 +571,28 @@ _eext_circle_surface_finish(Eext_Circle_Surface *surface)
 void
 _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Object *obj)
 {
+   Eina_List *l;
+   Eext_Circle_Object_Item *item;
+
    if (!surface) return;
    if (!obj) return;
 
+   EINA_LIST_FOREACH(obj->items, l, item)
+     {
+        if (item->vg)
+          evas_vg_shape_reset(item->vg);
+     }
+
+   efl_parent_set(obj->vg_container, NULL);
    surface->render_objs = eina_list_remove(surface->render_objs, obj);
    obj->surface = NULL;
    _eext_circle_surface_changed(surface);
 
    if (surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
      {
-        evas_object_smart_callback_del(obj->image_widget, "rotary,activated",
+        evas_object_smart_callback_del(obj->main_obj, "rotary,activated",
                                        _eext_circle_surface_object_rotary_activated_cb);
-        evas_object_smart_callback_del(obj->image_widget, "rotary,deactivated",
+        evas_object_smart_callback_del(obj->main_obj, "rotary,deactivated",
                                        _eext_circle_surface_object_rotary_deactivated_cb);
 
         if (obj->widget_object)
@@ -671,7 +623,7 @@ _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Obj
         EINA_LIST_FOREACH_SAFE(surface->sub_surfaces, l, l_next, cur_surface)
           {
              Evas_Object *parent;
-             parent = elm_object_parent_widget_get(obj->image_widget);
+             parent = elm_object_parent_widget_get(obj->main_obj);
 
              while (parent)
                {
@@ -689,15 +641,16 @@ _eext_circle_surface_object_append(Eext_Circle_Surface *surface, Eext_Circle_Obj
           }
      }
 
+   efl_parent_set(obj->vg_container, surface->vg_root);
    surface->render_objs = eina_list_append(surface->render_objs, obj);
    _eext_circle_surface_changed(surface);
    obj->surface = surface;
 
    if (obj->surface->type != EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
      {
-        evas_object_smart_callback_add(obj->image_widget, "rotary,activated",
+        evas_object_smart_callback_add(obj->main_obj, "rotary,activated",
                                        _eext_circle_surface_object_rotary_activated_cb, obj);
-        evas_object_smart_callback_add(obj->image_widget, "rotary,deactivated",
+        evas_object_smart_callback_add(obj->main_obj, "rotary,deactivated",
                                        _eext_circle_surface_object_rotary_deactivated_cb, obj);
 
         if (obj->widget_object)
@@ -719,14 +672,14 @@ _eext_circle_surface_object_exclusive_show(Eext_Circle_Surface *surface, Eext_Ci
    if (!surface) return;
    if (!obj) return;
 
-   if (!evas_object_visible_get(obj->image_widget) &&
+   if (!evas_object_visible_get(obj->main_obj) &&
        (obj->widget_object && evas_object_visible_get(obj->widget_object)))
-     evas_object_show(obj->image_widget);
+     evas_object_show(obj->main_obj);
 
    EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
      {
         if (render_obj != obj)
-          evas_object_hide(render_obj->image_widget);
+          evas_object_hide(render_obj->main_obj);
      }
 }
 
@@ -735,8 +688,8 @@ _eext_circle_surface_changed(Eext_Circle_Surface *surface)
 {
    if (!surface) return;
 
-   if (!surface->render_job && surface->image_widget &&
-       evas_object_visible_get(surface->image_widget) &&
+   if (!surface->render_job && surface->main_obj &&
+       evas_object_visible_get(surface->main_obj) &&
        (surface->w != 0) && (surface->h != 0))
      surface->render_job = ecore_job_add(_eext_circle_surface_render, surface);
 }
@@ -745,14 +698,14 @@ Eext_Circle_Surface *
 _eext_circle_surface_add(Evas_Object *parent, Eext_Circle_Surface_Type type)
 {
    Eext_Circle_Surface *surface;
-   Evas_Object *image_widget = NULL;
+   Evas_Object *main_obj = NULL;
 
    if (!parent) return NULL;
 
    if (type != EEXT_CIRCLE_SURFACE_TYPE_NAVIFRAME)
-     image_widget = _eext_circle_surface_image_widget_add(parent);
+     main_obj = _eext_circle_surface_main_obj_add(parent);
 
-   surface = _eext_circle_surface_init(image_widget, parent, type);
+   surface = _eext_circle_surface_init(main_obj, parent, type);
 
    return surface;
 }
@@ -786,14 +739,14 @@ eext_circle_surface_conformant_add(Evas_Object *conform)
 
              surface = _eext_circle_surface_add(conform, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
 
-             if (!surface->image_widget)
+             if (!surface->main_obj)
                {
                   ERR("Surface doesn't have image widget for drawing. It returns NULL.");
                   return NULL;
                }
 
-             INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->image_widget, conform);
-             elm_object_part_content_set(conform, "elm.swallow.circle", surface->image_widget);
+             INF("Put the surface[%p]'s widget[%p] to elm_conformant widget[%p]", surface, surface->main_obj, conform);
+             elm_object_part_content_set(conform, "elm.swallow.circle", surface->main_obj);
 
              return surface;
           }
@@ -834,14 +787,14 @@ eext_circle_surface_layout_add(Evas_Object *layout)
 
              surface = _eext_circle_surface_add(layout, EEXT_CIRCLE_SURFACE_TYPE_DEFAULT);
 
-             if (!surface->image_widget)
+             if (!surface->main_obj)
                {
                   ERR("Surface doesn't have image widget for drawing. It returns NULL.");
                   return NULL;
                }
 
-             INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->image_widget, layout);
-             elm_object_part_content_set(layout, "elm.swallow.circle", surface->image_widget);
+             INF("Put the surface[%p]'s widget[%p] to layout widget[%p]", surface, surface->main_obj, layout);
+             elm_object_part_content_set(layout, "elm.swallow.circle", surface->main_obj);
 
              return surface;
           }
@@ -889,12 +842,15 @@ eext_circle_surface_del(Eext_Circle_Surface *surface)
         return;
      }
 
-   if (surface->image_widget)
+   if (surface->main_obj)
      {
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
-        evas_object_event_callback_del(surface->image_widget, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
-        evas_object_del(surface->image_widget);
-        surface->image_widget = NULL;
+        _eext_circle_surface_vector_finish(surface);
+        _eext_circle_surface_render_finish(surface);
+
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_RESIZE, _eext_circle_surface_resize_cb);
+        evas_object_event_callback_del(surface->main_obj, EVAS_CALLBACK_DEL, _eext_circle_surface_del_cb);
+        evas_object_del(surface->main_obj);
+        surface->main_obj = NULL;
      }
 
    INF("Surface[%p] is going to free in eext_circle_surface_del API.", surface);