e_map: Added wrapper APIs for evas_map 30/258730/14
authorJunseok, Kim <juns.kim@samsung.com>
Mon, 17 May 2021 09:05:31 +0000 (18:05 +0900)
committerJunseok, Kim <juns.kim@samsung.com>
Mon, 7 Jun 2021 10:32:48 +0000 (19:32 +0900)
Evas_Map used in many functions for effect, zoom and etc.
But, we couldn't manage all of Evas_Map used by modules.
and there're so many duplicated codes to doing same operation.

For easy maintenance and increase reusability of Evas_Map, added E_Map wrapper APIs for it's first step.

Change-Id: I6c0dc2a88a43a545bc0f62dba591e4c9129730d3
Signed-off-by: Junseok, Kim <juns.kim@samsung.com>
src/bin/Makefile.mk
src/bin/e_client.c
src/bin/e_client.h
src/bin/e_comp_object.c
src/bin/e_comp_object.h
src/bin/e_includes.h
src/bin/e_map.c [new file with mode: 0644]
src/bin/e_map.h [new file with mode: 0644]

index e00be7d..daf5fc7 100644 (file)
@@ -146,7 +146,8 @@ src/bin/e_devicemgr.h \
 src/bin/e_devicemgr_private.h \
 src/bin/e_msg.h        \
 src/bin/e_foreign.h \
-src/bin/e_foreign_private.h
+src/bin/e_foreign_private.h \
+src/bin/e_map.h
 
 enlightenment_src = \
 src/bin/e_actions.c \
@@ -284,7 +285,8 @@ src/bin/e_devicemgr_inputgen.c \
 src/bin/e_devicemgr_wl.c \
 src/bin/e_msg.c \
 src/bin/e_foreign.c \
-src/bin/e_foreign_shell.c
+src/bin/e_foreign_shell.c \
+src/bin/e_map.c
 
 src_bin_enlightenment_CPPFLAGS = $(E_CPPFLAGS) -DEFL_BETA_API_SUPPORT -DEFL_EO_API_SUPPORT -DE_LOGGING=2 @WAYLAND_CFLAGS@ $(TTRACE_CFLAGS) $(DLOG_CFLAGS) $(PIXMAN_CFLAGS) $(POLICY_CFLAGS) $(EGL_CFLAGS)
 if HAVE_LIBGOMP
index 0e81f1f..8966f4a 100644 (file)
@@ -8385,4 +8385,31 @@ e_client_cdata_get(E_Client *ec)
    if (!ec) return NULL;
 
    return ec->comp_data;
+}
+
+E_API Eina_Bool
+e_client_map_set(E_Client *ec, E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+
+   return e_map_set_to_comp_object(em, ec->frame);
+}
+
+E_API E_Map *
+e_client_map_get(const E_Client *ec)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, NULL);
+
+   return e_map_get_from_comp_object(ec->frame);
+}
+
+E_API Eina_Bool
+e_client_map_enable_set(E_Client *ec, Eina_Bool enable)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(ec->frame, EINA_FALSE);
+
+   evas_object_map_enable_set(ec->frame, enable);
+
+   return EINA_TRUE;
 }
\ No newline at end of file
index 9615fb4..ad3548b 100644 (file)
@@ -1269,6 +1269,10 @@ EINTERN E_Comp_Wl_Client_Data   *e_client_cdata_new(E_Client *ec);
 EINTERN void                     e_client_cdata_free(E_Client *ec);
 EINTERN E_Comp_Wl_Client_Data   *e_client_cdata_get(E_Client *ec);
 
