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

199 lines
6.6 KiB
C
Raw Normal View History

/*
* vim:ts=8:sw=3:sts=8:noexpandtab:cino=>5n-3f0^-2{2
*/
#undef SCALE_USING_MMX
{
if (smooth)
{
for (y = ystart; y <= yend; y++)
{
int x, w, ww;
FPc u, v, ud, vd, dv;
DATA32 *d, *s, *so[4], val1, val2;
#ifdef COLMUL
FPc cv, cd, cc; // col
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;
v = span->v[0] << FPI;
ud = ((span->u[1] << FPI) - u) / w;
vd = ((span->v[1] << FPI) - 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 -= 1;
if (vd < 0) v -= 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;
DATA32 *d, *s;
#ifdef COLMUL
FPc cv, cd, cc; // 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;
v = span->v[0] << FPI;
ud = ((span->u[1] << FPI) - u) / w;
vd = ((span->v[1] << FPI) - v) / w;
if (ud < 0) u -= 1;
if (vd < 0) v -= 1;
if (direct)
d = dst->image.data + (y * dst->cache_entry.w) + x;
else
d = buf;
#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;
}
}
}
}