From 643624fe59842eae2b51ece1b022f6cf5d4e5788 Mon Sep 17 00:00:00 2001 From: Gustavo Sverzut Barbieri Date: Fri, 12 Dec 2008 22:36:47 +0000 Subject: [PATCH] helper: evas_object_image_filled. This helper will take care of applying fill property to match object size. SVN revision: 38120 --- legacy/evas/src/lib/Evas.h | 4 + .../evas/src/lib/canvas/evas_object_image.c | 97 +++++++++++++++++++ 2 files changed, 101 insertions(+) diff --git a/legacy/evas/src/lib/Evas.h b/legacy/evas/src/lib/Evas.h index ab097431b2..4f5955a52c 100644 --- a/legacy/evas/src/lib/Evas.h +++ b/legacy/evas/src/lib/Evas.h @@ -503,12 +503,16 @@ extern "C" { /* image objects */ EAPI Evas_Object *evas_object_image_add (Evas *e); + EAPI Evas_Object *evas_object_image_filled_add (Evas *e); + EAPI void evas_object_image_file_set (Evas_Object *obj, const char *file, const char *key); EAPI void evas_object_image_file_get (const Evas_Object *obj, const char **file, const char **key); EAPI void evas_object_image_border_set (Evas_Object *obj, int l, int r, int t, int b); EAPI void evas_object_image_border_get (const Evas_Object *obj, int *l, int *r, int *t, int *b); EAPI void evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Bool fill); EAPI Evas_Bool evas_object_image_border_center_fill_get(const Evas_Object *obj); + EAPI void evas_object_image_filled_set (Evas_Object *obj, Evas_Bool setting); + EAPI Evas_Bool evas_object_image_filled_get (const Evas_Object *obj); EAPI void evas_object_image_fill_set (Evas_Object *obj, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); EAPI void evas_object_image_fill_get (const Evas_Object *obj, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); EAPI void evas_object_image_fill_spread_set (Evas_Object *obj, int tile_mode); diff --git a/legacy/evas/src/lib/canvas/evas_object_image.c b/legacy/evas/src/lib/canvas/evas_object_image.c index 3a71cd06a3..e643f52710 100644 --- a/legacy/evas/src/lib/canvas/evas_object_image.c +++ b/legacy/evas/src/lib/canvas/evas_object_image.c @@ -57,6 +57,7 @@ struct _Evas_Object_Image unsigned char changed : 1; unsigned char dirty_pixels : 1; + unsigned char filled : 1; }; /* private methods for image objects */ @@ -81,6 +82,7 @@ static int evas_object_image_was_opaque(Evas_Object *obj); static int evas_object_image_is_inside(Evas_Object *obj, Evas_Coord x, Evas_Coord y); static void *evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_Colorspace to_cspace); +static void evas_object_image_filled_resize_listener(void *data, Evas *e, Evas_Object *obj, void *einfo); static const Evas_Object_Func object_func = { @@ -211,6 +213,26 @@ evas_object_image_add(Evas *e) return obj; } +/** + * Creates a new image object that automatically scales on the given evas. + * + * This is a helper around evas_object_image_add() and + * evas_object_image_filled_set(), it will track object resizes and apply + * evas_object_image_fill_set() with the new geometry. + * + * @see evas_object_image_add() + * @see evas_object_image_filled_set() + * @see evas_object_image_fill_set() + */ +EAPI Evas_Object * +evas_object_image_filled_add(Evas *e) +{ + Evas_Object *obj; + obj = evas_object_image_add(e); + evas_object_image_filled_set(obj, 1); + return obj; +} + /** * Sets the filename and key of the given image object. * @@ -439,6 +461,73 @@ evas_object_image_border_center_fill_set(Evas_Object *obj, Evas_Bool fill) evas_object_change(obj); } +/** + * Retrieves if image fill property is tracking object size. + * + * @param obj The given image object. + * @return 1 if it is tracking, 0 if not and evas_object_fill_set() + * must be called manually. + */ +EAPI Evas_Bool +evas_object_image_filled_get(const Evas_Object *obj) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return 0; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return 0; + MAGIC_CHECK_END(); + + return o->filled; +} + +/** + * Sets if image fill property should track object size. + * + * If set to true, then every evas_object_resize() will automatically + * trigger call to evas_object_image_fill_set() with the new size so + * image will fill the whole object area. + * + * @param obj The given image object. + * @param setting whether to follow object size. + * + * @see evas_object_image_filled_add() + * @see evas_object_image_fill_set() + */ +EAPI void +evas_object_image_filled_set(Evas_Object *obj, Evas_Bool setting) +{ + Evas_Object_Image *o; + + MAGIC_CHECK(obj, Evas_Object, MAGIC_OBJ); + return; + MAGIC_CHECK_END(); + o = (Evas_Object_Image *)(obj->object_data); + MAGIC_CHECK(o, Evas_Object_Image, MAGIC_OBJ_IMAGE); + return; + MAGIC_CHECK_END(); + + setting = !!setting; + if (o->filled == setting) return; + + o->filled = setting; + if (!o->filled) + evas_object_event_callback_del(obj, EVAS_CALLBACK_RESIZE, evas_object_image_filled_resize_listener); + else + { + Evas_Coord w, h; + + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_image_fill_set(obj, 0, 0, w, h); + + evas_object_event_callback_add(obj, EVAS_CALLBACK_RESIZE, evas_object_image_filled_resize_listener, NULL); + } +} + + /** * Retrieves if the center of the given image object is to be drawn * or not. @@ -2607,3 +2696,11 @@ evas_object_image_data_convert_internal(Evas_Object_Image *o, void *data, Evas_C return out; } + +static void +evas_object_image_filled_resize_listener(void *data, Evas *e, Evas_Object *obj, void *einfo) +{ + Evas_Coord w, h; + evas_object_geometry_get(obj, NULL, NULL, &w, &h); + evas_object_image_fill_set(obj, 0, 0, w, h); +}