//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_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);
+ line_width /= 2;
+ evas_vg_shape_reset(vg);
- if (round_cap) cairo_set_line_cap(cairo, CAIRO_LINE_CAP_ROUND);
+ evas_vg_shape_stroke_width_set(vg, line_width);
- cairo_set_source_rgba(cairo, r, g, b, a);
+ r = (r * a) / 255;
+ g = (g * a) / 255;
+ b = (b * a) / 255;
+ evas_vg_shape_stroke_color_set(vg, r, g, b, a);
- cairo_arc(cairo, center_x, center_y, radius,
- angle1 * M_PI / 180, angle2 * M_PI / 180);
- cairo_stroke(cairo);
+ 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);
+
+ 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);
}
+/*
+//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,
cairo_show_text(cairo, text);
cairo_stroke(cairo);
}
+*/
static void
_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
EINA_LIST_FOREACH(surface->render_objs, l, render_obj)
{
if (!render_obj->visible)
- continue;
+ {
+ Eext_Circle_Object_Item *item;
+ EINA_LIST_FOREACH(render_obj->items, ll, item)
+ {
+ if (item->vg)
+ evas_vg_shape_reset(item->vg);
+ }
+ continue;
+ }
if (render_obj->bg_image_objs)
{
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)
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->draw.angle) * -1;
+ angle2 = (item->draw.angle_offset + item->min_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->min_angle;
+ angle2 = item->draw.angle_offset + item->draw.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,
- angle1,
+ 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,
+ angle1,
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,
+ /*
+ //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,
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.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
}
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);
-
- 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;
+ evas_object_del(surface->vector_widget);
+ evas_object_del(surface->image_widget);
}
static void
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
{
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);
}
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)
}
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_object_vg_root_node_get(surface->vector_widget);
+ 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);
}
//////////////////////////
}
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);
+ _init_render_object(surface, image_widget);
}
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);
+ _init_render_object(surface, image_widget);
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;
}
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);
{
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;
}