summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaeun Choi <jaeun12.choi@samsung.com>2016-05-12 13:25:13 +0900
committerJaeun Choi <jaeun12.choi@samsung.com>2016-05-26 16:26:04 +0900
commit8cb6c3e466a9d242706a629b3b39daafe2740dce (patch)
tree5ef4f1fb92a6ef65f5f7d6b0232a98b6f4f0619b
parente3de1ab9f7cfd4d56cb023758ed79cc7b3661c14 (diff)
downloadefl-8cb6c3e466a9d242706a629b3b39daafe2740dce.tar.gz
Elm_image: implement 'scale_type' and 'scalable' property related functions
This patch implements the functions related to new eo properties added in a5a44b0104c7302b9e3ca2925d28b3212206c714
-rw-r--r--src/lib/elementary/elm_image.c207
-rw-r--r--src/lib/elementary/elm_widget_image.h3
2 files changed, 136 insertions, 74 deletions
diff --git a/src/lib/elementary/elm_image.c b/src/lib/elementary/elm_image.c
index 263c80afd3..ff61834638 100644
--- a/src/lib/elementary/elm_image.c
+++ b/src/lib/elementary/elm_image.c
@@ -125,24 +125,24 @@ _img_new(Evas_Object *obj)
static void
_elm_image_internal_sizing_eval(Evas_Object *obj, Elm_Image_Data *sd)
{
- Evas_Coord x, y, w, h;
-
if (!sd->img) return;
- w = sd->img_w;
- h = sd->img_h;
-
if (eo_isa(sd->img, EDJE_OBJECT_CLASS))
{
- x = sd->img_x;
- y = sd->img_y;
- evas_object_move(sd->img, x, y);
- evas_object_resize(sd->img, w, h);
+ evas_object_move(sd->img, sd->img_x, sd->img_y);
+ evas_object_resize(sd->img, sd->img_w, sd->img_h);
+
+ evas_object_move(sd->hit_rect, sd->img_x, sd->img_y);
+ evas_object_resize(sd->hit_rect, sd->img_w, sd->img_h);
}
else
{
+ Evas_Coord x = 0, y = 0, w = 1, h = 1;
+
double alignh = 0.5, alignv = 0.5;
- int iw = 0, ih = 0, offset_w = 0, offset_h = 0;
+ int iw = 0, ih = 0, offset_x = 0, offset_y = 0;
+
+ //1. Get the original image size (iw x ih)
evas_object_image_size_get(sd->img, &iw, &ih);
iw = ((double)iw) * sd->scale;
@@ -151,68 +151,89 @@ _elm_image_internal_sizing_eval(Evas_Object *obj, Elm_Image_Data *sd)
if (iw < 1) iw = 1;
if (ih < 1) ih = 1;
- if (sd->aspect_fixed)
- {
- h = ((double)ih * w) / (double)iw;
- if (sd->fill_inside)
- {
- if (h > sd->img_h)
- {
- h = sd->img_h;
- w = ((double)iw * h) / (double)ih;
- }
- }
- else
- {
- if (h < sd->img_h)
- {
- h = sd->img_h;
- w = ((double)iw * h) / (double)ih;
- }
- }
- }
- if (!sd->resize_up)
+ //2. Calculate internal image size (w x h)
+ // according to (iw x ih), (sd->img_w x sd->img_h), and scale_type
+ switch (sd->scale_type)
{
- if (w > iw) w = iw;
- if (h > ih) h = ih;
- }
- if (!sd->resize_down)
- {
- if (w < iw) w = iw;
- if (h < ih) h = ih;
+ case ELM_IMAGE_SCALE_TYPE_NONE:
+ w = iw;
+ h = ih;
+ break;
+ case ELM_IMAGE_SCALE_TYPE_FILL:
+ w = sd->img_w;
+ h = sd->img_h;
+ break;
+ case ELM_IMAGE_SCALE_TYPE_FIT_INSIDE:
+ w = sd->img_w;
+ h = ((double)ih * w) / (double)iw;
+
+ if (h > sd->img_h)
+ {
+ h = sd->img_h;
+ w = ((double)iw * h) / (double)ih;
+ }
+
+ if (((!sd->scale_up) && (w > iw))
+ || ((!sd->scale_down) && (w < iw)))
+ {
+ w = iw;
+ h = ih;
+ }
+ break;
+ case ELM_IMAGE_SCALE_TYPE_FIT_OUTSIDE:
+ w = sd->img_w;
+ h = ((double)ih * w) / (double)iw;
+ if (h < sd->img_h)
+ {
+ h = sd->img_h;
+ w = ((double)iw * h) / (double)ih;
+ }
+
+ if (((!sd->scale_up) && (w > iw))
+ || ((!sd->scale_down) && (w < iw)))
+ {
+ w = iw;
+ h = ih;
+ }
+ break;
}
+ //3. Calculate offset according to align value
evas_object_size_hint_align_get
(obj, &alignh, &alignv);
if (alignh == EVAS_HINT_FILL) alignh = 0.5;
if (alignv == EVAS_HINT_FILL) alignv = 0.5;
- offset_w = ((sd->img_w - w) * alignh);
- offset_h = ((sd->img_h - h) * alignv);
+ offset_x = ((sd->img_w - w) * alignh);
+ offset_y = ((sd->img_h - h) * alignv);
- if (sd->aspect_fixed && !sd->fill_inside)
- {
- evas_object_image_fill_set(sd->img, offset_w, offset_h, w, h);
+ x = sd->img_x + offset_x;
+ y = sd->img_y + offset_y;
- w = sd->img_w;
- h = sd->img_h;
+ //4. Fill, move, resize
+ if (offset_x >= 0) offset_x = 0;
+ if (offset_y >= 0) offset_y = 0;
+
+ evas_object_image_fill_set(sd->img, offset_x, offset_y, w, h);
+
+ if (offset_x < 0)
+ {
x = sd->img_x;
- y = sd->img_y;
+ w = sd->img_w;
}
- else
+ if (offset_y < 0)
{
- evas_object_image_fill_set(sd->img, 0, 0, w, h);
-
- x = sd->img_x + offset_w;
- y = sd->img_y + offset_h;
+ y = sd->img_y;
+ h = sd->img_h;
}
evas_object_move(sd->img, x, y);
evas_object_resize(sd->img, w, h);
+
+ evas_object_move(sd->hit_rect, x, y);
+ evas_object_resize(sd->hit_rect, w, h);
}
- evas_object_move(sd->hit_rect, x, y);
- evas_object_resize(sd->hit_rect, w, h);
}
static inline void
@@ -586,6 +607,8 @@ _elm_image_evas_object_smart_add(Eo *obj, Elm_Image_Data *priv)
priv->aspect_fixed = EINA_TRUE;
priv->load_size = 0;
priv->scale = 1.0;
+ priv->scale_up = EINA_TRUE;
+ priv->scale_down = EINA_TRUE;
eina_spinlock_new(&priv->async.lck);
elm_widget_can_focus_set(obj, EINA_FALSE);
@@ -1410,28 +1433,37 @@ _elm_image_class_constructor(Eo_Class *klass)
}
EOLIAN static void
-_elm_image_scale_type_set(Eo *obj EINA_UNUSED, Elm_Image_Data *sd EINA_UNUSED, Elm_Image_Scale_Type type EINA_UNUSED)
+_elm_image_scale_type_set(Eo *obj EINA_UNUSED, Elm_Image_Data *sd EINA_UNUSED, Elm_Image_Scale_Type scale_type)
{
- //TODO: implementation
+ if (scale_type == sd->scale_type) return;
+
+ sd->scale_type = scale_type;
+
+ _elm_image_internal_sizing_eval(obj);
}
EOLIAN static Elm_Image_Scale_Type
-_elm_image_scale_type_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd EINA_UNUSED)
+_elm_image_scale_type_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd)
{
- //TODO: implementation
- return ELM_IMAGE_SCALE_TYPE_NONE;
+ return sd->scale_type;
}
EOLIAN static void
-_elm_image_scalable_set(Eo *obj EINA_UNUSED, Elm_Image_Data *sd EINA_UNUSED, Eina_Bool up EINA_UNUSED, Eina_Bool down EINA_UNUSED)
+_elm_image_scalable_set(Eo *obj, Elm_Image_Data *sd, Eina_Bool up, Eina_Bool down)
{
- //TODO: implementation
+ if ((up == sd->scale_up) && (down == sd->scale_down)) return;
+
+ sd->scale_up = !!up;
+ sd->scale_down = !!down;
+
+ _elm_image_internal_sizing_eval(obj);
}
EOLIAN static void
-_elm_image_scalable_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd EINA_UNUSED, Eina_Bool *up EINA_UNUSED, Eina_Bool *down EINA_UNUSED)
+_elm_image_scalable_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd, Eina_Bool *up, Eina_Bool *down)
{
- //TODO: implementation
+ if (up) *size_up = sd->scale_up;
+ if (down) *size_down = sd->scale_down;
}
// A11Y
@@ -1752,10 +1784,21 @@ elm_image_fill_outside_set(Evas_Object *obj, Eina_Bool fill_outside)
{
ELM_IMAGE_CHECK(obj);
ELM_IMAGE_DATA_GET(obj, sd);
+ fill_outside = !!fill_outside;
+
+ if (sd->fill_inside == !fill_outside) return;
sd->fill_inside = !fill_outside;
- _elm_image_sizing_eval(obj);
+ if (sd->aspect_fixed)
+ {
+ if (sd->fill_inside) sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_INSIDE;
+ else sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_OUTSIDE;
+ }
+ else
+ sd->scale_type = ELM_IMAGE_SCALE_TYPE_FILL;
+
+ _elm_image_internal_sizing_eval(obj, sd);
}
EAPI Eina_Bool
@@ -1877,9 +1920,9 @@ elm_image_resize_down_set(Evas_Object *obj, Eina_Bool resize_down)
resize_down = !!resize_down;
- if (sd->resize_down == resize_down) return;
+ if (sd->scale_down == resize_down) return;
- sd->resize_down = resize_down;
+ sd->scale_down = resize_down;
_elm_image_internal_sizing_eval(obj, sd);
}
@@ -1889,7 +1932,7 @@ elm_image_resize_down_get(const Evas_Object *obj)
{
ELM_IMAGE_CHECK(obj) EINA_FALSE;
ELM_IMAGE_DATA_GET(obj, sd);
- return sd->resize_down;
+ return sd->scale_down;
}
EAPI void
@@ -1900,9 +1943,9 @@ elm_image_resize_up_set(Evas_Object *obj, Eina_Bool resize_up)
resize_up = !!resize_up;
- if (sd->resize_up == resize_up) return;
+ if (sd->scale_up == resize_up) return;
- sd->resize_up = resize_up;
+ sd->scale_up = resize_up;
_elm_image_internal_sizing_eval(obj, sd);
}
@@ -1912,7 +1955,7 @@ elm_image_resize_up_get(const Evas_Object *obj)
{
ELM_IMAGE_CHECK(obj) EINA_FALSE;
ELM_IMAGE_DATA_GET(obj, sd);
- return sd->resize_up;
+ return sd->scale_up;
}
EAPI void
@@ -1945,10 +1988,10 @@ elm_image_resizable_set(Evas_Object *obj, Eina_Bool up, Eina_Bool down)
{
ELM_IMAGE_CHECK(obj);
ELM_IMAGE_DATA_GET(obj, sd);
- sd->resize_up = !!up;
- sd->resize_down = !!down;
+ sd->scale_up = !!up;
+ sd->scale_down = !!down;
- _elm_image_sizing_eval(obj);
+ _elm_image_internal_sizing_eval(obj);
}
EAPI void
@@ -1956,8 +1999,8 @@ elm_image_resizable_get(const Evas_Object *obj, Eina_Bool *size_up, Eina_Bool *s
{
ELM_IMAGE_CHECK(obj);
ELM_IMAGE_DATA_GET(obj, sd);
- if (size_up) *size_up = sd->resize_up;
- if (size_down) *size_down = sd->resize_down;
+ if (size_up) *size_up = sd->scale_up;
+ if (size_down) *size_down = sd->scale_down;
}
EAPI void
@@ -1971,6 +2014,14 @@ elm_image_fill_inside_set(Evas_Object *obj, Eina_Bool fill_inside)
sd->fill_inside = fill_inside;
+ if (sd->aspect_fixed)
+ {
+ if (sd->fill_inside) sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_INSIDE;
+ else sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_OUTSIDE;
+ }
+ else
+ sd->scale_type = ELM_IMAGE_SCALE_TYPE_FILL;
+
_elm_image_internal_sizing_eval(obj, sd);
}
@@ -1992,6 +2043,14 @@ elm_image_aspect_fixed_set(Evas_Object *obj, Eina_Bool fixed)
sd->aspect_fixed = fixed;
+ if (sd->aspect_fixed)
+ {
+ if (sd->fill_inside) sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_INSIDE;
+ else sd->scale_type = ELM_IMAGE_SCALE_TYPE_FIT_OUTSIDE;
+ }
+ else
+ sd->scale_type = ELM_IMAGE_SCALE_TYPE_FILL;
+
_elm_image_internal_sizing_eval(obj, sd);
}
diff --git a/src/lib/elementary/elm_widget_image.h b/src/lib/elementary/elm_widget_image.h
index 271570f881..e0ece1a445 100644
--- a/src/lib/elementary/elm_widget_image.h
+++ b/src/lib/elementary/elm_widget_image.h
@@ -73,6 +73,7 @@ struct _Elm_Image_Data
} async;
Elm_Image_Preload_Status preload_status;
+ Elm_Image_Scale_Type scale_type;
const char *stdicon;
@@ -96,6 +97,8 @@ struct _Elm_Image_Data
Eina_Bool async_enable : 1;
Eina_Bool async_opening : 1;
Eina_Bool async_failed : 1;
+ Eina_Bool scale_up : 1;
+ Eina_Bool scale_down : 1;
};
/**