mirror of
https://github.com/libsdl-org/SDL.git
synced 2025-10-03 16:36:25 +00:00
509 lines
18 KiB
C
509 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;
|
|
}
|
|
|
|
black_texture2 = CreateTexture(data, SDL_arraysize(data));
|
|
if (!black_texture2) {
|
|
return false;
|
|
}
|
|
|
|
white_texture1 = CreateTexture(data, SDL_arraysize(data));
|
|
if (!white_texture1) {
|
|
return false;
|
|
}
|
|
|
|
white_texture2 = CreateTexture(data, SDL_arraysize(data));
|
|
if (!white_texture2) {
|
|
return false;
|
|
}
|
|
|
|
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;
|
|
bool pixelart = false;
|
|
|
|
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 if (SDL_strcmp(argv[1], "--pixelart") == 0) {
|
|
pixelart = true;
|
|
} else {
|
|
SDL_Log("Usage: %s [--pixelart]", 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 (pixelart) {
|
|
SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_PIXELART);
|
|
} else {
|
|
SDL_SetDefaultTextureScaleMode(renderer, SDL_SCALEMODE_NEAREST);
|
|
}
|
|
|
|
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;
|
|
}
|