146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* 246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL - Simple DirectMedia Layer 346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Copyright (C) 1997-2006 Sam Lantinga 446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is free software; you can redistribute it and/or 646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner modify it under the terms of the GNU Lesser General Public 746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License as published by the Free Software Foundation; either 846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner version 2.1 of the License, or (at your option) any later version. 946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner This library is distributed in the hope that it will be useful, 1146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner but WITHOUT ANY WARRANTY; without even the implied warranty of 1246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 1346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Lesser General Public License for more details. 1446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner You should have received a copy of the GNU Lesser General Public 1646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner License along with this library; if not, write to the Free Software 1746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 1846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 1946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Sam Lantinga 2046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner slouken@libsdl.org 2146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner*/ 2246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_config.h" 2346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_video.h" 2546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_blit.h" 2646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_sysvideo.h" 2746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#include "SDL_endian.h" 2846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 2946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* Functions to blit from 8-bit surfaces to other surfaces */ 3046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 3146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to1(SDL_BlitInfo *info) 3246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 3346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef USE_DUFFS_LOOP 3446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int c; 3546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 3646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 3746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src, *map, *dst; 3846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip, dstskip; 3946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 4146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = info->d_width; 4246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = info->d_height; 4346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src = info->s_pixels; 4446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner srcskip = info->s_skip; 4546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst = info->d_pixels; 4646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip = info->d_skip; 4746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner map = info->table; 4846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 4946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 5046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_DUFFS_LOOP 5146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 5246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 5346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst = map[*src]; 5446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 5546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst++; 5646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 5746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner , width); 5846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 5946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( c=width; c; --c ) { 6046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst = map[*src]; 6146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst++; 6246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 6346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 6546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 6646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 6746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 6846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 6946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner/* This is now endian dependent */ 7046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#if ( SDL_BYTEORDER == SDL_LIL_ENDIAN ) 7146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define HI 1 7246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define LO 0 7346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else /* ( SDL_BYTEORDER == SDL_BIG_ENDIAN ) */ 7446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define HI 0 7546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#define LO 1 7646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 7746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to2(SDL_BlitInfo *info) 7846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 7946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef USE_DUFFS_LOOP 8046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int c; 8146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 8246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 8346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src, *dst; 8446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint16 *map; 8546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip, dstskip; 8646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 8746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 8846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = info->d_width; 8946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = info->d_height; 9046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src = info->s_pixels; 9146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner srcskip = info->s_skip; 9246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst = info->d_pixels; 9346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip = info->d_skip; 9446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner map = (Uint16 *)info->table; 9546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 9646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_DUFFS_LOOP 9746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 9846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 9946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 10046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 10146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 10246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 10346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 10446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 10546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 10646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 10746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 10846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Memory align at 4-byte boundary, if necessary */ 10946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( (long)dst & 0x03 ) { 11046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Don't do anything if width is 0 */ 11146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( width == 0 ) { 11246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return; 11346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 11446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner --width; 11546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 11646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 11746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Perform copy alignment */ 11846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 11946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 12046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 12146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Copy in 4 pixel chunks */ 12246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( c=width/4; c; --c ) { 12346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 12446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 12546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 12646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 12746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 12846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 12946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 13046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 13146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 13246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get any leftovers */ 13346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (width & 3) { 13446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: 13546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 13646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 13746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 2: 13846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 13946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 14046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 14146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 14246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: 14446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 14546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 14646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 14746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 14846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 14946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 15046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 15146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 15246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 15346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Copy in 4 pixel chunks */ 15446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( c=width/4; c; --c ) { 15546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 15646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 15746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 15846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 15946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 16046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 16146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 16246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 16346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 16446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Get any leftovers */ 16546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch (width & 3) { 16646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: 16746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 16846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 16946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 2: 17046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint32 *)dst = 17146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner (map[src[HI]]<<16)|(map[src[LO]]); 17246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += 2; 17346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 4; 17446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: 17646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *(Uint16 *)dst = map[*src++]; 17746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 2; 17846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner break; 17946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 18146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 18246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 18446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* USE_DUFFS_LOOP */ 18546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 18646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to3(SDL_BlitInfo *info) 18746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 18846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef USE_DUFFS_LOOP 18946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int c; 19046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 19146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int o; 19246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 19346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src, *map, *dst; 19446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip, dstskip; 19546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 19646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 19746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = info->d_width; 19846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = info->d_height; 19946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src = info->s_pixels; 20046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner srcskip = info->s_skip; 20146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst = info->d_pixels; 20246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip = info->d_skip; 20346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner map = info->table; 20446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 20546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 20646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_DUFFS_LOOP 20746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 20846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 20946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner o = *src * 4; 21046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[0] = map[o++]; 21146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[1] = map[o++]; 21246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[2] = map[o++]; 21346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 21446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 21546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 3; 21646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner , width); 21746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 21846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( c=width; c; --c ) { 21946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner o = *src * 4; 22046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[0] = map[o++]; 22146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[1] = map[o++]; 22246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[2] = map[o++]; 22346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 22446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 3; 22546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 22646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* USE_DUFFS_LOOP */ 22746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 22846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 22946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 23046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 23146be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to4(SDL_BlitInfo *info) 23246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 23346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifndef USE_DUFFS_LOOP 23446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int c; 23546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif 23646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width, height; 23746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src; 23846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 *map, *dst; 23946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip, dstskip; 24046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 24146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 24246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width = info->d_width; 24346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner height = info->d_height; 24446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src = info->s_pixels; 24546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner srcskip = info->s_skip; 24646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst = (Uint32 *)info->d_pixels; 24746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip = info->d_skip/4; 24846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner map = (Uint32 *)info->table; 24946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 25046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 25146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#ifdef USE_DUFFS_LOOP 25246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 25346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 25446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner , width); 25546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#else 25646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner for ( c=width/4; c; --c ) { 25746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 25846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 25946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 26046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 26146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 26246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch ( width & 3 ) { 26346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: 26446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 26546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 2: 26646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 26746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: 26846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst++ = map[*src++]; 26946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner#endif /* USE_DUFFS_LOOP */ 27146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 27246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 27346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 27446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 27546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 27646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to1Key(SDL_BlitInfo *info) 27746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 27846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 27946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 28046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 28146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 28246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *dst = info->d_pixels; 28346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 28446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *palmap = info->table; 28546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 ckey = info->src->colorkey; 28646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 28746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( palmap ) { 28846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 28946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 29046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 29146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 29246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst = palmap[*src]; 29346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 29446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst++; 29546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 29646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 29746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 29846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 29946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 30046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 30246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 30346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 30446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 30546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 30646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dst = *src; 30746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 30846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst++; 30946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 31046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 31146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 31246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 31346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 31446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 31646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 31746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 31846be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to2Key(SDL_BlitInfo *info) 31946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 32046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 32146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 32246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 32346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 32446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint16 *dstp = (Uint16 *)info->d_pixels; 32546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 32646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint16 *palmap = (Uint16 *)info->table; 32746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 ckey = info->src->colorkey; 32846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 32946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 33046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip /= 2; 33146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 33246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 33346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 33446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 33546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 33646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dstp=palmap[*src]; 33746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 33846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 33946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstp++; 34046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 34146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 34246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 34346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstp += dstskip; 34446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 34546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 34646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 34746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to3Key(SDL_BlitInfo *info) 34846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 34946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 35046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 35146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 35246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 35346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *dst = info->d_pixels; 35446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 35546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *palmap = info->table; 35646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 ckey = info->src->colorkey; 35746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int o; 35846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 35946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 36046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 36146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 36246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 36346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner o = *src * 4; 36446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[0] = palmap[o++]; 36546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[1] = palmap[o++]; 36646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst[2] = palmap[o++]; 36746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 36846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 36946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += 3; 37046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 37146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 37246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 37346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 37446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 37546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 37646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 37746be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1to4Key(SDL_BlitInfo *info) 37846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 37946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 38046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 38146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 38246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 38346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 *dstp = (Uint32 *)info->d_pixels; 38446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 38546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 *palmap = (Uint32 *)info->table; 38646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 ckey = info->src->colorkey; 38746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 38846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 38946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstskip /= 4; 39046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 39146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 39246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 39346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 39446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 39546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner *dstp = palmap[*src]; 39646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 39746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 39846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstp++; 39946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 40046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 40146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 40246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstp += dstskip; 40346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 40446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 40546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 40646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1toNAlpha(SDL_BlitInfo *info) 40746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 40846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 40946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 41046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 41146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 41246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *dst = info->d_pixels; 41346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 41446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PixelFormat *dstfmt = info->dst; 41546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const SDL_Color *srcpal = info->src->palette->colors; 41646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstbpp; 41746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const int A = info->src->alpha; 41846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 41946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 42046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstbpp = dstfmt->BytesPerPixel; 42146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 42246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 42346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int sR, sG, sB; 42446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dR, dG, dB; 42546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP4( 42646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 42746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 pixel; 42846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sR = srcpal[*src].r; 42946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sG = srcpal[*src].g; 43046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sB = srcpal[*src].b; 43146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DISEMBLE_RGB(dst, dstbpp, dstfmt, 43246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pixel, dR, dG, dB); 43346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); 43446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB); 43546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 43646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstbpp; 43746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 43846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 43946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 44046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 44146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 44246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 44346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 44446be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic void Blit1toNAlphaKey(SDL_BlitInfo *info) 44546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 44646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int width = info->d_width; 44746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int height = info->d_height; 44846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *src = info->s_pixels; 44946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int srcskip = info->s_skip; 45046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint8 *dst = info->d_pixels; 45146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstskip = info->d_skip; 45246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PixelFormat *srcfmt = info->src; 45346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PixelFormat *dstfmt = info->dst; 45446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const SDL_Color *srcpal = info->src->palette->colors; 45546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 ckey = srcfmt->colorkey; 45646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dstbpp; 45746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner const int A = srcfmt->alpha; 45846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 45946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Set up some basic variables */ 46046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstbpp = dstfmt->BytesPerPixel; 46146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 46246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner while ( height-- ) { 46346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int sR, sG, sB; 46446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int dR, dG, dB; 46546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DUFFS_LOOP( 46646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner { 46746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( *src != ckey ) { 46846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner Uint32 pixel; 46946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sR = srcpal[*src].r; 47046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sG = srcpal[*src].g; 47146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner sB = srcpal[*src].b; 47246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner DISEMBLE_RGB(dst, dstbpp, dstfmt, 47346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner pixel, dR, dG, dB); 47446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ALPHA_BLEND(sR, sG, sB, A, dR, dG, dB); 47546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner ASSEMBLE_RGB(dst, dstbpp, dstfmt, dR, dG, dB); 47646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 47746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src++; 47846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstbpp; 47946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner }, 48046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner width); 48146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner src += srcskip; 48246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dst += dstskip; 48346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 48446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 48546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 48646be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_loblit one_blit[] = { 48746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULL, Blit1to1, Blit1to2, Blit1to3, Blit1to4 48846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 48946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49046be48730333120a7b939116cef075e61c12c703David 'Digit' Turnerstatic SDL_loblit one_blitkey[] = { 49146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner NULL, Blit1to1Key, Blit1to2Key, Blit1to3Key, Blit1to4Key 49246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner}; 49346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49446be48730333120a7b939116cef075e61c12c703David 'Digit' TurnerSDL_loblit SDL_CalculateBlit1(SDL_Surface *surface, int blit_index) 49546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner{ 49646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner int which; 49746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner SDL_PixelFormat *dstfmt; 49846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 49946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner dstfmt = surface->map->dst->format; 50046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner if ( dstfmt->BitsPerPixel < 8 ) { 50146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner which = 0; 50246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } else { 50346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner which = dstfmt->BytesPerPixel; 50446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 50546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner switch(blit_index) { 50646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 0: /* copy */ 50746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return one_blit[which]; 50846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 50946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 1: /* colorkey */ 51046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return one_blitkey[which]; 51146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 2: /* alpha */ 51346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner /* Supporting 8bpp->8bpp alpha is doable but requires lots of 51446be48730333120a7b939116cef075e61c12c703David 'Digit' Turner tables which consume space and takes time to precompute, 51546be48730333120a7b939116cef075e61c12c703David 'Digit' Turner so is better left to the user */ 51646be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return which >= 2 ? Blit1toNAlpha : NULL; 51746be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 51846be48730333120a7b939116cef075e61c12c703David 'Digit' Turner case 3: /* alpha + colorkey */ 51946be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return which >= 2 ? Blit1toNAlphaKey : NULL; 52046be48730333120a7b939116cef075e61c12c703David 'Digit' Turner 52146be48730333120a7b939116cef075e61c12c703David 'Digit' Turner } 52246be48730333120a7b939116cef075e61c12c703David 'Digit' Turner return NULL; 52346be48730333120a7b939116cef075e61c12c703David 'Digit' Turner} 524