forked from old/legacy-imlib2
parent
1f488f4eec
commit
d51a33d0e1
|
@ -0,0 +1,2 @@
|
||||||
|
#define SYS_LOADERS_PATH "/usr/local/lib/loaders"
|
||||||
|
#define USER_LOADERS_PATH ".loaders"
|
|
@ -0,0 +1,185 @@
|
||||||
|
|
||||||
|
#include "common.h"
|
||||||
|
#include "rotate.h"
|
||||||
|
|
||||||
|
/*\ I have no idea which of these two is faster..
|
||||||
|
|*| The first one doesn't branch, the second one doesn't multiply..
|
||||||
|
|*| Tests are inconclusive so far..
|
||||||
|
|*| Maybe some kind of table lookup would be quicker ?? \*/
|
||||||
|
#if 1
|
||||||
|
#define RENORM_X_Y_SRC \
|
||||||
|
src += (x >> _ROTATE_PREC) + ((y >> _ROTATE_PREC) * sow); \
|
||||||
|
x &= _ROTATE_PREC_BITS; y &= _ROTATE_PREC_BITS;
|
||||||
|
#else
|
||||||
|
#define RENORM_X_Y_SRC \
|
||||||
|
while (x > _ROTATE_PREC_BITS) { \
|
||||||
|
x -= _ROTATE_PREC_BITS; \
|
||||||
|
src++; \
|
||||||
|
} \
|
||||||
|
while (x < 0) { \
|
||||||
|
x += _ROTATE_PREC_BITS; \
|
||||||
|
src--; \
|
||||||
|
} \
|
||||||
|
while (y > _ROTATE_PREC_BITS) { \
|
||||||
|
y -= _ROTATE_PREC_BITS; \
|
||||||
|
src += sow; \
|
||||||
|
} \
|
||||||
|
while (y < 0) { \
|
||||||
|
y += _ROTATE_PREC_BITS; \
|
||||||
|
src -= sow; \
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/*\ Rotate by pixel sampling only, target inside source \*/
|
||||||
|
void
|
||||||
|
__imlib_RotateSampleInside(DATA32 *src, DATA32 *dest, int sow, int dow,
|
||||||
|
int dw, int dh, int x, int y, int dx, int dy)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((dw < 1) || (dh < 1)) return;
|
||||||
|
|
||||||
|
/*\
|
||||||
|
fprintf(stderr, "__imlib_RotateSampleInside(src = %p, dest = %p, sow = %d, dow = %d, dw = %d, dh = %d, x = %d, y = %d, dx = %d, dy = %d)\n", src, dest, sow, dow, dw, dh, x, y, dx, dy);
|
||||||
|
\*/
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
src += (x >> _ROTATE_PREC) + ((y >> _ROTATE_PREC) * sow);
|
||||||
|
x &= _ROTATE_PREC_BITS; y &= _ROTATE_PREC_BITS;
|
||||||
|
while (1) {
|
||||||
|
do {
|
||||||
|
*dest = *src;
|
||||||
|
/*\ RIGHT; \*/
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest++;
|
||||||
|
i++;
|
||||||
|
} while (i < dw);
|
||||||
|
dh--;
|
||||||
|
if (dh <= 0) break;
|
||||||
|
/*\ DOWN; \*/
|
||||||
|
x -= dy;
|
||||||
|
y += dx;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest += dow;
|
||||||
|
do {
|
||||||
|
/*\ LEFT; \*/
|
||||||
|
x -= dx;
|
||||||
|
y -= dy;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest--;
|
||||||
|
*dest = *src;
|
||||||
|
i--;
|
||||||
|
} while (i > 0);
|
||||||
|
dh--;
|
||||||
|
if (dh <= 0) break;
|
||||||
|
/*\ DOWN; \*/
|
||||||
|
x -= dy;
|
||||||
|
y += dx;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest += dow;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/*\ Testing shows this version to be 10% (!!!) faster (overall speed)
|
||||||
|
|*| So I think we can live with its ugliness..
|
||||||
|
|*| It's still a bottleneck, with it's 24 MULs per call..
|
||||||
|
\*/
|
||||||
|
|
||||||
|
/*\ bigendian and littleendian byte-from-int macro's \*/
|
||||||
|
#if __BYTE_ORDER == __LITTLE_ENDIAN
|
||||||
|
#define R_VAL(x) (*(((DATA8 *)&(x))+(0)))
|
||||||
|
#define G_VAL(x) (*(((DATA8 *)&(x))+(1)))
|
||||||
|
#define B_VAL(x) (*(((DATA8 *)&(x))+(2)))
|
||||||
|
#define A_VAL(x) (*(((DATA8 *)&(x))+(3)))
|
||||||
|
#elif __BYTE_ORDER == __BIG_ENDIAN
|
||||||
|
#define A_VAL(x) (*(((DATA8 *)&(x))+(0)))
|
||||||
|
#define B_VAL(x) (*(((DATA8 *)&(x))+(1)))
|
||||||
|
#define G_VAL(x) (*(((DATA8 *)&(x))+(2)))
|
||||||
|
#define R_VAL(x) (*(((DATA8 *)&(x))+(3)))
|
||||||
|
#elif __BYTE_ORDER == __PDP_ENDIAN
|
||||||
|
#define B_VAL(x) (*(((DATA8 *)&(x))+(0)))
|
||||||
|
#define A_VAL(x) (*(((DATA8 *)&(x))+(1)))
|
||||||
|
#define R_VAL(x) (*(((DATA8 *)&(x))+(2)))
|
||||||
|
#define G_VAL(x) (*(((DATA8 *)&(x))+(3)))
|
||||||
|
#else
|
||||||
|
#error Unknown byte endianness.
|
||||||
|
#endif
|
||||||
|
static inline DATA32
|
||||||
|
Interp_ARGB(DATA32 ul, DATA32 ur, DATA32 ll, DATA32 lr, int x, int y)
|
||||||
|
{
|
||||||
|
DATA32 rv;
|
||||||
|
|
||||||
|
R_VAL(rv) = ((((R_VAL(ul)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(R_VAL(ur)) * x) * (_ROTATE_PREC_MAX - y) +
|
||||||
|
((R_VAL(ll)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(R_VAL(lr)) * x) * y) >> (2 * _ROTATE_PREC));
|
||||||
|
|
||||||
|
G_VAL(rv) = ((((G_VAL(ul)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(G_VAL(ur)) * x) * (_ROTATE_PREC_MAX - y) +
|
||||||
|
((G_VAL(ll)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(G_VAL(lr)) * x) * y) >> (2 * _ROTATE_PREC));
|
||||||
|
|
||||||
|
B_VAL(rv) = ((((B_VAL(ul)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(B_VAL(ur)) * x) * (_ROTATE_PREC_MAX - y) +
|
||||||
|
((B_VAL(ll)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(B_VAL(lr)) * x) * y) >> (2 * _ROTATE_PREC));
|
||||||
|
|
||||||
|
A_VAL(rv) = ((((A_VAL(ul)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(A_VAL(ur)) * x) * (_ROTATE_PREC_MAX - y) +
|
||||||
|
((A_VAL(ll)) * (_ROTATE_PREC_MAX - x) +
|
||||||
|
(A_VAL(lr)) * x) * y) >> (2 * _ROTATE_PREC));
|
||||||
|
|
||||||
|
return rv;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*\ Same as last function, but with antialiasing \*/
|
||||||
|
void
|
||||||
|
__imlib_RotateAAInside(DATA32 *src, DATA32 *dest, int sow, int dow,
|
||||||
|
int dw, int dh, int x, int y, int dx, int dy)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
|
||||||
|
if ((dw < 1) || (dh < 1)) return;
|
||||||
|
|
||||||
|
i = 0;
|
||||||
|
src += (x >> _ROTATE_PREC) + ((y >> _ROTATE_PREC) * sow);
|
||||||
|
x &= _ROTATE_PREC_BITS; y &= _ROTATE_PREC_BITS;
|
||||||
|
while (1) {
|
||||||
|
do {
|
||||||
|
*dest = Interp_ARGB(src[0], src[1],
|
||||||
|
src[sow], src[sow + 1], x, y);
|
||||||
|
/*\ RIGHT; \*/
|
||||||
|
x += dx;
|
||||||
|
y += dy;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest++;
|
||||||
|
i++;
|
||||||
|
} while (i < dw);
|
||||||
|
dh--;
|
||||||
|
if (dh <= 0) break;
|
||||||
|
/*\ DOWN; \*/
|
||||||
|
x -= dy;
|
||||||
|
y += dx;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest += dow;
|
||||||
|
do {
|
||||||
|
/*\ LEFT; \*/
|
||||||
|
x -= dx;
|
||||||
|
y -= dy;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
--dest;
|
||||||
|
*dest = Interp_ARGB(src[0], src[1],
|
||||||
|
src[sow], src[sow + 1], x, y);
|
||||||
|
--i;
|
||||||
|
} while (i > 0);
|
||||||
|
dh--;
|
||||||
|
if (dh <= 0) break;
|
||||||
|
/*\ DOWN; \*/
|
||||||
|
x -= dy;
|
||||||
|
y += dx;
|
||||||
|
RENORM_X_Y_SRC;
|
||||||
|
dest += dow;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#ifndef __ROTATE
|
||||||
|
#define __ROTATE 1
|
||||||
|
|
||||||
|
/*\ Calc precision \*/
|
||||||
|
#define _ROTATE_PREC 12
|
||||||
|
#define _ROTATE_PREC_MAX (1 << _ROTATE_PREC)
|
||||||
|
#define _ROTATE_PREC_BITS (_ROTATE_PREC_MAX - 1)
|
||||||
|
|
||||||
|
void __imlib_RotateSampleInside(DATA32 *src, DATA32 *dest, int sow, int dow,
|
||||||
|
int dw, int dh, int x, int y, int dx, int dy);
|
||||||
|
void __imlib_RotateAAInside(DATA32 *src, DATA32 *dest, int sow, int dow,
|
||||||
|
int dw, int dh, int x, int y, int dx, int dy);
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue