Revert "wearable surface: changed cairo to evasvector in surface renderer"
authorYoungbok Shin <youngb.shin@samsung.com>
Fri, 13 Apr 2018 03:46:35 +0000 (12:46 +0900)
committerJongmin Lee <jm105.lee@samsung.com>
Thu, 21 Jun 2018 22:26:15 +0000 (07:26 +0900)
This reverts commit d161a5725b7c631c5699b0c9d9b907f9773c5178.

inc/wearable/circle/efl_extension_circle_private.h
src/wearable/circle/efl_extension_circle_object.c
src/wearable/circle/efl_extension_circle_surface.c

index b6e3ef0817533d453ebb34b23083f64f465848c8..a6046c3a7b24c3bfac7b54f15de31653f2b167d7 100644 (file)
@@ -46,8 +46,6 @@ typedef enum
 struct _Eext_Circle_Surface {
    Evas_Object         *parent;
    Evas_Object         *image_widget;
-   Evas_Object         *vector_widget;
-   Efl_VG              *vg_root;
    cairo_surface_t     *cairo_surface;
    cairo_t             *cairo;
    unsigned char       *buffer;
@@ -104,9 +102,6 @@ struct _Eext_Circle_Object_Item {
    const char *name;
    void *data;
 
-   //For rendering
-   Efl_VG *vg;
-
    // For text draw
    const char *text;
    const char *font;
index f287bc90654eddfa09e5e7495bd0770311f70a93..f5ad11da03609cf5a732f7f0ade657c2faffc9e5 100644 (file)
@@ -39,8 +39,6 @@ _eext_circle_object_del_cb(void *data,
 
    EINA_LIST_FOREACH_SAFE(circle_obj->items, l, l_next, item)
      {
-        if (item->vg)
-          evas_vg_shape_reset(item->vg);
         _eext_circle_object_item_free(item);
      }
 
@@ -273,7 +271,6 @@ EAPI void
 eext_circle_object_line_width_set(Evas_Object *obj, int line_width)
 {
    eext_circle_object_item_line_width_set(obj, "default", line_width);
-   eext_circle_object_item_line_width_set(obj, "bg", line_width);
 }
 
 EAPI int
@@ -358,7 +355,6 @@ EAPI void
 eext_circle_object_radius_set(Evas_Object *obj, double radius)
 {
    eext_circle_object_item_radius_set(obj, "default", radius);
-   eext_circle_object_item_radius_set(obj, "bg", radius);
 }
 
 EAPI double
index 6edefb536478fed3c74946be1c8296b0b9a8c187..22aadf4e438992b890dc1a646c92fb574aa321df 100644 (file)
@@ -37,42 +37,34 @@ _eext_circle_surface_image_widget_add(Evas_Object *parent)
    //for accessibility
    elm_atspi_accessible_role_set(image_widget, ELM_ATSPI_ROLE_REDUNDANT_OBJECT);
 
+   //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;
 }
 
 static void
-_eext_circle_surface_vector_draw_arc(Efl_VG *vg,
+_eext_circle_surface_cairo_draw_arc(cairo_t *cairo,
                                     int line_width,
-                                    double surface_width, double radius,
-                                    int r, int g, int b, int a,
+                                    double center_x, double center_y, double radius,
+                                    double r, double g, double b, double a,
                                     double angle1, double angle2, Eina_Bool round_cap)
 {
-   line_width /= 2;
-   evas_vg_shape_reset(vg);
-
-   evas_vg_shape_stroke_width_set(vg, line_width);
+   cairo_set_line_width(cairo, line_width);
 
-   r = (r * a) / 255;
-   g = (g * a) / 255;
-   b = (b * a) / 255;
-   evas_vg_shape_stroke_color_set(vg, r, g, b, a);
+   if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
 
-   int x, y, w, h;
-   w = radius  * 2;
-   h = w;
-   x = (surface_width - w) / 2;
-   y = x;
-
-   evas_vg_shape_append_arc(vg, x, y, w, h, (angle1 * -1) + 90, (angle2 - angle1) * -1);
+   cairo_set_source_rgba(cairo, r, g, b, a);
 
-   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);
+   cairo_arc(cairo, center_x, center_y, radius,
+             angle1 * M_PI / 180, angle2 * M_PI / 180);
+   cairo_stroke(cairo);
 }
 
-/*
-//FIXME:: This code should be modified later when the curved text supports is done.
 static void
 _eext_circle_surface_cairo_draw_text(cairo_t *cairo,
                                      const char *text, const char *font, int font_size,
@@ -96,7 +88,6 @@ _eext_circle_surface_cairo_draw_text(cairo_t *cairo,
    cairo_show_text(cairo, text);
    cairo_stroke(cairo);
 }
-*/
 
 static void
 _eext_circle_surface_clear(Eext_Circle_Surface *surface)
@@ -110,6 +101,9 @@ _eext_circle_surface_clear(Eext_Circle_Surface *surface)
 
    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
@@ -151,15 +145,7 @@ _eext_circle_surface_render(void *data)
    EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
      {
         if (!render_obj->visible)
-          {
-             Eext_Circle_Object_Item *item;
-             EINA_LIST_FOREACH(render_obj->items, ll, item)
-             {
-               if (item->vg)
-                 evas_vg_shape_reset(item->vg);
-             }
-             continue;
-        }
+          continue;
 
         if (render_obj->bg_image_objs)
           {
@@ -195,6 +181,8 @@ _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)
@@ -202,35 +190,32 @@ _eext_circle_surface_render(void *data)
 
                        if (is_mirrored)
                          {
-                            angle1 = (item->draw.angle_offset + item->draw.angle) * -1;
-                            angle2 = (item->draw.angle_offset + item->min_angle) * -1;
+                            angle1 = (item->draw.angle_offset + item->draw.angle + 90.0) * -1;
+                            angle2 = (item->draw.angle_offset + item->min_angle + 90.0) * -1;
                          }
                        else
                          {
-                            angle1 = item->draw.angle_offset + item->min_angle;
-                            angle2 = item->draw.angle_offset + item->draw.angle;
+                            angle1 = item->draw.angle_offset + item->min_angle - 90.0;
+                            angle2 = item->draw.angle_offset + item->draw.angle - 90.0;
                          }
 
-                       if (item->vg == NULL)
-                         item->vg = evas_vg_shape_add(surface->vg_root);
-
-                       _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,
-                                                           angle2,
+                       _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,
                                                            angle1,
+                                                           angle2,
                                                            item->round_cap);
+                       cairo_restore(surface->cairo);
                     }
-                  /*
-                  //FIXME:: This code should be modified later when the curved text supports is done.
-                  else if (item->font_size)
-                    {
-                       // Draw Text
-                       cairo_save(surface->cairo);
-                       _eext_circle_surface_cairo_draw_text(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,
@@ -240,12 +225,13 @@ _eext_circle_surface_render(void *data)
                                                        (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);
-                    }
-                  */
+                  cairo_restore(surface->cairo);
                }
           }
      }
