e_remember_update(ec);
ec->pre_cb.w = w; ec->pre_cb.h = h;
+ e_client_transform_core_update(ec);
e_client_visibility_calculate();
}
static Eina_Bool
_e_client_transform_core_check_change(E_Client *ec)
{
- Eina_Bool check = EINA_FALSE;
int w = 0;
int h = 0;
-
+ Eina_Bool check = EINA_FALSE;
if (!ec) return EINA_FALSE;
+ // wait viewport setting
+ if (!ec->transform_core.transform_list)
+ {
+ if (ec->comp_data && ec->comp_data->scaler.viewport)
+ return EINA_FALSE;
+ }
+
if (ec->frame)
evas_object_geometry_get(ec->frame, 0, 0, &w, &h);
ec->y != ec->transform_core.backup.client_y ||
ec->w != ec->transform_core.backup.client_w ||
ec->h != ec->transform_core.backup.client_h ||
- w != ec->transform_core.backup.frame_w ||
- h != ec->transform_core.backup.frame_h)
+ w != ec->transform_core.backup.frame_w ||
+ h != ec->transform_core.backup.frame_h)
{
check = EINA_TRUE;
ec->transform_core.backup.client_x = ec->x;
ec->transform_core.backup.client_y = ec->y;
ec->transform_core.backup.client_w = ec->w;
ec->transform_core.backup.client_h = ec->h;
-
- if (ec->frame)
- {
- evas_object_geometry_get(ec->frame, 0, 0,
- &ec->transform_core.backup.frame_w,
- &ec->transform_core.backup.frame_h);
- }
- else
- {
- ec->transform_core.backup.frame_w = 0;
- ec->transform_core.backup.frame_h = 0;
- }
+ ec->transform_core.backup.frame_w = w;
+ ec->transform_core.backup.frame_h = h;
}
// check new transform or del transform
}
static void
-_e_client_transform_core_vertices_apply(E_Client *ec EINA_UNUSED, Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+_e_client_transform_core_vertices_apply(E_Client *ec EINA_UNUSED,
+ Evas_Object *obj,
+ E_Util_Transform_Rect_Vertex *vertices,
+ E_Util_Transform *transform)
{
Evas_Map *map = NULL;
int i, x, y;
y = (int)(dy + 0.5);
evas_map_point_coord_set(map, i, x, y, 1.0);
+
+ if (transform && e_util_transform_texcoord_flag_get(transform))
+ {
+ double u = 0.0; double v = 0.0;
+ e_util_transform_texcoord_get(transform, i, &u, &v);
+ evas_map_point_image_uv_set(map, i, u, v);
+ }
}
evas_object_map_set(obj, map);
cdata = (E_Comp_Wl_Client_Data*)ec->comp_data;
if (cdata->sub.below_obj)
- _e_client_transform_core_vertices_apply(ec, cdata->sub.below_obj, vertices);
+ _e_client_transform_core_vertices_apply(ec, cdata->sub.below_obj, vertices, NULL);
EINA_LIST_FOREACH(cdata->sub.list, l, subc)
e_client_transform_core_update(subc);
ec->transform_core.transform_list = eina_list_append(ec->transform_core.transform_list, transform);
ec->transform_core.changed = EINA_TRUE;
e_util_transform_ref(transform);
- e_client_transform_core_update(ec);
+ // e_client_transform_core_update(ec);
}
E_API void
E_API void
e_client_transform_core_update(E_Client *ec)
{
- E_Comp_Wl_Client_Data *cdata;
-
if (!ec) return;
if (ec->new_client) return;
if (!_e_client_transform_core_check_change(ec)) return;
- cdata = (E_Comp_Wl_Client_Data *)ec->comp_data;
- if (cdata && cdata->scaler.viewport) return;
-
if (ec->transform_core.transform_list || ec->transform_core.parent.enable)
{
E_Util_Transform_Rect source_rect;
// 2. merge transform
EINA_LIST_FOREACH(ec->transform_core.transform_list, l, temp_trans)
{
- ec->transform_core.result.transform = e_util_transform_merge(&ec->transform_core.result.transform, temp_trans);
+ e_util_transform_merge(&ec->transform_core.result.transform, temp_trans);
+ }
+
+ // 2.5 check viewport
+ if (e_util_transform_viewport_flag_get(&ec->transform_core.result.transform))
+ {
+ int vx = 0, vy = 0, vw = 0, vh = 0;
+ e_util_transform_viewport_get(&ec->transform_core.result.transform, &vx, &vy, &vw, &vh);
+ e_util_transform_rect_init(&source_rect, vx, vy, vw, vh);
}
// 3. covert to matrix and apply keep_ratio
ec->transform_core.keep_ratio = keep_ratio;
}
+ // 3.1 if 24bit window then set transp rect
+ if (!ec->argb)
+ {
+ int angle = 0;
+ double dangle = 0.0;
+ e_util_transform_rotation_get(&ec->transform_core.result.transform, 0, 0, &dangle);
+
+ angle = (int)(dangle + 0.5);
+ angle %= 90;
+
+ if (angle == 0) // when transform angle is 0, 90, 180, 270, 360. then set transp rect
+ e_comp_object_transform_transp_set(ec->frame, EINA_TRUE);
+ else
+ e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+ }
+ else
+ e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+
// 3.5 parent matrix multiply
if (ec->transform_core.parent.enable)
{
&ec->transform_core.result.boundary.vertices);
// 5. apply vertices
+ e_comp_object_transform_transp_vertices_set(ec->frame, &ec->transform_core.result.vertices);
e_comp_object_transform_bg_vertices_set(ec->frame, &ec->transform_core.result.boundary.vertices);
_e_client_transform_core_boundary_update(ec, &ec->transform_core.result.boundary.vertices);
- _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices);
+ _e_client_transform_core_vertices_apply(ec, ec->frame, &ec->transform_core.result.vertices, &ec->transform_core.result.transform);
// 6. subsurface update'
_e_client_transform_core_sub_update(ec, &ec->transform_core.result.vertices);
}
else
{
- ec->transform_core.result.enable = EINA_FALSE;
- _e_client_transform_core_vertices_apply(ec, ec->frame, NULL);
- _e_client_transform_core_sub_update(ec, NULL);
+ if (ec->transform_core.result.enable)
+ {
+ ec->transform_core.result.enable = EINA_FALSE;
+ _e_client_transform_core_vertices_apply(ec, ec->frame, NULL, NULL);
+ e_comp_object_transform_bg_set(ec->frame, EINA_FALSE);
+ e_comp_object_transform_transp_set(ec->frame, EINA_FALSE);
+ _e_client_transform_core_sub_update(ec, NULL);
+ }
}
e_client_visibility_calculate();
Evas_Object *shobj; // shadow object
Evas_Object *effect_obj; // effects object
Evas_Object *mask_obj; // mask object: transparent parts of this comp object allow to copy the alpha to current H/W plane.
- Evas_Object *transform_bg_obj; // transform backgroung with keep_ratio option
+ Evas_Object *transform_bg_obj; // transform backgroung with keep_ratio option
+ Evas_Object *transform_tranp_obj;// transform transp rect obj
unsigned int layer; //e_comp_canvas_layer_map(cw->ec->layer)
Eina_List *obj_mirror; // extra mirror objects
Eina_Tiler *updates; //render update regions
/////////////////////////////////////
static void
-_e_comp_object_transform_bg_stack_update(Evas_Object *obj)
+_e_comp_object_transform_obj_stack_update(Evas_Object *obj)
{
- API_ENTRY;
- EINA_SAFETY_ON_NULL_RETURN(cw->ec);
- if (cw->ec->input_only) return;
- if (!cw->transform_bg_obj) return;
+ int layer = 0;
+ API_ENTRY;
+ EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+ if (cw->ec->input_only) return;
- if (evas_object_layer_get(obj) != evas_object_layer_get(cw->transform_bg_obj))
- {
- int layer = evas_object_layer_get(obj);
- evas_object_layer_set(cw->transform_bg_obj, layer);
- }
- evas_object_stack_below(cw->transform_bg_obj, obj);
+ layer = evas_object_layer_get(obj);
+
+ if (cw->transform_bg_obj)
+ {
+ if (layer != evas_object_layer_get(cw->transform_bg_obj))
+ {
+ evas_object_layer_set(cw->transform_bg_obj, layer);
+ }
+
+ evas_object_stack_below(cw->transform_bg_obj, obj);
+ }
+
+ if (cw->transform_tranp_obj)
+ {
+ if (layer != evas_object_layer_get(cw->transform_tranp_obj))
+ {
+ evas_object_layer_set(cw->transform_tranp_obj, layer);
+ }
+
+ evas_object_stack_below(cw->transform_tranp_obj, obj);
+ }
+}
+
+static void
+_e_comp_object_transform_obj_map_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+{
+ if (!obj) return;
+
+ if (vertices)
+ {
+ Evas_Map *map = evas_map_new(4);
+
+ if (map)
+ {
+ int i;
+ evas_map_util_points_populate_from_object_full(map, obj, 0);
+ evas_map_util_points_color_set(map, 255, 255, 255, 255);
+
+ for (i = 0 ; i < 4 ; ++i)
+ {
+ double dx, dy;
+ int x, y;
+
+ e_util_transform_vertices_pos_get(vertices, i, &dx, &dy, 0, 0);
+
+ x = (int)(dx + 0.5);
+ y = (int)(dy + 0.5);
+
+ evas_map_point_coord_set(map, i, x, y, 1.0);
+ }
+
+ evas_object_map_set(obj, map);
+ evas_object_map_enable_set(obj, EINA_TRUE);
+
+ evas_map_free(map);
+ }
+ }
+ else
+ {
+ evas_object_map_enable_set(obj, EINA_FALSE);
+ }
}
/////////////////////////////////////
if (!cw->visible) return;
e_comp_render_queue();
e_comp_shape_queue();
+ _e_comp_object_transform_obj_stack_update(obj);
}
typedef void (*E_Comp_Object_Stack_Func)(Evas_Object *obj, Evas_Object *stack);
TRACE_DS_BEGIN(COMP:INTERCEPT STACK ABOVE);
_e_comp_intercept_stack_helper(data, above, evas_object_stack_above);
- _e_comp_object_transform_bg_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(above);
TRACE_DS_END();
}
TRACE_DS_BEGIN(COMP:INTERCEPT STACK BELOW);
_e_comp_intercept_stack_helper(data, below, evas_object_stack_below);
- _e_comp_object_transform_bg_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(below);
TRACE_DS_END();
}
if (e_comp->hwc && e_comp_is_on_overlay(cw->ec)) e_comp_nocomp_end(__FUNCTION__);
e_comp_render_queue();
e_comp_shape_queue();
- _e_comp_object_transform_bg_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(obj);
end:
TRACE_DS_END();
e_comp_nocomp_end(__FUNCTION__);
e_comp_render_queue();
e_comp_shape_queue();
- _e_comp_object_transform_bg_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(obj);
end:
TRACE_DS_END();
if (cw->mask_obj)
evas_object_resize(cw->mask_obj, cw->w, cw->h);
- if (cw->transform_bg_obj)
- evas_object_resize(cw->transform_bg_obj, cw->w, cw->h);
-
_e_comp_intercept_show_helper(cw);
}
if (cw->input_obj) evas_object_hide(cw->input_obj);
evas_object_hide(cw->effect_obj);
if (cw->transform_bg_obj) evas_object_hide(cw->transform_bg_obj);
+ if (cw->transform_tranp_obj) evas_object_hide(cw->transform_tranp_obj);
if (cw->ec->dead)
{
Evas_Object *o;
evas_object_show(cw->ec->internal_elm_win);
if (cw->mask_obj) evas_object_show(cw->mask_obj);
if (cw->transform_bg_obj) evas_object_show(cw->transform_bg_obj);
+ if (cw->transform_tranp_obj) evas_object_show(cw->transform_tranp_obj);
e_comp_render_queue();
if (cw->ec->input_only)
{
evas_object_del(cw->obj);
evas_object_del(cw->mask_obj);
evas_object_del(cw->transform_bg_obj);
+ evas_object_del(cw->transform_tranp_obj);
e_comp_shape_queue();
eina_stringshare_del(cw->frame_theme);
eina_stringshare_del(cw->frame_name);
evas_object_resize(cw->input_obj, w, h);
if (cw->mask_obj)
evas_object_resize(cw->mask_obj, w, h);
- if (cw->transform_bg_obj)
- evas_object_resize(cw->transform_bg_obj, w, h);
/* resize render update tiler */
if (!first)
{
evas_object_image_data_set(cw->obj, NULL);
evas_object_image_size_set(cw->obj, w, h);
if (cw->mask_obj) evas_object_resize(cw->mask_obj, w, h);
- if (cw->transform_bg_obj) evas_object_resize(cw->transform_bg_obj, w, h);
-
if (cw->pending_updates)
eina_tiler_area_size_set(cw->pending_updates, w, h);
EINA_LIST_FOREACH(cw->obj_mirror, ll, o)
{
Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
evas_object_move(o, 0, 0);
- evas_object_resize(o, cw->w, cw->h);
+ evas_object_resize(o, 1, 1);
evas_object_render_op_set(o, EVAS_RENDER_COPY);
evas_object_color_set(o, 0, 0, 0, 255);
if (cw->visible) evas_object_show(o);
cw->transform_bg_obj = o;
}
- _e_comp_object_transform_bg_stack_update(obj);
+ _e_comp_object_transform_obj_stack_update(obj);
}
else
{
if (cw->ec->input_only) return;
if (!cw->transform_bg_obj) return;
- if (vertices)
- {
- Evas_Map *map = evas_map_new(4);
-
- if (map)
- {
- int i;
- evas_map_util_points_populate_from_object_full(map, cw->transform_bg_obj, 0);
- evas_map_util_points_color_set(map, 255, 255, 255, 255);
-
- for (i = 0 ; i < 4 ; ++i)
- {
- double dx, dy;
- int x, y;
-
- e_util_transform_vertices_pos_get(vertices, i, &dx, &dy, 0, 0);
+ _e_comp_object_transform_obj_map_set(cw->transform_bg_obj, vertices);
+}
- x = (int)(dx + 0.5);
- y = (int)(dy + 0.5);
+E_API void
+e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set)
+{
+ Eina_Bool transform_set = EINA_FALSE;
+ API_ENTRY;
+ EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+ if (cw->ec->input_only) return;
- evas_map_point_coord_set(map, i, x, y, 1.0);
- }
+ transform_set = !!set;
- evas_object_map_set(cw->transform_bg_obj, map);
- evas_object_map_enable_set(cw->transform_bg_obj, EINA_TRUE);
+ if (transform_set)
+ {
+ if (!cw->transform_tranp_obj)
+ {
+ Evas_Object *o = evas_object_rectangle_add(e_comp->evas);
+ evas_object_move(o, 0, 0);
+ evas_object_resize(o, 1, 1);
+ evas_object_render_op_set(o, EVAS_RENDER_COPY);
+ evas_object_color_set(o, 0, 0, 0, 0);
+ if (cw->visible) evas_object_show(o);
- evas_map_free(map);
+ cw->transform_tranp_obj = o;
}
+ _e_comp_object_transform_obj_stack_update(obj);
}
else
{
- evas_object_map_enable_set(cw->transform_bg_obj, EINA_FALSE);
+ if (cw->transform_tranp_obj)
+ {
+ evas_object_smart_member_del(cw->transform_tranp_obj);
+ E_FREE_FUNC(cw->transform_tranp_obj, evas_object_del);
+ }
}
}
+E_API void
+e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices)
+{
+ API_ENTRY;
+ EINA_SAFETY_ON_NULL_RETURN(cw->ec);
+ if (cw->ec->input_only) return;
+ if (!cw->transform_tranp_obj) return;
+
+ _e_comp_object_transform_obj_map_set(cw->transform_tranp_obj, vertices);
+}
+
E_API void
e_comp_object_layer_update(Evas_Object *obj,
Evas_Object *above, Evas_Object *below)
E_API void e_comp_object_size_update(Evas_Object *obj, int w, int h);
E_API void e_comp_object_transform_bg_set(Evas_Object *obj, Eina_Bool set);
E_API void e_comp_object_transform_bg_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
+E_API void e_comp_object_transform_transp_set(Evas_Object *obj, Eina_Bool set);
+E_API void e_comp_object_transform_transp_vertices_set(Evas_Object *obj, E_Util_Transform_Rect_Vertex *vertices);
E_API void e_comp_object_layer_update(Evas_Object *obj, Evas_Object *above, Evas_Object *below);
{
E_Comp_Wl_Buffer_Viewport *vp;
E_Comp_Wl_Subsurf_Data *sdata;
- const Evas_Map *m;
- Evas_Map *map;
+ E_Comp_Wl_Client_Data *cdata;
int x1, y1, x2, y2, x, y;
int dx, dy;
if (!ec || !ec->comp_data) return;
+ cdata = ec->comp_data;
sdata = ec->comp_data->sub.data;
if (sdata)
{
if (x != dx || y != dy)
evas_object_move(ec->frame, dx, dy);
- m = evas_object_map_get(ec->frame);
- evas_map_point_coord_get(m, 0, &x1, &y1, NULL);
- evas_map_point_coord_get(m, 2, &x2, &y2, NULL);
-
- if (x1 == dx && (x2 - x1) == ec->comp_data->width_from_viewport &&
- y1 == dy && (y2 - y1) == ec->comp_data->height_from_viewport)
- return;
-
- map = evas_map_new(4);
+ if (!cdata->viewport_transform)
+ {
+ cdata->viewport_transform = e_util_transform_new();
+ e_client_transform_core_add(ec, cdata->viewport_transform);
+ }
- evas_map_util_points_populate_from_geometry(map,
- dx, dy,
- ec->comp_data->width_from_viewport,
- ec->comp_data->height_from_viewport,
- 0);
+ e_util_transform_viewport_set(cdata->viewport_transform, dx, dy,
+ ec->comp_data->width_from_viewport,
+ ec->comp_data->height_from_viewport);
vp = &ec->comp_data->scaler.buffer_viewport;
+
if (vp->buffer.src_width == wl_fixed_from_int(-1))
{
x1 = 0.0;
_e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x1, y1, &x, &y);
- evas_map_point_image_uv_set(map, 0, x, y);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 0, x, y);
_e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x2, y1, &x, &y);
- evas_map_point_image_uv_set(map, 1, x, y);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 1, x, y);
_e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x2, y2, &x, &y);
- evas_map_point_image_uv_set(map, 2, x, y);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 2, x, y);
_e_comp_wl_map_transform(ec->comp_data->width_from_buffer, ec->comp_data->height_from_buffer,
vp->buffer.transform, vp->buffer.scale,
x1, y2, &x, &y);
- evas_map_point_image_uv_set(map, 3, x, y);
+ e_util_transform_texcoord_set(cdata->viewport_transform, 3, x, y);
- evas_object_map_set(ec->frame, map);
- evas_object_map_enable_set(ec->frame, map ? EINA_TRUE : EINA_FALSE);
-
- evas_map_free(map);
+ e_client_transform_core_update(ec);
}
static void
E_Client *subc;
Eina_List *l;
int x, y;
- const Evas_Map *m;
if (!(ec = data)) return;
if (e_object_is_del(E_OBJECT(ec))) return;
EINA_LIST_FOREACH(ec->comp_data->sub.list, l, subc)
{
- if ((m = evas_object_map_get(subc->frame))) continue;
x = ec->x + subc->comp_data->sub.data->position.x;
y = ec->y + subc->comp_data->sub.data->position.y;
evas_object_move(subc->frame, x, y);
+
+ if (subc->comp_data->scaler.viewport)
+ {
+ E_Comp_Wl_Client_Data *cdata = subc->comp_data;
+ if (cdata && cdata->viewport_transform)
+ e_comp_wl_map_apply(subc);
+ }
}
EINA_LIST_FOREACH(ec->comp_data->sub.below_list, l, subc)
{
- if ((m = evas_object_map_get(subc->frame))) continue;
x = ec->x + subc->comp_data->sub.data->position.x;
y = ec->y + subc->comp_data->sub.data->position.y;
evas_object_move(subc->frame, x, y);
+
+ if (subc->comp_data->scaler.viewport)
+ {
+ E_Comp_Wl_Client_Data *cdata = subc->comp_data;
+ if (cdata && cdata->viewport_transform)
+ e_comp_wl_map_apply(subc);
+ }
}
if (ec->comp_data->sub.below_obj)
if (e_comp_wl->selection.cbhm == ec->comp_data->surface)
e_comp_wl->selection.cbhm = NULL;
+ if (ec->comp_data->viewport_transform)
+ {
+ e_client_transform_core_remove(ec, ec->comp_data->viewport_transform);
+ e_util_transform_del(ec->comp_data->viewport_transform);
+ ec->comp_data->viewport_transform = NULL;
+ }
+
e_pixmap_cdata_set(ec->pixmap, NULL);
E_FREE(ec->comp_data);
E_Comp_Wl_Input_Device *last_device_ptr;
E_Comp_Wl_Input_Device *last_device_touch;
E_Comp_Wl_Input_Device *last_device_kbd;
+
+ E_Util_Transform *viewport_transform;
};
struct _E_Comp_Wl_Output
int i;
int count = e_client_transform_core_transform_count_get(target_ec);
- __WINDOW_PROP_ARG_APPEND(" ", "[id] [move] [scale] [rotation] [keep_ratio]");
+ __WINDOW_PROP_ARG_APPEND(" ", "[id] [move] [scale] [rotation] [keep_ratio] [viewport]");
for (i = 0 ; i < count ; ++i)
{
double dx, dy, dsx, dsy, drz;
int x, y, rz;
int keep_ratio;
+ int view_port;
+ int vx, vy, vw, vh;
E_Util_Transform *transform = e_client_transform_core_transform_get(target_ec, i);
if (!transform) continue;
e_util_transform_scale_get(transform, &dsx, &dsy, NULL);
e_util_transform_rotation_get(transform, NULL, NULL, &drz);
keep_ratio = e_util_transform_keep_ratio_get(transform);
+ view_port = e_util_transform_viewport_flag_get(transform);
x = (int)(dx + 0.5);
y = (int)(dy + 0.5);
rz = (int)(drz + 0.5);
- __WINDOW_PROP_ARG_APPEND_TYPE("Transform", "[%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d]", i, x, y, dsx, dsy, rz, keep_ratio);
+ if (view_port)
+ {
+ e_util_transform_viewport_get(transform, &vx, &vy, &vw, &vh);
+ }
+ else
+ {
+ vx = 0;
+ vy = 0;
+ vw = 0;
+ vh = 0;
+ }
+
+ __WINDOW_PROP_ARG_APPEND_TYPE("Transform", "[%d] [%d, %d] [%2.1f, %2.1f] [%d] [%d] [%d :%d, %d, %d, %d]",
+ i, x, y, dsx, dsy, rz, keep_ratio, view_port, vx, vy, vw, vh);
}
}
#undef __WINDOW_PROP_ARG_APPEND
transform->changed = EINA_TRUE;
}
+E_API void
+e_util_transform_texcoord_set(E_Util_Transform *transform, int index, double tu, double tv)
+{
+ if (!transform) return;
+ if (index < 0 || index > 3) return;
+
+ transform->texcoord.value[index][0] = tu;
+ transform->texcoord.value[index][1] = tv;
+ transform->use_texcoord = EINA_TRUE;
+ transform->changed = EINA_TRUE;
+}
+
+E_API void
+e_util_transform_viewport_set(E_Util_Transform *transform, int x, int y, int w, int h)
+{
+ if (!transform) return;
+
+ transform->viewport.x = x;
+ transform->viewport.y = y;
+ transform->viewport.w = w;
+ transform->viewport.h = h;
+ transform->use_viewport = EINA_TRUE;
+ transform->changed = EINA_TRUE;
+}
+
E_API void
e_util_transform_source_to_target(E_Util_Transform *transform,
E_Util_Transform_Rect *dest,
transform->changed = EINA_TRUE;
}
-E_API E_Util_Transform
-e_util_transform_merge(E_Util_Transform *trans1, E_Util_Transform *trans2)
+E_API void
+e_util_transform_merge(E_Util_Transform *in_out, E_Util_Transform *input)
{
- E_Util_Transform result;
int i;
- e_util_transform_init(&result);
-
- if (!trans1) return result;
- if (!trans2) return result;
+ if (!in_out) return;
+ if (!input) return;
for (i = 0 ; i < 3 ; ++i)
- result.move.value[i] = trans1->move.value[i] + trans2->move.value[i];
-
- for (i = 0 ; i < 3 ; ++i)
- result.scale.value[i] = trans1->scale.value[i] * trans2->scale.value[i];
-
- for (i = 0 ; i < 3 ; ++i)
- result.rotation.value[i] = trans1->rotation.value[i] + trans2->rotation.value[i];
+ {
+ in_out->move.value[i] += input->move.value[i];
+ in_out->scale.value[i] *= input->scale.value[i];
+ in_out->rotation.value[i] += input->rotation.value[i];
+ }
- if (trans1->keep_ratio || trans2->keep_ratio)
- result.keep_ratio = EINA_TRUE;
+ // texcoord and viewport just one setting.
+ if (input->use_texcoord)
+ memcpy(&in_out->texcoord, &input->texcoord, sizeof(input->texcoord));
+ if (input->use_viewport)
+ memcpy(&in_out->viewport, &input->viewport, sizeof(input->viewport));
- result.changed = EINA_TRUE;
+ in_out->keep_ratio |= input->keep_ratio;
+ in_out->use_texcoord |= input->use_texcoord;
+ in_out->use_viewport |= input->use_viewport;
- return result;
+ in_out->changed = EINA_TRUE;
}
E_API E_Util_Transform_Matrix
if (z) *z = transform->rotation.value[2];
}
+E_API void
+e_util_transform_texcoord_get(E_Util_Transform *transform,int index, double *tu, double *tv)
+{
+ if (!transform) return;
+ if (index < 0 || index > 3) return;
+
+ if (tu) *tu = transform->texcoord.value[index][0];
+ if (tv) *tv = transform->texcoord.value[index][1];
+}
+
+E_API void
+e_util_transform_viewport_get(E_Util_Transform *transform, int *x, int *y, int *w, int *h)
+{
+ if (!transform) return;
+
+ if (x) *x = transform->viewport.x;
+ if (y) *y = transform->viewport.y;
+ if (w) *w = transform->viewport.w;
+ if (h) *h = transform->viewport.h;
+}
+
+E_API Eina_Bool
+e_util_transform_texcoord_flag_get(E_Util_Transform *transform)
+{
+ if (!transform) return EINA_FALSE;
+ return transform->use_texcoord;
+}
+
+E_API Eina_Bool
+e_util_transform_viewport_flag_get(E_Util_Transform *transform)
+{
+ if (!transform) return EINA_FALSE;
+ return transform->use_viewport;
+}
+
E_API void
e_util_transform_log(E_Util_Transform *transform, const char *str)
{
#ifdef E_TYPEDEFS
typedef struct _E_Util_Transform_Value E_Util_Transform_Value;
+typedef struct _E_Util_Transform_Texcoord E_Util_Transform_Texcoord;
typedef struct _E_Util_Transform E_Util_Transform;
typedef struct _E_Util_Transform_Rect E_Util_Transform_Rect;
typedef struct _E_Util_Transform_Vertex E_Util_Transform_Vertex;
double value[3];
};
-struct _E_Util_Transform
+struct _E_Util_Transform_Texcoord
{
- E_Util_Transform_Value scale;
- E_Util_Transform_Value move;
- E_Util_Transform_Value rotation;
- int ref_count;
- Eina_Bool keep_ratio;
- Eina_Bool changed;
+ double value[4][2];
};
struct _E_Util_Transform_Rect
int h;
};
+struct _E_Util_Transform
+{
+ E_Util_Transform_Value scale;
+ E_Util_Transform_Value move;
+ E_Util_Transform_Value rotation;
+ E_Util_Transform_Texcoord texcoord;
+ E_Util_Transform_Rect viewport;
+ int ref_count;
+ Eina_Bool keep_ratio;
+ Eina_Bool changed;
+ Eina_Bool use_texcoord;
+ Eina_Bool use_viewport;
+};
+
struct _E_Util_Transform_Vertex
{
double vertex[4];
E_API void e_util_transform_move(E_Util_Transform *transform, double x, double y, double z);
E_API void e_util_transform_scale(E_Util_Transform *transform, double sx, double sy, double sz);
E_API void e_util_transform_rotation(E_Util_Transform *transform, double rx, double ry, double rz);
+E_API void e_util_transform_texcoord_set(E_Util_Transform *transform, int index, double tu, double tv);
+E_API void e_util_transform_viewport_set(E_Util_Transform *transform, int x, int y, int w, int h);
E_API void e_util_transform_source_to_target(E_Util_Transform *transform,
E_Util_Transform_Rect *dest,
E_Util_Transform_Rect *source);
-E_API E_Util_Transform e_util_transform_merge(E_Util_Transform *trans1, E_Util_Transform *trans2);
+E_API void e_util_transform_merge(E_Util_Transform *in_out, E_Util_Transform *input);
E_API E_Util_Transform_Matrix e_util_transform_convert_to_matrix(E_Util_Transform *transform, E_Util_Transform_Rect *source_rect);
E_API Eina_Bool e_util_transform_change_get(E_Util_Transform *transform);
E_API void e_util_transform_change_unset(E_Util_Transform *transform);
E_API void e_util_transform_move_get(E_Util_Transform *transform, double *x, double *y, double *z);
E_API void e_util_transform_scale_get(E_Util_Transform *transform, double *x, double *y, double *z);
E_API void e_util_transform_rotation_get(E_Util_Transform *transform, double *x, double *y, double *z);
+E_API void e_util_transform_texcoord_get(E_Util_Transform *transform, int index, double *tu, double *tv);
+E_API void e_util_transform_viewport_get(E_Util_Transform *transform, int *x, int *y, int *w, int *h);
+E_API Eina_Bool e_util_transform_texcoord_flag_get(E_Util_Transform *transform);
+E_API Eina_Bool e_util_transform_viewport_flag_get(E_Util_Transform *transform);
E_API void e_util_transform_log(E_Util_Transform *transform, const char *str);
E_API void e_util_transform_rect_init(E_Util_Transform_Rect *rect, int x, int y, int w, int h);