2004-01-29 21:46:57 -08:00
|
|
|
{
|
|
|
|
int Cx, Cy, i, j;
|
2005-12-03 01:27:53 -08:00
|
|
|
DATA32 *dptr, *sptr, *pix, *pbuf;
|
2014-11-12 17:04:00 -08:00
|
|
|
DATA8 *mask;
|
2004-01-29 21:46:57 -08:00
|
|
|
int a, r, g, b, rx, gx, bx, ax;
|
2005-12-03 01:27:53 -08:00
|
|
|
int xap, yap, pos;
|
2014-11-12 17:04:00 -08:00
|
|
|
int y;
|
2012-01-19 08:49:47 -08:00
|
|
|
//int dyy, dxx;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
|
|
|
DATA32 **yp;
|
2005-12-03 01:27:53 -08:00
|
|
|
int *xp;
|
|
|
|
int w = dst_clip_w;
|
2005-05-21 19:49:50 -07:00
|
|
|
|
2004-01-29 21:46:57 -08:00
|
|
|
dptr = dst_ptr;
|
2005-12-03 01:27:53 -08:00
|
|
|
pos = (src_region_y * src_w) + src_region_x;
|
2012-01-19 08:49:47 -08:00
|
|
|
//dyy = dst_clip_y - dst_region_y;
|
|
|
|
//dxx = dst_clip_x - dst_region_x;
|
2005-12-03 01:27:53 -08:00
|
|
|
|
2011-02-12 06:50:25 -08:00
|
|
|
xp = xpoints;// + dxx;
|
|
|
|
yp = ypoints;// + dyy;
|
|
|
|
xapp = xapoints;// + dxx;
|
|
|
|
yapp = yapoints;// + dyy;
|
2005-12-03 01:27:53 -08:00
|
|
|
pbuf = buf;
|
2004-01-29 21:46:57 -08:00
|
|
|
/*#ifndef SCALE_USING_MMX */
|
2005-05-21 19:49:50 -07:00
|
|
|
/* for now there's no mmx down scaling - so C only */
|
2004-01-29 21:46:57 -08:00
|
|
|
#if 1
|
2008-06-03 02:09:39 -07:00
|
|
|
if (src->cache_entry.flags.alpha)
|
2004-01-29 21:46:57 -08:00
|
|
|
{
|
2014-11-12 17:04:00 -08:00
|
|
|
y = 0;
|
2005-12-03 01:27:53 -08:00
|
|
|
while (dst_clip_h--)
|
2004-01-29 21:46:57 -08:00
|
|
|
{
|
2012-04-26 01:41:39 -07:00
|
|
|
Cy = *yapp >> 16;
|
|
|
|
yap = *yapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
while (dst_clip_w--)
|
|
|
|
{
|
|
|
|
Cx = *xapp >> 16;
|
|
|
|
xap = *xapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
sptr = *yp + *xp + pos;
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
ax = (A_VAL(pix) * xap) >> 9;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * Cx) >> 9;
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * i) >> 9;
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
a = (ax * yap) >> 14;
|
|
|
|
r = (rx * yap) >> 14;
|
|
|
|
g = (gx * yap) >> 14;
|
|
|
|
b = (bx * yap) >> 14;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
ax = (A_VAL(pix) * xap) >> 9;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * Cx) >> 9;
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * i) >> 9;
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
a += (ax * Cy) >> 14;
|
|
|
|
r += (rx * Cy) >> 14;
|
|
|
|
g += (gx * Cy) >> 14;
|
|
|
|
b += (bx * Cy) >> 14;
|
|
|
|
}
|
|
|
|
if (j > 0)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
ax = (A_VAL(pix) * xap) >> 9;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * Cx) >> 9;
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
ax += (A_VAL(pix) * i) >> 9;
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
a += (ax * j) >> 14;
|
|
|
|
r += (rx * j) >> 14;
|
|
|
|
g += (gx * j) >> 14;
|
|
|
|
b += (bx * j) >> 14;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
*pbuf++ = ARGB_JOIN(((a + (1 << 4)) >> 5),
|
|
|
|
((r + (1 << 4)) >> 5),
|
|
|
|
((g + (1 << 4)) >> 5),
|
2012-04-26 01:41:39 -07:00
|
|
|
((b + (1 << 4)) >> 5));
|
|
|
|
xp++; xapp++;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2014-11-12 17:04:00 -08:00
|
|
|
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++;
|
2012-04-26 01:41:39 -07:00
|
|
|
|
|
|
|
pbuf = buf;
|
|
|
|
dptr += dst_w; dst_clip_w = w;
|
|
|
|
xp = xpoints;// + dxx;
|
|
|
|
xapp = xapoints;// + dxx;
|
|
|
|
yp++; yapp++;
|
2006-01-22 23:57:30 -08:00
|
|
|
}
|
2006-11-15 08:44:34 -08:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
#ifdef DIRECT_SCALE
|
2008-06-03 02:09:39 -07:00
|
|
|
if ((!src->cache_entry.flags.alpha) &&
|
2014-11-12 17:04:00 -08:00
|
|
|
(!dst->cache_entry.flags.alpha) &&
|
|
|
|
(mul_col == 0xffffffff) &&
|
|
|
|
(!mask_ie))
|
2006-01-22 23:57:30 -08:00
|
|
|
{
|
|
|
|
while (dst_clip_h--)
|
|
|
|
{
|
2012-04-26 01:41:39 -07:00
|
|
|
Cy = *yapp >> 16;
|
|
|
|
yap = *yapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
pbuf = dptr;
|
|
|
|
while (dst_clip_w--)
|
|
|
|
{
|
|
|
|
Cx = *xapp >> 16;
|
|
|
|
xap = *xapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
sptr = *yp + *xp + pos;
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
r = (rx * yap) >> 14;
|
|
|
|
g = (gx * yap) >> 14;
|
|
|
|
b = (bx * yap) >> 14;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
r += (rx * Cy) >> 14;
|
|
|
|
g += (gx * Cy) >> 14;
|
|
|
|
b += (bx * Cy) >> 14;
|
|
|
|
}
|
|
|
|
if (j > 0)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
r += (rx * j) >> 14;
|
|
|
|
g += (gx * j) >> 14;
|
|
|
|
b += (bx * j) >> 14;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
*pbuf++ = ARGB_JOIN(0xff,
|
|
|
|
((r + (1 << 4)) >> 5),
|
|
|
|
((g + (1 << 4)) >> 5),
|
2012-04-26 01:41:39 -07:00
|
|
|
((b + (1 << 4)) >> 5));
|
|
|
|
xp++; xapp++;
|
|
|
|
}
|
|
|
|
|
|
|
|
dptr += dst_w; dst_clip_w = w;
|
|
|
|
xp = xpoints;// + dxx;
|
|
|
|
xapp = xapoints;// + dxx;
|
|
|
|
yp++; yapp++;
|
2006-11-15 08:44:34 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2012-12-17 13:29:33 -08:00
|
|
|
#endif
|
2006-11-15 08:44:34 -08:00
|
|
|
{
|
2014-11-12 17:04:00 -08:00
|
|
|
y = 0;
|
2006-11-15 08:44:34 -08:00
|
|
|
while (dst_clip_h--)
|
|
|
|
{
|
2012-04-26 01:41:39 -07:00
|
|
|
Cy = *yapp >> 16;
|
|
|
|
yap = *yapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
while (dst_clip_w--)
|
|
|
|
{
|
|
|
|
Cx = *xapp >> 16;
|
|
|
|
xap = *xapp & 0xffff;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
sptr = *yp + *xp + pos;
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
r = (rx * yap) >> 14;
|
|
|
|
g = (gx * yap) >> 14;
|
|
|
|
b = (bx * yap) >> 14;
|
2012-12-17 13:29:33 -08:00
|
|
|
|
2012-04-26 01:41:39 -07:00
|
|
|
for (j = (1 << 14) - yap; j > Cy; j -= Cy)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
r += (rx * Cy) >> 14;
|
|
|
|
g += (gx * Cy) >> 14;
|
|
|
|
b += (bx * Cy) >> 14;
|
|
|
|
}
|
|
|
|
if (j > 0)
|
|
|
|
{
|
|
|
|
pix = sptr;
|
|
|
|
sptr += src_w;
|
|
|
|
rx = (R_VAL(pix) * xap) >> 9;
|
|
|
|
gx = (G_VAL(pix) * xap) >> 9;
|
|
|
|
bx = (B_VAL(pix) * xap) >> 9;
|
|
|
|
pix++;
|
|
|
|
for (i = (1 << 14) - xap; i > Cx; i -= Cx)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * Cx) >> 9;
|
|
|
|
gx += (G_VAL(pix) * Cx) >> 9;
|
|
|
|
bx += (B_VAL(pix) * Cx) >> 9;
|
|
|
|
pix++;
|
|
|
|
}
|
|
|
|
if (i > 0)
|
|
|
|
{
|
|
|
|
rx += (R_VAL(pix) * i) >> 9;
|
|
|
|
gx += (G_VAL(pix) * i) >> 9;
|
|
|
|
bx += (B_VAL(pix) * i) >> 9;
|
|
|
|
}
|
|
|
|
|
|
|
|
r += (rx * j) >> 14;
|
|
|
|
g += (gx * j) >> 14;
|
|
|
|
b += (bx * j) >> 14;
|
|
|
|
}
|
2012-12-17 13:29:33 -08:00
|
|
|
*pbuf++ = ARGB_JOIN(0xff,
|
|
|
|
((r + (1 << 4)) >> 5),
|
|
|
|
((g + (1 << 4)) >> 5),
|
2012-04-26 01:41:39 -07:00
|
|
|
((b + (1 << 4)) >> 5));
|
|
|
|
xp++; xapp++;
|
|
|
|
}
|
|
|
|
|
2014-11-12 17:04:00 -08:00
|
|
|
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++;
|
2012-04-26 01:41:39 -07:00
|
|
|
|
|
|
|
pbuf = buf;
|
|
|
|
dptr += dst_w; dst_clip_w = w;
|
|
|
|
xp = xpoints;// + dxx;
|
|
|
|
xapp = xapoints;// + dxx;
|
|
|
|
yp++; yapp++;
|
2006-01-22 23:57:30 -08:00
|
|
|
}
|
2004-01-29 21:46:57 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
#else
|
|
|
|
/* MMX scaling down would go here */
|
2005-05-21 19:49:50 -07:00
|
|
|
#endif
|
2004-01-29 21:46:57 -08:00
|
|
|
}
|