#endif
#include "e.h"
+#include "e_compositor.h"
#include <wayland-server.h>
#include <wayland-tbm-server.h>
#include <scaler-server-protocol.h>
struct wl_resource *dst_mode_res;
E_Client *ec;
+ E_Surface *surface;
E_Client *epc;
Ecore_Window window;
static void
_destroy_viewport(E_Viewport *viewport)
{
- E_Client *ec;
-
if (!viewport) return;
PIN("destroy E_Viewport");
- ec = viewport->ec;
-
ecore_event_handler_del(viewport->topmost_rotate_hdl);
_e_comp_wl_viewport_parent_unset(viewport);
if (viewport->dst_mode_res)
wl_resource_set_user_data(viewport->dst_mode_res, NULL);
- if (ec->comp_data && ec->comp_data->scaler.viewport)
- {
- ec->comp_data->scaler.viewport = NULL;
- ec->comp_data->scaler.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
- ec->comp_data->scaler.buffer_viewport.surface.width = -1;
- ec->comp_data->scaler.buffer_viewport.changed = 1;
- ec->comp_data->pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
- ec->comp_data->pending.buffer_viewport.surface.width = -1;
- ec->comp_data->pending.buffer_viewport.changed = 1;
- }
+ e_surface_viewporter_resource_unset(viewport->surface);
free(viewport);
}
static Eina_Bool
_e_comp_wl_viewport_apply_transform(E_Viewport *viewport, int *rtransform)
{
- E_Client *ec;
- E_Comp_Wl_Buffer_Viewport *vp;
Eina_Bool changed = EINA_FALSE;
unsigned int new_transform;
- ec = viewport->ec;
- vp = &ec->comp_data->scaler.buffer_viewport;
new_transform = viewport->current.transform;
if (viewport->current.follow_parent_transform && viewport->epc)
if (!epc->comp_data || e_object_is_del(E_OBJECT(epc)))
{
- *rtransform = vp->buffer.transform;
+ *rtransform = e_surface_buffer_transform_get(viewport->surface);
return EINA_FALSE;
}
new_transform = ((ptran + ctran) & 0x3) + ((pflip + cflip) & 0x4);
}
- if (new_transform != vp->buffer.transform)
- {
- vp->buffer.transform = new_transform;
- vp->changed = changed = EINA_TRUE;
-
- ec->comp_data->pending.buffer_viewport = *vp;
- if (ec->comp_data->sub.data)
- ec->comp_data->sub.data->cached.buffer_viewport = *vp;
- }
-
+ changed = e_surface_buffer_transform_set(viewport->surface, new_transform);
if (changed)
PIN("apply transform: %d type(%d) follow(%d) changed(%d)",
- vp->buffer.transform, viewport->current.destination.mode.type,
+ new_transform, viewport->current.destination.mode.type,
viewport->current.follow_parent_transform, changed);
- *rtransform = vp->buffer.transform;
+ *rtransform = new_transform;
return changed;
}
dst.y = ec->y;
}
- if (vp->surface.width != dst.w || vp->surface.height != dst.h)
- {
- vp->surface.width = dst.w;
- vp->surface.height = dst.h;
- vp->changed = changed = EINA_TRUE;
-
- ec->comp_data->pending.buffer_viewport = *vp;
- if (ec->comp_data->sub.data)
- ec->comp_data->sub.data->cached.buffer_viewport = *vp;
- }
+ if (e_surface_viewport_destination_set(viewport->surface, dst.w, dst.h))
+ changed = EINA_TRUE;
*rrect = dst;
_e_comp_wl_viewport_apply_source(E_Viewport *viewport)
{
E_Client *ec;
- E_Comp_Wl_Buffer_Viewport *vp;
Eina_Rectangle rect = {0,};
int bw = 0, bh = 0;
- wl_fixed_t fx, fy, fw, fh;
Eina_Bool changed = EINA_FALSE;
ec = viewport->ec;
- vp = &ec->comp_data->scaler.buffer_viewport;
if (viewport->cropped_source.w == -1)
return EINA_FALSE;
e_comp_wl_output_buffer_transform_get(ec), 1,
&rect, &rect);
- fx = wl_fixed_from_int(rect.x);
- fy = wl_fixed_from_int(rect.y);
- fw = wl_fixed_from_int(rect.w);
- fh = wl_fixed_from_int(rect.h);
-
- if (vp->buffer.src_x != fx || vp->buffer.src_y != fy ||
- vp->buffer.src_width != fw || vp->buffer.src_height != fh)
- {
- vp->buffer.src_x = wl_fixed_from_int(rect.x);
- vp->buffer.src_y = wl_fixed_from_int(rect.y);
- vp->buffer.src_width = wl_fixed_from_int(rect.w);
- vp->buffer.src_height = wl_fixed_from_int(rect.h);
- vp->changed = changed = EINA_TRUE;
-
- ec->comp_data->pending.buffer_viewport = *vp;
- if (ec->comp_data->sub.data)
- ec->comp_data->sub.data->cached.buffer_viewport = *vp;
- }
-
+ changed = e_surface_viewport_source_box_set(viewport->surface, &rect);
if (changed)
PIN("apply source: %d,%d %dx%d orig(%d,%d %dx%d) changed(%d)",
EINA_RECTANGLE_ARGS(&rect), EINA_RECTANGLE_ARGS(&viewport->cropped_source), changed);
E_Viewport *viewport;
E_Client *ec;
E_Client *topmost;
- E_Comp_Wl_Buffer_Viewport *vp;
Eina_Bool changed = EINA_FALSE;
viewport = container_of(listener, E_Viewport, surface_apply_viewport_listener);
ec = viewport->ec;
topmost = e_comp_wl_topmost_parent_get(ec);
- vp = &ec->comp_data->scaler.buffer_viewport;
- if (vp->changed)
+ if (e_surface_viewport_changed_get(viewport->surface))
changed = EINA_TRUE;
if (viewport->cached.changed)
E_API Eina_Bool
e_comp_wl_viewport_create(struct wl_resource *resource,
uint32_t id,
- struct wl_resource *surface)
+ struct wl_resource *surface_resource)
{
E_Client *ec;
+ E_Surface *surface;
int version;
struct wl_client *client;
struct wl_resource *res;
E_Viewport *viewport;
- ec = e_client_from_surface_resource(surface);
+ ec = e_client_from_surface_resource(surface_resource);
version = wl_resource_get_version(resource);
if (!ec || !ec->comp_data || e_object_is_del(E_OBJECT(ec)))
{
- ERR("wrong resource %d", wl_resource_get_id(surface));
+ ERR("wrong resource %d", wl_resource_get_id(surface_resource));
return EINA_FALSE;
}
return EINA_FALSE;
}
- if (ec->comp_data->scaler.viewport)
+ surface = e_surface_from_resource(surface_resource);
+ if (!surface)
{
- ERR("wl_surface@%d already has a viewport",
- wl_resource_get_id(surface));
+ ERR("Could not get E_Surface from wl_resource(%p)", surface_resource);
return EINA_FALSE;
}
- if (!(client = wl_resource_get_client(surface)))
+ if (e_surface_viewporter_resource_get(surface))
+ {
+ ERR("E_Surface(%p) already has a viewport", surface);
+ return EINA_FALSE;
+ }
+
+ if (!(client = wl_resource_get_client(surface_resource)))
{
ERR("Could not get client from wl_surface@%d",
- wl_resource_get_id(surface));
+ wl_resource_get_id(surface_resource));
return EINA_FALSE;
}
viewport->resource = res;
viewport->ec = ec;
+ viewport->surface = surface;
viewport->window = e_client_util_win_get(ec);
_e_comp_wl_viewport_parent_check(viewport);
wl_signal_add(&ec->comp_data->apply_viewport_signal, &viewport->surface_apply_viewport_listener);
/* Use scaler variable because tizen_viewport is the alternative of wl_viewport */
- ec->comp_data->scaler.viewport = res;
+ e_surface_viewporter_resource_set(viewport->surface, res);
+
wl_resource_set_implementation(res, &_e_comp_wl_viewport_interface,
viewport, _e_comp_wl_viewport_destroy);