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/mod_blendop/mod_blendop.c | 280 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 280 insertions(+) create mode 100644 modules/mod_blendop/mod_blendop.c (limited to 'modules/mod_blendop/mod_blendop.c') diff --git a/modules/mod_blendop/mod_blendop.c b/modules/mod_blendop/mod_blendop.c new file mode 100644 index 0000000..64980f7 --- /dev/null +++ b/modules/mod_blendop/mod_blendop.c @@ -0,0 +1,280 @@ +/* + * 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 "bgdrtm.h" +#include "bgddl.h" + +#include "libgrbase.h" + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_create_blendop + * + * Create a new blendop table and initialize it with blend_init + * A blendop table is a group of two tables that return intermediate + * colors to a composite (+) operation that does no saturation: + * + * Src_param = Src_color + * Dst_param = Dst_color + * Dst_color = Src_param + Dst_param // No clamp! + * + * The other blend_x funcions change the Src_param and Dst_param formulas. + * The Dst_color formula is immutable and embedded in the blitter + * + * PARAMS : + * None + * + * RETURN VALUE : + * Pointer to the new blendop table or NULL if not enough memory + */ + +static int modblendop_create_blendop( INSTANCE * my, int * params ) +{ + return ( int ) blend_create(); +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_apply + * + * Apply a blend operation to the pixels of a graphic, as if it was + * rendered into a black (color 0) background + * + * PARAMS : + * map Pointer to the graphic + * blend Pointer to the blend table + * + * RETURN VALUE : + * 0 Error + * 1 OK + */ + +static int modblendop_apply( INSTANCE * my, int * params ) +{ + GRAPH * graph = bitmap_get( params[0], params[1] ); + if ( !graph ) return 0; + blend_apply( graph, ( int16_t * )params[2] ); + return 1; + +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_assign + * + * Assign a blend operation to a graphic. The graphic will be + * drawn using this blend operation thereafter. + * + * PARAMS : + * map Pointer to the graphic + * blend Pointer to the blend table + * + * RETURN VALUE : + * None + */ + +static int modblendop_assign( INSTANCE * my, int * params ) +{ + GRAPH * graph = bitmap_get( params[0], params[1] ); + if ( !graph ) return 0; + blend_assign( graph, ( int16_t * )params[2] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_free + * + * Free the memory used by a blendop table + * + * PARAMS : + * blend Pointer to the blend table + * + * RETURN VALUE : + * None + */ + +static int modblendop_free( INSTANCE * my, int * params ) +{ + blend_free(( int16_t * )params[0] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_identity + * + * Restore default blendop table + * + * PARAMS : + * blend Pointer to the blend table + * + * RETURN VALUE : + * None + */ + +static int modblendop_identity( INSTANCE * my, int * params ) +{ + blend_init(( int16_t * )params[0] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_grayscale + * + * Initialize a blend table as a grayscale operation (changes the + * color value of the source object to grayscale). Three methods + * of operation are supported: + * + * 1. Luminance: result = 0.3R + 0.59G + 0.11B + * 2. Desaturate: result = (MAX(R,G,B)+MIN(R,G,B))/2 + * 3. Maximum: result = MAX(R,G,B) + * + * + * Src_param = Grayscale_operation(previous Src_param) + * + * PARAMS : + * blend Pointer to the blend table + * method Method of operation + * + * RETURN VALUE : + * 0 Error + * 1 Ok + */ + +static int modblendop_grayscale( INSTANCE * my, int * params ) +{ + blend_grayscale(( int16_t * )params[0], params[1] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_translucency + * + * Modify a blend table as a translucency combination operation + * + * Src_param = (previous Src_param) * ammount + * Dst_param = Dst_color * (1.0 - ammount) + * + * PARAMS : + * blend Pointer to the blend table + * ammount Opacity factor (1.0f = opaque, 0.0f = transparent) + * + * RETURN VALUE : + * None + */ + +static int modblendop_translucency( INSTANCE * my, int * params ) +{ + blend_translucency(( int16_t * )params[0], *( float * )( ¶ms[1] ) ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_intensity + * + * Modify a blend table as an intensity operation (changes the + * color value of the source object as the factor ammount but + * does no transparency or other operation with the background) + * + * Src_param = (previous Src_param) * ammount + * + * PARAMS : + * blend Pointer to the blend table + * ammount Color component factor (1.0f leaves source unchanged) + * + * RETURN VALUE : + * None + */ + +static int modblendop_intensity( INSTANCE * my, int * params ) +{ + blend_intensity(( int16_t * )params[0], *( float * )( ¶ms[1] ) ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_swap + * + * Swaps a blendop table. That is, change the blend operation so + * the Dst_color and Src_color are exchanged in the formulas. + * + * PARAMS : + * blend Pointer to the blend table + * + * RETURN VALUE : + * None + */ + +static int modblendop_swap( INSTANCE * my, int * params ) +{ + blend_swap(( int16_t * )params[0] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* + * FUNCTION : modblendop_tint + * + * Modify a blend table as a tint operation (changes the + * color value of the source object as a combination of a given + * color and the source color with the factor given) + * + * Src_param = Const_color * ammount + * + (previous Src_Param) * (1.0f-ammount) + * + * PARAMS : + * blend Pointer to the blend table + * ammount Color component factor (1.0f = Full Const color) + * cr Constant color, red component (0-255) + * cg Constant color, green component (0-255) + * cb Constant color, blue component (0-255) + * + * RETURN VALUE : + * None + */ + +static int modblendop_tint( INSTANCE * my, int * params ) +{ + blend_tint(( int16_t * )params[0], *( float * )( ¶ms[1] ), ( uint8_t ) params[2], ( uint8_t ) params[3], ( uint8_t ) params[4] ); + return 1; +} + +/* ----------------------------------------------------------------- */ +/* exports */ +/* ----------------------------------------------------------------- */ + +#include "mod_blendop_exports.h" + +/* ----------------------------------------------------------------- */ -- cgit v1.2.3