diff options
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | src/pixmap.c | 76 |
2 files changed, 29 insertions, 52 deletions
@@ -5357,3 +5357,8 @@ Reverted patch from C. David Wilde <cdw@mylinuxguy.com> which broke big-endian machines and really didn't fix anything at all. Thanks to Tres Melton <tres@mindspring.com> for catching this. ---------------------------------------------------------------------- +Tue Apr 26 13:40:54 2005 Michael Jennings (mej) + +Patch from Tres Melton <tres@mindspring.com> to optimize 24-bit and +32-bit non-MMX shading routines. +---------------------------------------------------------------------- diff --git a/src/pixmap.c b/src/pixmap.c index bf63258..7441bd6 100644 --- a/src/pixmap.c +++ b/src/pixmap.c @@ -1651,22 +1651,14 @@ shade_ximage_32(void *data, int bpl, int w, int h, int rm, int gm, int bm) /* No saturation */ for (y = h; --y >= 0;) { for (x = -(w * 4); x < 0; x += 4) { - int r, g, b; - # if WORDS_BIGENDIAN - r = (ptr[x + 1] * rm) >> 8; - g = (ptr[x + 2] * gm) >> 8; - b = (ptr[x + 3] * bm) >> 8; - ptr[x + 1] = r; - ptr[x + 2] = g; - ptr[x + 3] = b; + ptr[x + 1] = (unsigned char) ((ptr[x + 1] * rm) >> 8); + ptr[x + 2] = (unsigned char) ((ptr[x + 2] * gm) >> 8); + ptr[x + 3] = (unsigned char) ((ptr[x + 3] * bm) >> 8); # else - r = (ptr[x + 2] * rm) >> 8; - g = (ptr[x + 1] * gm) >> 8; - b = (ptr[x + 0] * bm) >> 8; - ptr[x + 2] = r; - ptr[x + 1] = g; - ptr[x + 0] = b; + ptr[x + 2] = (unsigned char) ((ptr[x + 2] * rm) >> 8); + ptr[x + 1] = (unsigned char) ((ptr[x + 1] * gm) >> 8); + ptr[x + 0] = (unsigned char) ((ptr[x + 0] * bm) >> 8); # endif } ptr += bpl; @@ -1675,27 +1667,20 @@ shade_ximage_32(void *data, int bpl, int w, int h, int rm, int gm, int bm) for (y = h; --y >= 0;) { for (x = -(w * 4); x < 0; x += 4) { int r, g, b; - # if WORDS_BIGENDIAN r = (ptr[x + 1] * rm) >> 8; + ptr[x + 1] = r|(!(r >> 8) - 1); g = (ptr[x + 2] * gm) >> 8; + ptr[x + 2] = g|(!(g >> 8) - 1); b = (ptr[x + 3] * bm) >> 8; + ptr[x + 3] = b|(!(b >> 8) - 1); # else r = (ptr[x + 2] * rm) >> 8; + ptr[x + 2] = r|(!(r >> 8) - 1); g = (ptr[x + 1] * gm) >> 8; + ptr[x + 1] = g|(!(g >> 8) - 1); b = (ptr[x + 0] * bm) >> 8; -# endif - r |= (!(r >> 8) - 1); - g |= (!(g >> 8) - 1); - b |= (!(b >> 8) - 1); -# if WORDS_BIGENDIAN - ptr[x + 1] = r; - ptr[x + 2] = g; - ptr[x + 3] = b; -# else - ptr[x + 2] = r; - ptr[x + 1] = g; - ptr[x + 0] = b; + ptr[x + 0] = b|(!(b >> 8) - 1); # endif } ptr += bpl; @@ -1719,19 +1704,13 @@ shade_ximage_24(void *data, int bpl, int w, int h, int rm, int gm, int bm) int r, g, b; # if WORDS_BIGENDIAN - r = (ptr[x + 0] * rm) >> 8; - g = (ptr[x + 1] * gm) >> 8; - b = (ptr[x + 2] * bm) >> 8; - ptr[x + 0] = r; - ptr[x + 1] = g; - ptr[x + 2] = b; + ptr[x + 0] = (ptr[x + 0] * rm) >> 8; + ptr[x + 1] = (ptr[x + 1] * gm) >> 8; + ptr[x + 2] = (ptr[x + 2] * bm) >> 8; # else - r = (ptr[x + 2] * rm) >> 8; - g = (ptr[x + 1] * gm) >> 8; - b = (ptr[x + 0] * bm) >> 8; - ptr[x + 2] = r; - ptr[x + 1] = g; - ptr[x + 0] = b; + ptr[x + 2] = (ptr[x + 2] * rm) >> 8; + ptr[x + 1] = (ptr[x + 1] * gm) >> 8; + ptr[x + 0] = (ptr[x + 0] * bm) >> 8; # endif } ptr += bpl; @@ -1740,27 +1719,20 @@ shade_ximage_24(void *data, int bpl, int w, int h, int rm, int gm, int bm) for (y = h; --y >= 0;) { for (x = -(w * 3); x < 0; x += 3) { int r, g, b; - # if WORDS_BIGENDIAN r = (ptr[x + 0] * rm) >> 8; + ptr[x + 0] = r|(!(r >> 8) - 1); g = (ptr[x + 1] * gm) >> 8; + ptr[x + 1] = g|(!(g >> 8) - 1); b = (ptr[x + 2] * bm) >> 8; + ptr[x + 2] = b|(!(b >> 8) - 1); # else r = (ptr[x + 2] * rm) >> 8; + ptr[x + 2] = r|(!(r >> 8) - 1); g = (ptr[x + 1] * gm) >> 8; + ptr[x + 1] = g|(!(g >> 8) - 1); b = (ptr[x + 0] * bm) >> 8; -# endif - r |= (!(r >> 8) - 1); - g |= (!(g >> 8) - 1); - b |= (!(b >> 8) - 1); -# if WORDS_BIGENDIAN - ptr[x + 0] = r; - ptr[x + 1] = g; - ptr[x + 2] = b; -# else - ptr[x + 2] = r; - ptr[x + 1] = g; - ptr[x + 0] = b; + ptr[x + 0] = b|(!(b >> 8) - 1); # endif } ptr += bpl; |