}
static void
-buffer_transform(int width, int height, uint32_t transform, int32_t scale,
- int sx, int sy, int *dx, int *dy)
+_buffer_viewport_get(E_Surface *surface, Eina_Rectangle *out)
{
- 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;
- }
+ struct ds_fbox source_box;
- *dx *= scale;
- *dy *= scale;
-}
-
-static void
-_buffer_viewport_get(E_Comp_Wl_Buffer_Viewport *vp, int bw, int bh, Eina_Rectangle *out)
-{
- int x1, y1, x2, y2;
- int tx1, ty1, tx2, ty2;
- int width_from_buffer, height_from_buffer;
+ e_surface_buffer_source_box_get(surface, &source_box);
- 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_from_buffer = bh / vp->buffer.scale;
- height_from_buffer = bw / vp->buffer.scale;
- break;
- default:
- width_from_buffer = bw / vp->buffer.scale;
- height_from_buffer = bh / vp->buffer.scale;
- break;
- }
-
- if (vp->buffer.src_width == wl_fixed_from_int(-1))
- {
- x1 = 0.0;
- y1 = 0.0;
- x2 = width_from_buffer;
- y2 = height_from_buffer;
- }
- else
- {
- x1 = wl_fixed_to_int(vp->buffer.src_x);
- y1 = wl_fixed_to_int(vp->buffer.src_y);
- x2 = wl_fixed_to_int(vp->buffer.src_x + vp->buffer.src_width);
- y2 = wl_fixed_to_int(vp->buffer.src_y + vp->buffer.src_height);
- }
-
- buffer_transform(width_from_buffer, height_from_buffer,
- vp->buffer.transform, vp->buffer.scale, x1, y1, &tx1, &ty1);
- buffer_transform(width_from_buffer, height_from_buffer,
- vp->buffer.transform, vp->buffer.scale, x2, y2, &tx2, &ty2);
-
- out->x = (tx1 <= tx2) ? tx1 : tx2;
- out->y = (ty1 <= ty2) ? ty1 : ty2;
- out->w = (tx1 <= tx2) ? tx2 - tx1 : tx1 - tx2;
- out->h = (ty1 <= ty2) ? ty2 - ty1 : ty1 - ty2;
+ out->x = (int)source_box.x;
+ out->y = (int)source_box.y;
+ out->w = (int)source_box.width;
+ out->h = (int)source_box.height;
}
/**
EINTERN Eina_Bool
e_comp_wl_surface_viewport_get(E_Client *ec, Eina_Rectangle *buffer_viewport, Eina_Rectangle *output_viewport, unsigned int *transform)
{
- E_Comp_Wl_Buffer *buffer;
- E_Comp_Wl_Buffer_Viewport *vp;
E_Map *m;
- E_Surface *surface;
enum wl_output_transform buffer_transform;
unsigned int rotation;
Eina_Bool res = EINA_FALSE;
- int32_t bw, bh;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
if (e_object_is_del(E_OBJECT(ec)))
return EINA_FALSE;
- surface = e_surface_from_ec(ec);
-
- vp = &ec->comp_data->scaler.buffer_viewport;
-
if (buffer_viewport)
{
- buffer = e_surface_buffer_try_get(surface);
- /* Getting a viewport of buffer needs geometry of buffer. */
- if (!buffer)
+ _buffer_viewport_get(e_surface_from_ec(ec), buffer_viewport);
+ if (buffer_viewport->w == 0 || buffer_viewport->h == 0)
return EINA_FALSE;
-
- e_comp_wl_buffer_size_get(buffer, &bw, &bh);
- _buffer_viewport_get(vp, bw, bh, buffer_viewport);
}
if ((output_viewport) || (transform))