efl/src/lib/evas/common/evas_scale_smooth_scaler_do...

264 lines
6.4 KiB
C

{
int Cy, j;
DATA32 *dptr, *pix, *pbuf, **yp;
DATA8 *mask;
int r, g, b, a, rr, gg, bb, aa;
int *xp, xap, yap, pos;
//int dyy, dxx;
int w = dst_clip_w;
int y;
dptr = dst_ptr;
pos = (src_region_y * src_w) + src_region_x;
//dyy = dst_clip_y - dst_region_y;
//dxx = dst_clip_x - dst_region_x;
xp = xpoints;// + dxx;
yp = ypoints;// + dyy;
xapp = xapoints;// + dxx;
yapp = yapoints;// + dyy;
pbuf = buf;
if (src->cache_entry.flags.alpha)
{
y = 0;
while (dst_clip_h--)
{
Cy = *yapp >> 16;
yap = *yapp & 0xffff;
while (dst_clip_w--)
{
pix = *yp + *xp + pos;
a = (A_VAL(pix) * yap) >> 10;
r = (R_VAL(pix) * yap) >> 10;
g = (G_VAL(pix) * yap) >> 10;
b = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
a += (A_VAL(pix) * Cy) >> 10;
r += (R_VAL(pix) * Cy) >> 10;
g += (G_VAL(pix) * Cy) >> 10;
b += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
a += (A_VAL(pix) * j) >> 10;
r += (R_VAL(pix) * j) >> 10;
g += (G_VAL(pix) * j) >> 10;
b += (B_VAL(pix) * j) >> 10;
}
if ((xap = *xapp) > 0)
{
pix = *yp + *xp + 1 + pos;
aa = (A_VAL(pix) * yap) >> 10;
rr = (R_VAL(pix) * yap) >> 10;
gg = (G_VAL(pix) * yap) >> 10;
bb = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
aa += (A_VAL(pix) * Cy) >> 10;
rr += (R_VAL(pix) * Cy) >> 10;
gg += (G_VAL(pix) * Cy) >> 10;
bb += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
aa += (A_VAL(pix) * j) >> 10;
rr += (R_VAL(pix) * j) >> 10;
gg += (G_VAL(pix) * j) >> 10;
bb += (B_VAL(pix) * j) >> 10;
}
a += ((aa - a) * xap) >> 8;
r += ((rr - r) * xap) >> 8;
g += ((gg - g) * xap) >> 8;
b += ((bb - b) * xap) >> 8;
}
*pbuf++ = ARGB_JOIN(((a + (1 << 3)) >> 4),
((r + (1 << 3)) >> 4),
((g + (1 << 3)) >> 4),
((b + (1 << 3)) >> 4));
xp++; xapp++;
}
if (!mask_ie)
func(buf, NULL, mul_col, dptr, w);
else
{
mask = mask_ie->image.data8
+ ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w)
+ (dst_clip_x - mask_x);
if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w);
func(buf, mask, 0, dptr, w);
}
y++;
pbuf = buf;
dptr += dst_w; dst_clip_w = w;
yp++; yapp++;
xp = xpoints;// + dxx;
xapp = xapoints;// + dxx;
}
}
else
{
#ifdef DIRECT_SCALE
if ((!src->cache_entry.flags.alpha) &&
(!dst->cache_entry.flags.alpha) &&
(mul_col == 0xffffffff) &&
(!mask_ie))
{
while (dst_clip_h--)
{
Cy = *yapp >> 16;
yap = *yapp & 0xffff;
pbuf = dptr;
while (dst_clip_w--)
{
pix = *yp + *xp + pos;
r = (R_VAL(pix) * yap) >> 10;
g = (G_VAL(pix) * yap) >> 10;
b = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
r += (R_VAL(pix) * Cy) >> 10;
g += (G_VAL(pix) * Cy) >> 10;
b += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
r += (R_VAL(pix) * j) >> 10;
g += (G_VAL(pix) * j) >> 10;
b += (B_VAL(pix) * j) >> 10;
}
if ((xap = *xapp) > 0)
{
pix = *yp + *xp + 1 + pos;
rr = (R_VAL(pix) * yap) >> 10;
gg = (G_VAL(pix) * yap) >> 10;
bb = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
rr += (R_VAL(pix) * Cy) >> 10;
gg += (G_VAL(pix) * Cy) >> 10;
bb += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
rr += (R_VAL(pix) * j) >> 10;
gg += (G_VAL(pix) * j) >> 10;
bb += (B_VAL(pix) * j) >> 10;
}
r += ((rr - r) * xap) >> 8;
g += ((gg - g) * xap) >> 8;
b += ((bb - b) * xap) >> 8;
}
*pbuf++ = ARGB_JOIN(0xff,
((r + (1 << 3)) >> 4),
((g + (1 << 3)) >> 4),
((b + (1 << 3)) >> 4));
xp++; xapp++;
}
dptr += dst_w; dst_clip_w = w;
yp++; yapp++;
xp = xpoints;// + dxx;
xapp = xapoints;// + dxx;
}
}
else
#endif
{
y = 0;
while (dst_clip_h--)
{
Cy = *yapp >> 16;
yap = *yapp & 0xffff;
while (dst_clip_w--)
{
pix = *yp + *xp + pos;
r = (R_VAL(pix) * yap) >> 10;
g = (G_VAL(pix) * yap) >> 10;
b = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
r += (R_VAL(pix) * Cy) >> 10;
g += (G_VAL(pix) * Cy) >> 10;
b += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
r += (R_VAL(pix) * j) >> 10;
g += (G_VAL(pix) * j) >> 10;
b += (B_VAL(pix) * j) >> 10;
}
if ((xap = *xapp) > 0)
{
pix = *yp + *xp + 1 + pos;
rr = (R_VAL(pix) * yap) >> 10;
gg = (G_VAL(pix) * yap) >> 10;
bb = (B_VAL(pix) * yap) >> 10;
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
{
pix += src_w;
rr += (R_VAL(pix) * Cy) >> 10;
gg += (G_VAL(pix) * Cy) >> 10;
bb += (B_VAL(pix) * Cy) >> 10;
}
if (j > 0)
{
pix += src_w;
rr += (R_VAL(pix) * j) >> 10;
gg += (G_VAL(pix) * j) >> 10;
bb += (B_VAL(pix) * j) >> 10;
}
r += ((rr - r) * xap) >> 8;
g += ((gg - g) * xap) >> 8;
b += ((bb - b) * xap) >> 8;
}
*pbuf++ = ARGB_JOIN(0xff,
((r + (1 << 3)) >> 4),
((g + (1 << 3)) >> 4),
((b + (1 << 3)) >> 4));
xp++; xapp++;
}
if (!mask_ie)
func(buf, NULL, mul_col, dptr, w);
else
{
mask = mask_ie->image.data8
+ ((dst_clip_y - mask_y + y) * mask_ie->cache_entry.w)
+ (dst_clip_x - mask_x);
if (mul_col != 0xffffffff) func2(buf, NULL, mul_col, buf, w);
func(buf, mask, 0, dptr, w);
}
y++;
pbuf = buf;
dptr += dst_w; dst_clip_w = w;
yp++; yapp++;
xp = xpoints;// + dxx;
xapp = xapoints;// + dxx;
}
}
}
}