photocam: Use Eina.Rect for image_region

This commit is contained in:
Jean-Philippe Andre 2017-09-18 21:13:19 +09:00
parent e4517b28d6
commit 64ebdd9c7b
3 changed files with 49 additions and 46 deletions

View File

@ -2211,67 +2211,49 @@ _efl_ui_image_zoomable_efl_gfx_view_view_size_get(Eo *obj EINA_UNUSED, Efl_Ui_Im
return EINA_SIZE2D(pd->size.imw, pd->size.imh);
}
EOLIAN static void
_efl_ui_image_zoomable_image_region_get(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd, int *x, int *y, int *w, int *h)
EOLIAN static Eina_Rect
_efl_ui_image_zoomable_image_region_get(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd)
{
Evas_Coord sx, sy, sw, sh;
Eina_Rect region = {};
elm_interface_scrollable_content_pos_get((Eo *)obj, &sx, &sy);
elm_interface_scrollable_content_viewport_geometry_get
((Eo *)obj, NULL, NULL, &sw, &sh);
if (sd->size.w > 0)
{
if (x)
{
*x = (sd->size.imw * sx) / sd->size.w;
if (*x > sd->size.imw) *x = sd->size.imw;
}
if (w)
{
*w = (sd->size.imw * sw) / sd->size.w;
if (*w > sd->size.imw) *w = sd->size.imw;
else if (*w < 0)
*w = 0;
}
}
else
{
if (x) *x = 0;
if (w) *w = 0;
region.x = (sd->size.imw * sx) / sd->size.w;
if (region.x > sd->size.imw) region.x = sd->size.imw;
region.w = (sd->size.imw * sw) / sd->size.w;
if (region.w > sd->size.imw) region.w = sd->size.imw;
else if (region.w < 0)
region.w = 0;
}
if (sd->size.h > 0)
{
if (y)
{
*y = (sd->size.imh * sy) / sd->size.h;
if (*y > sd->size.imh) *y = sd->size.imh;
}
if (h)
{
*h = (sd->size.imh * sh) / sd->size.h;
if (*h > sd->size.imh) *h = sd->size.imh;
else if (*h < 0)
*h = 0;
}
}
else
{
if (y) *y = 0;
if (h) *h = 0;
region.y = (sd->size.imh * sy) / sd->size.h;
if (region.y > sd->size.imh) region.y = sd->size.imh;
region.h = (sd->size.imh * sh) / sd->size.h;
if (region.h > sd->size.imh) region.h = sd->size.imh;
else if (region.h < 0)
region.h = 0;
}
return region;
}
EOLIAN static void
_efl_ui_image_zoomable_image_region_set(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd, int x, int y, int w, int h)
_efl_ui_image_zoomable_image_region_set(Eo *obj, Efl_Ui_Image_Zoomable_Data *sd, Eina_Rect region)
{
int rx, ry, rw, rh;
if ((sd->size.imw < 1) || (sd->size.imh < 1)) return;
rx = (x * sd->size.w) / sd->size.imw;
ry = (y * sd->size.h) / sd->size.imh;
rw = (w * sd->size.w) / sd->size.imw;
rh = (h * sd->size.h) / sd->size.imh;
rx = (region.x * sd->size.w) / sd->size.imw;
ry = (region.y * sd->size.h) / sd->size.imh;
rw = (region.w * sd->size.w) / sd->size.imw;
rh = (region.h * sd->size.h) / sd->size.imh;
if (rw < 1) rw = 1;
if (rh < 1) rh = 1;
if ((rx + rw) > sd->size.w) rx = sd->size.w - rw;
@ -2922,7 +2904,7 @@ elm_photocam_file_get(const Evas_Object *obj)
EAPI void
elm_photocam_image_region_show(Evas_Object *obj, int x, int y, int w, int h)
{
efl_ui_image_zoomable_image_region_set(obj, x, y, w, h);
efl_ui_image_zoomable_image_region_set(obj, EINA_RECT(x, y, w, h));
}
EAPI void
@ -2956,6 +2938,18 @@ elm_photocam_bounce_get(const Evas_Object *obj,
elm_interface_scrollable_bounce_allow_get((Eo *)obj, h_bounce, v_bounce);
}
EAPI void
elm_photocam_image_region_get(const Efl_Ui_Image_Zoomable *obj, int *x, int *y, int *w, int *h)
{
Eina_Rect r;
r = efl_ui_image_zoomable_image_region_get(obj);
if (x) *x = r.x;
if (y) *y = r.y;
if (w) *w = r.w;
if (h) *h = r.h;
}
/* Standard widget overrides */
ELM_WIDGET_KEY_DOWN_DEFAULT_IMPLEMENT(efl_ui_image_zoomable, Efl_Ui_Image_Zoomable_Data)

View File

@ -29,6 +29,7 @@ class Efl.Ui.Image_Zoomable (Elm.Widget, Efl.Ui.Image, Efl.Ui.Zoom,
See also @.image_region.set.
]]
legacy: null;
}
set {
[[Set the viewed region of the image
@ -39,10 +40,7 @@ class Efl.Ui.Image_Zoomable (Elm.Widget, Efl.Ui.Image, Efl.Ui.Zoom,
legacy: null;
}
values {
x: int; [[X-coordinate of region in image original pixels]]
y: int; [[Y-coordinate of region in image original pixels]]
w: int; [[Width of region in image original pixels]]
h: int; [[Height of region in image original pixels]]
region: Eina.Rect; [[The region in the original image pixels.]]
}
}
}

View File

@ -218,5 +218,16 @@ EAPI void elm_photocam_zoom_mode_set(Evas_Object *obj, Elm_Photoca
*/
EAPI Elm_Photocam_Zoom_Mode elm_photocam_zoom_mode_get(const Evas_Object *obj);
/**
* @brief Get the region of the image that is currently shown
*
* See also @ref Efl.Ui.Image_Zoomable.image_region.set.
*
* @param[out] x X-coordinate of region in image original pixels
* @param[out] y Y-coordinate of region in image original pixels
* @param[out] w Width of region in image original pixels
* @param[out] h Height of region in image original pixels
*/
EAPI void elm_photocam_image_region_get(const Evas_Object *obj, int *x, int *y, int *w, int *h);
#include "efl_ui_image_zoomable.eo.legacy.h"