efl/legacy/evas/src/lib/engines/common/evas_map_image_core.c

227 lines
7.7 KiB
C

//#undef SCALE_USING_MMX
{
if (smooth)
{
for (y = ystart; y <= yend; y++)
{
int x, w, ww;
FPc u, v, ud, vd, dv, ue, ve;
DATA32 *d, *s;
#ifdef COLMUL
FPc cv, cd; // col
# ifdef SCALE_USING_MMX
FPc cc;
#endif
DATA32 c1, c2; // col
#endif
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]);
if (span->x1 >= 0)
{
long long tl;
x = span->x1;
w = (span->x2 - x);
if (w <= 0) continue;
dv = (span->o2 - span->o1);
if (dv <= 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;
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;
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;
#define SMOOTH 1
#ifdef COLMUL
c1 = span->col[0]; // col
c2 = span->col[1]; // col
cv = 0; // col
cd = (255 << 16) / w; // col
if (c1 == c2)
{
if (c1 == 0xffffffff)
{
#endif
#include "evas_map_image_loop.c"
#ifdef COLMUL
}
else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
{
// all black line
# define COLBLACK 1
# include "evas_map_image_loop.c"
# undef COLBLACK
}
else if (c1 == 0x000000)
{
// skip span
}
else
{
// generic loop
# include "evas_map_image_loop.c"
}
}
else
{
# include "evas_map_image_loop.c"
}
#endif
if (!direct)
{
d = dst->image.data;
d += (y * dst->cache_entry.w) + x;
func(buf, NULL, dc->mul.col, d, w);
}
}
else break;
}
}
}
else
{
for (y = ystart; y <= yend; y++)
{
int x, w, ww;
FPc u, v, ud, vd, ue, ve;
DATA32 *d, *s;
#ifdef COLMUL
FPc cv, cd; // col
DATA32 c1, c2; // col
#endif
Line *line;
line = &(spans[y - ystart]);
for (i = 0; i < 2; i++)
{
Span *span;
span = &(line->span[i]);
if (span->x1 >= 0)
{
x = span->x1;
w = (span->x2 - x);
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;
#undef SMOOTH
#ifdef COLMUL
c1 = span->col[0]; // col
c2 = span->col[1]; // col
cv = 0; // col
cd = (255 << 16) / w; // col
if (c1 == c2)
{
if (c1 == 0xffffffff)
{
#endif
#include "evas_map_image_loop.c"
#ifdef COLMUL
}
else if ((c1 == 0x0000ff) && (!src->cache_entry.flags.alpha))
{
// all black line
# define COLBLACK 1
# include "evas_map_image_loop.c"
# undef COLBLACK
}
else if (c1 == 0x000000)
{
// skip span
}
else
{
// generic loop
# include "evas_map_image_loop.c"
}
}
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, dc->mul.col, d, w);
}
}
else break;
}
}
}
}