2009-11-01 03:45:16 -08:00
|
|
|
//#undef SCALE_USING_MMX
|
2009-10-31 18:32:23 -07:00
|
|
|
{
|
|
|
|
if (smooth)
|
|
|
|
{
|
|
|
|
for (y = ystart; y <= yend; y++)
|
|
|
|
{
|
|
|
|
int x, w, ww;
|
2010-06-03 07:02:46 -07:00
|
|
|
FPc u, v, ud, vd, dv, ue, ve;
|
2010-01-21 22:51:27 -08:00
|
|
|
DATA32 *d, *s;
|
2013-06-14 05:32:15 -07:00
|
|
|
#ifdef COLMUL
|
2010-09-18 18:57:19 -07:00
|
|
|
FPc cv, cd; // col
|
|
|
|
# ifdef SCALE_USING_MMX
|
|
|
|
FPc cc;
|
2013-06-14 05:32:15 -07:00
|
|
|
#endif
|
2009-10-31 18:32:23 -07:00
|
|
|
DATA32 c1, c2; // col
|
2013-06-14 05:32:15 -07:00
|
|
|
#endif
|
2009-10-31 18:32:23 -07:00
|
|
|
Line *line;
|
|
|
|
#ifdef SCALE_USING_MMX
|
|
|
|
pxor_r2r(mm0, mm0);
|
|
|
|
MOV_A2R(ALPHA_255, mm5)
|
|
|
|
#endif
|
|
|
|
line = &(spans[y - ystart]);
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
Span *span;
|
|
|
|
span = &(line->span[i]);
|
2014-02-07 23:26:01 -08:00
|
|
|
if (span->x1 < 0) break;
|
2011-10-11 05:32:21 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
long long tl;
|
|
|
|
x = span->x1;
|
|
|
|
w = (span->x2 - x);
|
|
|
|
if (w <= 0) continue;
|
|
|
|
dv = (span->o2 - span->o1);
|
|
|
|
if (dv <= 0) continue;
|
2011-10-11 05:32:21 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
ww = w;
|
|
|
|
u = span->u[0] << FPI;
|
|
|
|
if (u < 0) u = 0;
|
|
|
|
else if (u > swp) u = swp;
|
|
|
|
v = span->v[0] << FPI;
|
|
|
|
if (v < 0) v = 0;
|
|
|
|
else if (v > shp) v = shp;
|
|
|
|
ue = span->u[1] << FPI;
|
|
|
|
if (ue < 0) ue = 0;
|
|
|
|
else if (ue > swp) ue = swp;
|
|
|
|
ve = span->v[1] << FPI;
|
|
|
|
if (ve < 0) ve = 0;
|
|
|
|
else if (ve > shp) ve = shp;
|
|
|
|
ud = (ue - u) / w;
|
|
|
|
vd = (ve - v) / w;
|
|
|
|
tl = (long long)ud * (w << FP);
|
|
|
|
tl = tl / dv;
|
|
|
|
ud = tl;
|
|
|
|
u -= (ud * (span->o1 - (span->x1 << FP))) / FP1;
|
|
|
|
|
|
|
|
tl = (long long)vd * (w << FP);
|
|
|
|
tl = tl / dv;
|
|
|
|
vd = tl;
|
|
|
|
v -= (vd * (span->o1 - (span->x1 << FP))) / FP1;
|
2009-10-31 18:32:23 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
if (ud < 0) u += ud;
|
|
|
|
if (vd < 0) v += vd;
|
|
|
|
if (u < 0) u = 0;
|
|
|
|
else if (u >= swp) u = swp - 1;
|
|
|
|
if (v < 0) v = 0;
|
|
|
|
else if (v >= shp) v = shp - 1;
|
|
|
|
|
|
|
|
if (direct)
|
|
|
|
d = dst->image.data + (y * dst->cache_entry.w) + x;
|
|
|
|
else
|
|
|
|
d = buf;
|
2013-06-14 05:32:15 -07:00
|
|
|
#define SMOOTH 1
|
|
|
|
#ifdef COLMUL
|
2014-02-07 23:26:01 -08:00
|
|
|
c1 = span->col[0]; // col
|
|
|
|
c2 = span->col[1]; // col
|
|
|
|
cv = 0; // col
|
|
|
|
cd = (255 << 16) / w; // col
|
2009-10-31 18:32:23 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
if (c1 == c2)
|
|
|
|
{
|
|
|
|
if (c1 == 0xffffffff)
|
2009-10-31 18:32:23 -07:00
|
|
|
{
|
2013-06-14 05:32:15 -07:00
|
|
|
#endif
|
|
|
|
#define COLSAME 1
|
2009-10-31 18:32:23 -07:00
|
|
|
#include "evas_map_image_loop.c"
|
2013-06-14 05:32:15 -07:00
|
|
|
#undef COLSAME
|
|
|
|
#ifdef COLMUL
|
2014-02-07 23:26:01 -08:00
|
|
|
}
|
|
|
|
else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
|
|
|
|
{
|
|
|
|
// all black line
|
2009-10-31 18:32:23 -07:00
|
|
|
# define COLBLACK 1
|
2013-06-14 05:32:15 -07:00
|
|
|
# define COLSAME 1
|
2009-10-31 18:32:23 -07:00
|
|
|
# include "evas_map_image_loop.c"
|
2013-06-14 05:32:15 -07:00
|
|
|
# undef COLSAME
|
|
|
|
# undef COLBLACK
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
2014-02-07 23:26:01 -08:00
|
|
|
else if (c1 == 0x000000)
|
2009-10-31 18:32:23 -07:00
|
|
|
{
|
2014-02-07 23:26:01 -08:00
|
|
|
// skip span
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
2014-02-07 23:26:01 -08:00
|
|
|
else
|
2009-10-31 18:32:23 -07:00
|
|
|
{
|
2014-02-07 23:26:01 -08:00
|
|
|
// generic loop
|
|
|
|
# define COLSAME 1
|
|
|
|
# include "evas_map_image_loop.c"
|
|
|
|
# undef COLSAME
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
|
|
|
}
|
2014-02-07 23:26:01 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
# include "evas_map_image_loop.c"
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (!direct)
|
|
|
|
{
|
|
|
|
d = dst->image.data;
|
|
|
|
d += (y * dst->cache_entry.w) + x;
|
|
|
|
func(buf, NULL, mul_col, d, w);
|
|
|
|
}
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
for (y = ystart; y <= yend; y++)
|
|
|
|
{
|
|
|
|
int x, w, ww;
|
2010-06-03 07:02:46 -07:00
|
|
|
FPc u, v, ud, vd, ue, ve;
|
2009-10-31 18:32:23 -07:00
|
|
|
DATA32 *d, *s;
|
|
|
|
#ifdef COLMUL
|
2010-09-18 18:57:19 -07:00
|
|
|
FPc cv, cd; // col
|
2009-10-31 18:32:23 -07:00
|
|
|
DATA32 c1, c2; // col
|
2013-06-14 05:32:15 -07:00
|
|
|
#endif
|
2009-10-31 18:32:23 -07:00
|
|
|
Line *line;
|
|
|
|
line = &(spans[y - ystart]);
|
|
|
|
for (i = 0; i < 2; i++)
|
|
|
|
{
|
|
|
|
Span *span;
|
|
|
|
span = &(line->span[i]);
|
2014-02-07 23:26:01 -08:00
|
|
|
if (span->x1 < 0) break;
|
2011-10-11 05:32:21 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
x = span->x1;
|
|
|
|
w = (span->x2 - x);
|
2011-10-11 05:32:21 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
if (w <= 0) continue;
|
|
|
|
ww = w;
|
|
|
|
u = span->u[0] << FPI;
|
|
|
|
if (u < 0) u = 0;
|
|
|
|
else if (u > swp) u = swp;
|
|
|
|
v = span->v[0] << FPI;
|
|
|
|
if (v < 0) v = 0;
|
|
|
|
else if (v > shp) v = shp;
|
|
|
|
ue = span->u[1] << FPI;
|
|
|
|
if (ue < 0) ue = 0;
|
|
|
|
else if (ue > swp) ue = swp;
|
|
|
|
ve = span->v[1] << FPI;
|
|
|
|
if (ve < 0) ve = 0;
|
|
|
|
else if (ve > shp) ve = shp;
|
|
|
|
ud = (ue - u) / w;
|
|
|
|
vd = (ve - v) / w;
|
|
|
|
if (direct)
|
|
|
|
d = dst->image.data + (y * dst->cache_entry.w) + x;
|
|
|
|
else
|
|
|
|
d = buf;
|
|
|
|
if (ud < 0) u += ud;
|
|
|
|
if (vd < 0) v += vd;
|
|
|
|
if (u < 0) u = 0;
|
|
|
|
else if (u >= swp) u = swp - 1;
|
|
|
|
if (v < 0) v = 0;
|
|
|
|
else if (v >= shp) v = shp - 1;
|
2009-10-31 18:32:23 -07:00
|
|
|
#undef SMOOTH
|
|
|
|
#ifdef COLMUL
|
2014-02-07 23:26:01 -08:00
|
|
|
c1 = span->col[0]; // col
|
|
|
|
c2 = span->col[1]; // col
|
|
|
|
cv = 0; // col
|
|
|
|
cd = (255 << 16) / w; // col
|
2009-10-31 18:32:23 -07:00
|
|
|
|
2014-02-07 23:26:01 -08:00
|
|
|
if (c1 == c2)
|
|
|
|
{
|
|
|
|
if (c1 == 0xffffffff)
|
2009-10-31 18:32:23 -07:00
|
|
|
{
|
2013-06-14 05:32:15 -07:00
|
|
|
#endif
|
|
|
|
#define COLSAME 1
|
2009-10-31 18:32:23 -07:00
|
|
|
#include "evas_map_image_loop.c"
|
2013-06-14 05:32:15 -07:00
|
|
|
#undef COLSAME
|
2009-10-31 18:32:23 -07:00
|
|
|
#ifdef COLMUL
|
2014-02-07 23:26:01 -08:00
|
|
|
}
|
|
|
|
else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
|
|
|
|
{
|
|
|
|
// all black line
|
2009-10-31 18:32:23 -07:00
|
|
|
# define COLBLACK 1
|
2013-06-14 05:32:15 -07:00
|
|
|
# define COLSAME 1
|
2009-10-31 18:32:23 -07:00
|
|
|
# include "evas_map_image_loop.c"
|
2013-06-14 05:32:15 -07:00
|
|
|
# undef COLSAME
|
|
|
|
# undef COLBLACK
|
2014-02-07 23:26:01 -08:00
|
|
|
}
|
|
|
|
else if (c1 == 0x000000)
|
|
|
|
{
|
|
|
|
// skip span
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
// generic loop
|
2014-02-07 23:26:01 -08:00
|
|
|
# define COLSAME 1
|
2009-10-31 18:32:23 -07:00
|
|
|
# include "evas_map_image_loop.c"
|
2014-02-07 23:26:01 -08:00
|
|
|
# undef COLSAME
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
|
|
|
}
|
2014-02-07 23:26:01 -08:00
|
|
|
else
|
|
|
|
{
|
|
|
|
// generic loop
|
|
|
|
# include "evas_map_image_loop.c"
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
if (!direct)
|
|
|
|
{
|
|
|
|
d = dst->image.data;
|
|
|
|
d += (y * dst->cache_entry.w) + x;
|
|
|
|
func(buf, NULL, mul_col, d, w);
|
|
|
|
}
|
2009-10-31 18:32:23 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|