state->input = eina_tiler_new(w, h);
eina_tiler_tile_size_set(state->input, 1, 1);
- state->opaque = eina_tiler_new(w, h);
- eina_tiler_tile_size_set(state->opaque, 1, 1);
-
state->buffer_viewport.buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL;
state->buffer_viewport.buffer.scale = 1;
state->buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
EINA_LIST_FREE(state->frames, cb)
wl_resource_destroy(cb);
- if (state->opaque) eina_tiler_free(state->opaque);
- state->opaque = NULL;
-
if (state->input) eina_tiler_free(state->input);
state->input = NULL;
_e_comp_wl_surface_damage_set(ec);
}
+static void
+_e_comp_wl_client_pixmap_opaque_region_update(E_Client *ec, int buffer_width, int buffer_height)
+{
+ E_Surface *surface = e_surface_from_ec(ec);
+ pixman_region32_t region;
+ pixman_region32_t *opaque_region;
+ pixman_box32_t *rects;
+ int nrects, i;
+
+ e_pixmap_image_opaque_set(ec->pixmap, 0, 0, 0, 0);
+
+ opaque_region = e_surface_opaque_region_get(surface);
+ if (!opaque_region)
+ return;
+
+ pixman_region32_init(®ion);
+
+ pixman_region32_intersect_rect(®ion, opaque_region, 0, 0, buffer_width, buffer_height);
+ rects = pixman_region32_rectangles(®ion, &nrects);
+ for (i = 0; i < nrects; i++)
+ {
+ e_pixmap_image_opaque_set(ec->pixmap,
+ rects[i].x1,
+ rects[i].y1,
+ rects[i].x2 - rects[i].x1,
+ rects[i].y2 - rects[i].y1);
+ }
+
+ pixman_region32_fini(®ion);
+}
+
static void
_e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state)
{
if (e_client_view_get(ec))
_e_comp_wl_surface_damage_update(ec);
- /* put state opaque into surface */
- e_pixmap_image_opaque_set(ec->pixmap, 0, 0, 0, 0);
- if (state->opaque)
- {
- Eina_Rectangle *rect;
- Eina_Iterator *itr;
-
- itr = eina_tiler_iterator_new(state->opaque);
- EINA_ITERATOR_FOREACH(itr, rect)
- {
- Eina_Rectangle r;
-
- EINA_RECTANGLE_SET(&r, rect->x, rect->y, rect->w, rect->h);
- E_RECTS_CLIP_TO_RECT(r.x, r.y, r.w, r.h, 0, 0, state->bw, state->bh);
- e_pixmap_image_opaque_set(ec->pixmap, r.x, r.y, r.w, r.h);
- break;
- }
-
- eina_iterator_free(itr);
- }
+ _e_comp_wl_client_pixmap_opaque_region_update(ec, state->bw, state->bh);
/* put state input into surface */
if ((state->input) &&
}
EINTERN void
-e_comp_wl_client_surface_pending_opaque_region_set(E_Client *ec, Eina_Tiler *region)
+e_comp_wl_client_opaque_region_set(E_Client *ec, pixman_region32_t *region)
{
- if (ec->comp_data->pending.opaque)
- eina_tiler_clear(ec->comp_data->pending.opaque);
-
- if (region)
+ if (pixman_region32_not_empty(region))
{
- eina_tiler_union(ec->comp_data->pending.opaque, region);
-
- if (!eina_tiler_empty(ec->comp_data->pending.opaque))
+ if (ec->argb)
{
- if (ec->argb)
- {
- ec->argb = EINA_FALSE;
- ELOGF("COMP", "Set argb:%d", ec, ec->argb);
- EC_CHANGED(ec);
- _e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE, ec);
- e_view_client_alpha_set(e_client_view_get(ec), EINA_FALSE);
- }
+ ec->argb = EINA_FALSE;
+ ELOGF("COMP", "Set argb:%d", ec, ec->argb);
+ EC_CHANGED(ec);
+ _e_comp_wl_hook_call(E_COMP_WL_HOOK_CLIENT_ALPHA_CHANGE, ec);
+ e_view_client_alpha_set(e_client_view_get(ec), EINA_FALSE);
}
}
else
#include "e_policy_wl.h"
#include "e_device_intern.h"
+#include <pixman.h>
+
EINTERN E_Comp_Wl_Data *e_comp_wl_init(void);
EINTERN void e_comp_wl_shutdown(void);
EINTERN E_Comp_Wl_Data *e_comp_wl_get(void);
EINTERN void e_comp_wl_client_surface_init(E_Client *ec);
EINTERN void e_comp_wl_client_surface_finish(E_Client *ec);
EINTERN void e_comp_wl_client_surface_pending_buffer_set(E_Client *ec, E_Comp_Wl_Buffer *buffer, int32_t sx, int32_t sy);
-EINTERN void e_comp_wl_client_surface_pending_opaque_region_set(E_Client *ec, Eina_Tiler *region);
+EINTERN void e_comp_wl_client_opaque_region_set(E_Client *ec, pixman_region32_t *region);
EINTERN void e_comp_wl_client_surface_pending_input_region_set(E_Client *ec, Eina_Tiler *region);
EINTERN void e_comp_wl_client_surface_pending_commit(E_Client *ec);