static void _e_subsurface_cb_surface_destroy(struct wl_listener *listener, void *data);
static void _e_subsurface_cb_parent_surface_destroy(struct wl_listener *listener, void *data);
+static void _ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform);
+static void _ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box);
+static void _ds_surface_viewport_destination_set(struct ds_surface *ds_surface, int32_t width, int32_t height);
+static void _ds_surface_viewport_unset(struct ds_surface *ds_surface);
+
static const char *e_comp_wl_subsurface_role_name = "ds_subsurface";
static E_Compositor *_compositor;
wl_signal_add(&surface->events.parent_destroy, listener);
}
+EINTERN struct wl_resource *
+e_surface_viewporter_resource_get(E_Surface *surface)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, NULL);
+ return surface->base.scaler.viewport;
+}
+
+EINTERN void
+e_surface_viewporter_resource_set(E_Surface *surface, struct wl_resource *viewporter)
+{
+ EINA_SAFETY_ON_NULL_RETURN(surface);
+ surface->base.scaler.viewport = viewporter;
+}
+
+EINTERN void
+e_surface_viewporter_resource_unset(E_Surface *surface)
+{
+ EINA_SAFETY_ON_NULL_RETURN(surface);
+
+ surface->base.scaler.viewport = NULL;
+ surface->base.scaler.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
+ surface->base.scaler.buffer_viewport.surface.width = -1;
+ surface->base.scaler.buffer_viewport.changed = 1;
+ surface->base.pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
+ surface->base.pending.buffer_viewport.surface.width = -1;
+ surface->base.pending.buffer_viewport.changed = 1;
+
+ if (surface->ds_surface)
+ _ds_surface_viewport_unset(surface->ds_surface);
+}
+
+EINTERN enum wl_output_transform
+e_surface_buffer_transform_get(E_Surface *surface)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, WL_OUTPUT_TRANSFORM_NORMAL);
+ return surface->base.scaler.buffer_viewport.buffer.transform;
+}
+
+EINTERN Eina_Bool
+e_surface_buffer_transform_set(E_Surface *surface, enum wl_output_transform transform)
+{
+ E_Subsurface *sub;
+ E_Comp_Wl_Buffer_Viewport *vp;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+ vp = &surface->base.scaler.buffer_viewport;
+ if (vp->buffer.transform == transform)
+ return EINA_FALSE;
+
+ vp->buffer.transform = transform;
+ vp->changed = EINA_TRUE;
+
+ surface->base.pending.buffer_viewport = *vp;
+
+ sub = _e_subsurface_from_surface(surface);
+ if (sub)
+ sub->base.cached.buffer_viewport = *vp;
+
+ if (surface->ds_surface)
+ _ds_surface_buffer_transform_set(surface->ds_surface, transform);
+
+ return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_source_box_set(E_Surface *surface, Eina_Rectangle *box)
+{
+ E_Subsurface *sub;
+ E_Comp_Wl_Buffer_Viewport *vp;
+ wl_fixed_t fx, fy, fw, fh;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+ fx = wl_fixed_from_int(box->x);
+ fy = wl_fixed_from_int(box->y);
+ fw = wl_fixed_from_int(box->w);
+ fh = wl_fixed_from_int(box->h);
+
+ vp = &surface->base.scaler.buffer_viewport;
+ if ((vp->buffer.src_x == fx) && (vp->buffer.src_y == fy) &&
+ (vp->buffer.src_width == fw) && (vp->buffer.src_height == fh))
+ return EINA_FALSE;
+
+ vp->buffer.src_x = fx;
+ vp->buffer.src_y = fy;
+ vp->buffer.src_width = fw;
+ vp->buffer.src_height = fh;
+ vp->changed = EINA_TRUE;
+
+ surface->base.pending.buffer_viewport = *vp;
+
+ sub = _e_subsurface_from_surface(surface);
+ if (sub)
+ sub->base.cached.buffer_viewport = *vp;
+
+ if (surface->ds_surface)
+ _ds_surface_viewport_source_box_set(surface->ds_surface, box);
+
+ return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_destination_set(E_Surface *surface, int32_t width, int32_t height)
+{
+ E_Subsurface *sub;
+ E_Comp_Wl_Buffer_Viewport *vp;
+
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+
+ vp = &surface->base.scaler.buffer_viewport;
+ if ((vp->surface.width == width) && (vp->surface.height == height))
+ return EINA_FALSE;
+
+ vp->surface.width = width;
+ vp->surface.height = height;
+ vp->changed = EINA_TRUE;
+
+ surface->base.pending.buffer_viewport = *vp;
+
+ sub = _e_subsurface_from_surface(surface);
+ if (sub)
+ sub->base.cached.buffer_viewport = *vp;
+
+ if (surface->ds_surface)
+ _ds_surface_viewport_destination_set(surface->ds_surface, width, height);
+
+ return EINA_TRUE;
+}
+
+EINTERN Eina_Bool
+e_surface_viewport_changed_get(E_Surface *surface)
+{
+ EINA_SAFETY_ON_NULL_RETURN_VAL(surface, EINA_FALSE);
+ return surface->base.scaler.buffer_viewport.changed;
+}
+
static void
_e_compositor_cb_display_destroy(struct wl_listener *listener EINA_UNUSED, void *data EINA_UNUSED)
{
e_comp_wl_client_subsurface_parent_unset(sub->surface->ec);
}
+static void
+_ds_surface_buffer_transform_set(struct ds_surface *ds_surface, enum wl_output_transform transform)
+{
+ ds_surface->pending.transform = transform;
+ ds_surface->current.transform = transform;
+}
+
+static void
+_ds_surface_viewport_source_box_set(struct ds_surface *ds_surface, Eina_Rectangle *box)
+{
+ ds_surface->pending.viewport.has_src = true;
+ ds_surface->pending.viewport.src.x = (double)box->x;
+ ds_surface->pending.viewport.src.y = (double)box->y;
+ ds_surface->pending.viewport.src.width = (double)box->w;
+ ds_surface->pending.viewport.src.height = (double)box->h;
+ ds_surface->current.viewport.has_src = true;
+ ds_surface->current.viewport.src = ds_surface->pending.viewport.src;
+}
+
+static void
+_ds_surface_viewport_destination_set(struct ds_surface *ds_surface, int32_t width, int32_t height)
+{
+ ds_surface->pending.viewport.has_dst = true;
+ ds_surface->pending.viewport.dst_width = width;
+ ds_surface->pending.viewport.dst_height = height;
+ ds_surface->pending.width = width;
+ ds_surface->pending.height = height;
+ ds_surface->current.viewport.has_dst = true;
+ ds_surface->current.viewport.dst_width = width;
+ ds_surface->current.viewport.dst_height = height;
+ ds_surface->current.width = width;
+ ds_surface->current.height = height;
+}
+
+static void
+_ds_surface_viewport_unset(struct ds_surface *ds_surface)
+{
+ ds_surface->pending.viewport.has_src = false;
+ ds_surface->pending.viewport.has_dst = false;
+ ds_surface->current.viewport.has_src = false;
+ ds_surface->current.viewport.has_dst = false;
+}