};
#endif
+static Eina_Bool _damage_trace = EINA_FALSE;
+static Eina_List *_damage_trace_objs = NULL;
+static Eina_List *_damage_trace_post_objs = NULL;
+
/* sekrit functionzzz */
EINTERN void e_client_focused_set(E_Client *ec);
e_comp_object_damage(obj, 0, 0, cw->w, cw->h);
}
+static void
+_e_comp_object_damage_trace_rect_set(Evas_Object *obj, Eina_Rectangle *origin, int dmg_x, int dmg_y, int dmg_w, int dmg_h)
+{
+ Evas_Object *o;
+ int obj_x, obj_y;
+
+ if (!_damage_trace) return;
+
+ API_ENTRY;
+
+ if (!evas_object_visible_get(cw->obj)) return;
+
+ evas_object_geometry_get(cw->obj, &obj_x, &obj_y, NULL, NULL);
+
+ o = evas_object_rectangle_add(e_comp->evas);
+ evas_object_layer_set(o, E_LAYER_MAX);
+ evas_object_name_set(o, "damage_trace");
+ evas_object_move(o, dmg_x + obj_x, dmg_y + obj_y);
+ evas_object_resize(o, dmg_w, dmg_h);
+ evas_object_color_set(o, 0, 128, 0, 128);
+ evas_object_render_op_set(o, EVAS_RENDER_BLEND);
+ evas_object_pass_events_set(o, EINA_TRUE);
+ evas_object_show(o);
+
+ ELOGF("COMP", "add damage(%dx%d+%d+%d) origin(%dx%d+%d+%d)",
+ cw->ec,
+ dmg_w, dmg_h, dmg_x, dmg_y,
+ origin->w, origin->h, origin->x, origin->y);
+
+ _damage_trace_objs = eina_list_append(_damage_trace_objs, o);
+}
+
/* mark an object as dirty and setup damages */
E_API void
e_comp_object_dirty(Evas_Object *obj)
_e_comp_object_map_damage_transform_rect(cw->ec, m, rect->x, rect->y, rect->w, rect->h,
&damage_x, &damage_y, &damage_w, &damage_h);
evas_object_image_data_update_add(cw->obj, damage_x, damage_y, damage_w, damage_h);
+ _e_comp_object_damage_trace_rect_set(obj, rect, damage_x, damage_y, damage_w, damage_h);
}
else
- evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
+ {
+ evas_object_image_data_update_add(cw->obj, rect->x, rect->y, rect->w, rect->h);
+ _e_comp_object_damage_trace_rect_set(obj, rect, rect->x, rect->y, rect->w, rect->h);
+ }
EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
evas_object_image_data_update_add(o, rect->x, rect->y, rect->w, rect->h);
return cw->image_filter;
}
+
+static void
+_e_comp_object_damage_trace_render_pre_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ Evas_Object *obj;
+
+ if (!_damage_trace) return;
+
+ EINA_LIST_FREE(_damage_trace_post_objs, obj)
+ evas_object_del(obj);
+
+ _damage_trace_post_objs = NULL;
+}
+
+static void
+_e_comp_object_damage_trace_render_post_cb(void *data, Evas *e EINA_UNUSED, void *event_info EINA_UNUSED)
+{
+ if (!_damage_trace) return;
+
+ _damage_trace_post_objs = _damage_trace_objs;
+ _damage_trace_objs = NULL;
+}
+
+EINTERN void
+e_comp_object_damage_trace_debug(Eina_Bool onoff)
+{
+ if (_damage_trace == onoff) return;
+
+ if (onoff)
+ {
+ evas_event_callback_add(e_comp->evas,
+ EVAS_CALLBACK_RENDER_PRE,
+ _e_comp_object_damage_trace_render_pre_cb,
+ NULL);
+
+ evas_event_callback_add(e_comp->evas,
+ EVAS_CALLBACK_RENDER_POST,
+ _e_comp_object_damage_trace_render_post_cb,
+ NULL);
+ }
+ else
+ {
+ Evas_Object *obj;
+
+ EINA_LIST_FREE(_damage_trace_objs, obj)
+ evas_object_del(obj);
+
+ _damage_trace_objs = NULL;
+
+ EINA_LIST_FREE(_damage_trace_post_objs, obj)
+ evas_object_del(obj);
+
+ _damage_trace_post_objs = NULL;
+
+ evas_event_callback_del(e_comp->evas,
+ EVAS_CALLBACK_RENDER_PRE,
+ _e_comp_object_damage_trace_render_pre_cb);
+
+ evas_event_callback_del(e_comp->evas,
+ EVAS_CALLBACK_RENDER_POST,
+ _e_comp_object_damage_trace_render_post_cb);
+ }
+
+ _damage_trace = onoff;
+}
return reply;
}
-
static Eldbus_Message *
e_info_server_cb_serial_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
}
static Eldbus_Message *
+e_info_server_cb_damage_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
+{
+ Eldbus_Message *reply = eldbus_message_method_return_new(msg);
+ uint32_t on;
+
+ if (!eldbus_message_arguments_get(msg, "i", &on))
+ {
+ ERR("Error getting arguments.");
+ return reply;
+ }
+
+ if (on == 0 || on == 1)
+ e_comp_object_damage_trace_debug(on);
+
+ return reply;
+}
+
+static Eldbus_Message *
e_info_server_cb_prstt_trace_message(const Eldbus_Service_Interface *iface EINA_UNUSED, const Eldbus_Message *msg)
{
Eldbus_Message *reply = eldbus_message_method_return_new(msg);
{ "trace_message_serial", ELDBUS_ARGS({"i", "trace_message_serial"}), NULL, e_info_server_cb_serial_trace_message, 0},
{ "trace_message_prstt", ELDBUS_ARGS({"i", "trace_message_presentation_time"}), NULL, e_info_server_cb_prstt_trace_message, 0},
{ "trace_message_exsync", ELDBUS_ARGS({"i", "trace_message_ex_sync"}), NULL, e_info_server_cb_exsync_trace_message, 0},
+ { "trace_message_damage", ELDBUS_ARGS({"i", "trace_message_damage"}), NULL, e_info_server_cb_damage_trace_message, 0},
{ "hwc", ELDBUS_ARGS({"i", "hwc"}), NULL, e_info_server_cb_hwc, 0},
{ "show_plane_state", NULL, NULL, e_info_server_cb_show_plane_state, 0},
{ "show_pending_commit", NULL, ELDBUS_ARGS({"a("VALUE_TYPE_FOR_PENDING_COMMIT")", "array of pending commit"}), e_info_server_cb_show_pending_commit, 0},