#include <wayland-tbm-server.h>
#include <scaler-server-protocol.h>
#include <tizen-extension-server-protocol.h>
+#include <libds-tizen/scaler.h>
#define PER(fmt,arg...) ELOGF("VIEWPORT<E>", "viewport(%p) epc(%p): " \
fmt, viewport->ec, viewport, viewport->epc, ##arg)
fclose(log_fl);
}
-static void
-_e_viewport_destroy(struct wl_resource *resource)
-{
- E_Client *ec;
-
- ec = wl_resource_get_user_data(resource);
- if (!e_object_unref(E_OBJECT(ec))) return;
- if (e_object_is_del(E_OBJECT(ec))) return;
- if (!ec->comp_data) return;
- if (!ec->comp_data->scaler.viewport) return;
-
- ec->comp_data->scaler.viewport = NULL;
- 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;
-}
-
-static void
-_e_viewport_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
-{
- wl_resource_destroy(resource);
-}
-
-static void
-_e_viewport_cb_set(struct wl_client *client EINA_UNUSED,
- struct wl_resource *resource,
- wl_fixed_t src_x,
- wl_fixed_t src_y,
- wl_fixed_t src_width,
- wl_fixed_t src_height,
- int32_t dst_width,
- int32_t dst_height)
-{
- E_Client *ec;
-
- ec = wl_resource_get_user_data(resource);
- if (e_object_is_del(E_OBJECT(ec))) return;
-
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data);
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data->scaler.viewport);
-
- if (wl_fixed_to_double(src_width) < 0 || wl_fixed_to_double(src_height) < 0)
- {
- ERR("source dimensions must be non-negative (%fx%f)",
- wl_fixed_to_double(src_width), wl_fixed_to_double(src_height));
- struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
- wl_resource_post_error(resource,
- WL_VIEWPORT_ERROR_BAD_VALUE,
- "wl_surface@%d viewport source "
- "w=%f < 0 or h=%f < 0",
- wl_resource_get_id(surface),
- wl_fixed_to_double(src_width),
- wl_fixed_to_double(src_height));
- return;
- }
-
- if (dst_width <= 0 || dst_height <= 0)
- {
- ERR("destination dimensions must be positive (%dx%d)", dst_width, dst_height);
- wl_resource_post_error(resource,
- WL_VIEWPORT_ERROR_BAD_VALUE,
- "destination size must be positive (%dx%d)",
- dst_width, dst_height);
- return;
- }
-
- ec->comp_data->pending.buffer_viewport.buffer.src_x = src_x;
- ec->comp_data->pending.buffer_viewport.buffer.src_y = src_y;
- ec->comp_data->pending.buffer_viewport.buffer.src_width = src_width;
- ec->comp_data->pending.buffer_viewport.buffer.src_height = src_height;
- ec->comp_data->pending.buffer_viewport.surface.width = dst_width;
- ec->comp_data->pending.buffer_viewport.surface.height = dst_height;
- ec->comp_data->pending.buffer_viewport.changed = 1;
-}
-
-static void
-_e_viewport_cb_set_source(struct wl_client *client EINA_UNUSED,
- struct wl_resource *resource,
- wl_fixed_t src_x,
- wl_fixed_t src_y,
- wl_fixed_t src_width,
- wl_fixed_t src_height)
-{
- E_Client *ec;
-
- ec = wl_resource_get_user_data(resource);
- if (e_object_is_del(E_OBJECT(ec))) return;
-
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data);
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data->scaler.viewport);
-
- if (src_width == wl_fixed_from_int(-1) && src_height == wl_fixed_from_int(-1))
- {
- /* unset source size */
- ec->comp_data->pending.buffer_viewport.buffer.src_width = wl_fixed_from_int(-1);
- ec->comp_data->pending.buffer_viewport.changed = 1;
- return;
- }
-
- if (src_width <= 0 || src_height <= 0)
- {
- ERR("source size must be positive (%fx%f)",
- wl_fixed_to_double(src_width), wl_fixed_to_double(src_height));
- struct wl_resource *surface = e_comp_wl_client_surface_get(ec);
- wl_resource_post_error(resource,
- WL_VIEWPORT_ERROR_BAD_VALUE,
- "wl_surface@%d viewport source "
- "w=%f <= 0 or h=%f <= 0",
- wl_resource_get_id(surface),
- wl_fixed_to_double(src_width),
- wl_fixed_to_double(src_height));
- return;
- }
-
- ec->comp_data->pending.buffer_viewport.buffer.src_x = src_x;
- ec->comp_data->pending.buffer_viewport.buffer.src_y = src_y;
- ec->comp_data->pending.buffer_viewport.buffer.src_width = src_width;
- ec->comp_data->pending.buffer_viewport.buffer.src_height = src_height;
- ec->comp_data->pending.buffer_viewport.changed = 1;
-}
-
-static void
-_e_viewport_cb_set_destination(struct wl_client *client EINA_UNUSED,
- struct wl_resource *resource,
- int32_t dst_width,
- int32_t dst_height)
-{
- E_Client *ec;
-
- ec = wl_resource_get_user_data(resource);
- if (e_object_is_del(E_OBJECT(ec))) return;
-
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data);
- EINA_SAFETY_ON_NULL_RETURN(ec->comp_data->scaler.viewport);
-
- if (dst_width == -1 && dst_height == -1)
- {
- /* unset destination size */
- ec->comp_data->pending.buffer_viewport.surface.width = -1;
- ec->comp_data->pending.buffer_viewport.changed = 1;
- return;
- }
-
- if (dst_width <= 0 || dst_height <= 0)
- {
- ERR("destination size must be positive (%dx%d)", dst_width, dst_height);
- wl_resource_post_error(resource,
- WL_VIEWPORT_ERROR_BAD_VALUE,
- "destination size must be positive (%dx%d)",
- dst_width, dst_height);
- return;
- }
-
- ec->comp_data->pending.buffer_viewport.surface.width = dst_width;
- ec->comp_data->pending.buffer_viewport.surface.height = dst_height;
- ec->comp_data->pending.buffer_viewport.changed = 1;
-}
-
-static const struct wl_viewport_interface _e_viewport_interface =
-{
- _e_viewport_cb_destroy,
- _e_viewport_cb_set,
- _e_viewport_cb_set_source,
- _e_viewport_cb_set_destination
-};
-
-static void
-_e_scaler_cb_destroy(struct wl_client *client EINA_UNUSED, struct wl_resource *resource)
-{
- wl_resource_destroy(resource);
-}
-
-static void
-_e_scaler_cb_get_viewport(struct wl_client *client EINA_UNUSED, struct wl_resource *scaler, uint32_t id, struct wl_resource *surface_resource)
-{
- int version;
- E_Client *ec;
- struct wl_resource *res;
-
- version = wl_resource_get_version(scaler);
- if (!(ec = e_client_from_surface_resource(surface_resource))) return;
- if (!ec->comp_data) return;
-
- if (ec->comp_data && ec->comp_data->scaler.viewport)
- {
- wl_resource_post_error(scaler,
- WL_SCALER_ERROR_VIEWPORT_EXISTS,
- "a viewport for that surface already exists");
- return;
- }
-
- res = wl_resource_create(client, &wl_viewport_interface, version, id);
- if (res == NULL)
- {
- wl_client_post_no_memory(client);
- return;
- }
-
- ec->comp_data->scaler.viewport = res;
- wl_resource_set_implementation(res, &_e_viewport_interface, ec, _e_viewport_destroy);
- e_object_ref(E_OBJECT(ec));
-}
-
-static const struct wl_scaler_interface _e_scaler_interface =
-{
- _e_scaler_cb_destroy,
- _e_scaler_cb_get_viewport
-};
-
-static void
-_e_scaler_cb_bind(struct wl_client *client, void *data, uint32_t version, uint32_t id)
-{
- struct wl_resource *res;
-
- if (!(res = wl_resource_create(client, &wl_scaler_interface, MIN(version, 2), id)))
- {
- ERR("Could not create scaler resource: %m");
- wl_client_post_no_memory(client);
- return;
- }
-
- wl_resource_set_implementation(res, &_e_scaler_interface, NULL, NULL);
-}
-
EINTERN int
e_comp_wl_viewport_init(void)
{
if (!e_comp_wl) return 0;
if (!e_comp_wl->wl.disp) return 0;
- if (!wl_global_create(e_comp_wl->wl.disp, &wl_scaler_interface, 2,
- e_comp->wl_comp_data, _e_scaler_cb_bind))
+ if (!ds_tizen_scaler_create(e_comp_wl->wl.disp))
{
- ERR("Could not add scaler to wayland globals: %m");
+ ERR("Could not create ds_tizen_scaler");
return 0;
}