+E_API Eina_Bool        e_client_map_set(E_Client *ec, E_Map *em);
+E_API E_Map           *e_client_map_get(const E_Client *ec);
+E_API Eina_Bool        e_client_map_enable_set(E_Client *ec, Eina_Bool enabled);
+
 /**
  * Move window to coordinates that do not account client decorations yet.
  *
index 4ea2712..31176f1 100644 (file)
@@ -6379,3 +6379,29 @@ e_comp_object_color_visible_get(Evas_Object *obj)
 
    return EINA_TRUE;
 }
+
+E_API Eina_Bool
+e_comp_object_map_set(Evas_Object *obj, E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+
+   return e_map_set_to_comp_object(em, obj);
+}
+
+E_API E_Map *
+e_comp_object_map_get(const Evas_Object *obj)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
+
+   return e_map_get_from_comp_object(obj);
+}
+
+E_API Eina_Bool
+e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enable)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+
+   evas_object_map_enable_set(obj, enable);
+
+   return EINA_TRUE;
+}
index 0b0cd1d..a3f2ca7 100644 (file)
@@ -203,6 +203,10 @@ EINTERN void e_comp_object_damage_trace_debug(Eina_Bool onoff);
 
 EINTERN Eina_Bool e_comp_object_redirected_get(Evas_Object *obj);
 EINTERN Eina_Bool e_comp_object_color_visible_get(Evas_Object *obj);
+
+E_API Eina_Bool        e_comp_object_map_set(Evas_Object *obj, E_Map *em);
+E_API E_Map           *e_comp_object_map_get(const Evas_Object *obj);
+E_API Eina_Bool        e_comp_object_map_enable_set(Evas_Object *obj, Eina_Bool enabled);
 #endif
 #endif
 
index 25bd45d..d4c6f5e 100644 (file)
@@ -96,3 +96,4 @@
 #include "e_comp_wl_capture.h"
 #include "e_comp_wl_tizen_hwc.h"
 #include "e_comp_wl_renderer.h"
+#include "e_map.h"
diff --git a/src/bin/e_map.c b/src/bin/e_map.c
new file mode 100644 (file)
index 0000000..7f68903
--- /dev/null
@@ -0,0 +1,310 @@
+#include "e.h"
+#include "e_map.h"
+
+#define E_MAP_INDEX_IN_RANGE(MAP, X) ((X >= 0) && (X < MAP->count))
+
+struct _E_Map
+{
+   Evas_Map *map;
+   int count;
+   Eina_Bool internal;
+};
+
+EINTERN Eina_Bool
+e_map_set_to_comp_object(E_Map *em, Evas_Object *obj)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+
+   if (!em)
+     {
+        evas_object_map_set(obj, NULL);
+        return EINA_TRUE;
+     }
+
+   evas_object_map_set(obj, em->map);
+
+   return EINA_TRUE;
+}
+
+EINTERN E_Map *
+e_map_get_from_comp_object(const Evas_Object *obj)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, NULL);
+
+   E_Map *em = E_NEW(E_Map, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, NULL);
+
+   em->map = (Evas_Map *) evas_object_map_get(obj);
+   if (!em->map)
+     {
+        ELOGF("MAP", "evas_object_map_get failed. (object:%p)", NULL, obj);
+        free(em);
+        return NULL;
+     }
+   em->internal = EINA_TRUE;
+   em->count = evas_map_count_get(em->map);
+
+   return em;
+}
+
+E_API E_Map *
+e_map_new(void)
+{
+   E_Map *em = E_NEW(E_Map, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, NULL);
+
+   em->map = evas_map_new(4);
+   if (!em->map)
+     {
+        ELOGF("MAP", "evas_map_new failed.", NULL);
+        free(em);
+        return NULL;
+     }
+
+   em->count = 4;
+   em->internal = EINA_FALSE;
+
+   return em;
+}
+
+E_API E_Map *
+e_map_dup(E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, NULL);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em->map, NULL);
+
+   E_Map *em_dup = E_NEW(E_Map, 1);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em_dup, NULL);
+
+   memcpy(em_dup, em, sizeof(E_Map));
+   em_dup->map = evas_map_dup(em->map);
+   if (!em_dup->map)
+     {
+        ELOGF("MAP", "evas_map_dup failed. (E_Map:%p)", NULL, em);
+        free(em_dup);
+        return NULL;
+     }
+
+   em_dup->internal = EINA_FALSE;
+
+   return em_dup;
+}
+
+E_API Eina_Bool
+e_map_free(E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   if (em->map && !em->internal)
+     evas_map_free(em->map);
+   free(em);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_coord_get(E_Map *em, int idx, int *x, int *y, int *z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+
+   evas_map_point_coord_get(em->map, idx, x, y, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_coord_set(E_Map *em, int idx, int x, int y, int z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_point_coord_set(em->map, idx, x, y, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_precise_coord_get(E_Map *em, int idx, double *x, double *y, double *z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+
+   evas_map_point_precise_coord_get(em->map, idx, x, y, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_precise_coord_set(E_Map *em, int idx, double x, double y, double z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_point_precise_coord_set(em->map, idx, x, y, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_image_uv_get(E_Map *em, int idx, double *u, double *v)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+
+   evas_map_point_image_uv_get(em->map, idx, u, v);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_image_uv_set(E_Map *em, int idx, double u, double v)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_point_image_uv_set(em->map, idx, u, v);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_coords_get(E_Map *em, double x, double y, double *mx, double *my, int grab)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   return evas_map_coords_get(em->map, x, y, mx, my, grab);
+}
+
+E_API Eina_Bool
+e_map_alpha_get(E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   return evas_map_alpha_get(em->map);
+}
+
+E_API Eina_Bool
+e_map_alpha_set(E_Map *em, Eina_Bool alpha)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_alpha_set(em->map, alpha);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_point_color_set(E_Map *em, int idx, int r, int g, int b, int a)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_FALSE_RETURN_VAL(E_MAP_INDEX_IN_RANGE(em, idx), EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_point_color_set(em->map, idx, r, g, b, a);
+
+   return EINA_TRUE;
+}
+
+E_API int
+e_map_count_get(E_Map *em)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, -1);
+
+   return evas_map_count_get(em->map);
+}
+
+E_API Eina_Bool
+e_map_smooth_set(E_Map *em, Eina_Bool enabled)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_smooth_set(em->map, enabled);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_points_populate_from_geometry(E_Map *em, int x, int y, int w, int h, int z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   evas_map_util_points_populate_from_geometry(em->map, x, y, w, h, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_points_populate_from_object(E_Map *em, Evas_Object *obj)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+
+   evas_map_util_points_populate_from_object(em->map, obj);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_points_populate_from_object_full(E_Map *em, Evas_Object *obj, int z)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   EINA_SAFETY_ON_NULL_RETURN_VAL(obj, EINA_FALSE);
+
+   evas_map_util_points_populate_from_object_full(em->map, obj, z);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_object_move_sync_set(E_Map *em, Eina_Bool enabled)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_util_object_move_sync_set(em->map, enabled);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_points_color_set(E_Map *em, int r, int g, int b, int a)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+   if (em->internal) return EINA_FALSE;
+
+   evas_map_util_points_color_set(em->map, r, g, b, a);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_zoom_with_constant_ratio(E_Map *em, double zoom, int cx, int cy)
+{
+   return e_map_util_zoom(em, zoom, zoom, cx, cy);
+}
+
+E_API Eina_Bool
+e_map_util_zoom(E_Map *em, double zoomx, double zoomy, int cx, int cy)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   evas_map_util_zoom(em->map, zoomx, zoomy, cx, cy);
+
+   return EINA_TRUE;
+}
+
+E_API Eina_Bool
+e_map_util_rotate(E_Map *em, int angle, int cx, int cy)
+{
+   EINA_SAFETY_ON_NULL_RETURN_VAL(em, EINA_FALSE);
+
+   evas_map_util_rotate(em->map, angle, cx, cy);
+
+   return EINA_TRUE;
+}
diff --git a/src/bin/e_map.h b/src/bin/e_map.h
new file mode 100644 (file)
index 0000000..a385caf
--- /dev/null
@@ -0,0 +1,38 @@
+#ifdef E_TYPEDEFS
+typedef struct _E_Map E_Map;
+#else
+# ifndef E_MAP_H
+# define E_MAP_H
+
+/* current Evas_Map is support only four points.
+ * So, we're provide e_map_new without count parameter. */
+E_API E_Map           *e_map_new(void);
+E_API E_Map           *e_map_dup(E_Map *em);
+E_API Eina_Bool        e_map_free(E_Map *em);
+E_API Eina_Bool        e_map_point_coord_get(E_Map *em, int idx, int *x, int *y, int *z);
+E_API Eina_Bool        e_map_point_coord_set(E_Map *em, int idx, int x, int y, int z);
+E_API Eina_Bool        e_map_point_precise_coord_get(E_Map *em, int idx, double *x, double *y, double *z);
+E_API Eina_Bool        e_map_point_precise_coord_set(E_Map *em, int idx, double x, double y, double z);
+E_API Eina_Bool        e_map_point_image_uv_get(E_Map *em, int idx, double *u, double *v);
+E_API Eina_Bool        e_map_point_image_uv_set(E_Map *em, int idx, double u, double v);
+E_API Eina_Bool        e_map_coords_get(E_Map *em, double x, double y, double *mx, double *my, int grab);
+E_API Eina_Bool        e_map_alpha_get(E_Map *em);
+E_API Eina_Bool        e_map_alpha_set(E_Map *em, Eina_Bool alpha);
+E_API Eina_Bool        e_map_point_color_set(E_Map *em, int idx, int r, int g, int b, int a);
+E_API int              e_map_count_get(E_Map *em);
+E_API Eina_Bool        e_map_smooth_set(E_Map *em, Eina_Bool enabled);
+
+E_API Eina_Bool        e_map_util_points_populate_from_geometry(E_Map *em, int x, int y, int w, int h, int z);
+E_API Eina_Bool        e_map_util_points_populate_from_object(E_Map *em, Evas_Object *obj);
+E_API Eina_Bool        e_map_util_points_populate_from_object_full(E_Map *em, Evas_Object *obj, int z);
+E_API Eina_Bool        e_map_util_object_move_sync_set(E_Map *em, Eina_Bool enabled);
+E_API Eina_Bool        e_map_util_points_color_set(E_Map *em, int r, int g, int b, int a);
+E_API Eina_Bool        e_map_util_zoom_with_constant_ratio(E_Map *em, double zoom, int cx, int cy);
+E_API Eina_Bool        e_map_util_zoom(E_Map *em, double zoomx, double zoomy, int cx, int cy);
+E_API Eina_Bool        e_map_util_rotate(E_Map *em, int angle, int cx, int cy);
+
+EINTERN Eina_Bool      e_map_set_to_comp_object(E_Map *em, Evas_Object *obj);
+EINTERN E_Map *        e_map_get_from_comp_object(const Evas_Object *obj);
+
+# endif
+#endif