diff --git a/src/bin/e_comp_object.c b/src/bin/e_comp_object.c index 1dbecbfaa..14b863ab6 100644 --- a/src/bin/e_comp_object.c +++ b/src/bin/e_comp_object.c @@ -2582,6 +2582,48 @@ e_comp_object_zoomap_set(Evas_Object *obj, Eina_Bool enabled) cw->zoomap_disabled = !enabled; } +E_API void +e_comp_object_viewport_source_set(Evas_Object *obj, int src_x, int src_y, int src_width, int src_height) +{ + API_ENTRY; + + e_zoomap_viewport_source_set(cw->zoomobj, src_x, src_y, src_width, src_height); +} + +E_API void +e_comp_object_viewport_destination_set(Evas_Object *obj, int width, int height) +{ + API_ENTRY; + + e_zoomap_viewport_destination_set(cw->zoomobj, width, height); +} + +E_API void +e_comp_object_viewport_set(Evas_Object *obj, Eina_Bool enabled) +{ + API_ENTRY; + + e_zoomap_commit(cw->zoomobj); +} + +E_API void +e_comp_object_scale_set(Evas_Object *obj, int32_t scale) +{ + API_ENTRY; + + e_zoomap_scale_set(cw->zoomobj, scale); +e_zoomap_commit(cw->zoomobj); +} + +E_API void +e_comp_object_transform_set(Evas_Object *obj, uint32_t transform) +{ + API_ENTRY; + + e_zoomap_transform_set(cw->zoomobj, transform); +e_zoomap_commit(cw->zoomobj); +} + E_API Eina_Bool e_comp_object_mirror_visibility_check(Evas_Object *obj) { diff --git a/src/bin/e_comp_object.h b/src/bin/e_comp_object.h index 55392faeb..838618ad5 100644 --- a/src/bin/e_comp_object.h +++ b/src/bin/e_comp_object.h @@ -92,6 +92,11 @@ E_API Eina_Bool e_comp_object_effect_stop(Evas_Object *obj, Edje_Signal_Cb end_c E_API E_Comp_Object_Mover *e_comp_object_effect_mover_add(int pri, const char *sig, E_Comp_Object_Mover_Cb provider, const void *data); E_API void e_comp_object_effect_mover_del(E_Comp_Object_Mover *prov); E_API void e_comp_object_map_set(Evas_Object *obj, Evas_Map *map); +E_API void e_comp_object_viewport_source_set(Evas_Object *obj, int src_x, int src_y, int src_width, int src_height); +E_API void e_comp_object_viewport_destination_set(Evas_Object *obj, int width, int height); +E_API void e_comp_object_viewport_set(Evas_Object *obj, Eina_Bool enabled); +E_API void e_comp_object_scale_set(Evas_Object *obj, int32_t scale); +E_API void e_comp_object_transform_set(Evas_Object *obj, uint32_t transform); #endif #endif diff --git a/src/bin/e_comp_wl.c b/src/bin/e_comp_wl.c index 496e4bddb..3cb968bba 100644 --- a/src/bin/e_comp_wl.c +++ b/src/bin/e_comp_wl.c @@ -1248,8 +1248,8 @@ _e_comp_wl_surface_state_init(E_Comp_Wl_Surface_State *state, int w, int h) 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->transform = WL_OUTPUT_TRANSFORM_NORMAL; + state->scale = 1; state->buffer_viewport.buffer.src_width = wl_fixed_from_int(-1); state->buffer_viewport.surface.width = -1; state->buffer_viewport.changed = 0; @@ -1305,70 +1305,6 @@ _e_comp_wl_surface_state_attach(E_Client *ec, E_Comp_Wl_Surface_State *state) e_pixmap_refresh(ec->pixmap); } -static void -_e_comp_wl_map_transform(int width, int height, uint32_t transform, int32_t scale, - int sx, int sy, int *dx, int *dy) -{ - switch (transform) - { - case WL_OUTPUT_TRANSFORM_NORMAL: - default: - *dx = sx, *dy = sy; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED: - *dx = width - sx, *dy = sy; - break; - case WL_OUTPUT_TRANSFORM_90: - *dx = height - sy, *dy = sx; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - *dx = height - sy, *dy = width - sx; - break; - case WL_OUTPUT_TRANSFORM_180: - *dx = width - sx, *dy = height - sy; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_180: - *dx = sx, *dy = height - sy; - break; - case WL_OUTPUT_TRANSFORM_270: - *dx = sy, *dy = width - sx; - break; - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - *dx = sy, *dy = sx; - break; - } - - *dx *= scale; - *dy *= scale; -} - -static void -_e_comp_wl_map_size_cal_from_buffer(E_Client *ec, int32_t *ow, int32_t *oh) -{ - E_Comp_Wl_Buffer_Viewport *vp = &ec->comp_data->scaler.buffer_viewport; - int32_t width, height, pw, ph; - - if (!e_pixmap_size_get(ec->pixmap, &pw, &ph)) return; - - switch (vp->buffer.transform) - { - case WL_OUTPUT_TRANSFORM_90: - case WL_OUTPUT_TRANSFORM_270: - case WL_OUTPUT_TRANSFORM_FLIPPED_90: - case WL_OUTPUT_TRANSFORM_FLIPPED_270: - width = ph / vp->buffer.scale; - height = pw / vp->buffer.scale; - break; - default: - width = pw / vp->buffer.scale; - height = ph / vp->buffer.scale; - break; - } - - *ow = width; - *oh = height; -} - static void _e_comp_wl_map_size_cal_from_viewport(E_Client *ec, int32_t bw, int32_t bh, int32_t *ow, int32_t *oh) { @@ -1398,7 +1334,7 @@ _e_comp_wl_map_size_cal_from_viewport(E_Client *ec, int32_t bw, int32_t bh, int3 *ow = width; *oh = height; } - +/* static void _e_comp_wl_map_apply(E_Client *ec) { @@ -1455,7 +1391,7 @@ _e_comp_wl_map_apply(E_Client *ec) evas_map_free(map); } - +*/ static void _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state) { @@ -1629,9 +1565,35 @@ _e_comp_wl_surface_state_commit(E_Client *ec, E_Comp_Wl_Surface_State *state) } } + if (e_pixmap_usable_get(ec->pixmap)) + { + if (state->scale > 1 && state->scale != ec->comp_data->scale) + { + ec->comp_data->scale = state->scale; + e_comp_object_zoomap_set(ec->frame, 1); + e_comp_object_scale_set(ec->frame, state->scale); + } + if (state->transform && state->transform != ec->comp_data->transform) + { + ec->comp_data->transform = state->transform; + e_comp_object_zoomap_set(ec->frame, 1); + e_comp_object_transform_set(ec->frame, state->transform); + } + } if (e_pixmap_usable_get(ec->pixmap) && state->buffer_viewport.changed) { - _e_comp_wl_map_apply(ec); + E_Comp_Wl_Buffer_Viewport *vp = &ec->comp_data->scaler.buffer_viewport; + + e_comp_object_zoomap_set(ec->frame, 1); + e_comp_object_viewport_source_set(ec->frame, + wl_fixed_to_int(vp->buffer.src_x), + wl_fixed_to_int(vp->buffer.src_y), + wl_fixed_to_int(vp->buffer.src_width), + wl_fixed_to_int(vp->buffer.src_height)); + e_comp_object_viewport_destination_set(ec->frame, + vp->surface.width, + vp->surface.height); + e_comp_object_viewport_set(ec->frame, 1); state->buffer_viewport.changed = 0; } @@ -1882,15 +1844,25 @@ _e_comp_wl_surface_cb_commit(struct wl_client *client EINA_UNUSED, struct wl_res } static void -_e_comp_wl_surface_cb_buffer_transform_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, int32_t transform EINA_UNUSED) +_e_comp_wl_surface_cb_buffer_transform_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, int32_t transform) { - /* DBG("Surface Buffer Transform: %d", wl_resource_get_id(resource)); */ + E_Client *ec; + + if (!(ec = wl_resource_get_user_data(resource))) return; + if (e_object_is_del(E_OBJECT(ec))) return; + + ec->comp_data->pending.transform = transform; } static void -_e_comp_wl_surface_cb_buffer_scale_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, int32_t scale EINA_UNUSED) +_e_comp_wl_surface_cb_buffer_scale_set(struct wl_client *client EINA_UNUSED, struct wl_resource *resource EINA_UNUSED, int32_t scale) { - /* DBG("Surface Buffer Scale: %d", wl_resource_get_id(resource)); */ + E_Client *ec; + + if (!(ec = wl_resource_get_user_data(resource))) return; + if (e_object_is_del(E_OBJECT(ec))) return; + + ec->comp_data->pending.scale = scale; } static const struct wl_surface_interface _e_surface_interface = @@ -2585,8 +2557,8 @@ _e_comp_wl_client_cb_new(void *data EINA_UNUSED, E_Client *ec) /* set initial client data properties */ ec->comp_data->mapped = EINA_FALSE; - ec->comp_data->scaler.buffer_viewport.buffer.transform = WL_OUTPUT_TRANSFORM_NORMAL; - ec->comp_data->scaler.buffer_viewport.buffer.scale = 1; + ec->comp_data->transform = WL_OUTPUT_TRANSFORM_NORMAL; + ec->comp_data->scale = 1; ec->comp_data->scaler.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1); ec->comp_data->scaler.buffer_viewport.surface.width = -1; diff --git a/src/bin/e_comp_wl.h b/src/bin/e_comp_wl.h index 1945732f2..579f17092 100644 --- a/src/bin/e_comp_wl.h +++ b/src/bin/e_comp_wl.h @@ -68,9 +68,6 @@ struct _E_Comp_Wl_Buffer struct _E_Comp_Wl_Buffer_Viewport { struct { - uint32_t transform; /* wl_surface.set_buffer_transform */ - int32_t scale; /* wl_surface.set_scaling_factor */ - /* If src_width != wl_fixed_from_int(-1), then and only then src_* are used. */ wl_fixed_t src_x, src_y; wl_fixed_t src_width, src_height; @@ -93,6 +90,8 @@ struct _E_Comp_Wl_Surface_State struct wl_listener buffer_destroy_listener; Eina_List *damages, *frames; Eina_Tiler *input, *opaque; + uint32_t transform; + int32_t scale; E_Comp_Wl_Buffer_Viewport buffer_viewport; Eina_Bool new_attach : 1; Eina_Bool has_data : 1; @@ -331,6 +330,9 @@ struct _E_Comp_Wl_Client_Data int32_t x, y; } popup; + uint32_t transform; + int32_t scale; + struct { struct wl_resource *viewport; diff --git a/src/bin/e_zoomap.c b/src/bin/e_zoomap.c index 682412fc6..046f02f1a 100644 --- a/src/bin/e_zoomap.c +++ b/src/bin/e_zoomap.c @@ -10,10 +10,15 @@ struct _E_Smart_Data Evas_Object *smart_obj, *child_obj; Evas_Coord x, y, w, h; Evas_Coord child_w, child_h; + int32_t scale; + uint32_t transform; + int src_x, src_y, src_w, src_h; + int dst_w, dst_h; unsigned int recurse; Eina_Bool solid : 1; Eina_Bool smooth : 1; Eina_Bool always : 1; + Eina_Bool viewport : 1; }; /* local subsystem functions */ @@ -36,6 +41,60 @@ static void _e_zoomap_smart_init(void); static Evas_Smart *_e_smart = NULL; /* externally accessible functions */ +E_API void +e_zoomap_commit(Evas_Object *obj) +{ + API_ENTRY return; + + _e_zoomap_smart_reconfigure(sd); +} + +E_API void +e_zoomap_viewport_source_set(Evas_Object *obj, int x, int y, int w, int h) +{ + API_ENTRY return; +fprintf(stderr, "ZOOM: %d %d %d %d\n", x, y, w, h); + sd->src_x = x; + sd->src_y = y; + sd->src_w = w; + sd->src_h = h; + sd->viewport = EINA_TRUE; +} + +E_API void +e_zoomap_viewport_destination_set(Evas_Object *obj, int w, int h) +{ + API_ENTRY return; + + sd->w = w; + sd->h = h; + sd->viewport = EINA_TRUE; +} + +E_API void +e_zoomap_viewport_set(Evas_Object *obj, Eina_Bool enabled) +{ + API_ENTRY return; +fprintf(stderr, "ZOOM: %d\n", enabled); + sd->viewport = enabled; +} + +E_API void +e_zoomap_scale_set(Evas_Object *obj, int32_t scale) +{ + API_ENTRY return; + + sd->scale = scale; +} + +E_API void +e_zoomap_transform_set(Evas_Object *obj, uint32_t transform) +{ + API_ENTRY return; + + sd->transform = transform; +} + E_API Evas_Object * e_zoomap_add(Evas *evas) { @@ -47,6 +106,7 @@ E_API void e_zoomap_child_set(Evas_Object *obj, Evas_Object *child) { API_ENTRY return; +fprintf(stderr, "CHILD SET: %p %p\n", obj, child); if (child == sd->child_obj) return; if (sd->child_obj) { @@ -68,6 +128,7 @@ e_zoomap_child_set(Evas_Object *obj, Evas_Object *child) evas_object_smart_member_add(sd->child_obj, sd->smart_obj); evas_object_geometry_get(sd->child_obj, NULL, NULL, &sd->child_w, &sd->child_h); +fprintf(stderr, "child set: (%p)'s CHILD (%p) SIZE: %d %d\n", obj, sd->child_obj, sd->child_w, sd->child_h); evas_object_event_callback_add(child, EVAS_CALLBACK_DEL, _e_zoomap_smart_child_del_hook, sd); evas_object_event_callback_add(child, EVAS_CALLBACK_RESIZE, @@ -86,6 +147,8 @@ e_zoomap_child_resize(Evas_Object *obj, int w, int h) { API_ENTRY return; evas_object_resize(sd->child_obj, w, h); +fprintf(stderr, "child_resize (%p)'s CHILD (%p) RESIZED... %d %d\n", obj, sd->child_obj, w, h); +sd->child_w = w; sd->child_h = h; } E_API Evas_Object * @@ -189,13 +252,94 @@ _e_zoomap_smart_child_resize_hook(void *data, Evas *e EINA_UNUSED, Evas_Object * } } +static void +_e_zoomap_size(E_Smart_Data *sd, int32_t *ow, int32_t *oh) +{ + switch (sd->transform) + { + case WL_OUTPUT_TRANSFORM_90: + case WL_OUTPUT_TRANSFORM_270: + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + *ow = sd->child_h; + *oh = sd->child_w; + break; + default: + *ow = sd->child_w; + *oh = sd->child_h; + break; + } + + if (sd->scale > 1) + { + *ow /= sd->scale; + *oh /= sd->scale; + } +} + +static void +_e_zoomap_transform_point(E_Smart_Data *sd, int sx, int sy, int *dx, int *dy) +{ + int width, height; + + _e_zoomap_size(sd, &width, &height); + + switch (sd->transform) + { + case WL_OUTPUT_TRANSFORM_NORMAL: + default: + *dx = sx, *dy = sy; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED: + *dx = width - sx, *dy = sy; + break; + case WL_OUTPUT_TRANSFORM_90: + *dx = height - sy, *dy = sx; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_90: + *dx = height - sy, *dy = width - sx; + break; + case WL_OUTPUT_TRANSFORM_180: + *dx = width - sx, *dy = height - sy; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_180: + *dx = sx, *dy = height - sy; + break; + case WL_OUTPUT_TRANSFORM_270: + *dx = sy, *dy = width - sx; + break; + case WL_OUTPUT_TRANSFORM_FLIPPED_270: + *dx = sy, *dy = sx; + break; + } + + if (sd->scale > 1) + { + *dx *= sd->scale; + *dy *= sd->scale; + } + +fprintf(stderr, "TRANSFORM %d %d rot %d scale %d to %d %d\n", sx, sy, sd->transform, sd->scale, *dx, *dy); +} + +static Eina_Bool +_e_zoomap_transformed(E_Smart_Data *sd) +{ + if (sd->scale > 1) return EINA_TRUE; +fprintf(stderr, "TRANSFORM: %d\n", sd->transform); + if (sd->transform != 0) return EINA_TRUE; + + return EINA_FALSE; +} + static void _e_zoomap_smart_reconfigure(E_Smart_Data *sd) { if (!sd->child_obj) return; sd->recurse++; if ((!sd->always) && - ((sd->w == sd->child_w) && (sd->h == sd->child_h))) + ((sd->w == sd->child_w) && (sd->h == sd->child_h)) && + (!_e_zoomap_transformed(sd))) { evas_object_map_set(sd->child_obj, NULL); evas_object_map_enable_set(sd->child_obj, EINA_FALSE); @@ -208,7 +352,8 @@ _e_zoomap_smart_reconfigure(E_Smart_Data *sd) Evas *e = evas_object_evas_get(sd->child_obj); Evas_Coord cx = 0, cy = 0; int r = 0, g = 0, b = 0, a = 0; - + int width, height, x, y; + evas_object_geometry_get(sd->child_obj, &cx, &cy, NULL, NULL); if (sd->recurse != 1) { @@ -227,12 +372,23 @@ _e_zoomap_smart_reconfigure(E_Smart_Data *sd) } evas_object_color_get(sd->child_obj, &r, &g, &b, &a); m = evas_map_new(4); - evas_map_util_points_populate_from_geometry(m, sd->x, sd->y, - sd->w, sd->h, 0); - evas_map_point_image_uv_set(m, 0, 0, 0); - evas_map_point_image_uv_set(m, 1, sd->child_w, 0); - evas_map_point_image_uv_set(m, 2, sd->child_w, sd->child_h); - evas_map_point_image_uv_set(m, 3, 0, sd->child_h); + _e_zoomap_size(sd, &width, &height); +fprintf(stderr, "PLZ HALP buffer:(%d, %d) surface:(%d, %d)\n", sd->child_w, sd->child_h, width, height); + evas_map_util_points_populate_from_geometry(m, sd->x, sd->y, + width, height, 0); + + _e_zoomap_transform_point(sd, 0, 0, &x, &y); + evas_map_point_image_uv_set(m, 0, x, y); + + _e_zoomap_transform_point(sd, width, 0, &x, &y); + evas_map_point_image_uv_set(m, 1, x, y); + + _e_zoomap_transform_point(sd, width, height, &x, &y); + evas_map_point_image_uv_set(m, 2, x, y); + + _e_zoomap_transform_point(sd, 0, height, &x, &y); + evas_map_point_image_uv_set(m, 3, x, y); + evas_map_smooth_set(m, sd->smooth); evas_map_point_color_set(m, 0, r, g, b, a); evas_map_point_color_set(m, 1, r, g, b, a); diff --git a/src/bin/e_zoomap.h b/src/bin/e_zoomap.h index 37d56bcb8..c9be54f9a 100644 --- a/src/bin/e_zoomap.h +++ b/src/bin/e_zoomap.h @@ -14,5 +14,12 @@ E_API void e_zoomap_always_set (Evas_Object *obj, Eina_Bool always); E_API Eina_Bool e_zoomap_always_get (Evas_Object *obj); E_API void e_zoomap_child_resize(Evas_Object *zoomap, int w, int h); E_API void e_zoomap_child_edje_solid_setup(Evas_Object *obj); +E_API void e_zoomap_viewport_source_set(Evas_Object *obj, int x, int y, int w, int h); +E_API void e_zoomap_viewport_destination_set(Evas_Object *obj, int w, int h); +E_API void e_zoomap_viewport_set(Evas_Object *obj, Eina_Bool enabled); +E_API void e_zoomap_scale_set(Evas_Object *obj, int32_t scale); +E_API void e_zoomap_transform_set(Evas_Object *obj, uint32_t transform); +E_API void e_zoomap_commit(Evas_Object *obj); + #endif #endif