1 #include "e_mod_comp_shared_types.h"
2 #include "e_mod_comp.h"
3 #include "e_mod_comp_atoms.h"
4 #include "e_mod_comp_debug.h"
6 typedef struct _E_Comp_Log
15 struct _E_Comp_HW_Ov_Win
17 Ecore_X_Window ee_win;
34 /* local subsystem globals */
35 static E_Comp_HW_Ov_Win *ov_win = NULL;
37 /* local subsystem functions */
38 static void _hw_ov_win_power_set(E_Comp_HW_Ov_Win *ov, Eina_Bool set);
39 static Eina_Bool _hw_ov_win_update(E_Comp_HW_Ov_Win *ov, E_Comp_Win *cw);
41 /* externally accessible functions */
42 EAPI E_Comp_HW_Ov_Win *
43 e_mod_comp_hw_ov_win_new(Ecore_X_Window parent,
49 E_Comp_HW_Ov_Win *ov = NULL;
50 Eina_Bool res = EINA_FALSE;
52 E_CHECK_GOTO(parent, finish);
54 ov = E_NEW(E_Comp_HW_Ov_Win, 1);
55 E_CHECK_GOTO(ov, finish);
57 ov->ee = ecore_evas_software_x11_new(NULL, parent, x, y, w, h);
58 E_CHECK_GOTO(ov->ee, finish);
60 ov->ee_win = ecore_evas_window_get(ov->ee);;
61 E_CHECK_GOTO(ov->ee_win, finish);
63 ov->evas = ecore_evas_get(ov->ee);
64 E_CHECK_GOTO(ov->evas, finish);
66 ecore_x_composite_redirect_window(ov->ee_win, ECORE_X_COMPOSITE_UPDATE_MANUAL);
67 ecore_evas_comp_sync_set(ov->ee, 0);
68 ecore_evas_show(ov->ee);
70 ov->bg = evas_object_rectangle_add(ov->evas);
71 E_CHECK_GOTO(ov->bg, finish);
73 evas_object_render_op_set(ov->bg, EVAS_RENDER_COPY);
74 evas_object_layer_set(ov->bg, EVAS_LAYER_MIN);
75 evas_object_color_set(ov->bg, 0, 0, 0, 0);
76 evas_object_move(ov->bg, 0, 0);
77 evas_object_resize(ov->bg, w, h);
78 evas_object_show(ov->bg);
79 _hw_ov_win_power_set(ov, EINA_FALSE);
81 // comp has to unset shape input mask for the H/W overlay window
82 // to receive input event.
83 ecore_x_window_shape_input_rectangle_set(ov->ee_win, -1, -1, 1, 1);
99 ecore_evas_free(ov->ee);
109 e_mod_comp_hw_ov_win_msg_config_update(void)
114 E_CHECK(_comp_mod->conf->use_hw_ov);
115 E_CHECK(_comp_mod->conf->debug_info_show);
117 EINA_LIST_FREE(ov_win->info.list, log)
119 evas_object_hide(log->o);
120 evas_object_hide(log->bg);
121 evas_object_del(log->o);
122 evas_object_del(log->bg);
123 memset(log, 0, sizeof(E_Comp_Log));
128 #ifdef _LOG_TYPE_CHECK
129 # undef _LOG_TYPE_CHECK
131 # define _LOG_TYPE_CHECK(a, b) \
132 ((_comp_mod->conf->debug_type_##a) && \
133 (E_COMP_LOG_TYPE_##b == type))
136 e_mod_comp_hw_ov_win_msg_show(E_Comp_Log_Type type,
140 E_Comp_Log *log, *prev_log;
142 Evas_Coord w = 0, h = 0;
145 char buf[256], str[256];
149 E_CHECK(_comp_mod->conf->use_hw_ov);
150 E_CHECK(_comp_mod->conf->debug_info_show);
151 E_CHECK(_comp_mod->conf->max_debug_msgs >= 1);
152 E_CHECK(type > E_COMP_LOG_TYPE_DEFAULT);
153 E_CHECK(type < E_COMP_LOG_TYPE_MAX);
155 if (!(_LOG_TYPE_CHECK(nocomp, NOCOMP) ||
156 _LOG_TYPE_CHECK(swap, SWAP) ||
157 _LOG_TYPE_CHECK(effect, EFFECT)))
163 vsprintf(buf, f, args);
166 /* check if previous log is same type, just increment repeat value */
167 num = eina_list_count(ov_win->info.list);
170 log = eina_list_nth(ov_win->info.list, num - 1);
171 if ((log) && (log->type == type) &&
172 (!strcmp(buf, log->str)))
174 sprintf(str, "%04d|%s %d",
178 evas_object_text_text_set(log->o, str);
183 log = E_NEW(E_Comp_Log, 1);
187 strcpy(log->str, buf);
188 sprintf(str, "%04d|%s", ov_win->info.num++, log->str);
190 if (num < _comp_mod->conf->max_debug_msgs)
192 bg = evas_object_rectangle_add(ov_win->evas);
193 evas_object_layer_set(bg, EVAS_LAYER_MAX);
194 evas_object_render_op_set(bg, EVAS_RENDER_COPY);
195 evas_object_color_set(bg, 30, 30, 30, 128);
196 evas_object_show(bg);
198 o = evas_object_text_add(ov_win->evas);
199 evas_object_text_font_set(o, "Sans", 28);
200 evas_object_text_text_set(o, str);
201 evas_object_layer_set(o, EVAS_LAYER_MAX);
202 evas_object_render_op_set(o, EVAS_RENDER_COPY);
203 evas_object_color_set(o, 200, 200, 200, 255);
211 prev_log = eina_list_nth(ov_win->info.list, 0);
217 log->bg = prev_log->bg;
218 log->o = prev_log->o;
219 ov_win->info.list = eina_list_remove(ov_win->info.list, prev_log);
222 evas_object_text_text_set(log->o, str);
225 ov_win->info.list = eina_list_append(ov_win->info.list, log);
228 EINA_LIST_REVERSE_FOREACH(ov_win->info.list, l, log)
231 evas_object_geometry_get(log->o, NULL, NULL, &w, &h);
232 evas_object_move(log->bg, 0, y - 1);
233 evas_object_resize(log->bg, w + 2, h + 2);
234 evas_object_move(log->o, 1, y);
240 e_mod_comp_hw_ov_win_free(E_Comp_HW_Ov_Win *ov)
245 _hw_ov_win_power_set(ov, EINA_FALSE);
247 EINA_LIST_FREE(ov->info.list, log)
249 evas_object_hide(log->o);
250 evas_object_hide(log->bg);
251 evas_object_del(log->o);
252 evas_object_del(log->bg);
253 memset(log, 0, sizeof(E_Comp_Log));
258 evas_object_del(ov->bg);
263 ecore_evas_free(ov->ee);
266 memset(ov, 0, sizeof(E_Comp_HW_Ov_Win));
273 e_mod_comp_hw_ov_win_show(E_Comp_HW_Ov_Win *ov,
278 E_CHECK(cw->visible);
279 E_CHECK(cw->dmg_updates >= 1);
281 _hw_ov_win_update(ov, cw);
285 e_mod_comp_hw_ov_win_hide(E_Comp_HW_Ov_Win *ov,
290 E_CHECK(!cw->visible);
292 _hw_ov_win_power_set(ov, EINA_FALSE);
296 evas_object_hide(cw->ov_obj);
297 evas_object_del(cw->ov_obj);
303 ecore_x_image_free(cw->ov_xim);
311 e_mod_comp_hw_ov_win_obj_show(E_Comp_HW_Ov_Win *ov,
318 visible = evas_object_visible_get(cw->ov_obj);
321 Eina_Bool res = _hw_ov_win_update(ov, cw);
324 evas_object_show(cw->ov_obj);
325 _hw_ov_win_power_set(ov, EINA_TRUE);
332 e_mod_comp_hw_ov_win_obj_hide(E_Comp_HW_Ov_Win *ov,
338 visible = evas_object_visible_get(cw->ov_obj);
341 _hw_ov_win_power_set(ov, EINA_FALSE);
342 evas_object_hide(cw->ov_obj);
350 e_mod_comp_hw_ov_win_update(E_Comp_HW_Ov_Win *ov,
353 E_CHECK_RETURN(ov, EINA_FALSE);
354 E_CHECK_RETURN(cw, EINA_FALSE);
356 Eina_Bool res = _hw_ov_win_update(ov, cw);
359 // we will be trying to get image again at next update.
361 cw->c->updates = eina_list_append(cw->c->updates, cw);
362 e_mod_comp_win_render_queue(cw);
369 e_mod_comp_hw_ov_win_root_set(E_Comp_HW_Ov_Win *ov,
376 /* local subsystem functions */
378 _hw_ov_win_power_set(E_Comp_HW_Ov_Win *ov,
386 e_mod_comp_util_fb_visible_set(set);
395 e_mod_comp_util_fb_visible_set(set);
402 _hw_ov_win_update(E_Comp_HW_Ov_Win *ov,
405 Eina_Bool visible = EINA_FALSE;
406 Eina_Bool get = EINA_FALSE;
407 unsigned char *pix = NULL;
409 if (!cw->pixmap || cw->pw <= 0 || cw->ph <= 0 || cw->needpix)
413 if (cw->ov_xim) ecore_x_image_free(cw->ov_xim);
418 if (cw->pixmap && cw->pw > 0 && cw->ph > 0)
422 cw->ov_xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth);
423 if (!cw->ov_xim) return EINA_FALSE;
428 else if (cw->ov.w != cw->pw || cw->ov.h != cw->ph)
430 if (cw->ov_xim) ecore_x_image_free(cw->ov_xim);
431 cw->ov_xim = ecore_x_image_new(cw->pw, cw->ph, cw->vis, cw->depth);
443 if (cw->pixmap && cw->pw > 0 && cw->ph > 0 && cw->ov_xim &&
444 !cw->ov_obj && cw->visible)
446 cw->ov_obj = evas_object_image_filled_add(ov->evas);
447 if (!cw->ov_obj) return EINA_FALSE;
448 evas_object_image_content_hint_set(cw->ov_obj, EVAS_IMAGE_CONTENT_HINT_DYNAMIC);
449 evas_object_image_colorspace_set(cw->ov_obj, EVAS_COLORSPACE_ARGB8888);
450 evas_object_image_size_set(cw->ov_obj, cw->pw, cw->ph);
451 if (cw->argb) evas_object_image_alpha_set(cw->ov_obj, 1);
452 else evas_object_image_alpha_set(cw->ov_obj, 0);
453 evas_object_image_fill_set(cw->ov_obj, 0, 0, cw->pw, cw->ph);
454 evas_object_resize(cw->ov_obj, cw->pw, cw->ph);
455 evas_object_render_op_set(cw->ov_obj, EVAS_RENDER_COPY);
456 evas_object_color_set(cw->ov_obj, 255, 255, 255, 255);
457 evas_object_show(cw->ov_obj);
458 _hw_ov_win_power_set(ov, EINA_TRUE);
461 if (cw->ov_obj && cw->visible)
463 visible = evas_object_visible_get(cw->ov_obj);
466 evas_object_show(cw->ov_obj);
467 _hw_ov_win_power_set(ov, EINA_TRUE);
471 if (cw->ov_xim && cw->ov_obj && cw->visible)
473 pix = ecore_x_image_data_get(cw->ov_xim, NULL, NULL, NULL);
474 evas_object_image_data_set(cw->ov_obj, pix);
475 evas_object_image_size_set(cw->ov_obj, cw->pw, cw->ph);
477 get = ecore_x_image_get(cw->ov_xim, cw->pixmap,
483 e_mod_comp_update_add(cw->up, 0, 0, cw->pw, cw->ph);
487 evas_object_move(cw->ov_obj, cw->x, cw->y);
488 evas_object_resize(cw->ov_obj, cw->pw, cw->ph);
491 pix = ecore_x_image_data_get(cw->ov_xim, &bpl, &rows, &bpp);
494 evas_data_argb_unpremul((unsigned int *)pix,
495 (unsigned int)bpl * (unsigned int)rows / bpp);
496 evas_object_image_data_set(cw->ov_obj, pix);
497 evas_object_image_data_update_add(cw->ov_obj, 0, 0, cw->pw, cw->ph);