diff --git a/src/modules/Image/blit.c b/src/modules/Image/blit.c index f91b74c4ab0e6da943573bb499722e0b845d3d53..8645bd3d54000dfd31abe5ce32f6c27db2c72915 100644 --- a/src/modules/Image/blit.c +++ b/src/modules/Image/blit.c @@ -1,10 +1,10 @@ -/* $Id: blit.c,v 1.39 2000/06/03 21:00:43 per Exp $ */ +/* $Id: blit.c,v 1.40 2000/06/03 22:48:01 per Exp $ */ #include "global.h" /* **! module Image **! note -**! $Id: blit.c,v 1.39 2000/06/03 21:00:43 per Exp $ +**! $Id: blit.c,v 1.40 2000/06/03 22:48:01 per Exp $ **! class Image */ @@ -126,47 +126,34 @@ void img_clear(rgb_group *dest,rgb_group rgb,INT32 size) { if(!size) return; THREADS_ALLOW(); + if( ( rgb.r == rgb.g && rgb.r == rgb.b ) ) + MEMSET(dest, rgb.r, size*sizeof(rgb_group) ); #ifdef ASSEMBLY_OK - if( size > 512 ) + else if( size > 512 && (image_cpuid & IMAGE_MMX) ) { - if( image_cpuid & IMAGE_MMX ) - { - if( ( rgb.r == rgb.g && rgb.g == rgb.b ) ) - image_clear_buffer_mmx_x86asm_eq( dest, size/8, rgb.g ); - else - { - /* clear a few bytes the slow way. */ - /* 8 pixels */ - dest[0] = rgb; dest[1] = rgb; dest[2] = rgb; dest[3] = rgb; - dest[4] = rgb; dest[5] = rgb; dest[6] = rgb; dest[7] = rgb; - /* clear the rest the fast way */ - image_clear_buffer_mmx_x86asm_from( dest, size/8 ); - } - dest += size; size = size%8; dest -= size; - while(size--) *(dest++) = rgb; - return; - } + int *q = (int *)dest; + /* 8 pixels, 24 bytes */ + dest[0] = rgb; dest[1] = rgb; dest[2] = rgb; dest[3] = rgb; + q[4] = q[0]; q[5] = q[1]; q[6] = q[2]; + /* clear the rest the fast way.. */ + image_clear_buffer_mmx_x86asm_from( dest, size/8 ); + dest += size; size = size%8; dest -= size; + while(size--) *(dest++) = rgb; } #endif - if(!rgb.r && !rgb.b && !rgb.g) - MEMSET(dest, 0, size*sizeof(rgb_group)); - else if((sizeof(rgb.r) == 1) && (rgb.r == rgb.b && rgb.b == rgb.g)) - MEMSET(dest, rgb.r, size*sizeof(rgb_group)); else if(size) { + int increment = 1; + rgb_group *from = dest; + *(dest++)=rgb; + size -= 1; + while (size>increment) { - int increment = 1; - rgb_group *from = dest; - *(dest++)=rgb; - size -= 1; - while (size>increment) - { - MEMCPY(dest,from,increment*sizeof(rgb_group)); - size-=increment,dest+=increment; - if (increment<1024) increment *= 2; - } - if(size>0) MEMCPY(dest,from,size*sizeof(rgb_group)); + MEMCPY(dest,from,increment*sizeof(rgb_group)); + size-=increment,dest+=increment; + if (increment<1024) increment *= 2; } + if(size>0) MEMCPY(dest,from,size*sizeof(rgb_group)); } THREADS_DISALLOW(); }