Ephoto: Use a circle in the Red Eye Removal... Uses modified Bresenham.
This commit is contained in:
parent
a6aee9555b
commit
89dd56870a
|
@ -49,9 +49,10 @@ _reye_clicked(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
||||||
void *event_data EINA_UNUSED)
|
void *event_data EINA_UNUSED)
|
||||||
{
|
{
|
||||||
Ephoto_Reye *er = data;
|
Ephoto_Reye *er = data;
|
||||||
unsigned int *im_data, *im_data_new, *p1, *p2;
|
unsigned int *im_data, *p1;
|
||||||
Evas_Coord x, y, imx, imy, imw, imh;
|
Evas_Coord x, y, imx, imy, imw, imh;
|
||||||
Evas_Coord xpos, ypos, xadj, yadj, nx, ny;
|
Evas_Coord xpos, ypos, xadj, yadj, nx, ny;
|
||||||
|
Evas_Coord xx, yy, nnx, nny;
|
||||||
int a, r, g, b;
|
int a, r, g, b;
|
||||||
double scalex, scaley;
|
double scalex, scaley;
|
||||||
|
|
||||||
|
@ -67,8 +68,8 @@ _reye_clicked(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
||||||
scalex = (double) (xadj) / (double) imw;
|
scalex = (double) (xadj) / (double) imw;
|
||||||
scaley = (double) (yadj) / (double) imh;
|
scaley = (double) (yadj) / (double) imh;
|
||||||
|
|
||||||
nx = ((er->w * scalex)-(er->rad/2));
|
nx = er->w * scalex;
|
||||||
ny = ((er->h * scaley)-(er->rad/2));
|
ny = er->h * scaley;
|
||||||
|
|
||||||
if (nx < 0) nx = 0;
|
if (nx < 0) nx = 0;
|
||||||
if (ny < 0) ny = 0;
|
if (ny < 0) ny = 0;
|
||||||
|
@ -81,41 +82,37 @@ _reye_clicked(void *data, Evas *e EINA_UNUSED, Evas_Object *obj EINA_UNUSED,
|
||||||
memcpy(im_data, er->original_im_data,
|
memcpy(im_data, er->original_im_data,
|
||||||
sizeof(unsigned int) * er->w * er->h);
|
sizeof(unsigned int) * er->w * er->h);
|
||||||
|
|
||||||
im_data_new = malloc(sizeof(unsigned int) * er->w * er->h);
|
for (yy = -er->rad; yy <= er->rad; yy++)
|
||||||
|
|
||||||
for (y = 0; y < er->h; y++)
|
|
||||||
{
|
{
|
||||||
p1 = im_data + (y * er->w);
|
for (xx = -er->rad; xx <= er->rad; xx++)
|
||||||
p2 = im_data_new + (y * er->w);
|
{
|
||||||
for (x = 0; x < er->w; x++)
|
if ((xx * xx) + (yy * yy) <= (er->rad * er->rad))
|
||||||
{
|
{
|
||||||
b = (int) ((*p1) & 0xff);
|
nnx = nx + xx;
|
||||||
g = (int) ((*p1 >> 8) & 0xff);
|
nny = ny + yy;
|
||||||
r = (int) ((*p1 >> 16) & 0xff);
|
|
||||||
a = (int) ((*p1 >> 24) & 0xff);
|
p1 = im_data + (nny * er->w) + nnx;
|
||||||
b = _mul_color_alpha(b, a);
|
b = (int) ((*p1) & 0xff);
|
||||||
g = _mul_color_alpha(g, a);
|
g = (int) ((*p1 >> 8) & 0xff);
|
||||||
r = _mul_color_alpha(r, a);
|
r = (int) ((*p1 >> 16) & 0xff);
|
||||||
if (y >= ny && y <= ny+er->rad)
|
a = (int) ((*p1 >> 24) & 0xff);
|
||||||
{
|
b = _mul_color_alpha(b, a);
|
||||||
if (x >= nx && x <= nx+er->rad)
|
g = _mul_color_alpha(g, a);
|
||||||
r = (int) ((g+b)/2);
|
r = _mul_color_alpha(r, a);
|
||||||
|
r = (int) ((g+b)/2);
|
||||||
|
b = _normalize_color(b);
|
||||||
|
g = _normalize_color(g);
|
||||||
|
r = _normalize_color(r);
|
||||||
|
b = _demul_color_alpha(b, a);
|
||||||
|
g = _demul_color_alpha(g, a);
|
||||||
|
r = _demul_color_alpha(r, a);
|
||||||
|
*p1 = (a << 24) | (r << 16) | (g << 8) | b;
|
||||||
}
|
}
|
||||||
b = _normalize_color(b);
|
|
||||||
g = _normalize_color(g);
|
|
||||||
r = _normalize_color(r);
|
|
||||||
b = _demul_color_alpha(b, a);
|
|
||||||
g = _demul_color_alpha(g, a);
|
|
||||||
r = _demul_color_alpha(r, a);
|
|
||||||
*p2 = (a << 24) | (r << 16) | (g << 8) | b;
|
|
||||||
p2++;
|
|
||||||
p1++;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
er->edited_im_data = im_data_new;
|
er->edited_im_data = im_data;
|
||||||
ephoto_single_browser_image_data_update(er->main, er->image,
|
ephoto_single_browser_image_data_update(er->main, er->image,
|
||||||
im_data_new, er->w, er->h);
|
im_data, er->w, er->h);
|
||||||
free(im_data);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
Loading…
Reference in New Issue