lib/efl/interfaces/efl_gfx_filter.eo \
lib/efl/interfaces/efl_model_base.eo \
lib/efl/interfaces/efl_animator.eo \
+ lib/efl/interfaces/efl_orientation.eo \
+ lib/efl/interfaces/efl_flip.eo \
lib/efl/interfaces/efl_vpath.eo \
lib/efl/interfaces/efl_vpath_manager.eo \
lib/efl/interfaces/efl_vpath_file.eo \
/evas_images2
/evas_images3
/evas_images4
+/evas_images5
/evas_init_shutdown
/evas_object_manipulation
/evas_object_manipulation-eo
evas_images4_LDADD = $(ECORE_EVAS_COMMON_LDADD)
evas_images4_CPPFLAGS = $(ECORE_EVAS_COMMON_CPPFLAGS)
+EXTRA_PROGRAMS += evas_images5
+evas_images5_SOURCES = evas-images5.c
+evas_images5_LDADD = $(ECORE_EVAS_COMMON_LDADD)
+evas_images5_CPPFLAGS = $(ECORE_EVAS_COMMON_CPPFLAGS)
+
EXTRA_PROGRAMS += evas_text
evas_text_SOURCES = evas-text.c
evas_text_LDADD = $(ECORE_EVAS_COMMON_LDADD)
evas-images2.c \
evas-images3.c \
evas-images4.c \
+evas-images5.c \
evas-init-shutdown.c \
evas-map-utils.c \
evas-map-aa.c \
evas-images2 \
evas-images3 \
evas-images4 \
+ evas-images5 \
evas-init-shutdown \
evas-map-utils \
evas-object-manipulation \
--- /dev/null
+/**
+ * Simple Evas example illustrating some image objects functions
+ *
+ * You'll need at least one engine built for it (excluding the buffer
+ * one) and the png image loader/saver also built. See stdout/stderr
+ * for output.
+ *
+ * @verbatim
+ * gcc -o evas-images5 evas-images5.c `pkg-config --libs --cflags evas ecore ecore-evas efl`
+ * @endverbatim
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#else
+#define PACKAGE_EXAMPLES_DIR "."
+#endif
+
+#define EFL_BETA_API_SUPPORT
+
+#include <Ecore.h>
+#include <Ecore_Evas.h>
+#include <stdio.h>
+#include <errno.h>
+#include <Efl.h>
+#include "evas-common.h"
+
+#define WIDTH (320)
+#define HEIGHT (240)
+
+static const char *img_path = PACKAGE_EXAMPLES_DIR EVAS_IMAGE_FOLDER "/im1.png";
+static const char *commands = \
+ "commands are:\n"
+ "\tp - print image fill property\n"
+ "\t0 - rotate by 0\n"
+ "\t1 - rotate by 90\n"
+ "\t2 - rotate by 180\n"
+ "\t3 - rotate by 270\n"
+ "\t4 - flip horizontal\n"
+ "\t5 - flip vertical\n"
+ "\t6 - flip none\n"
+ "\ts - save noise image to disk (/tmp dir)\n"
+ "\th - print help\n";
+
+const char *file_path = "/tmp/evas-images4-example.png";
+const char *quality_str = "quality=100";
+
+struct test_data
+{
+ Ecore_Evas *ee;
+ Evas *evas;
+ Evas_Object *bg, *img;
+};
+
+static struct test_data d = {0};
+
+static void
+_on_destroy(Ecore_Evas *ee EINA_UNUSED)
+{
+ ecore_main_loop_quit();
+}
+
+/* here just to keep our example's window size and background image's
+ * size in synchrony */
+static void
+_canvas_resize_cb(Ecore_Evas *ee)
+{
+ int w, h;
+
+ ecore_evas_geometry_get(ee, NULL, NULL, &w, &h);
+ evas_object_resize(d.bg, w, h);
+}
+
+static void
+_on_keydown(void *data EINA_UNUSED,
+ Evas *evas EINA_UNUSED,
+ Evas_Object *o EINA_UNUSED,
+ void *einfo)
+{
+ Evas_Event_Key_Down *ev = einfo;
+
+ if (strcmp(ev->key, "h") == 0) /* print help */
+ {
+ puts(commands);
+ return;
+ }
+
+ if (strcmp(ev->key, "s") == 0) /* save noise image to disk */
+ {
+ if (!evas_object_image_save(d.img, file_path, NULL, quality_str))
+ fprintf(stderr, "Cannot save image to '%s' (flags '%s')\n",
+ file_path, quality_str);
+ else
+ fprintf(stdout, "Image saved to '%s' (flags '%s'), check it out with "
+ "an image viewer\n", file_path, quality_str);
+
+ return;
+ }
+
+ if (strcmp(ev->key, "p") == 0) /* print image size*/
+ {
+ Evas_Coord w, h;
+
+ evas_object_image_size_get(d.img, &w, &h);
+ fprintf(stdout, "Image has size set to: w=%d, h=%d\n", w, h);
+ return;
+ }
+
+ int key_val = ev->key[0] - '0';
+
+ switch (key_val)
+ {
+ case 0:
+ efl_orientation_set(d.img, EFL_ORIENT_0);
+ break;
+ case 1:
+ efl_orientation_set(d.img, EFL_ORIENT_90);
+ break;
+ case 2:
+ efl_orientation_set(d.img, EFL_ORIENT_180);
+ break;
+ case 3:
+ efl_orientation_set(d.img, EFL_ORIENT_270);
+ break;
+ case 4:
+ efl_flip_set(d.img, EFL_FLIP_HORIZONTAL);
+ break;
+ case 5:
+ efl_flip_set(d.img, EFL_FLIP_VERTICAL);
+ break;
+ case 6:
+ efl_flip_set(d.img, EFL_FLIP_NONE);
+ break;
+ }
+}
+
+int
+main(void)
+{
+ int err;
+
+ if (!ecore_evas_init())
+ return EXIT_FAILURE;
+
+ /* this will give you a window with an Evas canvas under the first
+ * engine available */
+ d.ee = ecore_evas_new(NULL, 10, 10, WIDTH, HEIGHT, NULL);
+ if (!d.ee)
+ goto error;
+
+ ecore_evas_callback_destroy_set(d.ee, _on_destroy);
+ ecore_evas_callback_resize_set(d.ee, _canvas_resize_cb);
+ ecore_evas_show(d.ee);
+
+ /* the canvas pointer, de facto */
+ d.evas = ecore_evas_get(d.ee);
+
+ d.bg = evas_object_rectangle_add(d.evas);
+ evas_object_color_set(d.bg, 255, 255, 255, 255); /* white bg */
+ evas_object_move(d.bg, 0, 0); /* at canvas' origin */
+ evas_object_resize(d.bg, WIDTH, HEIGHT); /* covers full canvas */
+ evas_object_show(d.bg);
+
+ d.img = evas_object_image_add(d.evas);
+ evas_object_image_file_set(d.img, img_path, NULL);
+ err = evas_object_image_load_error_get(d.img);
+ if (err != EVAS_LOAD_ERROR_NONE)
+ {
+ fprintf(stderr, "could not load image '%s'. error string is \"%s\"\n",
+ img_path, evas_load_error_str(err));
+ }
+ else
+ {
+ fprintf(stdout,
+ "loaded image '%s' with succes! error string is \"%s\"\n",
+ img_path, evas_load_error_str(err));
+
+ evas_object_move(d.img, WIDTH / 2, HEIGHT / 2);
+ evas_object_image_fill_set(d.img, 0, 0, WIDTH / 2, HEIGHT / 2);
+ evas_object_resize(d.img, WIDTH / 2, HEIGHT / 2);
+ evas_object_show(d.img);
+
+ evas_object_focus_set(d.bg, EINA_TRUE);
+ evas_object_event_callback_add(
+ d.bg, EVAS_CALLBACK_KEY_DOWN, _on_keydown, NULL);
+ }
+
+ puts(commands);
+ ecore_main_loop_begin();
+
+ ecore_evas_free(d.ee);
+ ecore_evas_shutdown();
+ return 0;
+
+error:
+ fprintf(stderr, "you got to have at least one evas engine built and linked"
+ " up to ecore-evas for this example to run properly.\n");
+ ecore_evas_shutdown();
+ return -1;
+}
#include "interfaces/efl_player.eo.h"
#include "interfaces/efl_text.eo.h"
#include "interfaces/efl_text_properties.eo.h"
+#include "interfaces/efl_orientation.eo.h"
+#include "interfaces/efl_flip.eo.h"
/* Core interface */
#include "interfaces/efl_animator.eo.h"
--- /dev/null
+enum Efl.Flip_Value
+{
+ [[Flip
+
+ See also @Efl.Flip
+ ]]
+ legacy: efl;
+ flip_none = 0, [[no flip]]
+ flip_horizontal = 1, [[flip image horizontally]]
+ flip_vertical = 2 [[flip image vertically]]
+}
+
+interface Efl.Flip
+{
+ legacy_prefix: null;
+ methods {
+ @property flip{
+ [[Control the flip of the given image
+
+ Use this function to change how your image is to be
+ flipped: vertically or horizontally or transpose
+ or traverse]]
+ set {
+ }
+ get {
+ }
+ values {
+ flip: Efl.Flip_Value; [[Flip]]
+ }
+ }
+ }
+}
solid = 2 [[Image's center region is to be made solid, even if it has transparency on it]]
}
-enum Efl.Gfx.Orientation
-{
- [[Orientation options for $Efl.Image.orientation
- @since 1.14]]
- /* FIXME: legacy: evas_image; */
- orient_none = 0, [[no orientation change]]
- orient_0 = 0, [[no orientation change]]
- orient_90 = 1, [[orient 90 degrees clockwise]]
- orient_180 = 2, [[orient 180 degrees clockwise]]
- orient_270 = 3, [[rotate 90 degrees counter-clockwise (i.e. 270 degrees clockwise)]]
- flip_horizontal = 4, [[flip image horizontally]]
- flip_vertical = 5, [[flip image vertically]]
- flip_transpose = 6, [[flip image along the y = (width - x) line (bottom-left to top-right)]]
- flip_transverse = 7 [[flip image along the y = x line (top-left to bottom-right)]]
-}
ratio: double; [[The image's ratio.]]
}
}
- @property orientation {
- [[The image orientation allows rotating and flipping the image
- at render time.
-
- Default is @Efl.Gfx.Orientation.orient_none
-
- @since 1.14
- ]]
- set {}
- get {}
- values {
- orient: Efl.Gfx.Orientation;
- }
- }
-
@property border {
[[Dimensions of this image's border, a region that does not scale
with the center area.
#include "interfaces/efl_model_base.eo.c"
#include "interfaces/efl_animator.eo.c"
+#include "interfaces/efl_orientation.eo.c"
+#include "interfaces/efl_flip.eo.c"
--- /dev/null
+enum Efl.Orient
+{
+ [[Orientation
+
+ See also @Efl.Orientation
+ ]]
+ legacy: efl;
+ orient_none = 0,
+ orient_0 = 0, [[no orientation change]]
+ orient_90 = 90, [[orient 90 degrees clockwise]]
+ orient_180 = 180, [[orient 180 degrees clockwise]]
+ orient_270 = 270, [[rotate 90 degrees counter-clockwise (i.e. 270 degrees clockwise)]]
+ orient_up = 0, [[orient up]]
+ orient_right = 90, [[orient right]]
+ orient_down = 180, [[orient down]]
+ orient_left = 270, [[orient left]]
+ orient_vertical = 0, [[orient vertical]]
+ orient_horizontal = 90 [[orient horizontal]]
+
+}
+
+interface Efl.Orientation
+{
+ legacy_prefix: null;
+ methods {
+ @property orientation{
+ [[Control the orientation of a given widget
+
+ Use this function to change how your widget is to be
+ disposed: vertically or horizontally or inverted vertically
+ or inverted horizontally]]
+ set {
+ }
+ get {
+ }
+ values {
+ dir: Efl.Orient; [[Direction]]
+ }
+ }
+ }
+}
}
EOLIAN static void
-_elm_image_efl_image_orientation_set(Eo *obj, Elm_Image_Data *sd, Efl_Gfx_Orientation orient)
+_elm_image_efl_orientation_orientation_set(Eo *obj, Elm_Image_Data *sd, Efl_Orient orient)
{
if (sd->edje) return;
if (sd->orient == orient) return;
- evas_object_image_orient_set(sd->img, (Evas_Image_Orient) orient);
+ efl_orientation_set(sd->img, orient);
+
sd->orient = orient;
_elm_image_internal_sizing_eval(obj, sd);
}
-EOLIAN static Efl_Gfx_Orientation
-_elm_image_efl_image_orientation_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd)
+EOLIAN static Efl_Orient
+_elm_image_efl_orientation_orientation_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd)
{
return sd->orient;
}
+
+EOLIAN static void
+_elm_image_efl_flip_flip_set(Eo *obj, Elm_Image_Data *sd, Efl_Flip_Value flip)
+{
+ if (sd->edje) return;
+ if (sd->flip == flip) return;
+
+ efl_flip_set(sd->img, flip);
+
+ sd->flip = flip;
+ _elm_image_internal_sizing_eval(obj, sd);
+}
+
+EOLIAN static Efl_Flip_Value
+_elm_image_efl_flip_flip_get(Eo *obj EINA_UNUSED, Elm_Image_Data *sd)
+{
+ return sd->flip;
+}
+
/**
* Turns on editing through drag and drop and copy and paste.
*/
EAPI void
elm_image_orient_set(Evas_Object *obj, Elm_Image_Orient orient)
{
- efl_image_orientation_set(obj, (Efl_Gfx_Orientation) orient);
+ Efl_Orient dir;
+ Efl_Flip_Value flip;
+
+ ELM_IMAGE_DATA_GET(obj, sd);
+ sd->image_orient = orient;
+
+ switch (orient)
+ {
+ case EVAS_IMAGE_ORIENT_0:
+ dir = EFL_ORIENT_0;
+ flip = EFL_FLIP_NONE;
+ break;
+ case EVAS_IMAGE_ORIENT_90:
+ dir = EFL_ORIENT_90;
+ flip = EFL_FLIP_NONE;
+ break;
+ case EVAS_IMAGE_ORIENT_180:
+ dir = EFL_ORIENT_180;
+ flip = EFL_FLIP_NONE;
+ break;
+ case EVAS_IMAGE_ORIENT_270:
+ dir = EFL_ORIENT_270;
+ flip = EFL_FLIP_NONE;
+ break;
+ case EVAS_IMAGE_FLIP_HORIZONTAL:
+ dir = EFL_ORIENT_0;
+ flip = EFL_FLIP_HORIZONTAL;
+ break;
+ case EVAS_IMAGE_FLIP_VERTICAL:
+ dir = EFL_ORIENT_0;
+ flip = EFL_FLIP_VERTICAL;
+ break;
+ case EVAS_IMAGE_FLIP_TRANSVERSE:
+ dir = EFL_ORIENT_270;
+ flip = EFL_FLIP_HORIZONTAL;
+ break;
+ case EVAS_IMAGE_FLIP_TRANSPOSE:
+ dir = EFL_ORIENT_270;
+ flip = EFL_FLIP_VERTICAL;
+ break;
+ default:
+ dir = EFL_ORIENT_0;
+ flip = EFL_FLIP_NONE;
+ break;
+ }
+
+ efl_orientation_set(obj, dir);
+ efl_flip_set(obj, flip);
}
EAPI Elm_Image_Orient
elm_image_orient_get(const Evas_Object *obj)
{
- return (Elm_Image_Orient) efl_image_orientation_get(obj);
+ ELM_IMAGE_CHECK(obj) EVAS_IMAGE_ORIENT_NONE;
+ ELM_IMAGE_DATA_GET(obj, sd);
+
+ return sd->image_orient;
}
EAPI Evas_Object*
class Elm.Image (Elm.Widget, Evas.Clickable_Interface, Evas.Draggable_Interface,
Efl.File, Efl.Image, Efl.Image_Load, Efl.Player, Efl.Gfx.View, Efl.Player,
Elm.Interface_Atspi_Image, Elm.Interface_Atspi_Widget_Action,
- Edje.Object)
+ Edje.Object, Efl.Orientation, Efl.Flip)
{
eo_prefix: elm_obj_image;
methods {
Efl.Image_Load.load_size.get;
Efl.Image.smooth_scale.set;
Efl.Image.smooth_scale.get;
- Efl.Image.orientation.set;
- Efl.Image.orientation.get;
+ Efl.Orientation.orientation.set;
+ Efl.Orientation.orientation.get;
+ Efl.Flip.flip.set;
+ Efl.Flip.flip.get;
Efl.Player.playable.get;
Efl.Player.play.set;
Efl.Player.play.get;
int frame_count;
int cur_frame;
- Efl_Gfx_Orientation orient;
+ Elm_Image_Orient image_orient; // to support EAPI
+ Efl_Orient orient;
+ Efl_Flip_Value flip;
struct {
Ecore_Thread *th;
type @extern Evas_Object_Image_Pixels_Get_Cb: __undefined_type; /* FIXME: func pointers are not supported. */
class Evas.Image (Evas.Object, Evas.Filter,
- Efl.Image, Efl.Gfx.Buffer, Efl.Gfx.Fill, Efl.Gfx.View, Efl.File)
+ Efl.Image, Efl.Gfx.Buffer, Efl.Gfx.Fill, Efl.Gfx.View, Efl.File,
+ Efl.Orientation, Efl.Flip)
{
/* Legacy is implement inside Efl.Canvas.Image */
legacy_prefix: evas_object_image;
Eo.Base.dbg_info_get;
Eo.Base.finalize;
Efl.File.save;
- Efl.Image.orientation.get;
- Efl.Image.orientation.set;
+ Efl.Orientation.orientation.get;
+ Efl.Orientation.orientation.set;
+ Efl.Flip.flip.set;
+ Efl.Flip.flip.get;
Efl.Image.smooth_scale.set;
Efl.Image.smooth_scale.get;
Efl.Image.ratio.get;
evas_object_image_orient_set(Evas_Object *obj, Evas_Image_Orient orient)
{
EVAS_IMAGE_API(obj);
- efl_image_orientation_set(obj, (Efl_Gfx_Orientation) orient);
+
+ Evas_Image_Data *o = eo_data_scope_get(obj, EVAS_IMAGE_CLASS);
+ _evas_image_orientation_set(obj, o, orient);
}
EAPI Evas_Image_Orient
evas_object_image_orient_get(const Evas_Object *obj)
{
EVAS_IMAGE_API(obj, EVAS_IMAGE_ORIENT_NONE);
- return (Evas_Image_Orient) efl_image_orientation_get(obj);
+
+ Evas_Image_Data *o = eo_data_scope_get(obj, EVAS_IMAGE_CLASS);
+
+ return o->cur->orient;
}
EAPI void
Efl_Image_Scale_Hint scale_hint;
Efl_Image_Content_Hint content_hint;
+ Efl_Flip_Value flip_value;
+ Efl_Orient orient_value;
Eina_Bool changed : 1;
Eina_Bool dirty_pixels : 1;
void _evas_image_load_orientation_set(Eo *eo_obj, Eina_Bool enable);
Eina_Bool _evas_image_load_orientation_get(const Eo *eo_obj);
Eina_Bool _evas_image_load_region_support_get(const Eo *eo_obj);
+void _evas_image_orientation_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Image_Orient orient);
/* Efl.Image.Animated */
Eina_Bool _evas_image_animated_get(const Eo *eo_obj);
evas_object_change(eo_obj, obj);
}
-EOLIAN static void
-_evas_image_efl_image_orientation_set(Eo *eo_obj, Evas_Image_Data *o, Efl_Gfx_Orientation _orient)
+void
+_evas_image_orientation_set(Eo *eo_obj, Evas_Image_Data *o, Evas_Image_Orient orient)
{
Evas_Object_Protected_Data *obj = eo_data_scope_get(eo_obj, EVAS_OBJECT_CLASS);
- Evas_Image_Orient orient = (Evas_Image_Orient) _orient;
int iw, ih;
if (o->cur->orient == orient) return;
evas_object_change(eo_obj, obj);
}
-EOLIAN static Efl_Gfx_Orientation
-_evas_image_efl_image_orientation_get(Eo *eo_obj EINA_UNUSED, Evas_Image_Data *o)
+static Evas_Image_Orient
+_get_image_orient_from_orient_flip(Efl_Orient orient, Efl_Flip_Value flip)
+{
+ switch (orient)
+ {
+ case EFL_ORIENT_0:
+ if (flip == EFL_FLIP_HORIZONTAL)
+ return EVAS_IMAGE_FLIP_HORIZONTAL;
+ else if (flip == EFL_FLIP_VERTICAL)
+ return EVAS_IMAGE_FLIP_VERTICAL;
+ else
+ return EVAS_IMAGE_ORIENT_0;
+ case EFL_ORIENT_90:
+ if (flip == EFL_FLIP_HORIZONTAL)
+ return EVAS_IMAGE_FLIP_TRANSPOSE;
+ else if (flip == EFL_FLIP_VERTICAL)
+ return EVAS_IMAGE_FLIP_TRANSVERSE;
+ else
+ return EVAS_IMAGE_ORIENT_90;
+ case EFL_ORIENT_180:
+ if (flip == EFL_FLIP_HORIZONTAL)
+ return EVAS_IMAGE_FLIP_VERTICAL;
+ else if (flip == EFL_FLIP_VERTICAL)
+ return EVAS_IMAGE_FLIP_HORIZONTAL;
+ else
+ return EVAS_IMAGE_ORIENT_180;
+ case EFL_ORIENT_270:
+ if (flip == EFL_FLIP_HORIZONTAL)
+ return EVAS_IMAGE_FLIP_TRANSVERSE;
+ else if (flip == EFL_FLIP_VERTICAL)
+ return EVAS_IMAGE_FLIP_TRANSPOSE;
+ else
+ return EVAS_IMAGE_ORIENT_270;
+ default:
+ return EVAS_IMAGE_ORIENT_NONE;
+ }
+}
+
+EOLIAN static void
+_evas_image_efl_orientation_orientation_set(Eo *obj, Evas_Image_Data *o, Efl_Orient dir)
+{
+ Evas_Image_Orient orient;
+
+ o->orient_value = dir;
+ orient = _get_image_orient_from_orient_flip(dir, o->flip_value);
+
+ _evas_image_orientation_set(obj, o, orient);
+}
+
+EOLIAN static Efl_Orient
+_evas_image_efl_orientation_orientation_get(Eo *obj EINA_UNUSED, Evas_Image_Data *o)
+{
+ return o->orient_value;
+}
+
+EOLIAN static void
+_evas_image_efl_flip_flip_set(Eo *obj, Evas_Image_Data *o, Efl_Flip_Value flip)
+{
+ Evas_Image_Orient orient;
+
+ o->flip_value = flip;
+ orient = _get_image_orient_from_orient_flip(o->orient_value, flip);
+
+ _evas_image_orientation_set(obj, o, orient);
+}
+
+EOLIAN static Efl_Flip_Value
+_evas_image_efl_flip_flip_get(Eo *obj EINA_UNUSED, Evas_Image_Data *o)
{
- return (Efl_Gfx_Orientation) o->cur->orient;
+ return o->flip_value;
}
EOLIAN static void