class Elm.Image (Elm.Widget, Efl.File, Efl.Image, Evas.Clickable_Interface,
                 Edje.Object,
                 Elm_Interface_Atspi_Image, Elm_Interface_Atspi_Widget_Action,
                 Efl.Player)
{
   eo_prefix: elm_obj_image;
   methods {
      @property editable {
         [[Contrtol if thhe image is 'editable'.

           This means the image is a valid drag target for drag and drop, and can be
           cut or pasted too.]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            set: bool; [[Turn on or off editability. Default is $false.]]
         }
      }
      @property resize_down {
         [[Control whether the object's image can be resized to a size smaller than the original one.

           @since 1.7]]
         set {
            legacy: null;
         }
         get {
            legacy: null;
         }
         values {
            resize_down: bool; [[whether resizing down is allowed]]
         }
      }
      @property resize_up {
         [[Control whether the object's image can be resized to a size larget than the original one.

           @since 1.7]]
         set {
            legacy: null;
         }
         get {
            legacy: null;
         }
         values {
            resize_up: bool; [[whether resizing up is allowed]]
         }
      }
      @property smooth {
         [[Control the smooth effect for an image.

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

           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).]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            smooth: bool; [[$true if smooth scaling should be used, $false otherwise. Default is $true.]]
         }
      }
      @property no_scale {
         [[Control scaling behaviour of this object.

           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
           @.resizable and @Elm.Widget.scale]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            no_scale: bool; [[$true if the object is not scalable, $false otherwise. Default is $false.]]
         }
      }
      @property scale {
         [[Control the scale of the object's image.

           @since 1.7]]
         set {
            legacy: null;
         }
         get {
            legacy: null;
         }
         values {
            scale: double; [[Object's image scale.]]
         }
      }
      @property fill_inside {
         [[Control the resize method for the object's internal image when maintaining a given aspect ratio.

           If $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".

           @since 1.7]]
         set {
            legacy: null;
         }
         get {
            legacy: null;
         }
         values {
            fill_inside: bool; [[Resize method for the object's internal image.]]
         }
      }
      @property aspect_fixed {
         set {
            [[Control whether the original aspect ratio of the image should be kept on resize.

              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 @.fill_outside.

              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            fixed: bool; [[$true if the image should retain the aspect, $false otherwise.]]
         }
      }
      @property orient {
         [[Contrtol the image orientation.

           This function allows to rotate or flip the given image.]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            orient: Elm_Image_Orient; [[The image orientation Elm_Image_Orient Default is #ELM_IMAGE_ORIENT_NONE.]]
         }
      }
      @property fill_outside {
         [[Control if the image fills the entire object area, when keeping the aspect ratio.

           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 ($fill_outside
           is $false) or let the extra width or height go outside of the object,
           and the image will fill the entire object ($fill_outside is $true).

           Note: This option will have no effect if @.aspect_fixed
           is set to $false.

           See also @.fill_inside.]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            fill_outside: bool; [[$true if the object is filled outside, $false otherwise. Default is $false.]]
         }
      }
      @property resizable {
         [[Control if the object is (up/down) resizable.

           This function limits the image resize ability. If $size_up is set to
           $false, the object can't have its height or width resized to a value
           higher than the original image size. Same is valid for $size_down.]]
         set {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         get {
            [[
              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            up: bool; [[A bool to set if the object is resizable up. Default is $true.]]
            down: bool; [[A bool to set if the object is resizable down. Default is $true.]]
         }
      }
      @property preload_disabled {
         set {
            [[Enable or disable preloading of the image

              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            disabled: bool; [[If true, preloading will be disabled]]
         }
      }
      @property mmap {
         set {
            [[Set the file that will be used as the image's source.

              See: elm_image_file_set()

              Note: This function will trigger the Edje file case based on the
              extension of the $file string use to create the Eina_File (expects
              $".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 $group differently for each object.
              Or image objects will share one evas image cache entry and you will get
              unwanted frames.]]

            return: bool; [[$true = success, $false = error]]
            legacy: null;
         }
         values {
            file: const(Eina_File)*; [[The handler to an Eina_File that will be used as image source]]
            group: const(char)* @optional; [[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.]]
         }
      }
      @property memfile {
         set {
            [[Set a location in memory to be used as an image object's source bitmap.

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

              The $format string should be something like $"png", $"jpg",
              $"tga", $"tiff", $"bmp" etc, when provided ($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.

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

              @since 1.7
            ]]

            return: bool; [[$true = success, $false = error]]
         }
         values {
            img: const(void)*; [[The binary data that will be used as image source]]
            size: size; [[The size of binary data blob $img]]
            format: const(char)* @optional; [[(Optional) expected format of $img bytes]]
            key: const(char)* @optional; [[Optional indexing key of $img to be passed to the image loader (eg. if $img is a memory-mapped EET file)]]
         }
      }
      @property object {
         get {
            [[Get the inlined image object of the image widget.

              This function allows one to get the underlying $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.

              Note: Be careful to not manipulate it, as it is under control of
              elementary.

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

            return: Evas.Object *; [[The inlined image object, or NULL if none exists]]
         }
      }
      @property object_size {
         get {
            [[Get the current size of the image.

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

              \@if MOBILE \@since_tizen 2.3
              \@elseif WEARABLE \@since_tizen 2.3.1
              \@endif
            ]]
         }
         values {
            w: int; [[Pointer to store width, or NULL.]]
            h: int; [[Pointer to store height, or NULL.]]
         }
      }
      sizing_eval {
         [[Re-evaluate the object's final geometry.

           @since 1.7]]
         legacy: null;
      }
   }
   implements {
      class.constructor;
      Eo.Base.constructor;
      Efl.File.file.set;
      Efl.File.file.get;
      Efl.File.mmap.set;
      Efl.Image.load_size.set;
      Efl.Image.load_size.get;
      Efl.Image.smooth_scale.set;
      Efl.Image.smooth_scale.get;
      Efl.Player.playable.get;
      Efl.Player.play.set;
      Efl.Player.play.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;
   }

}
