SDL_cgxaccel.c
上传用户:sun1608
上传日期:2007-02-02
资源大小:6116k
文件大小:7k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000  Sam Lantinga
  4.     This library is free software; you can redistribute it and/or
  5.     modify it under the terms of the GNU Library General Public
  6.     License as published by the Free Software Foundation; either
  7.     version 2 of the License, or (at your option) any later version.
  8.     This library is distributed in the hope that it will be useful,
  9.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
  11.     Library General Public License for more details.
  12.     You should have received a copy of the GNU Library General Public
  13.     License along with this library; if not, write to the Free
  14.     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  15.     Sam Lantinga
  16.     slouken@libsdl.org
  17. */
  18. #ifdef SAVE_RCSID
  19. static char rcsid =
  20.  "@(#) $Id: SDL_cgxaccel.c,v 1.3 2002/04/22 21:38:04 wmay Exp $";
  21. #endif
  22. #include "SDL_error.h"
  23. #include "SDL_endian.h"
  24. #include "SDL_sysvideo.h"
  25. #include "SDL_blit.h"
  26. #include "SDL_video.h"
  27. #include "SDL_cgxvideo.h"
  28. static int CGX_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
  29. SDL_Surface *dst, SDL_Rect *dstrect);
  30. // These are needed to avoid register troubles with gcc -O2!
  31. #if defined(__SASC) || defined(__PPC__) || defined(MORPHOS)
  32. #define BMKBRP(a,b,c,d,e,f,g,h,i,j) BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j)
  33. #define BBRP(a,b,c,d,e,f,g,h,i) BltBitMapRastPort(a,b,c,d,e,f,g,h,i)
  34. #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)
  35. #else
  36. void BMKBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i,APTR j)
  37. {BltMaskBitMapRastPort(a,b,c,d,e,f,g,h,i,j);}
  38. void BBRP(struct BitMap *a,WORD b, WORD c,struct RastPort *d,WORD e,WORD f,WORD g,WORD h,UBYTE i)
  39. {BltBitMapRastPort(a,b,c,d,e,f,g,h,i);}
  40. 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)
  41. {BltBitMap(a,b,c,d,e,f,g,h,i,j,k);}
  42. #endif
  43. int CGX_SetHWColorKey(_THIS,SDL_Surface *surface, Uint32 key)
  44. {
  45. if(surface->hwdata)
  46. {
  47. if(surface->hwdata->mask)
  48. free(surface->hwdata->mask);
  49. if(surface->hwdata->mask=malloc(RASSIZE(surface->w,surface->h)))
  50. {
  51. Uint32 pitch,ok=0;
  52. APTR lock;
  53. memset(surface->hwdata->mask,255,RASSIZE(surface->w,surface->h));
  54. D(bug("Building colorkey mask: color: %ld, size: %ld x %ld, %ld bytes...Bpp:%ldn",key,surface->w,surface->h,RASSIZE(surface->w,surface->h),surface->format->BytesPerPixel));
  55. if(lock=LockBitMapTags(surface->hwdata->bmap,LBMI_BASEADDRESS,(ULONG)&surface->pixels,
  56. LBMI_BYTESPERROW,(ULONG)&pitch,TAG_DONE))
  57. {
  58. switch(surface->format->BytesPerPixel)
  59. {
  60. case 1:
  61. {
  62. unsigned char k=key;
  63. register int i,j,t;
  64. register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels;
  65. pitch-=surface->w;
  66. for(i=0;i<surface->h;i++)
  67. {
  68. for(t=128,j=0;j<surface->w;j++)
  69. {
  70. if(*map==k)
  71. *dest&=~t;
  72. t>>=1;
  73. if(t==0)
  74. {
  75. dest++;
  76. t=128;
  77. }
  78. map++;
  79. }
  80. map+=pitch;
  81. }
  82. }
  83. break;
  84. case 2:
  85. {
  86. Uint16 k=key,*mapw;
  87. register int i,j,t;
  88. register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels;
  89. for(i=surface->h;i;--i)
  90. {
  91. mapw=(Uint16 *)map;
  92. for(t=128,j=surface->w;j;--j)
  93. {
  94. if(*mapw==k)
  95. *dest&=~t;
  96. t>>=1;
  97. if(t==0)
  98. {
  99. dest++;
  100. t=128;
  101. }
  102. mapw++;
  103. }
  104. map+=pitch;
  105. }
  106. }
  107. break;
  108. case 4:
  109. {
  110. Uint32 *mapl;
  111. register int i,j,t;
  112. register unsigned char *dest=surface->hwdata->mask,*map=surface->pixels;
  113. for(i=surface->h;i;--i)
  114. {
  115. mapl=(Uint32 *)map;
  116. for(t=128,j=surface->w;j;--j)
  117. {
  118. if(*mapl==key)
  119. *dest&=~t;
  120. t>>=1;
  121. if(t==0)
  122. {
  123. dest++;
  124. t=128;
  125. }
  126. mapl++;
  127. }
  128. map+=pitch;
  129. }
  130. }
  131. break;
  132. default:
  133. D(bug("Pixel mode non supported for color key..."));
  134. free(surface->hwdata->mask);
  135. surface->hwdata->mask=NULL;
  136. ok=-1;
  137. }
  138. UnLockBitMap(lock);
  139. D(bug("...Colorkey built!n"));
  140. return ok;
  141. }
  142. }
  143. }
  144. D(bug("HW colorkey not supported for this depthn"));
  145. return -1;
  146. }
  147. int CGX_CheckHWBlit(_THIS,SDL_Surface *src,SDL_Surface *dst)
  148. {
  149. // Doesn't support yet alpha blitting
  150. if(src->hwdata&& !(src->flags & (SDL_SRCALPHA)))
  151. {
  152. D(bug("CheckHW blit... OK!n"));
  153. if ( (src->flags & SDL_SRCCOLORKEY) == SDL_SRCCOLORKEY ) {
  154. if ( CGX_SetHWColorKey(this, src, src->format->colorkey) < 0 ) {
  155. src->flags &= ~SDL_HWACCEL;
  156. return -1;
  157. }
  158. }
  159. src->flags|=SDL_HWACCEL;
  160. src->map->hw_blit = CGX_HWAccelBlit;
  161. return 1;
  162. }
  163. else
  164. src->flags &= ~SDL_HWACCEL;
  165. D(bug("CheckHW blit... NO!n"));
  166. return 0;
  167. }
  168. static int temprp_init=0;
  169. static struct RastPort temprp;
  170. static int CGX_HWAccelBlit(SDL_Surface *src, SDL_Rect *srcrect,
  171. SDL_Surface *dst, SDL_Rect *dstrect)
  172. {
  173. struct SDL_VideoDevice *this=src->hwdata->videodata;
  174. // D(bug("Accel blit!n"));
  175. if(src->flags&SDL_SRCCOLORKEY && src->hwdata->mask)
  176. {
  177. if(dst==SDL_VideoSurface)
  178. {
  179. BMKBRP(src->hwdata->bmap,srcrect->x,srcrect->y,
  180. SDL_RastPort,dstrect->x+SDL_Window->BorderLeft,dstrect->y+SDL_Window->BorderTop,
  181. srcrect->w,srcrect->h,0xc0,src->hwdata->mask);
  182. }
  183. else if(dst->hwdata)
  184. {
  185. if(!temprp_init)
  186. {
  187. InitRastPort(&temprp);
  188. temprp_init=1;
  189. }
  190. temprp.BitMap=(struct BitMap *)dst->hwdata->bmap;
  191. BMKBRP(src->hwdata->bmap,srcrect->x,srcrect->y,
  192. &temprp,dstrect->x,dstrect->y,
  193. srcrect->w,srcrect->h,0xc0,src->hwdata->mask);
  194. }
  195. }
  196. else if(dst==SDL_VideoSurface)
  197. {
  198. 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);
  199. }
  200. else if(dst->hwdata)
  201. BBB(src->hwdata->bmap,srcrect->x,srcrect->y,dst->hwdata->bmap,dstrect->x,dstrect->y,srcrect->w,srcrect->h,0xc0,0xff,NULL);
  202. return 0;
  203. }
  204. int CGX_FillHWRect(_THIS,SDL_Surface *dst,SDL_Rect *dstrect,Uint32 color)
  205. {
  206. if(dst==SDL_VideoSurface)
  207. {
  208. FillPixelArray(SDL_RastPort,dstrect->x+SDL_Window->BorderLeft,dstrect->y+SDL_Window->BorderTop,dstrect->w,dstrect->h,color);
  209. }
  210. else if(dst->hwdata)
  211. {
  212. if(!temprp_init)
  213. {
  214. InitRastPort(&temprp);
  215. temprp_init=1;
  216. }
  217. temprp.BitMap=(struct BitMap *)dst->hwdata->bmap;
  218. FillPixelArray(&temprp,dstrect->x,dstrect->y,dstrect->w,dstrect->h,color);
  219. }
  220. return 0;
  221. }