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

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.     SDL - Simple DirectMedia Layer
  3.     Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002  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_blit_0.c,v 1.4 2002/04/22 21:38:03 wmay Exp $";
  21. #endif
  22. #include <stdio.h>
  23. #include <string.h>
  24. #include "SDL_types.h"
  25. #include "SDL_video.h"
  26. #include "SDL_blit.h"
  27. /* Functions to blit from bitmaps to other surfaces */
  28. static void BlitBto1(SDL_BlitInfo *info)
  29. {
  30. int c;
  31. int width, height;
  32. Uint8 *src, *map, *dst;
  33. int srcskip, dstskip;
  34. /* Set up some basic variables */
  35. width = info->d_width;
  36. height = info->d_height;
  37. src = info->s_pixels;
  38. srcskip = info->s_skip;
  39. dst = info->d_pixels;
  40. dstskip = info->d_skip;
  41. map = info->table;
  42. srcskip += width-(width+7)/8;
  43. if ( map ) {
  44. while ( height-- ) {
  45.         Uint8 byte = 0, bit;
  46.      for ( c=0; c<width; ++c ) {
  47. if ( (c&7) == 0 ) {
  48. byte = *src++;
  49. }
  50. bit = (byte&0x80)>>7;
  51. if ( 1 ) {
  52.   *dst = map[bit];
  53. }
  54. dst++;
  55. byte <<= 1;
  56. }
  57. src += srcskip;
  58. dst += dstskip;
  59. }
  60. } else {
  61. while ( height-- ) {
  62.         Uint8 byte = 0, bit;
  63.      for ( c=0; c<width; ++c ) {
  64. if ( (c&7) == 0 ) {
  65. byte = *src++;
  66. }
  67. bit = (byte&0x80)>>7;
  68. if ( 1 ) {
  69.   *dst = bit;
  70. }
  71. dst++;
  72. byte <<= 1;
  73. }
  74. src += srcskip;
  75. dst += dstskip;
  76. }
  77. }
  78. }
  79. static void BlitBto2(SDL_BlitInfo *info)
  80. {
  81. int c;
  82. int width, height;
  83. Uint8 *src;
  84. Uint16 *map, *dst;
  85. int srcskip, dstskip;
  86. /* Set up some basic variables */
  87. width = info->d_width;
  88. height = info->d_height;
  89. src = info->s_pixels;
  90. srcskip = info->s_skip;
  91. dst = (Uint16 *)info->d_pixels;
  92. dstskip = info->d_skip/2;
  93. map = (Uint16 *)info->table;
  94. srcskip += width-(width+7)/8;
  95. while ( height-- ) {
  96.         Uint8 byte = 0, bit;
  97.      for ( c=0; c<width; ++c ) {
  98. if ( (c&7) == 0 ) {
  99. byte = *src++;
  100. }
  101. bit = (byte&0x80)>>7;
  102. if ( 1 ) {
  103. *dst = map[bit];
  104. }
  105. byte <<= 1;
  106. dst++;
  107. }
  108. src += srcskip;
  109. dst += dstskip;
  110. }
  111. }
  112. static void BlitBto3(SDL_BlitInfo *info)
  113. {
  114. int c, o;
  115. int width, height;
  116. Uint8 *src, *map, *dst;
  117. int srcskip, dstskip;
  118. /* Set up some basic variables */
  119. width = info->d_width;
  120. height = info->d_height;
  121. src = info->s_pixels;
  122. srcskip = info->s_skip;
  123. dst = info->d_pixels;
  124. dstskip = info->d_skip;
  125. map = info->table;
  126. srcskip += width-(width+7)/8;
  127. while ( height-- ) {
  128.         Uint8 byte = 0, bit;
  129.      for ( c=0; c<width; ++c ) {
  130. if ( (c&7) == 0 ) {
  131. byte = *src++;
  132. }
  133. bit = (byte&0x80)>>7;
  134. if ( 1 ) {
  135. o = bit * 4;
  136. dst[0] = map[o++];
  137. dst[1] = map[o++];
  138. dst[2] = map[o++];
  139. }
  140. byte <<= 1;
  141. dst += 3;
  142. }
  143. src += srcskip;
  144. dst += dstskip;
  145. }
  146. }
  147. static void BlitBto4(SDL_BlitInfo *info)
  148. {
  149. int width, height;
  150. Uint8 *src;
  151. Uint32 *map, *dst;
  152. int srcskip, dstskip;
  153. int c;
  154. /* Set up some basic variables */
  155. width = info->d_width;
  156. height = info->d_height;
  157. src = info->s_pixels;
  158. srcskip = info->s_skip;
  159. dst = (Uint32 *)info->d_pixels;
  160. dstskip = info->d_skip/4;
  161. map = (Uint32 *)info->table;
  162. srcskip += width-(width+7)/8;
  163. while ( height-- ) {
  164.         Uint8 byte = 0, bit;
  165.      for ( c=0; c<width; ++c ) {
  166. if ( (c&7) == 0 ) {
  167. byte = *src++;
  168. }
  169. bit = (byte&0x80)>>7;
  170. if ( 1 ) {
  171. *dst = map[bit];
  172. }
  173. byte <<= 1;
  174. dst++;
  175. }
  176. src += srcskip;
  177. dst += dstskip;
  178. }
  179. }
  180. static void BlitBto1Key(SDL_BlitInfo *info)
  181. {
  182.         int width = info->d_width;
  183. int height = info->d_height;
  184. Uint8 *src = info->s_pixels;
  185. Uint8 *dst = info->d_pixels;
  186. int srcskip = info->s_skip;
  187. int dstskip = info->d_skip;
  188. Uint32 ckey = info->src->colorkey;
  189. Uint8 *palmap = info->table;
  190. int c;
  191. /* Set up some basic variables */
  192. srcskip += width-(width+7)/8;
  193. if ( palmap ) {
  194. while ( height-- ) {
  195.         Uint8  byte = 0, bit;
  196.      for ( c=0; c<width; ++c ) {
  197. if ( (c&7) == 0 ) {
  198. byte = *src++;
  199. }
  200. bit = (byte&0x80)>>7;
  201. if ( bit != ckey ) {
  202.   *dst = palmap[bit];
  203. }
  204. dst++;
  205. byte <<= 1;
  206. }
  207. src += srcskip;
  208. dst += dstskip;
  209. }
  210. } else {
  211. while ( height-- ) {
  212.         Uint8  byte = 0, bit;
  213.      for ( c=0; c<width; ++c ) {
  214. if ( (c&7) == 0 ) {
  215. byte = *src++;
  216. }
  217. bit = (byte&0x80)>>7;
  218. if ( bit != ckey ) {
  219.   *dst = bit;
  220. }
  221. dst++;
  222. byte <<= 1;
  223. }
  224. src += srcskip;
  225. dst += dstskip;
  226. }
  227. }
  228. }
  229. static void BlitBto2Key(SDL_BlitInfo *info)
  230. {
  231.         int width = info->d_width;
  232. int height = info->d_height;
  233. Uint8 *src = info->s_pixels;
  234. Uint16 *dstp = (Uint16 *)info->d_pixels;
  235. int srcskip = info->s_skip;
  236. int dstskip = info->d_skip;
  237. Uint32 ckey = info->src->colorkey;
  238. Uint8 *palmap = info->table;
  239. int c;
  240. /* Set up some basic variables */
  241. srcskip += width-(width+7)/8;
  242. dstskip /= 2;
  243. while ( height-- ) {
  244.         Uint8 byte = 0, bit;
  245.      for ( c=0; c<width; ++c ) {
  246. if ( (c&7) == 0 ) {
  247. byte = *src++;
  248. }
  249. bit = (byte&0x80)>>7;
  250. if ( bit != ckey ) {
  251. *dstp=((Uint16 *)palmap)[bit];
  252. }
  253. byte <<= 1;
  254. dstp++;
  255. }
  256. src += srcskip;
  257. dstp += dstskip;
  258. }
  259. }
  260. static void BlitBto3Key(SDL_BlitInfo *info)
  261. {
  262.         int width = info->d_width;
  263. int height = info->d_height;
  264. Uint8 *src = info->s_pixels;
  265. Uint8 *dst = info->d_pixels;
  266. int srcskip = info->s_skip;
  267. int dstskip = info->d_skip;
  268. Uint32 ckey = info->src->colorkey;
  269. Uint8 *palmap = info->table;
  270. int c;
  271. /* Set up some basic variables */
  272. srcskip += width-(width+7)/8;
  273. while ( height-- ) {
  274.         Uint8  byte = 0, bit;
  275.      for ( c=0; c<width; ++c ) {
  276. if ( (c&7) == 0 ) {
  277. byte = *src++;
  278. }
  279. bit = (byte&0x80)>>7;
  280. if ( bit != ckey ) {
  281. memcpy(dst, &palmap[bit*4], 3);
  282. }
  283. byte <<= 1;
  284. dst += 3;
  285. }
  286. src += srcskip;
  287. dst += dstskip;
  288. }
  289. }
  290. static void BlitBto4Key(SDL_BlitInfo *info)
  291. {
  292.         int width = info->d_width;
  293. int height = info->d_height;
  294. Uint8 *src = info->s_pixels;
  295. Uint32 *dstp = (Uint32 *)info->d_pixels;
  296. int srcskip = info->s_skip;
  297. int dstskip = info->d_skip;
  298. Uint32 ckey = info->src->colorkey;
  299. Uint8 *palmap = info->table;
  300. int c;
  301. /* Set up some basic variables */
  302. srcskip += width-(width+7)/8;
  303. dstskip /= 4;
  304. while ( height-- ) {
  305.         Uint8 byte = 0, bit;
  306.      for ( c=0; c<width; ++c ) {
  307. if ( (c&7) == 0 ) {
  308. byte = *src++;
  309. }
  310. bit = (byte&0x80)>>7;
  311. if ( bit != ckey ) {
  312. *dstp=((Uint32 *)palmap)[bit];
  313. }
  314. byte <<= 1;
  315. dstp++;
  316. }
  317. src += srcskip;
  318. dstp += dstskip;
  319. }
  320. }
  321. static void BlitBtoNAlpha(SDL_BlitInfo *info)
  322. {
  323.         int width = info->d_width;
  324. int height = info->d_height;
  325. Uint8 *src = info->s_pixels;
  326. Uint8 *dst = info->d_pixels;
  327. int srcskip = info->s_skip;
  328. int dstskip = info->d_skip;
  329. const SDL_Color *srcpal = info->src->palette->colors;
  330. SDL_PixelFormat *dstfmt = info->dst;
  331. int  dstbpp;
  332. int c;
  333. const int A = info->src->alpha;
  334. /* Set up some basic variables */
  335. dstbpp = dstfmt->BytesPerPixel;
  336. srcskip += width-(width+7)/8;
  337. while ( height-- ) {
  338.         Uint8 byte = 0, bit;
  339.      for ( c=0; c<width; ++c ) {
  340. if ( (c&7) == 0 ) {
  341. byte = *src++;
  342. }
  343. bit = (byte&0x80)>>7;
  344. if ( 1 ) {
  345.         Uint32 pixel;
  346.         unsigned sR, sG, sB;
  347. unsigned dR, dG, dB;
  348. sR = srcpal[bit].r;
  349. sG = srcpal[bit].g;
  350. sB = srcpal[bit].b;
  351. DISEMBLE_RGB(dst, dstbpp, dstfmt,
  352. pixel, dR, dG, dB);
  353. ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB);
  354.    ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB);
  355. }
  356. byte <<= 1;
  357. dst += dstbpp;
  358. }
  359. src += srcskip;
  360. dst += dstskip;
  361. }
  362. }
  363. static void BlitBtoNAlphaKey(SDL_BlitInfo *info)
  364. {
  365.         int width = info->d_width;
  366. int height = info->d_height;
  367. Uint8 *src = info->s_pixels;
  368. Uint8 *dst = info->d_pixels;
  369. int srcskip = info->s_skip;
  370. int dstskip = info->d_skip;
  371. SDL_PixelFormat *srcfmt = info->src;
  372. SDL_PixelFormat *dstfmt = info->dst;
  373. const SDL_Color *srcpal = srcfmt->palette->colors;
  374. int dstbpp;
  375. int c;
  376. const int A = srcfmt->alpha;
  377. Uint32 ckey = srcfmt->colorkey;
  378. /* Set up some basic variables */
  379. dstbpp = dstfmt->BytesPerPixel;
  380. srcskip += width-(width+7)/8;
  381. while ( height-- ) {
  382.         Uint8  byte = 0, bit;
  383.      for ( c=0; c<width; ++c ) {
  384. if ( (c&7) == 0 ) {
  385. byte = *src++;
  386. }
  387. bit = (byte&0x80)>>7;
  388. if ( bit != ckey ) {
  389.         int sR, sG, sB;
  390. int dR, dG, dB;
  391. Uint32 pixel;
  392. sR = srcpal[bit].r;
  393. sG = srcpal[bit].g;
  394. sB = srcpal[bit].b;
  395. DISEMBLE_RGB(dst, dstbpp, dstfmt,
  396. pixel, dR, dG, dB);
  397. ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB);
  398.    ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB);
  399. }
  400. byte <<= 1;
  401. dst += dstbpp;
  402. }
  403. src += srcskip;
  404. dst += dstskip;
  405. }
  406. }
  407. static SDL_loblit bitmap_blit[] = {
  408. NULL, BlitBto1, BlitBto2, BlitBto3, BlitBto4
  409. };
  410. static SDL_loblit colorkey_blit[] = {
  411.     NULL, BlitBto1Key, BlitBto2Key, BlitBto3Key, BlitBto4Key
  412. };
  413. SDL_loblit SDL_CalculateBlit0(SDL_Surface *surface, int blit_index)
  414. {
  415. int which;
  416. if ( surface->map->dst->format->BitsPerPixel < 8 ) {
  417. which = 0;
  418. } else {
  419. which = surface->map->dst->format->BytesPerPixel;
  420. }
  421. switch(blit_index) {
  422. case 0: /* copy */
  423.     return bitmap_blit[which];
  424. case 1: /* colorkey */
  425.     return colorkey_blit[which];
  426. case 2: /* alpha */
  427.     return which >= 2 ? BlitBtoNAlpha : NULL;
  428. case 4: /* alpha + colorkey */
  429.     return which >= 2 ? BlitBtoNAlphaKey : NULL;
  430. }
  431. return NULL;
  432. }