diff options
Diffstat (limited to 'distrib/sdl-1.2.12/src/video/cybergfx/SDL_cgxaccel.c')
-rw-r--r-- | distrib/sdl-1.2.12/src/video/cybergfx/SDL_cgxaccel.c | 262 |
1 files changed, 262 insertions, 0 deletions
diff --git a/distrib/sdl-1.2.12/src/video/cybergfx/SDL_cgxaccel.c b/distrib/sdl-1.2.12/src/video/cybergfx/SDL_cgxaccel.c new file mode 100644 index 0000000..24605e3 --- /dev/null +++ b/distrib/sdl-1.2.12/src/video/cybergfx/SDL_cgxaccel.c @@ -0,0 +1,262 @@ +/* + SDL - Simple DirectMedia Layer + Copyright (C) 1997-2006 Sam Lantinga + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with this library; if not, write to the Free Software + Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + + Sam Lantinga + slouken@libsdl.org +*/ +#include "SDL_config.h" + +#include "SDL_endian.h" +#include "SDL_video.h" +#include "../SDL_sysvideo.h" +#include "../SDL_blit.h" +#include "SDL_cgxvideo.h" + +static int CGX_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect); + +// These are needed to avoid register troubles with gcc -O2! + +#if defined(__SASC) || defined(__PPC__) || defined(MORPHOS) +#define BMKBRP(a,b,c,d,e,f,g,h,i,j) BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j) +#define BBRP(a,b,c,d,e,f,g,h,i) BltBitMapRastPort(a,b,c,d,e,f,g,h,i) +#define BBB(a,b,c,d,e,f,g,h,i,j,k) BltBitMap(a,b,c,d,e,f,g,h,i,j,k) +#else +void BMKBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,APTR j) +{BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j);} + +void BBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i) +{BltBitMapRastPort(a,b,c,d,e,f,g,h,i);} + +void BBB(struct BitMap *a,WORD b, WORD c,struct BitMap *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,UBYTE j,UWORD *k) +{BltBitMap(a,b,c,d,e,f,g,h,i,j,k);} +#endif + +int CGX_SetHWColorKey(_THIS,SDL_Surface *surface, Uint32 key) +{ + if(surface->hwdata) + { + if(surface->hwdata->mask) + SDL_free(surface->hwdata->mask); + + if(surface->hwdata->mask=SDL_malloc(RASSIZE(surface->w,surface->h))) + { + Uint32 pitch,ok=0; + APTR lock; + + SDL_memset(surface->hwdata->mask,255,RASSIZE(surface->w,surface->h)); + + D(bug("Building colorkey mask: color: %ld, size: %ld x %ld, %ld bytes...Bpp:%ld\n",key,surface->w,surface->h,RASSIZE(surface->w,surface->h),surface->format->BytesPerPixel)); + + if(lock=LockBitMapTags(surface->hwdata->bmap,LBMI_BASEADDRESS,(ULONG)&surface->pixels, + LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE)) + { + switch(surface->format->BytesPerPixel) + { + case 1: + { + unsigned char k=key; + register int i,j,t; + register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels; + + pitch-=surface->w; + + for(i=0;i<surface->h;i++) + { + for(t=128,j=0;j<surface->w;j++) + { + if(*map==k) + *dest&=~t; + + t>>=1; + + if(t==0) + { + dest++; + t=128; + } + map++; + } + map+=pitch; + } + } + break; + case 2: + { + Uint16 k=key,*mapw; + register int i,j,t; + register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels; + + for(i=surface->h;i;--i) + { + mapw=(Uint16 *)map; + + for(t=128,j=surface->w;j;--j) + { + if(*mapw==k) + *dest&=~t; + + t>>=1; + + if(t==0) + { + dest++; + t=128; + } + mapw++; + } + map+=pitch; + } + } + break; + case 4: + { + Uint32 *mapl; + register int i,j,t; + register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels; + + for(i=surface->h;i;--i) + { + mapl=(Uint32 *)map; + + for(t=128,j=surface->w;j;--j) + { + if(*mapl==key) + *dest&=~t; + + t>>=1; + + if(t==0) + { + dest++; + t=128; + } + mapl++; + } + map+=pitch; + } + + } + break; + default: + D(bug("Pixel mode non supported for color key...")); + SDL_free(surface->hwdata->mask); + surface->hwdata->mask=NULL; + ok=-1; + } + UnLockBitMap(lock); + D(bug("...Colorkey built!\n")); + return ok; + } + } + } + D(bug("HW colorkey not supported for this depth\n")); + + return -1; +} + +int CGX_CheckHWBlit(_THIS,SDL_Surface *src,SDL_Surface *dst) +{ +// Doesn't support yet alpha blitting + + if(src->hwdata&& !(src->flags & (SDL_SRCALPHA))) + { + D(bug("CheckHW blit... OK!\n")); + + if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) { + if ( CGX_SetHWColorKey(this, src, src->format->colorkey) < 0 ) { + src->flags &= ~SDL_HWACCEL; + return -1; + } + } + + src->flags|=SDL_HWACCEL; + src->map->hw_blit = CGX_HWAccelBlit; + return 1; + } + else + src->flags &= ~SDL_HWACCEL; + + D(bug("CheckHW blit... NO!\n")); + + return 0; +} + +static int temprp_init=0; +static struct RastPort temprp; + +static int CGX_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect, + SDL_Surface *dst, SDL_Rect *dstrect) +{ + struct SDL_VideoDevice *this=src->hwdata->videodata; + +// D(bug("Accel blit!\n")); + + if(src->flags&SDL_SRCCOLORKEY && src->hwdata->mask) + { + if(dst==SDL_VideoSurface) + { + BMKBRP(src->hwdata->bmap,srcrect->x,srcrect->y, + SDL_RastPort,dstrect->x+SDL_Window->BorderLeft,dstrect->y+SDL_Window->BorderTop, + srcrect->w,srcrect->h,0xc0,src->hwdata->mask); + } + else if(dst->hwdata) + { + if(!temprp_init) + { + InitRastPort(&temprp); + temprp_init=1; + } + temprp.BitMap=(struct BitMap *)dst->hwdata->bmap; + + BMKBRP(src->hwdata->bmap,srcrect->x,srcrect->y, + &temprp,dstrect->x,dstrect->y, + srcrect->w,srcrect->h,0xc0,src->hwdata->mask); + + } + } + else if(dst==SDL_VideoSurface) + { + BBRP(src->hwdata->bmap,srcrect->x,srcrect->y,SDL_RastPort,dstrect->x+SDL_Window->BorderLeft,dstrect->y+SDL_Window->BorderTop,srcrect->w,srcrect->h,0xc0); + } + else if(dst->hwdata) + BBB(src->hwdata->bmap,srcrect->x,srcrect->y,dst->hwdata->bmap,dstrect->x,dstrect->y,srcrect->w,srcrect->h,0xc0,0xff,NULL); + + return 0; +} + +int CGX_FillHWRect(_THIS,SDL_Surface *dst,SDL_Rect *dstrect,Uint32 color) +{ + if(dst==SDL_VideoSurface) + { + FillPixelArray(SDL_RastPort,dstrect->x+SDL_Window->BorderLeft,dstrect->y+SDL_Window->BorderTop,dstrect->w,dstrect->h,color); + } + else if(dst->hwdata) + { + if(!temprp_init) + { + InitRastPort(&temprp); + temprp_init=1; + } + + temprp.BitMap=(struct BitMap *)dst->hwdata->bmap; + + FillPixelArray(&temprp,dstrect->x,dstrect->y,dstrect->w,dstrect->h,color); + } + return 0; +} |