e_client : transform_core add inverse transform function 63/115463/2 accepted/tizen/3.0/common/20170221.125356 accepted/tizen/3.0/ivi/20170221.023409 accepted/tizen/3.0/mobile/20170221.023045 accepted/tizen/3.0/tv/20170221.023149 accepted/tizen/3.0/wearable/20170221.023300 accepted/tizen/common/20170220.144500 accepted/tizen/ivi/20170220.224010 accepted/tizen/mobile/20170220.223421 accepted/tizen/tv/20170220.223512 accepted/tizen/wearable/20170220.223900 submit/tizen/20170220.112722 submit/tizen_3.0/20170220.112854
authorSungbae Park <sb34.park@samsung.com>
Mon, 20 Feb 2017 05:26:50 +0000 (14:26 +0900)
committerJuyeon Lee <juyeonne.lee@samsung.com>
Mon, 20 Feb 2017 10:51:34 +0000 (02:51 -0800)
Signed-off-by: Sungbae Park <sb34.park@samsung.com>
Change-Id: I7f202c5a4586a647a140d06efb6d64419a467a77

src/bin/e_client.c
src/bin/e_client.h
src/bin/e_util_transform.c
src/bin/e_util_transform.h

index 4c4fe180416e2b9ba41d81e49bdabd6b1bcf132a..e221325b858f1821dfd6bd930c1943860ff0c831 100644 (file)
@@ -6421,6 +6421,7 @@ e_client_transform_core_update(E_Client *ec)
 
         // 4. apply matrix to vertices
         ec->transform_core.result.matrix = matrix;
+        ec->transform_core.result.inv_matrix = e_util_transform_matrix_inverse_get(&matrix);
         ec->transform_core.result.vertices = e_util_transform_rect_to_vertices(&source_rect);
         ec->transform_core.result.boundary.vertices = e_util_transform_rect_to_vertices(&source_rect);
         ec->transform_core.result.vertices = e_util_transform_matrix_multiply_rect_vertex(&matrix,
@@ -6471,6 +6472,34 @@ e_client_transform_core_transform_get(E_Client *ec, int index)
    return (E_Util_Transform*)eina_list_nth(ec->transform_core.transform_list, index);
 }
 
+E_API void
+e_client_transform_core_input_transform(E_Client *ec, int x, int y, int *out_x, int *out_y)
+{
+   E_Util_Transform_Vertex vertex, result_vertex;
+
+   if (!ec) return;
+   if (!e_client_transform_core_enable_get(ec)) return;
+
+   e_util_transform_vertex_init(&vertex, x, y, 0.0, 1.0);
+
+   result_vertex = e_util_transform_matrix_multiply_vertex(&ec->transform_core.result.inv_matrix, &vertex);
+   e_util_transform_vertex_pos_round_get(&result_vertex, out_x, out_y, NULL, NULL);
+}
+
+E_API void
+e_client_transform_core_input_inv_transform(E_Client *ec, int x, int y, int *out_x, int *out_y)
+{
+   E_Util_Transform_Vertex vertex, result_vertex;
+
+   if (!ec) return;
+   if (!e_client_transform_core_enable_get(ec)) return;
+
+   e_util_transform_vertex_init(&vertex, x, y, 0.0, 1.0);
+
+   result_vertex = e_util_transform_matrix_multiply_vertex(&ec->transform_core.result.matrix, &vertex);
+   e_util_transform_vertex_pos_round_get(&result_vertex, out_x, out_y, NULL, NULL);
+}
+
 E_API E_Pixmap *
 e_client_pixmap_change(E_Client *ec, E_Pixmap *newcp)
 {
index e7db8901488dd7ed1b9e535289cacdfb3c684743..14ad3b76aec57a19542ea6bf04c1106740521dd7 100644 (file)
@@ -880,6 +880,7 @@ struct E_Client
        {
            Eina_Bool                    enable;
            E_Util_Transform_Matrix      matrix;
+           E_Util_Transform_Matrix      inv_matrix;
            E_Util_Transform_Rect_Vertex vertices;
            E_Util_Transform             transform;
 
@@ -1085,6 +1086,8 @@ E_API void              e_client_transform_core_remove(E_Client *ec, E_Util_Tran
 E_API void              e_client_transform_core_update(E_Client *ec);
 E_API int               e_client_transform_core_transform_count_get(E_Client *ec);
 E_API E_Util_Transform *e_client_transform_core_transform_get(E_Client *ec, int index);
+E_API void              e_client_transform_core_input_transform(E_Client *ec, int x, int y, int *out_x, int *out_y);
+E_API void              e_client_transform_core_input_inv_transform(E_Client *ec, int x, int y, int *out_x, int *out_y);
 
 E_API E_Pixmap *e_client_pixmap_change(E_Client *ec, E_Pixmap *newcp);
 E_API void e_client_window_role_set(E_Client *ec, const char *role);
index 1fea0b29284f0b2de7c15ed2748ce09d8da580e4..79b24c952f4ae50d224bbb097cad7037529e73cc 100644 (file)
@@ -1,5 +1,5 @@
 #include "e.h"
-#define E_UTIL_TRANSFORM_IS_ZERO(p) ((p) > -1e-21 && (p) < 1e-21)
+#define E_UTIL_TRANSFORM_IS_ZERO(p) ((p) > -1e-6 && (p) < 1e-6)
 #define E_UTIL_TRANSFORM_ROUND(x)   ((x) >= 0 ? (int)((x) + 0.5) : (int)((x) - 0.5))
 
 static void _e_util_transform_value_merge(E_Util_Transform_Value *inout, E_Util_Transform_Value *input);
@@ -780,7 +780,7 @@ e_util_transform_matrix_equal_check(E_Util_Transform_Matrix *matrix,
      {
         for (col = 0 ; col < 4 ; ++col)
           {
-             if (matrix->mat[row][col] != matrix2->mat[row][col])
+             if (!E_UTIL_TRANSFORM_IS_ZERO(matrix->mat[row][col] - matrix2->mat[row][col]))
                {
                   result = EINA_FALSE;
                   break;
@@ -791,6 +791,154 @@ e_util_transform_matrix_equal_check(E_Util_Transform_Matrix *matrix,
    return result;
 }
 
+E_API E_Util_Transform_Matrix
+e_util_transform_matrix_inverse_get(E_Util_Transform_Matrix *matrix)
+{
+   E_Util_Transform_Matrix result;
+   float det = 0.0f, inv_det = 0.0f;
+   int i, j;
+
+   e_util_transform_matrix_load_identity(&result);
+
+   if (!matrix) return result;
+
+
+   result.mat[0][0]  =    matrix->mat[1][1] * matrix->mat[2][2] * matrix->mat[3][3]
+      + matrix->mat[1][2] * matrix->mat[2][3] * matrix->mat[3][1]
+      + matrix->mat[1][3] * matrix->mat[2][1] * matrix->mat[3][2]
+      - matrix->mat[1][1] * matrix->mat[2][3] * matrix->mat[3][2]
+      - matrix->mat[1][2] * matrix->mat[2][1] * matrix->mat[3][3]
+      - matrix->mat[1][3] * matrix->mat[2][2] * matrix->mat[3][1];
+
+   result.mat[0][1]  =    matrix->mat[0][1] * matrix->mat[2][3] * matrix->mat[3][2]
+      + matrix->mat[0][2] * matrix->mat[2][1] * matrix->mat[3][3]
+      + matrix->mat[0][3] * matrix->mat[2][2] * matrix->mat[3][1]
+      - matrix->mat[0][1] * matrix->mat[2][2] * matrix->mat[3][3]
+      - matrix->mat[0][2] * matrix->mat[2][3] * matrix->mat[3][1]
+      - matrix->mat[0][3] * matrix->mat[2][1] * matrix->mat[3][2];
+
+   result.mat[0][2]  =    matrix->mat[0][1] * matrix->mat[1][2] * matrix->mat[3][3]
+      + matrix->mat[0][2] * matrix->mat[1][3] * matrix->mat[3][1]
+      + matrix->mat[0][3] * matrix->mat[1][1] * matrix->mat[3][2]
+      - matrix->mat[0][1] * matrix->mat[1][3] * matrix->mat[3][2]
+      - matrix->mat[0][2] * matrix->mat[1][1] * matrix->mat[3][3]
+      - matrix->mat[0][3] * matrix->mat[1][2] * matrix->mat[3][1];
+
+   result.mat[0][3]  =    matrix->mat[0][1] * matrix->mat[1][3] * matrix->mat[2][2]
+      + matrix->mat[0][2] * matrix->mat[1][1] * matrix->mat[2][3]
+      + matrix->mat[0][3] * matrix->mat[1][2] * matrix->mat[2][1]
+      - matrix->mat[0][1] * matrix->mat[1][2] * matrix->mat[2][3]
+      - matrix->mat[0][2] * matrix->mat[1][3] * matrix->mat[2][1]
+      - matrix->mat[0][3] * matrix->mat[1][1] * matrix->mat[2][2];
+
+   result.mat[1][0]  =    matrix->mat[1][0] * matrix->mat[2][3] * matrix->mat[3][2]
+      + matrix->mat[1][2] * matrix->mat[2][0] * matrix->mat[3][3]
+      + matrix->mat[1][3] * matrix->mat[2][2] * matrix->mat[3][0]
+      - matrix->mat[1][0] * matrix->mat[2][2] * matrix->mat[3][3]
+      - matrix->mat[1][2] * matrix->mat[2][3] * matrix->mat[3][0]
+      - matrix->mat[1][3] * matrix->mat[2][0] * matrix->mat[3][2];
+
+   result.mat[1][1]  =    matrix->mat[0][0] * matrix->mat[2][2] * matrix->mat[3][3]
+      + matrix->mat[0][2] * matrix->mat[2][3] * matrix->mat[3][0]
+      + matrix->mat[0][3] * matrix->mat[2][0] * matrix->mat[3][2]
+      - matrix->mat[0][0] * matrix->mat[2][3] * matrix->mat[3][2]
+      - matrix->mat[0][2] * matrix->mat[2][0] * matrix->mat[3][3]
+      - matrix->mat[0][3] * matrix->mat[2][2] * matrix->mat[3][0];
+
+   result.mat[1][2]  =    matrix->mat[0][0] * matrix->mat[1][3] * matrix->mat[3][2]
+      + matrix->mat[0][2] * matrix->mat[1][0] * matrix->mat[3][3]
+      + matrix->mat[0][3] * matrix->mat[1][2] * matrix->mat[3][0]
+      - matrix->mat[0][0] * matrix->mat[1][2] * matrix->mat[3][3]
+      - matrix->mat[0][2] * matrix->mat[1][3] * matrix->mat[3][0]
+      - matrix->mat[0][3] * matrix->mat[1][0] * matrix->mat[3][2];
+
+   result.mat[1][3]  =    matrix->mat[0][0] * matrix->mat[1][2] * matrix->mat[2][3]
+      + matrix->mat[0][2] * matrix->mat[1][3] * matrix->mat[2][0]
+      + matrix->mat[0][3] * matrix->mat[1][0] * matrix->mat[2][2]
+      - matrix->mat[0][0] * matrix->mat[1][3] * matrix->mat[2][2]
+      - matrix->mat[0][2] * matrix->mat[1][0] * matrix->mat[2][3]
+      - matrix->mat[0][3] * matrix->mat[1][2] * matrix->mat[2][0];
+
+   result.mat[2][0]  =    matrix->mat[1][0] * matrix->mat[2][1] * matrix->mat[3][3]
+      + matrix->mat[1][1] * matrix->mat[2][3] * matrix->mat[3][0]
+      + matrix->mat[1][3] * matrix->mat[2][0] * matrix->mat[3][1]
+      - matrix->mat[1][0] * matrix->mat[2][3] * matrix->mat[3][1]
+      - matrix->mat[1][1] * matrix->mat[2][0] * matrix->mat[3][3]
+      - matrix->mat[1][3] * matrix->mat[2][1] * matrix->mat[3][0];
+
+   result.mat[2][1]  =    matrix->mat[0][0] * matrix->mat[2][3] * matrix->mat[3][1]
+      + matrix->mat[0][1] * matrix->mat[2][0] * matrix->mat[3][3]
+      + matrix->mat[0][3] * matrix->mat[2][1] * matrix->mat[3][0]
+      - matrix->mat[0][0] * matrix->mat[2][1] * matrix->mat[3][3]
+      - matrix->mat[0][1] * matrix->mat[2][3] * matrix->mat[3][0]
+      - matrix->mat[0][3] * matrix->mat[2][0] * matrix->mat[3][1];
+
+   result.mat[2][2]  =    matrix->mat[0][0] * matrix->mat[1][1] * matrix->mat[3][3]
+      + matrix->mat[0][1] * matrix->mat[1][3] * matrix->mat[3][0]
+      + matrix->mat[0][3] * matrix->mat[1][0] * matrix->mat[3][1]
+      - matrix->mat[0][0] * matrix->mat[1][3] * matrix->mat[3][1]
+      - matrix->mat[0][1] * matrix->mat[1][0] * matrix->mat[3][3]
+      - matrix->mat[0][3] * matrix->mat[1][1] * matrix->mat[3][0];
+
+   result.mat[2][3]  =    matrix->mat[0][0] * matrix->mat[1][3] * matrix->mat[2][1]
+      + matrix->mat[0][1] * matrix->mat[1][0] * matrix->mat[2][3]
+      + matrix->mat[0][3] * matrix->mat[1][1] * matrix->mat[2][0]
+      - matrix->mat[0][0] * matrix->mat[1][1] * matrix->mat[2][3]
+      - matrix->mat[0][1] * matrix->mat[1][3] * matrix->mat[2][0]
+      - matrix->mat[0][3] * matrix->mat[1][0] * matrix->mat[2][1];
+
+   result.mat[3][0]  =    matrix->mat[1][0] * matrix->mat[2][2] * matrix->mat[3][1]
+      + matrix->mat[1][1] * matrix->mat[2][0] * matrix->mat[3][2]
+      + matrix->mat[1][2] * matrix->mat[2][1] * matrix->mat[3][0]
+      - matrix->mat[1][0] * matrix->mat[2][1] * matrix->mat[3][2]
+      - matrix->mat[1][1] * matrix->mat[2][2] * matrix->mat[3][0]
+      - matrix->mat[1][2] * matrix->mat[2][0] * matrix->mat[3][1];
+
+   result.mat[3][1]  =    matrix->mat[0][0] * matrix->mat[2][1] * matrix->mat[3][2]
+      + matrix->mat[0][1] * matrix->mat[2][2] * matrix->mat[3][0]
+      + matrix->mat[0][2] * matrix->mat[2][0] * matrix->mat[3][1]
+      - matrix->mat[0][0] * matrix->mat[2][2] * matrix->mat[3][1]
+      - matrix->mat[0][1] * matrix->mat[2][0] * matrix->mat[3][2]
+      - matrix->mat[0][2] * matrix->mat[2][1] * matrix->mat[3][0];
+
+   result.mat[3][2]  =    matrix->mat[0][0] * matrix->mat[1][2] * matrix->mat[3][1]
+      + matrix->mat[0][1] * matrix->mat[1][0] * matrix->mat[3][2]
+      + matrix->mat[0][2] * matrix->mat[1][1] * matrix->mat[3][0]
+      - matrix->mat[0][0] * matrix->mat[1][1] * matrix->mat[3][2]
+      - matrix->mat[0][1] * matrix->mat[1][2] * matrix->mat[3][0]
+      - matrix->mat[0][2] * matrix->mat[1][0] * matrix->mat[3][1];
+
+   result.mat[3][3]  =    matrix->mat[0][0] * matrix->mat[1][1] * matrix->mat[2][2]
+      + matrix->mat[0][1] * matrix->mat[1][2] * matrix->mat[2][0]
+      + matrix->mat[0][2] * matrix->mat[1][0] * matrix->mat[2][1]
+      - matrix->mat[0][0] * matrix->mat[1][2] * matrix->mat[2][1]
+      - matrix->mat[0][1] * matrix->mat[1][0] * matrix->mat[2][2]
+      - matrix->mat[0][2] * matrix->mat[1][1] * matrix->mat[2][0];
+
+   det = matrix->mat[0][0] * result.mat[0][0] +
+      matrix->mat[0][1] * result.mat[1][0] +
+      matrix->mat[0][2] * result.mat[2][0] +
+      matrix->mat[0][3] * result.mat[3][0];
+
+
+   if (E_UTIL_TRANSFORM_IS_ZERO(det))
+     {
+        e_util_transform_matrix_load_identity(&result);
+     }
+   else
+     {
+        inv_det = 1.0f / det;
+
+        for (i = 0 ; i < 4 ; ++i)
+          {
+             for (j = 0 ; j < 4 ; ++j)
+               result.mat[i][j] *= inv_det;
+          }
+     }
+
+   return result;
+}
+
 static void
 _e_util_transform_value_merge(E_Util_Transform_Value *inout, E_Util_Transform_Value *input)
 {
index c96a01ea38a3eb1d7a74285dc113ee454b8b4b3a..c4912fadb8e247a4e5941e51acba64e4bc02434f 100644 (file)
@@ -132,6 +132,7 @@ E_API E_Util_Transform_Rect_Vertex e_util_transform_matrix_multiply_rect_vertex(
                                                                                 E_Util_Transform_Rect_Vertex *vertices);
 E_API Eina_Bool                    e_util_transform_matrix_equal_check(E_Util_Transform_Matrix *matrix,
                                                                        E_Util_Transform_Matrix *matrix2);
+E_API E_Util_Transform_Matrix      e_util_transform_matrix_inverse_get(E_Util_Transform_Matrix *matrix);
 
 // will delete function
 E_API void                         e_util_transform_source_to_target(E_Util_Transform *transform,