WIP stuff

This commit is contained in:
Derek Foreman 2016-10-05 10:30:19 -05:00
parent 24a8b7251a
commit 9cd40f0605
6 changed files with 270 additions and 86 deletions

View File

@ -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)
{

View File

@ -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

View File

@ -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;

View File

@ -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;

View File

@ -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);

View File

@ -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