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