+
+   evas_object_image_data_update_add(elm_image_object_get(surface->image_widget),
+                                     0, 0, surface->w, surface->h);
 }
 
 static void
@@ -258,10 +244,44 @@ _eext_circle_surface_render_finish(Eext_Circle_Surface *surface)
 }
 
 static void
-_eext_circle_surface_vector_finish(Eext_Circle_Surface *surface)
+_eext_circle_surface_cairo_finish(Eext_Circle_Surface *surface)
 {
-   evas_object_del(surface->vector_widget);
-   evas_object_del(surface->image_widget);
+   if (surface->cairo) cairo_destroy(surface->cairo);
+   if (surface->cairo_surface) cairo_surface_destroy(surface->cairo_surface);
+
+   surface->cairo = NULL;
+   surface->cairo_surface = NULL;
+}
+
+static void
+_eext_circle_surface_cairo_init(Eext_Circle_Surface *surface)
+{
+   Evas_Object *image_object;
+   cairo_surface_t *cairo_surface;
+   cairo_t *cairo;
+   unsigned char *buffer;
+   int stride;
+
+   if (surface->cairo_surface || surface->cairo)
+     _eext_circle_surface_cairo_finish(surface);
+
+   if (surface->image_widget == 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->cairo_surface = cairo_surface;
+   surface->cairo = cairo;
 }
 
 static void
@@ -280,14 +300,21 @@ _eext_circle_surface_update(Eext_Circle_Surface *surface)
 
    evas_object_image_size_set(image_object, surface->w, surface->h);
    evas_object_image_fill_set(image_object, 0, 0, surface->w, surface->h);
-   evas_object_resize(surface->image_widget, surface->w, surface->h);
-   evas_object_resize(surface->vector_widget, 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_changed(surface);
      }
+   else
+     {
+        if (surface->cairo_surface || surface->cairo)
+          {
+             _eext_circle_surface_cairo_finish(surface);
+             _eext_circle_surface_render_finish(surface);
+          }
+     }
 }
 
 static void
