mirror of
				https://github.com/libsdl-org/SDL.git
				synced 2025-11-03 17:24:34 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			504 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			504 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*
 | 
						|
  Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org>
 | 
						|
 | 
						|
  This software is provided 'as-is', without any express or implied
 | 
						|
  warranty.  In no event will the authors be held liable for any damages
 | 
						|
  arising from the use of this software.
 | 
						|
 | 
						|
  Permission is granted to anyone to use this software for any purpose,
 | 
						|
  including commercial applications, and to alter it and redistribute it
 | 
						|
  freely.
 | 
						|
*/
 | 
						|
/* Simple program:  Move N sprites around on the screen as fast as possible */
 | 
						|
 | 
						|
#include <SDL3/SDL.h>
 | 
						|
#include <SDL3/SDL_test_memory.h>
 | 
						|
#include <SDL3/SDL_main.h>
 | 
						|
 | 
						|
#ifdef SDL_PLATFORM_EMSCRIPTEN
 | 
						|
#include <emscripten/emscripten.h>
 | 
						|
#endif
 | 
						|
 | 
						|
#define WINDOW_WIDTH  640
 | 
						|
#define WINDOW_HEIGHT 480
 | 
						|
 | 
						|
 | 
						|
static const SDL_Color Palette[256] = {
 | 
						|
    { 255,   0,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   5,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  11,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  17,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  23,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  29,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  35,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  41,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  47,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  53,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  59,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  65,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  71,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  77,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  83,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  89,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,  95,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 101,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 107,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 113,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 119,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 125,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 131,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 137,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 143,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 149,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 155,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 161,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 167,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 173,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 179,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 185,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 191,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 197,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 203,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 209,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 215,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 221,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 227,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 233,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 239,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 245,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255, 251,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 253, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 247, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 241, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 235, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 229, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 223, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 217, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 211, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 205, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 199, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 193, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 187, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 181, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 175, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 169, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 163, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 157, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 151, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 145, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 139, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 133, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 127, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 121, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 115, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 109, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    { 103, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  97, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  91, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  85, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  79, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  73, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  67, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  61, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  55, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  49, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  43, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  37, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  31, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  25, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  19, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {  13, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {   7, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {   1, 255,   0, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,   3, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,   9, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  15, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  21, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  27, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  33, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  39, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  45, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  51, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  57, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  63, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  69, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  75, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  81, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  87, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  93, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255,  99, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 105, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 111, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 117, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 123, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 129, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 135, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 141, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 147, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 153, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 159, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 165, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 171, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 177, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 183, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 189, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 195, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 201, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 207, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 213, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 219, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 225, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 231, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 237, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 243, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 249, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 255, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 249, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 243, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 237, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 231, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 225, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 219, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 213, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 207, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 201, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 195, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 189, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 183, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 177, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 171, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 165, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 159, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 153, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 147, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 141, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 135, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 129, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 123, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 117, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 111, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0, 105, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  99, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  93, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  87, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  81, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  75, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  69, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  63, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  57, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  51, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  45, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  39, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  33, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  27, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  21, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,  15, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,   9, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   0,   3, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   1,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {   7,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  13,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  19,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  25,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  31,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  37,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  43,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  49,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  55,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  61,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  67,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  73,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  79,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  85,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  91,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    {  97,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 103,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 109,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 115,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 121,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 127,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 133,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 139,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 145,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 151,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 157,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 163,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 169,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 175,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 181,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 187,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 193,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 199,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 205,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 211,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 217,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 223,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 229,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 235,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 241,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 247,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 253,   0, 255, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 251, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 245, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 239, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 233, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 227, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 221, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 215, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 209, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 203, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 197, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 191, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 185, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 179, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 173, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 167, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 161, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 155, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 149, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 143, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 137, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 131, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 125, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 119, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 113, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 107, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0, 101, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  95, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  89, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  83, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  77, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  71, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  65, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  59, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  53, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  47, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  41, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  35, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  29, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  23, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  17, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,  11, SDL_ALPHA_OPAQUE },
 | 
						|
    { 255,   0,   5, SDL_ALPHA_OPAQUE }
 | 
						|
};
 | 
						|
 | 
						|
static SDL_Renderer *renderer;
 | 
						|
static SDL_Palette *palette;
 | 
						|
static SDL_Texture *texture;
 | 
						|
static SDL_Texture *black_texture1;
 | 
						|
static SDL_Texture *black_texture2;
 | 
						|
static SDL_Texture *white_texture1;
 | 
						|
static SDL_Texture *white_texture2;
 | 
						|
static int palettePos = 0;
 | 
						|
static int paletteDir = -1;
 | 
						|
static bool done;
 | 
						|
 | 
						|
static SDL_Texture *CreateTexture(const void *pixels, int pitch)
 | 
						|
{
 | 
						|
    SDL_Texture *tex = SDL_CreateTexture(renderer, SDL_PIXELFORMAT_INDEX8, SDL_TEXTUREACCESS_STATIC, 256, 1);
 | 
						|
    if (!tex) {
 | 
						|
        return NULL;
 | 
						|
    }
 | 
						|
    SDL_UpdateTexture(tex, NULL, pixels, pitch);
 | 
						|
    SDL_SetTexturePalette(tex, palette);
 | 
						|
    return tex;
 | 
						|
}
 | 
						|
 | 
						|
static bool CreateTextures()
 | 
						|
{
 | 
						|
    Uint8 data[256];
 | 
						|
    int i;
 | 
						|
 | 
						|
    palette = SDL_CreatePalette(256);
 | 
						|
    if (!palette) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    for (i = 0; i < SDL_arraysize(data); i++) {
 | 
						|
        data[i] = i;
 | 
						|
    }
 | 
						|
 | 
						|
    texture = CreateTexture(data, SDL_arraysize(data));
 | 
						|
    if (!texture) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
 | 
						|
    black_texture1 = CreateTexture(data, SDL_arraysize(data));
 | 
						|
    if (!black_texture1) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    SDL_SetTextureScaleMode(black_texture1, SDL_SCALEMODE_NEAREST);
 | 
						|
 | 
						|
    black_texture2 = CreateTexture(data, SDL_arraysize(data));
 | 
						|
    if (!black_texture2) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    SDL_SetTextureScaleMode(black_texture2, SDL_SCALEMODE_NEAREST);
 | 
						|
 | 
						|
    white_texture1 = CreateTexture(data, SDL_arraysize(data));
 | 
						|
    if (!white_texture1) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    SDL_SetTextureScaleMode(white_texture1, SDL_SCALEMODE_NEAREST);
 | 
						|
 | 
						|
    white_texture2 = CreateTexture(data, SDL_arraysize(data));
 | 
						|
    if (!white_texture2) {
 | 
						|
        return false;
 | 
						|
    }
 | 
						|
    SDL_SetTextureScaleMode(white_texture2, SDL_SCALEMODE_NEAREST);
 | 
						|
 | 
						|
    return true;
 | 
						|
}
 | 
						|
 | 
						|
static void UpdatePalette(int pos)
 | 
						|
{
 | 
						|
    int paletteSize = (int)SDL_arraysize(Palette);
 | 
						|
 | 
						|
    if (pos == 0) {
 | 
						|
        SDL_SetPaletteColors(palette, Palette, 0, paletteSize);
 | 
						|
    } else {
 | 
						|
        SDL_SetPaletteColors(palette, Palette + pos, 0, paletteSize - pos);
 | 
						|
        SDL_SetPaletteColors(palette, Palette, paletteSize - pos, pos);
 | 
						|
    }
 | 
						|
}
 | 
						|
 | 
						|
static void loop(void)
 | 
						|
{
 | 
						|
    SDL_Event event;
 | 
						|
    SDL_FRect src = { 1.0f, 0.0f, 1.0f, 1.0f };
 | 
						|
    SDL_FRect dst1 = { 0.0f, 0.0f, 32.0f, 32.0f };
 | 
						|
    SDL_FRect dst2 = { 0.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f };
 | 
						|
    SDL_FRect dst3 = { WINDOW_WIDTH - 32.0f, 0.0f, 32.0f, 32.0f };
 | 
						|
    SDL_FRect dst4 = { WINDOW_WIDTH - 32.0f, WINDOW_HEIGHT - 32.0f, 32.0f, 32.0f };
 | 
						|
    SDL_FRect dst5 = { 0.0f, 32.0f + 2.0f, 32.0f, 32.0f };
 | 
						|
    SDL_FRect dst6 = { WINDOW_WIDTH - 32.0f, 32.0f + 2.0f, 32.0f, 32.0f };
 | 
						|
    const SDL_Color black = { 0, 0, 0, SDL_ALPHA_OPAQUE };
 | 
						|
    const SDL_Color white = { 255, 255, 255, SDL_ALPHA_OPAQUE };
 | 
						|
    const SDL_Color red = { 255, 0, 0, SDL_ALPHA_OPAQUE };
 | 
						|
    const SDL_Color blue = { 0, 0, 255, SDL_ALPHA_OPAQUE };
 | 
						|
 | 
						|
    /* Check for events */
 | 
						|
    while (SDL_PollEvent(&event)) {
 | 
						|
        switch (event.type) {
 | 
						|
        case SDL_EVENT_KEY_UP:
 | 
						|
            switch (event.key.key) {
 | 
						|
            case SDLK_LEFT:
 | 
						|
                paletteDir = 1;
 | 
						|
                break;
 | 
						|
            case SDLK_RIGHT:
 | 
						|
                paletteDir = -1;
 | 
						|
                break;
 | 
						|
            case SDLK_ESCAPE:
 | 
						|
                done = true;
 | 
						|
                break;
 | 
						|
            default:
 | 
						|
                break;
 | 
						|
            }
 | 
						|
            break;
 | 
						|
        case SDL_EVENT_QUIT:
 | 
						|
            done = true;
 | 
						|
            break;
 | 
						|
        default:
 | 
						|
            break;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    SDL_SetRenderDrawColor(renderer, 0, 0, 0, 0);
 | 
						|
    SDL_RenderClear(renderer);
 | 
						|
 | 
						|
    /* Draw the rainbow texture */
 | 
						|
    UpdatePalette(palettePos);
 | 
						|
    palettePos += paletteDir;
 | 
						|
    if (palettePos < 0) {
 | 
						|
        palettePos = SDL_arraysize(Palette) - 1;
 | 
						|
    } else if (palettePos >= SDL_arraysize(Palette)) {
 | 
						|
        palettePos = 0;
 | 
						|
    }
 | 
						|
    SDL_RenderTexture(renderer, texture, NULL, NULL);
 | 
						|
 | 
						|
    /* Draw one square with black, and one square with white
 | 
						|
     * This tests changing palette colors within a single frame
 | 
						|
     */
 | 
						|
    SDL_SetPaletteColors(palette, &black, 1, 1);
 | 
						|
    SDL_SetRenderDrawColor(renderer, black.r, black.g, black.b, black.a);
 | 
						|
    SDL_RenderDebugText(renderer, dst1.x + 32.0f + 2.0f, dst1.y + 12, "Black");
 | 
						|
    SDL_RenderTexture(renderer, black_texture1, &src, &dst1);
 | 
						|
    SDL_RenderDebugText(renderer, dst2.x + 32.0f + 2.0f, dst2.y + 12, "Black");
 | 
						|
    SDL_RenderTexture(renderer, black_texture2, &src, &dst2);
 | 
						|
    SDL_SetPaletteColors(palette, &white, 1, 1);
 | 
						|
    SDL_SetRenderDrawColor(renderer, white.r, white.g, white.b, white.a);
 | 
						|
    SDL_RenderDebugText(renderer, dst3.x - 40.0f - 2.0f, dst3.y + 12, "White");
 | 
						|
    SDL_RenderTexture(renderer, white_texture1, &src, &dst3);
 | 
						|
    SDL_RenderDebugText(renderer, dst4.x - 40.0f - 2.0f, dst4.y + 12, "White");
 | 
						|
    SDL_RenderTexture(renderer, white_texture2, &src, &dst4);
 | 
						|
 | 
						|
    /* Draw the same textures again with different colors */
 | 
						|
    SDL_SetPaletteColors(palette, &red, 1, 1);
 | 
						|
    SDL_SetRenderDrawColor(renderer, red.r, red.g, red.b, red.a);
 | 
						|
    SDL_RenderDebugText(renderer, dst5.x + 32.0f + 2.0f, dst5.y + 12, "Red");
 | 
						|
    SDL_RenderTexture(renderer, black_texture1, &src, &dst5);
 | 
						|
    SDL_SetPaletteColors(palette, &blue, 1, 1);
 | 
						|
    SDL_SetRenderDrawColor(renderer, blue.r, blue.g, blue.b, blue.a);
 | 
						|
    SDL_RenderDebugText(renderer, dst6.x - 40.0f - 2.0f, dst6.y + 12, "Blue");
 | 
						|
    SDL_RenderTexture(renderer, white_texture1, &src, &dst6);
 | 
						|
 | 
						|
    SDL_RenderPresent(renderer);
 | 
						|
    SDL_Delay(10);
 | 
						|
 | 
						|
#ifdef SDL_PLATFORM_EMSCRIPTEN
 | 
						|
    if (done) {
 | 
						|
        emscripten_cancel_main_loop();
 | 
						|
    }
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
int main(int argc, char *argv[])
 | 
						|
{
 | 
						|
    SDL_Window *window = NULL;
 | 
						|
    int i, return_code = -1;
 | 
						|
 | 
						|
    SDLTest_TrackAllocations();
 | 
						|
 | 
						|
    for (i = 1; i < argc; ++i) {
 | 
						|
        if (SDL_strcmp(argv[1], "--renderer") == 0 && argv[i + 1]) {
 | 
						|
            ++i;
 | 
						|
            SDL_SetHint(SDL_HINT_RENDER_DRIVER, argv[i]);
 | 
						|
        } else {
 | 
						|
            SDL_Log("Usage: %s [--renderer driver]", argv[0]);
 | 
						|
            return_code = 1;
 | 
						|
            goto quit;
 | 
						|
        }
 | 
						|
    }
 | 
						|
 | 
						|
    if (!SDL_CreateWindowAndRenderer("testpalette", WINDOW_WIDTH, WINDOW_HEIGHT, SDL_WINDOW_RESIZABLE, &window, &renderer)) {
 | 
						|
        SDL_Log("SDL_CreateWindowAndRenderer failed: %s", SDL_GetError());
 | 
						|
        return_code = 2;
 | 
						|
        goto quit;
 | 
						|
    }
 | 
						|
 | 
						|
    if (!CreateTextures()) {
 | 
						|
        SDL_Log("Couldn't create textures: %s", SDL_GetError());
 | 
						|
        return_code = 3;
 | 
						|
        goto quit;
 | 
						|
    }
 | 
						|
 | 
						|
    /* Main render loop */
 | 
						|
    done = false;
 | 
						|
 | 
						|
#ifdef SDL_PLATFORM_EMSCRIPTEN
 | 
						|
    emscripten_set_main_loop(loop, 0, 1);
 | 
						|
#else
 | 
						|
    while (!done) {
 | 
						|
        loop();
 | 
						|
    }
 | 
						|
#endif
 | 
						|
    return_code = 0;
 | 
						|
quit:
 | 
						|
    SDL_DestroyPalette(palette);
 | 
						|
    SDL_DestroyRenderer(renderer);
 | 
						|
    SDL_DestroyWindow(window);
 | 
						|
    SDL_Quit();
 | 
						|
    SDLTest_LogAllocations();
 | 
						|
    return return_code;
 | 
						|
}
 |