class Elm_Image (Elm_Widget, Efl.File, Efl.Image, Evas.Clickable_Interface,
                 Edje.Object,
                 Elm_Interface_Atspi_Image, Elm_Interface_Atspi_Widget_Action)
{
   eo_prefix: elm_obj_image;
   properties {
      editable {
         set {
            /*@
            @brief Make the image 'editable'.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This means the image is a valid drag target for drag and drop, and can be
            cut or pasted too.

            @ingroup Image */
         }
         get {
            /*@
            @brief Check if the image is 'editable'.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return Editability.

            @remark A return value of EINA_TRUE means the image is a valid drag target
            for drag and drop, and can be cut or pasted too.

            @ingroup Image */
         }
         values {
            bool set; /*@ Turn on or off editability. Default is @c EINA_FALSE. */
         }
      }
      resize_down {
         set {
            /*@
              @brief Set whether the object's image can be resized to a size smaller than the original one.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         get {
            /*@
              @brief Get whether the object's image can be resized to a size smaller than the original one.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         values {
            bool resize_down; /*@ whether resizing down is allowed */
         }
      }
      animated_play {
         set {
            /*@
            @brief Start or stop an image object's animation.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark To actually start playing any image object's animation, if it
            supports it, one must do something like:

            @code
            if (elm_image_animated_available_get(img))
            {
            elm_image_animated_set(img, EINA_TRUE);
            elm_image_animated_play_set(img, EINA_TRUE);
            }
            @endcode

            @remark elm_image_animated_set() will enable animation on the image, <b>but
            not start it yet</b>. This is the function one uses to start and
            stop animations on image objects.

            @see elm_image_animated_available_get()
            @see elm_image_animated_set()
            @see elm_image_animated_play_get()

            @ingroup Image
            @since 1.7 */
         }
         get {
            /*@
            @brief Get whether an image object is under animation or not.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE, if the image is being animated, @c EINA_FALSE
            otherwise.

            @see elm_image_animated_play_get()

            @ingroup Image
            @since 1.7 */
         }
         values {
            bool play; /*@ @c EINA_TRUE to start the animation, @c EINA_FALSE
            otherwise. Default is @c EINA_FALSE. */
         }
      }
      resize_up {
         set {
            /*@
              Set whether the object's image can be resized to a size larget than the original one.

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         get {
            /*@
              Get whether the object's image can be resized to a size larget than the original one.

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         values {
            bool resize_up; /*@ whether resizing up is allowed */
         }
      }
      smooth {
         set {
            /*@
            @brief Set the smooth effect for an image.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark Set the scaling algorithm to be used when scaling the image. Smooth
            scaling provides a better resulting image, but is slower.

            @remark The smooth scaling should be disabled when making animations that change
            the image size, since it will be faster. Animations that don't require
            resizing of the image can keep the smooth scaling enabled (even if the
            image is already scaled, since the scaled image will be cached).

            @see elm_image_smooth_get()

            @ingroup Image */
         }
         get {
            /*@
            @brief Get the smooth effect for an image.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if smooth scaling is enabled, @c EINA_FALSE otherwise.

            @see elm_image_smooth_set()

            @ingroup Image */
         }
         values {
            bool smooth; /*@ @c EINA_TRUE if smooth scaling should be used, @c EINA_FALSE
            otherwise. Default is @c EINA_TRUE. */
         }
      }
      no_scale {
         set {
            /*@
            @brief Disable scaling of this object.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This function disables scaling of the elm_image widget through the
            function elm_object_scale_set(). However, this does not affect the widget
            size/resize in any way. For that effect, take a look at
            elm_image_resizable_set().

            @see elm_image_no_scale_get()
            @see elm_image_resizable_set()
            @see elm_object_scale_set()

            @ingroup Image */
         }
         get {
            /*@
            @brief Get whether scaling is disabled on the object.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if scaling is disabled, @c EINA_FALSE otherwise

            @see elm_image_no_scale_set()

            @ingroup Image */
         }
         values {
            bool no_scale; /*@ @c EINA_TRUE if the object is not scalable, @c EINA_FALSE
            otherwise. Default is @c EINA_FALSE. */
         }
      }
      animated {
         set {
            /*@
            @brief Set whether an image object (which supports animation) is to
            animate itself or not.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark An image object, even if it supports animation, will be displayed
            by default without animation. Call this function with @a animated
            set to @c EINA_TRUE to enable its animation. To start or stop the
            animation, actually, use elm_image_animated_play_set().

            @see elm_image_animated_get()
            @see elm_image_animated_available_get()
            @see elm_image_animated_play_set()

            @ingroup Image
            @since 1.7 */
         }
         get {
            /*@
            @brief Get whether an image object has animation enabled or not.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if the image has animation enabled,
            @c EINA_FALSE otherwise.

            @see elm_image_animated_set()

            @ingroup Image
            @since 1.7 */
         }
         values {
            bool anim; /*@ @c EINA_TRUE if the object is to animate itself,
            @c EINA_FALSE otherwise. Default is @c EINA_FALSE. */
         }
      }
      scale {
         set {
            /*@
              Set the scale of the object's image.

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         get {
            /*@
              Get the scale of the object's image.

              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         values {
            double scale; /*@ Object's image scale. */
         }
      }
      fill_inside {
         set {
            /*@
              Set the resize method for the object's internal image when maintaining a given aspect ratio.

              If @p fill_inside is true, image does not overflow the widget and
              blank spaces are added to fill the space that is still free. If it
              is false, the image overflows the image will fill all space and
              overflow in its larger dimension.

              You can think of it as "fill: inside" or "fill: outside" and not as
              "fill the inside".

              @see elm_image_fill_inside_get()
              @see elm_image_fill_outside_get()
              @see elm_image_fill_outside_set()
              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         get {
            /*@
              Set the resize method for the object's internal image when maintaining a given aspect ratio.

              @see elm_image_fill_inside_set()
              @see elm_image_fill_outside_get()
              @see elm_image_fill_outside_set()
              @ingroup Image
              @since 1.7
             */
            legacy: null;
         }
         values {
            bool fill_inside; /*@ Resize method for the object's internal image. */
         }
      }
      aspect_fixed {
         set {
            /*@
            @brief Set whether the original aspect ratio of the image should be kept on resize.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark The original aspect ratio (width / height) of the image is usually
            distorted to match the object's size. Enabling this option will retain
            this original aspect, and the way that the image is fit into the object's
            area depends on the option set by elm_image_fill_outside_set().

            @see elm_image_aspect_fixed_get()
            @see elm_image_fill_outside_set()

            @ingroup Image */
         }
         get {
            /*@
            @brief Get if the object retains the original aspect ratio.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if the object keeps the original aspect, @c EINA_FALSE
            otherwise.

            @ingroup Image */
         }
         values {
            bool fixed; /*@ @c EINA_TRUE if the image should retain the aspect,
            @c EINA_FALSE otherwise. */
         }
      }
      orient {
         set {
            /*@
            @brief Set the image orientation.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This function allows to rotate or flip the given image.

            @see elm_image_orient_get()
            @see @ref Elm_Image_Orient

            @ingroup Image */
         }
         get {
            /*@
            @brief Get the image orientation.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return The image orientation @ref Elm_Image_Orient

            @see elm_image_orient_set()
            @see @ref Elm_Image_Orient

            @ingroup Image */
         }
         values {
            Elm_Image_Orient orient; /*@ The image orientation @ref Elm_Image_Orient
            Default is #ELM_IMAGE_ORIENT_NONE. */
         }
      }
      fill_outside {
         set {
            /*@
            @brief Set if the image fills the entire object area, when keeping the aspect ratio.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark When the image should keep its aspect ratio even if resized to another
            aspect ratio, there are two possibilities to resize it: keep the entire
            image inside the limits of height and width of the object (@p fill_outside
            is @c EINA_FALSE) or let the extra width or height go outside of the object,
            and the image will fill the entire object (@p fill_outside is @c EINA_TRUE).

            @remark This option will have no effect if
            elm_image_aspect_fixed_set() is set to @c EINA_FALSE.

            @see elm_image_fill_inside_get()
            @see elm_image_fill_inside_set()
            @see elm_image_fill_outside_get()
            @see elm_image_aspect_fixed_set()

            @ingroup Image */
         }
         get {
            /*@
            @brief Get if the object is filled outside

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if the object is filled outside, @c EINA_FALSE otherwise.

            @see elm_image_fill_inside_get()
            @see elm_image_fill_inside_set()
            @see elm_image_fill_outside_set()

            @ingroup Image */
         }
         values {
            bool fill_outside; /*@ @c EINA_TRUE if the object is filled outside,
            @c EINA_FALSE otherwise. Default is @c EINA_FALSE. */
         }
      }
      resizable {
         set {
            /*@
            @brief Set if the object is (up/down) resizable.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This function limits the image resize ability. If @p size_up is set to
            @c EINA_FALSE, the object can't have its height or width resized to a value
            higher than the original image size. Same is valid for @p size_down.

            @see elm_image_resizable_get()

            @ingroup Image */
         }
         get {
            /*@
            @brief Get if the object is (up/down) resizable.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @see elm_image_resizable_set()

            @ingroup Image */
         }
         values {
            bool up; /*@ A bool to set if the object is resizable up. Default is
            @c EINA_TRUE. */
            bool down; /*@ A bool to set if the object is resizable down. Default
            is @c EINA_TRUE. */
         }
      }
      preload_disabled {
         set {
            /*@
            @brief Enable or disable preloading of the image

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @ingroup Image */
         }
         values {
            bool disabled; /*@ If EINA_TRUE, preloading will be disabled */
         }
      }
      mmap {
         set {
            /*@
            Set the file that will be used as the image's source.

            @return (@c EINA_TRUE = success, @c EINA_FALSE = error)

            @see elm_image_file_set()

            @note This function will trigger the Edje file case based on the
            extension of the @a file string use to create the Eina_File (expects
            @c ".edj", for this case).

            @note If you use animated gif image and create multiple image objects with
            one gif image file, you should set the @p group differently for each object.
            Or image objects will share one evas image cache entry and you will get
            unwanted frames.

            @ingroup Image */
            return: bool;
            legacy: null;
         }
         values {
            const(Eina_File)* file; /*@ The handler to an Eina_File that will be used as image source */
            const(char)* group; /*@ The group that the image belongs to, in case it's an
            EET (including Edje case) file. This can be used as a key inside
            evas image cache if this is a normal image file not eet file. */
         }
      }
      memfile {
         set {
            /*@
            @brief Set a location in memory to be used as an image object's source
            bitmap.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This function is handy when the contents of an image file are
            mapped in memory, for example.

            @remark The @p format string should be something like @c "png", @c "jpg",
            @c "tga", @c "tiff", @c "bmp" etc, when provided (@c NULL, on the
            contrary). This improves the loader performance as it tries the
            "correct" loader first, before trying a range of other possible
            loaders until one succeeds.

            @return (@c EINA_TRUE = success, @c EINA_FALSE = error)

            @since 1.7

            @ingroup Image */
            return: bool;
         }
         values {
            const(void)* img; /*@ The binary data that will be used as image source */
            size size; /*@ The size of binary data blob @p img */
            const(char)* format; /*@ (Optional) expected format of @p img bytes */
            const(char)* key; /*@ Optional indexing key of @p img to be passed to the
            image loader (eg. if @p img is a memory-mapped EET file) */
         }
      }
      animated_available {
         get {
            /*@
            @brief Get whether an image object supports animation or not.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return @c EINA_TRUE if the image supports animation,
            @c EINA_FALSE otherwise.

            @remark This function returns if this Elementary image object's internal
            image can be animated. Currently Evas only supports GIF
            animation. If the return value is @b EINA_FALSE, other
            @c elm_image_animated_xxx API calls won't work.

            @see elm_image_animated_set()

            @ingroup Image
            @since 1.7 */
            return: bool;
         }
      }
      object {
         get {
            /*@
            @brief Get the inlined image object of the image widget.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @return The inlined image object, or NULL if none exists

            @remark This function allows one to get the underlying @c Evas_Object of type
            Image from this elementary widget. It can be useful to do things like get
            the pixel data, save the image to a file, etc.

            @remark Be careful to not manipulate it, as it is under control of
            elementary.

            @ingroup Image */
            return: Evas_Object *;
         }
      }
      object_size {
         get {
            /*@
            @brief Get the current size of the image.

            @if MOBILE @since_tizen 2.3
            @elseif WEARABLE @since_tizen 2.3.1
            @endif

            @remark This is the real size of the image, not the size of the object.

            @ingroup Image */
         }
         values {
            int w; /*@ Pointer to store width, or NULL. */
            int h; /*@ Pointer to store height, or NULL. */
         }
      }
   }
   methods {
      sizing_eval {
         /*@
           Re-evaluate the object's final geometry.

           @ingroup Image
           @since 1.7 */
         legacy: null;
      }
   }
   implements {
      class.constructor;
      Eo.Base.constructor;
      Efl.File.file.set;
      Efl.File.file.get;
      Efl.File.async.set;
      Efl.File.async.get;
      Efl.File.async_wait;
      Efl.Image.load_size.set;
      Efl.Image.load_size.get;
      Efl.Image.smooth_scale.set;
      Efl.Image.smooth_scale.get;
      Edje.Object.signal_emit;
      Edje.Object.size_min.get;
      Edje.Object.size_max.get;
      Edje.Object.size_min_calc;
      Edje.Object.calc_force;
      Evas.Object_Smart.hide;
      Evas.Object_Smart.clip.set;
      Evas.Object_Smart.clip_unset;
      Evas.Object_Smart.show;
      Evas.Object_Smart.color.set;
      Evas.Object_Smart.move;
      Evas.Object_Smart.add;
      Evas.Object_Smart.del;
      Evas.Object_Smart.member_add;
      Evas.Object_Smart.resize;
      Elm_Widget.theme_apply;
      Elm_Widget.event;
      Elm_Interface_Atspi_Image.extents.get;
      Elm_Interface_Atspi_Widget_Action.elm_actions.get;
   }
   events {
      drop;
      clicked;
      download,start;
      download,progress;
      download,done;
      download,error;
   }

}