@@ -320,7 +347,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_vector_finish(surface);
+   _eext_circle_surface_cairo_finish(surface);
    _eext_circle_surface_render_finish(surface);
 }
 
@@ -496,7 +523,7 @@ _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_vector_finish(surface);
+   _eext_circle_surface_cairo_finish(surface);
    _eext_circle_surface_render_finish(surface);
 
    if (surface->image_widget)
@@ -544,30 +571,6 @@ _eext_circle_surface_del_internal(Eext_Circle_Surface *surface)
      }
 
    free(surface);
-  }
-
-static void
-_init_render_object(Eext_Circle_Surface *surface, Evas_Object *image_widget)
-{
-   surface->vector_widget = evas_object_vg_add(evas_object_evas_get(image_widget));
-   Efl_VG *root = evas_vg_container_add(surface->vector_widget);
-   evas_object_vg_root_node_set(surface->vector_widget, root);
-   surface->vg_root = root;
-
-   evas_object_repeat_events_set(surface->vector_widget, EINA_TRUE);
-
-   surface->image_widget = image_widget;
-   evas_object_image_alpha_set(elm_image_object_get(surface->image_widget), EINA_TRUE);
-   elm_image_aspect_fixed_set(surface->image_widget, EINA_FALSE);
-   evas_object_repeat_events_set(surface->image_widget, EINA_TRUE);
-   evas_object_smart_member_add(surface->vector_widget, surface->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_show(surface->vector_widget);
 }
 
 //////////////////////////
@@ -596,13 +599,24 @@ _eext_circle_surface_init(Evas_Object *image_widget, Evas_Object *parent, Eext_C
      }
    else if (type == EEXT_CIRCLE_SURFACE_TYPE_PRIVATE)
      {
-        _init_render_object(surface, image_widget);
+        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
      {
-        _init_render_object(surface, image_widget);
+        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;
 }
 
@@ -618,16 +632,6 @@ _eext_circle_surface_object_remove(Eext_Circle_Surface *surface, Eext_Circle_Obj
    if (!surface) return;
    if (!obj) return;
 
-   Eina_List *ll;
-   Eext_Circle_Object_Item *item;
-   EINA_LIST_FOREACH(obj->items, ll, item)
-   {
-      if (item->vg)
-        evas_vg_shape_reset(item->vg);
-   }
-
-   _eext_circle_surface_clear(surface);
-
    surface->render_objs = eina_list_remove(surface->render_objs, obj);
    obj->surface = NULL;
    _eext_circle_surface_changed(surface);
@@ -889,7 +893,6 @@ eext_circle_surface_del(Eext_Circle_Surface *surface)
      {
         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->vector_widget);
         evas_object_del(surface->image_widget);
         surface->image_widget = NULL;
      }