Fri Aug 12 14:45:54 2005 Søren Sandmann <sandmann@redhat.com>

Fix up multiplications based on patch by Billy Biggs. Part of bug 3945.
This commit is contained in:
Søren Sandmann Pedersen 2005-08-12 18:47:17 +00:00
parent 8bfffb96b5
commit 1eed84f227

View File

@ -148,12 +148,12 @@
x_c = (x_c * a) / 255 x_c = (x_c * a) / 255
*/ */
#define FbByteMul(x, a) do { \ #define FbByteMul(x, a) do { \
CARD32 t = (x & 0xff00ff) *a; \ CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
t &= 0xff00ff; \ t &= 0xff00ff; \
\ \
x = ((x >> 8) & 0xff00ff) * a; \ x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
x = (x + ((x >> 8) & 0xff00ff) + 0x800080); \ x = (x + ((x >> 8) & 0xff00ff)); \
x &= 0xff00ff00; \ x &= 0xff00ff00; \
x += t; \ x += t; \
} while (0) } while (0)
@ -162,15 +162,15 @@
x_c = (x_c * a) / 255 + y x_c = (x_c * a) / 255 + y
*/ */
#define FbByteMulAdd(x, a, y) do { \ #define FbByteMulAdd(x, a, y) do { \
CARD32 t = (x & 0xff00ff) * a; \ CARD32 t = ((x & 0xff00ff) * a) + 0x800080; \
t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
t &= 0xff00ff; \ t &= 0xff00ff; \
t += y & 0xff00ff; \ t += y & 0xff00ff; \
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
t &= 0xff00ff; \ t &= 0xff00ff; \
\ \
x = ((x >> 8) & 0xff00ff) * a; \ x = (((x >> 8) & 0xff00ff) * a) + 0x800080; \
x = (x + ((x >> 8) & 0xff00ff) + 0x800080) >> 8; \ x = (x + ((x >> 8) & 0xff00ff)) >> 8; \
x &= 0xff00ff; \ x &= 0xff00ff; \
x += (y >> 8) & 0xff00ff; \ x += (y >> 8) & 0xff00ff; \
x |= 0x1000100 - ((t >> 8) & 0xff00ff); \ x |= 0x1000100 - ((t >> 8) & 0xff00ff); \
@ -184,8 +184,8 @@
*/ */
#define FbByteAddMul(x, a, y, b) do { \ #define FbByteAddMul(x, a, y, b) do { \
CARD32 t; \ CARD32 t; \
CARD32 r = (x >> 24) * a + (y >> 24) * b; \ CARD32 r = (x >> 24) * a + (y >> 24) * b + 0x80; \
r += (r >> 8) + 0x80; \ r += (r >> 8); \
r >>= 8; \ r >>= 8; \
\ \
t = (x & 0xff00) * a + (y & 0xff00) * b; \ t = (x & 0xff00) * a + (y & 0xff00) * b; \
@ -197,12 +197,12 @@
t &= 0xff00ff; \ t &= 0xff00ff; \
t <<= 8; \ t <<= 8; \
\ \
r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b; \ r = ((x >> 16) & 0xff) * a + ((y >> 16) & 0xff) * b + 0x80; \
r += (r >> 8) + 0x80; \ r += (r >> 8); \
r >>= 8; \ r >>= 8; \
\ \
x = (x & 0xff) * a + (y & 0xff) * b; \ x = (x & 0xff) * a + (y & 0xff) * b + 0x80; \
x += (x >> 8) + 0x80; \ x += (x >> 8); \
x >>= 8; \ x >>= 8; \
x |= r << 16; \ x |= r << 16; \
x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
@ -229,13 +229,15 @@
CARD32 t; \ CARD32 t; \
CARD32 r = (x & 0xff) * (a & 0xff); \ CARD32 r = (x & 0xff) * (a & 0xff); \
r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8; \ r += 0x800080; \
r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
r &= 0xff00ff; \ r &= 0xff00ff; \
\ \
x >>= 8; \ x >>= 8; \
t = (x & 0xff) * ((a >> 8) & 0xff); \ t = (x & 0xff) * ((a >> 8) & 0xff); \
t |= (x & 0xff0000) * (a >> 24); \ t |= (x & 0xff0000) * (a >> 24); \
t = (t + ((t >> 8) & 0xff00ff) + 0x800080); \ t += 0x800080; \
t = t + ((t >> 8) & 0xff00ff); \
x = r | (t & 0xff00ff00); \ x = r | (t & 0xff00ff00); \
\ \
} while (0) } while (0)
@ -247,7 +249,8 @@
CARD32 t; \ CARD32 t; \
CARD32 r = (x & 0xff) * (a & 0xff); \ CARD32 r = (x & 0xff) * (a & 0xff); \
r |= (x & 0xff0000) * ((a >> 16) & 0xff); \ r |= (x & 0xff0000) * ((a >> 16) & 0xff); \
r = (r + ((r >> 8) & 0xff00ff) + 0x800080) >> 8; \ r += 0x800080; \
r = (r + ((r >> 8) & 0xff00ff)) >> 8; \
r &= 0xff00ff; \ r &= 0xff00ff; \
r += y & 0xff00ff; \ r += y & 0xff00ff; \
r |= 0x1000100 - ((r >> 8) & 0xff00ff); \ r |= 0x1000100 - ((r >> 8) & 0xff00ff); \
@ -256,7 +259,8 @@
x >>= 8; \ x >>= 8; \
t = (x & 0xff) * ((a >> 8) & 0xff); \ t = (x & 0xff) * ((a >> 8) & 0xff); \
t |= (x & 0xff0000) * (a >> 24); \ t |= (x & 0xff0000) * (a >> 24); \
t = (t + ((t >> 8) & 0xff00ff) + 0x800080) >> 8; \ t += 0x800080; \
t = (t + ((t >> 8) & 0xff00ff)) >> 8; \
t &= 0xff00ff; \ t &= 0xff00ff; \
t += (y >> 8) & 0xff00ff; \ t += (y >> 8) & 0xff00ff; \
t |= 0x1000100 - ((t >> 8) & 0xff00ff); \ t |= 0x1000100 - ((t >> 8) & 0xff00ff); \
@ -282,12 +286,12 @@
t &= 0xff00ff; \ t &= 0xff00ff; \
t <<= 8; \ t <<= 8; \
\ \
r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b; \ r = ((x >> 16) & 0xff) * ((a >> 16) & 0xff) + ((y >> 16) & 0xff) * b + 0x80; \
r += (r >> 8) + 0x80; \ r += (r >> 8); \
r >>= 8; \ r >>= 8; \
\ \
x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b; \ x = (x & 0xff) * (a & 0xff) + (y & 0xff) * b + 0x80; \
x += (x >> 8) + 0x80; \ x += (x >> 8); \
x >>= 8; \ x >>= 8; \
x |= r << 16; \ x |= r << 16; \
x |= 0x1000100 - ((x >> 8) & 0xff00ff); \ x |= 0x1000100 - ((x >> 8) & 0xff00ff); \
@ -310,7 +314,7 @@
x = r; \ x = r; \
} while (0) } while (0)
#define div_255(x) (((x) + ((x) >> 8) + 0x80) >> 8) #define div_255(x) (((x) + 0x80 + (((x) + 0x80) >> 8)) >> 8)
#if defined(__i386__) && defined(__GNUC__) #if defined(__i386__) && defined(__GNUC__)
#define FASTCALL __attribute__((regparm(3))) #define FASTCALL __attribute__((regparm(3)))