Author: Hermet Park <hermet@hermet.pe.kr> 98/95898/1
authorHermet Park <hermet@hermet.pe.kr>
Mon, 7 Nov 2016 04:01:42 +0000 (13:01 +0900)
committerHermet Park <hermet@hermet.pe.kr>
Mon, 7 Nov 2016 05:09:20 +0000 (14:09 +0900)
Date:   Fri Nov 4 20:19:14 2016 +0900

    elementary transit: support image fill area in zoom effect.

    Transit zoom effect didn't care image fill area in case of manual filling.
    This additional logic computes map uvs with regards to the current image fill area.

    @fix

Change-Id: I38cd1be536333d6cf984ccea08c524498efceb90

src/lib/elm_transit.c

index ade9390..b8f851b 100644 (file)
@@ -445,6 +445,9 @@ _recover_image_uv(Evas_Object *obj, Evas_Map *map, Eina_Bool revert, Eina_Bool b
    //Since the map is not proper for all types of objects,
    //Need to handle uvs only for image objects
    int iw, ih;
+   int x, y, w, h;
+   int fill_x, fill_y, fill_w, fill_h;
+
    const char *type = evas_object_type_get(obj);
    if ((!type) || (strcmp(type, "image"))) return EINA_FALSE;
    if (evas_object_image_source_get(obj)) return EINA_FALSE;
@@ -460,10 +463,34 @@ _recover_image_uv(Evas_Object *obj, Evas_Map *map, Eina_Bool revert, Eina_Bool b
      }
    else
      {
-        evas_map_point_image_uv_set(map, 0, 0, 0);
-        evas_map_point_image_uv_set(map, 1, iw, 0);
-        evas_map_point_image_uv_set(map, 2, iw, ih);
-        evas_map_point_image_uv_set(map, 3, 0, ih);
+        if (evas_object_image_filled_get(obj))
+          {
+             x = 0;
+             y = 0;
+             w = iw;
+             h = ih;
+          }
+        //Zooming image fill area.
+        else
+          {
+             evas_object_image_fill_get(obj, &fill_x, &fill_y, &fill_w, &fill_h);
+             evas_object_geometry_get(obj, NULL, NULL, &w, &h);
+
+             double rate_x = (double) w / (double) fill_w;
+             double rate_y = (double) h / (double) fill_h;
+             double rate_x2 = (double) iw / (double) fill_w;
+             double rate_y2 = (double) ih / (double) fill_h;
+
+             x = -(int)((double) fill_x * rate_x2);
+             y = -(int)((double) fill_y * rate_y2);
+             w = (int)(((double) iw) * rate_x) + x;
+             h = (int)(((double) ih) * rate_y) + y;
+          }
+
+        evas_map_point_image_uv_set(map, 0, x, y);
+        evas_map_point_image_uv_set(map, 1, w, y);
+        evas_map_point_image_uv_set(map, 2, w, h);
+        evas_map_point_image_uv_set(map, 3, x, h);
      }
    return EINA_TRUE;
 }