From ea1947ffcc606d757357398b24e74a3f4ecefa07 Mon Sep 17 00:00:00 2001 From: neonloop Date: Wed, 20 Oct 2021 14:54:27 +0000 Subject: Initial commit from steward-fu release --- modules/librender/g_fade.c | 164 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 modules/librender/g_fade.c (limited to 'modules/librender/g_fade.c') diff --git a/modules/librender/g_fade.c b/modules/librender/g_fade.c new file mode 100644 index 0000000..1fcafbe --- /dev/null +++ b/modules/librender/g_fade.c @@ -0,0 +1,164 @@ +/* + * Copyright © 2006-2016 SplinterGU (Fenix/Bennugd) + * Copyright © 2002-2006 Fenix Team (Fenix) + * Copyright © 1999-2002 José Luis Cebrián Pagüe (Fenix) + * + * This file is part of Bennu - Game Development + * + * 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, subject to the following restrictions: + * + * 1. The origin of this software must not be misrepresented; you must not + * claim that you wrote the original software. If you use this software + * in a product, an acknowledgment in the product documentation would be + * appreciated but is not required. + * + * 2. Altered source versions must be plainly marked as such, and must not be + * misrepresented as being the original software. + * + * 3. This notice may not be removed or altered from any source + * distribution. + * + */ + +#include +#include + +#include "librender.h" + +/* -------------------------------------------------------------------------- */ + +SDL_Color vpalette[ 256 ] ; + +int fade_inc = 0 ; +int fade_on = 0 ; +int fade_set = 0 ; +int fade_step = 64 ; + +SDL_Color fade_from ; +SDL_Color fade_to ; +SDL_Color fade_pos = { 100, 100, 100 }; + +/* -------------------------------------------------------------------------- */ + +static void activate_vpalette() +{ + int n ; + + if ( !screen ) return ; + + if (( sys_pixel_format ) && ( sys_pixel_format->palette ) ) + { + if ( sys_pixel_format->depth > 8 ) + { + for ( n = 0 ; n < 256 ; n++ ) + sys_pixel_format->palette->colorequiv[ n ] = SDL_MapRGB( screen->format, sys_pixel_format->palette->rgb[ n ].r, sys_pixel_format->palette->rgb[ n ].g, sys_pixel_format->palette->rgb[ n ].b ) ; + } + else + { + for ( n = 0 ; n < 256 ; n++ ) + { + if ( fade_pos.r <= 100 ) + vpalette[ n ].r = sys_pixel_format->palette->rgb[ n ].r * fade_pos.r / 100; + else + vpalette[ n ].r = sys_pixel_format->palette->rgb[ n ].r + ( 255 - sys_pixel_format->palette->rgb[ n ].r ) * ( fade_pos.r - 100 ) / 100; + + if ( fade_pos.g <= 100 ) + vpalette[ n ].g = sys_pixel_format->palette->rgb[ n ].g * fade_pos.g / 100; + else + vpalette[ n ].g = sys_pixel_format->palette->rgb[ n ].g + ( 255 - sys_pixel_format->palette->rgb[ n ].g ) * ( fade_pos.g - 100 ) / 100; + + if ( fade_pos.b <= 100 ) + vpalette[ n ].b = sys_pixel_format->palette->rgb[ n ].b * fade_pos.b / 100; + else + vpalette[ n ].b = sys_pixel_format->palette->rgb[ n ].b + ( 255 - sys_pixel_format->palette->rgb[ n ].b ) * ( fade_pos.b - 100 ) / 100; + } + + if ( scale_screen ) + SDL_SetColors( scale_screen, vpalette, 0, 256 ) ; + else + SDL_SetColors( screen, vpalette, 0, 256 ) ; + } + } +} + +/* -------------------------------------------------------------------------- */ + +void gr_fade_init( int r, int g, int b, int speed ) +{ + if ( fade_pos.r == r && fade_pos.g == g && fade_pos.b == b ) + { + GLODWORD( librender, FADING ) = 0 ; + fade_on = 0 ; + return ; + } + + fade_inc = speed; + fade_step = 0; + fade_on = 1 ; + fade_from = fade_pos; + fade_to.r = ( r > 200 ) ? 200 : r ; + fade_to.g = ( g > 200 ) ? 200 : g ; + fade_to.b = ( b > 200 ) ? 200 : b ; + + GLODWORD( librender, FADING ) = 1 ; +} + +/* -------------------------------------------------------------------------- */ + +void gr_fade_step() +{ + if ( fade_on ) + { + fade_set = 1 ; + GLODWORD( librender, FADING ) = 1 ; + + fade_step += fade_inc ; + if ( fade_step < 0 ) + { + GLODWORD( librender, FADING ) = 0 ; + fade_step = 0 ; + fade_on = 0 ; + } + + if ( fade_step >= 64 ) + { + GLODWORD( librender, FADING ) = 0 ; + fade_step = 64 ; + fade_on = 0 ; + } + + fade_pos.r = ( fade_to.r * fade_step + fade_from.r * ( 64 - fade_step ) ) / 64; + fade_pos.g = ( fade_to.g * fade_step + fade_from.g * ( 64 - fade_step ) ) / 64; + fade_pos.b = ( fade_to.b * fade_step + fade_from.b * ( 64 - fade_step ) ) / 64; + + if ( + ( fade_step + fade_inc < 0 || fade_step + fade_inc > 64 ) && + ( fade_pos.r == 100 && fade_pos.g == 100 && fade_pos.b == 100 ) ) + { + GLODWORD( librender, FADING ) = 0 ; + fade_step = 100 ; + fade_on = 0; + } + } + + if ( fade_set ) + { + if ( !fade_on && fade_to.r == 100 && fade_to.g == 100 && fade_to.b == 100 ) fade_set = 0; + + activate_vpalette() ; + + if ( scrbitmap->format->depth > 8 ) + { + gr_fade16( scrbitmap, fade_pos.r, fade_pos.g, fade_pos.b ); + } + } +} + +/* -------------------------------------------------------------------------- */ + -- cgit v1.2.3