kobodl/graphics/sprite.h
Ville Lindholm dbc223eb84
Initial commit
Import existing source tree; original VCS history is no longer available.

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2026-05-28 16:35:31 +03:00

243 lines
6.5 KiB
C

/*(LGPL)
----------------------------------------------------------------------
sprite.h - Sprite engine for use with cs.h
----------------------------------------------------------------------
* Copyright (C) 2001, 2003, 2007 David Olofson
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#ifndef _SPRITE_H_
#define _SPRITE_H_
#ifdef __cplusplus
extern "C" {
#endif
#include "glSDL.h"
typedef enum
{
S_BLITMODE_AUTO = 0, /* Use source alpha if present */
S_BLITMODE_OPAQUE, /* Alpha: blend over black during conv. */
S_BLITMODE_COLORKEY, /* Like OPAQUE, but apply colorkey to the result */
S_BLITMODE_ALPHA /* Apply source alpha during conv,
* then use full surface alpha */
} s_blitmodes_t;
struct s_container_t;
/* sprite image */
typedef struct
{
int x, y; /* kern or hot-spot*/
#if 0
/* TODO TODO TODO TODO TODO TODO */
struct
{
int x, y, w, h; /* spacing or collision rect */
} logic;
/* /TODO TODO TODO TODO TODO TODO */
#endif
SDL_Surface *surface;
} s_sprite_t;
/* Bank of sprite images */
typedef struct
{
#if 0
/* TODO TODO TODO TODO TODO TODO */
struct s_container_t *container;
int index; /* Index of this bank */
/* /TODO TODO TODO TODO TODO TODO */
#endif
unsigned w, h; /* Same size for all sprites in bank! */
unsigned last;
unsigned max;
s_sprite_t **sprites;
} s_bank_t;
/* Two dimensionally indexed sprite container */
typedef struct s_container_t
{
unsigned max;
s_bank_t **banks;
} s_container_t;
/*
* Basic Container Management
*/
s_container_t *s_new_container(unsigned banks);
void s_delete_container(s_container_t *c);
s_bank_t *s_new_bank(s_container_t *c, unsigned bank, unsigned frames,
unsigned w, unsigned h);
void s_delete_bank(s_container_t *c, unsigned bank);
void s_delete_all_banks(s_container_t *c);
s_sprite_t *s_new_sprite(s_container_t *c, unsigned bank, unsigned frame);
void s_delete_sprite(s_container_t *c, unsigned bank, unsigned frame);
/*
* Getting data
*/
s_sprite_t *s_get_sprite(s_container_t *c, unsigned bank, unsigned frame);
/* Detach sprite image from the manager. */
void s_detach_sprite(s_container_t *c, unsigned bank, unsigned frame);
/*
* File Import Tools
* (Will run plugins as files are loaded!)
*/
int s_load_image(s_container_t *c, unsigned bank, const char *name);
int s_load_bank(s_container_t *c, unsigned bank, unsigned w, unsigned h,
const char *name);
int s_load_sprite(s_container_t *c, unsigned bank, unsigned frame,
const char *name);
/*
* Rendering Tools
*/
int s_generate_bank(s_container_t *c, unsigned bank, unsigned w, unsigned h,
const char *name);
/*
* Sprite metadata
*/
/* Set sprite hotspot. Pass -1 for 'frame' to set hotspot for all frames. */
int s_set_hotspot(s_container_t *c, unsigned bank, int frame, int x, int y);
/*
* Internal data manipulation API
* (Will not automatically run plugins.)
*/
int s_copy_rect(s_container_t *c, unsigned bank,
unsigned frombank, unsigned fromframe, SDL_Rect *from);
/*
* Lower level interfaces
*/
s_bank_t *s_get_bank(s_container_t *c, unsigned bank);
s_sprite_t *s_get_sprite_b(s_bank_t *b, unsigned frame);
s_sprite_t *s_new_sprite_b(s_bank_t *b, unsigned frame);
void s_delete_sprite_b(s_bank_t *b, unsigned frame);
/*
* Filter Plugin Interface
*
* Rules:
* * Plugins are called to process one bank at a time,
* after new frames have been loaded.
*
* * Plugins are called in the order they were
* registered.
*
* * Plugins may replace the surfaces of sprites. If
* they do so, they're responsible for disposing of
* the old surfaces.
*
* * It is recommended that plugins operate only on
* the specified range of frames in a bank.
*
* * The surface size of all sprites in a bank should
* preferably match that of the bank. A chain of
* plugins may break this rule temporarily, as long
* as "order is restored" (ie surfaces are resized, or
* bank size values is adjusted) before the chain ends.
*
* Cool plugin ideas:
* * Rotator:
* Takes a bank and generates N rotated versions of
* each sprite.
*
* * Bumpmapper:
* Takes a bank and applies light, shadows, highlights
* and stuff to frames that have bumpmap channels.
* (Q: Where do we put bumpmaps? Extend the bank to
* twice the # of frames, using the last half for BMs?
* Use two banks? I think we need an API change that
* make plugins operators; X = A <op> B, where the
* banks X, A and B are arguments.)
*
* * Mixer:
* A plugin that takes two banks and performs various
* operations between them to produce the output.
*
* * Colorizer:
* Converts images to HSV and then replaces hue with
* a fixed color.
*
* * Map Colorizer:
* Like Colorizer, but uses a (wrapping) source image
* as a map to determine the new hue for each pixel.
*
* * Tiled Stretch:
* Given a list of tile interdependencies, generate
* all tiles required for seamless rendering of the
* map for which the interdependency list was generated.
*/
typedef struct s_filter_args_t
{
int x, y, z;
float fx, fy, fz;
int min, max;
short r, g, b;
int flags;
unsigned bank;
void *data;
} s_filter_args_t;
typedef int (*s_filter_cb_t)(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
typedef struct s_filter_t
{
struct s_filter_t *next;
s_filter_cb_t callback;
s_filter_args_t args;
} s_filter_t;
s_filter_t *s_insert_filter(s_filter_cb_t callback);
s_filter_t *s_add_filter(s_filter_cb_t callback);
/* callback == NULL means "remove all plugins" */
void s_remove_filter(s_filter_t *filter);
/* RGBA pixel type (used internally by most filters as well) */
typedef struct
{
Uint8 r;
Uint8 g;
Uint8 b;
Uint8 a;
} pix_t;
/*
* UURGH!!! This should be OO like the rest...
*/
extern s_blitmodes_t s_blitmode;
extern pix_t s_colorkey; /* NOTE: Alpha is ignored! */
extern pix_t s_clampcolor;
extern unsigned char s_alpha;
extern int s_filter_flags; /* Global flags; applied to all plugins. */
#ifdef __cplusplus
};
#endif
#endif /* _SPRITE_H_ */