kobodl/graphics/filters.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

193 lines
5.4 KiB
C

/*(LGPL)
----------------------------------------------------------------------
filters.h - Filters for the sprite manager
----------------------------------------------------------------------
* Copyright (C) David Olofson, 2001, 2003
*
* 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_FILTERS_H
#define SPRITE_FILTERS_H
#include "sprite.h"
#ifdef __cplusplus
extern "C" {
#endif
/*
* Flags (args.flags) that apply to most plugins:
*/
#define SF_CLAMP_EXTEND 0x00000001
#define SF_CLAMP_SFONT 0x00000002
/*
* Convert bank to RGBA 8:8:8:8 format.
*
* (No arguments.)
*/
int s_filter_rgba8(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Dither R, G and B channels to the specified bit depth.
*
* args.x = 1 activates 16 bit RGBA fix (assume +/-16 dither depth for RGBA)
* args.y = dither type (0 = 2x2 filter, 1 = random)
*
* args.r = red dither depth
* args.g = green dither depth
* args.b = blue dither depth
*
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*
* Note: This plugin does *not* dither the alpha channel!
*/
int s_filter_dither(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Convert bank to display format for fast rendering.
*
* args.x = 1 forces use of SDL_DisplayFormat().
* RGBA surfaces get a colorkey of <0,0,0,0>.
*/
int s_filter_displayformat(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Convert colorkey to alpha channel.
*
* The global colorkey variable is used for base colorkey value.
* args.max = colorkey detection fuzziness factor
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*/
int s_filter_key2alpha(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Adjust alpha level and contrast, and then clean out almost opaque
* and almost transparent pixels.
*
* args.fx = alpha contrast (1.0 = unchanged; 2.0 = double; scales around 128)
* args.x = alpha offset (0 = unchanged; -255 = all transp.; 255 = all opaque)
*
* args.min = min alpha passed (lower ==> 0)
* args.max = max alpha passed (higher ==> 255)
*
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*/
int s_filter_cleanalpha(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Adjust brightness and contrast.
*
* args.fx = brightness (1.0 = unchanged; 0.0 = black; 2.0 = white)
* args.fy = contrast (1.0 = unchanged; 0.5 = 50%; 2.0 = 200%)
*
* args.min = min value (clamping)
* args.max = max value (clamping)
*
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*/
int s_filter_brightness(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
/*
* Scale images by the specified factor, using the specified method.
*
* args.x = scaling mode;
* SF_SCALE_NEAREST Nearest
* SF_SCALE_BILINEAR Bilinear interpolation
* SF_SCALE_SCALE2X Scale2x (Based on an algo from AdvanceMAME)
* SF_SCALE_DIAMOND Diamond (Weighted diamond shaped core)
*
* args.fx = horizontal scale factor (1.0 ==> 1:1)
* args.fy = vertical scale factor (1.0 ==> 1:1)
*
* args.flags;
* SF_CLAMP_EXTEND Clamp at edges; image edge is extended outwards
* SF_CLAMP_SFONT SFont mode; first row is treated specially.
*
*/
#define SF_SCALE_NEAREST 0
#define SF_SCALE_BILINEAR 1
#define SF_SCALE_SCALE2X 2
#define SF_SCALE_DIAMOND 3
int s_filter_scale(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
#if 0
/*
TODO:
* Add shaded light to images.
*
* args.fx = Highlight X position ([0,1])
* args.fy = Highlight Y position ([0,1])
* args.fz = Highlight "half intensity" radius
*
* args.x = Gradient type:
* SF_LIGHT_LINEAR Linear gradient
* SF_LIGHT_CIRCULAR Circular spotlight
*
* args.z = Gradient rotation (65536 units/rotation)
*
* args.min = "Ambient light"
* args.max = Max brightness
*
* args.r = Light color, red component
* args.g = Light color, green component
* args.b = Light color, blue component
*
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*/
#define SF_LIGHT_LINEAR 0
#define SF_LIGHT_CIRCULAR 1
int s_filter_light(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
#endif
/*
* Add single colored noise to images.
*
* args.x = Pseudo-RNG seed for first frame
*
* args.min = Min brightness ([0,255])
* args.max = Max brightness ([0,255])
*
* args.r = Noise color, red component ([0,255])
* args.g = Noise color, green component ([0,255])
* args.b = Noise color, blue component ([0,255])
*
* args.flags;
* SF_CLAMP_SFONT SFont mode; first row is ignored.
*/
int s_filter_noise(s_bank_t *b, unsigned first, unsigned frames,
s_filter_args_t *args);
#ifdef __cplusplus
}
#endif
#endif /* SPRITE_FILTERS_H */