{
const Evas_Map *m;
Evas_Point p[4];
- Eina_Rectangle output_r;
+ Eina_Rectangle input_r, output_r;
+ Eina_Bool res = EINA_FALSE;
uint transform;
+ double u1, v1, u2, v2;
int i;
EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
for (i = 0; i < 4; i++)
evas_map_point_coord_get(m, i, &p[i].x, &p[i].y, NULL);
- if (!_e_video_hwc_coords_to_rectangle_convert(p, &output_r, &transform))
+ if (_e_video_hwc_coords_to_rectangle_convert(p, &output_r, &transform))
+ {
+ if (memcmp(&out->output_r, &output_r, sizeof(Eina_Rectangle)) != 0)
+ {
+ VDB("Evas_Map Changed: dst region (%d,%d %dx%d) => (%d,%d %dx%d)",
+ ec, EINA_RECTANGLE_ARGS(&out->output_r),
+ EINA_RECTANGLE_ARGS(&output_r));
+ res = EINA_TRUE;
+ out->output_r = output_r;
+ }
+
+ /* NOTE Merge transform value from evas_map with E_Comp_Wl_Buffer_Viewport's one.
+ * Since buffer.transform isn't applied using evas_map,
+ * it has to be taken into account here to apply buffer.transform
+ * and rotation of e_client_transform together. */
+ transform =
+ _e_video_hwc_transform_merge_with_buffer_viewport(&ec->comp_data->scaler.buffer_viewport,
+ transform);
+
+ if (out->transform != transform)
+ {
+ VDB("Evas_Map Changed: transform (%d) => (%d)",
+ ec, out->transform, transform);
+ res = EINA_TRUE;
+ out->transform = transform;
+ }
+ }
+ else
{
VIN("Cannot convert given coords to rectangle.\n"
"p1(%d %d) p2(%d %d) p3(%d %d) p4(%d %d)",
ec, p[0].x, p[0].y, p[1].x, p[1].y,
p[2].x, p[2].y, p[3].x, p[3].y);
- return EINA_FALSE;
}
- /* NOTE Merge transform value from evas_map with E_Comp_Wl_Buffer_Viewport's one.
- * Since buffer.transform isn't applied using evas_map,
- * it has to be taken into account here to apply buffer.transform
- * and rotation of e_client_transform together. */
- transform =
- _e_video_hwc_transform_merge_with_buffer_viewport(&ec->comp_data->scaler.buffer_viewport,
- transform);
-
- if ((!memcmp(&out->output_r, &output_r, sizeof(Eina_Rectangle))) &&
- (out->transform == transform))
- return EINA_FALSE;
+ /* In order to get source region accordingly for video client requesting
+ * 'tizen_viewport(or wl_viewport).set_source' without attach new buffer,
+ * 'wl_surface.commit' has to be handled.
+ * Or another way, since 'tizen_viewport(or wl_viewport).set_source' must
+ * set values of evas_map_point_image_uv, therefore, considering values of
+ * evas_map_point_image_uv can get source region as well. */
+ evas_map_point_image_uv_get(m, 0, &u1, &v1);
+ evas_map_point_image_uv_get(m, 2, &u2, &v2);
- VDB("frame(%p) m(%p) output(%d,%d %dx%d) trans(%d) => (%d,%d %dx%d) trans(%d)",
- ec, ec->frame, m, EINA_RECTANGLE_ARGS(&out->output_r), out->transform,
- EINA_RECTANGLE_ARGS(&output_r), transform);
+ _coord_to_rectangle((Evas_Point[2]){{u1, v1}, {u2, v2}}, &input_r);
- out->output_r = output_r;
- out->transform = transform;
+ if (memcmp(&out->input_r, &input_r, sizeof(Eina_Rectangle)) != 0)
+ {
+ VDB("Evas_Map Changed: src region (%d,%d %dx%d) => (%d,%d %dx%d)", ec,
+ EINA_RECTANGLE_ARGS(&out->input_r),
+ EINA_RECTANGLE_ARGS(&input_r));
+ res = EINA_TRUE;
+ out->input_r = input_r;
+ }
- _e_video_hwc_geometry_tdm_config_update(ec, out);
+ if (res)
+ _e_video_hwc_geometry_tdm_config_update(ec, out);
- return EINA_TRUE;
+ return res;
}
static void