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_map/mod_map.c | 1013 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1013 insertions(+) create mode 100644 modules/mod_map/mod_map.c (limited to 'modules/mod_map/mod_map.c') diff --git a/modules/mod_map/mod_map.c b/modules/mod_map/mod_map.c new file mode 100644 index 0000000..1c541a9 --- /dev/null +++ b/modules/mod_map/mod_map.c @@ -0,0 +1,1013 @@ +/* + * 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 "bgdrtm.h" + +#include "bgddl.h" +#include "dlvaracc.h" + +#include "xstrings.h" +#include "mod_map.h" + +#include "librender.h" + +#include "bgload.h" + +/* --------------------------------------------------------------------------- */ + +static int modmap_graphic_set( INSTANCE * my, int * params ) +{ + GRAPH * map ; + + map = bitmap_get( params[0], params[1] ) ; + if ( !map ) return 0 ; + + switch ( params[2] ) + { + case 2: /* g_center_x */ + bitmap_set_cpoint( map, 0, params[3], ( map->ncpoints ) ? ( map->cpoints[0].y ) : ( map->height / 2 ) ) ; + return 1 ; + + case 3: /* g_center_y */ + bitmap_set_cpoint( map, 0, ( map->ncpoints ) ? ( map->cpoints[0].x ) : ( map->width / 2 ), params[3] ) ; + return 1 ; + } + return 1 ; +} + +static int modmap_graphic_info( INSTANCE * my, int * params ) +{ + GRAPH * map ; + + map = bitmap_get( params[0], params[1] ) ; + if ( !map ) return 0 ; + + switch ( params[2] ) + { + case G_WIDTH: /* g_wide */ + return map->width ; + + case G_HEIGHT: /* g_height */ + return map->height ; + + case G_PITCH: /* g_pitch */ + return map->pitch ; + + case G_DEPTH: /* g_depth */ + return map->format->depth ; + + case G_CENTER_X: /* g_center_x */ + if ( map->ncpoints > 0 ) + if ( map->cpoints[0].x != CPOINT_UNDEFINED ) + return map->cpoints[0].x ; + return map->width / 2 ; + + case G_CENTER_Y: /* g_center_y */ + if ( map->ncpoints > 0 ) + if ( map->cpoints[0].y != CPOINT_UNDEFINED ) + return map->cpoints[0].y ; + return map->height / 2 ; + } + + return 1 ; +} + +static int modmap_set_point( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp || params[2] < 0 || params[2] > 999 ) return -1 ; + bitmap_set_cpoint( bmp, ( uint32_t )params[2], params[3], params[4] ); + return 1 ; +} + +static int modmap_set_center( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp ) return -1 ; + bitmap_set_cpoint( bmp, 0, params[2], params[3] ); + return 1 ; +} + +static int modmap_get_point( INSTANCE * my, int * params ) +{ + GRAPH * bmp ; + + bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp ) return 0 ; + + /* Use the center as control point if it is not there */ + if ( params[2] == 0 && ( bmp->ncpoints == 0 || bmp->cpoints[0].x == CPOINT_UNDEFINED ) ) + { + *( int * )params[3] = bmp->width / 2; + *( int * )params[4] = bmp->height / 2; + return 1 ; + } + + if (( uint32_t )params[2] >= bmp->ncpoints || params[2] < 0 ) + return 0 ; + if ( bmp->cpoints[params[2]].x == CPOINT_UNDEFINED && bmp->cpoints[params[2]].y == CPOINT_UNDEFINED ) + return 0; + + *( int * )params[3] = bmp->cpoints[params[2]].x ; + *( int * )params[4] = bmp->cpoints[params[2]].y ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_load_png( INSTANCE * my, int * params ) +{ + int r = gr_load_png( string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +static int modmap_load_pcx( INSTANCE * my, int * params ) +{ + int r = ( int ) gr_load_pcx( string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_save_png( INSTANCE * my, int * params ) +{ + int r = ( int ) gr_save_png( bitmap_get( params[0], params[1] ), string_get( params[2] ) ) ; + string_discard( params[2] ) ; + return r ; +} + +/* ---------------------------------------------------------------------- */ + +static int modmap_map_buffer( INSTANCE * my, int * params ) +{ + GRAPH * map ; + + if ( params[0] || params[1] ) + map = bitmap_get( params[0], params[1] ) ; + else + map = background ; + + return map ? ( int )map->data : 0 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_clear( INSTANCE * my, int * params ) +{ + GRAPH *map = bitmap_get( params[0], params[1] ) ; + if ( map ) gr_clear_as( map, params[2] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_new_map( INSTANCE * my, int * params ) +{ + GRAPH * map ; + map = bitmap_new_syslib( params[0], params[1], params[2] ) ; + if ( map ) gr_clear( map ); + return map ? map->code : 0 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_new_map_extend( INSTANCE * my, int * params ) +{ + GRAPH * map ; + map = bitmap_new_syslib( params[0], params[1], params[2] ) ; + if ( map && ( params[3] & B_CLEAR )) gr_clear( map ); + return map ? map->code : 0 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_clone( INSTANCE * my, int * params ) +{ + GRAPH * origin, * map = NULL ; + origin = bitmap_get( params[0], params[1] ) ; + if ( origin ) map = bitmap_clone( origin ) ; + if ( !map ) return 0; + map->code = bitmap_next_code(); + grlib_add_map( 0, map ); + return map->code ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_put( INSTANCE * my, int * params ) +{ + GRAPH * dest = bitmap_get( params[0], params[1] ) ; + GRAPH * orig = bitmap_get( params[0], params[2] ) ; + + if ( !dest || !orig ) return 0 ; + + gr_blit( dest, NULL, params[3], params[4], 0, orig ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ +/** MAP_XPUT (FILE, GRAPH_DEST, GRAPH_SRC, X, Y, ANGLE, SIZE, FLAGS) + * Draws a map into another one, with most blitter options including flags and alpha + */ + +static int modmap_map_xput( INSTANCE * my, int * params ) +{ + GRAPH * dest = bitmap_get( params[0], params[1] ) ; + GRAPH * orig = bitmap_get( params[0], params[2] ) ; + + if ( !dest || !orig ) return 0; + + if ( params[5] == 0 && params[6] == 100 ) + gr_blit( dest, 0, params[3], params[4], params[7], orig ) ; + else + gr_rotated_blit( dest, 0, params[3], params[4], params[7], params[5], params[6], params[6], orig ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ +/** MAP_XPUTNP (FILE_DST, GRAPH_DST, FILE_SRC, GRAPH_SRC, X, Y, ANGLE, SCALE_X, SCALE_Y, FLAGS) + * Enhanced MAP_XPUT with all parametes and different FPG file and non-proportional scale + */ + +static int modmap_map_xputnp( INSTANCE * my, int * params ) +{ + GRAPH * dest = bitmap_get( params[0], params[1] ) ; + GRAPH * orig = bitmap_get( params[2], params[3] ) ; + + if ( params[6] == 0 && params[7] == 100 && params[8] == 100 ) + gr_blit( dest, 0, params[4], params[5], params[9], orig ) ; + else + gr_rotated_blit( dest, 0, params[4], params[5], params[9], params[6], params[7], params[8], orig ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_name( INSTANCE * my, int * params ) +{ + GRAPH * map = bitmap_get( params[0], params[1] ); + int result; + + if ( !map ) return 0; + result = string_new( map->name ); + string_use( result ); + return result; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_set_name( INSTANCE * my, int * params ) +{ + GRAPH * map = bitmap_get( params[0], params[1] ); + const char * ptr = string_get( params[2] ) ; + if ( map ) + { + strncpy( map->name, ptr, sizeof( map->name ) ); + map->name[sizeof( map->name )-1] = 0; + } + string_discard( params[2] ); + return 0; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_exists( INSTANCE * my, int * params ) +{ + GRAPH * map = bitmap_get( params[0], params[1] ); + return map == NULL ? 0 : 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_map_block_copy( INSTANCE * my, int * params ) +{ + GRAPH * dest, * orig ; + REGION clip ; + int centerx, centery, flag ; + uint32_t x, y, w, h, dx, dy ; + + dest = bitmap_get( params[0], params[1] ) ; + if ( !dest ) return 0; + + orig = bitmap_get( params[0], params[4] ) ; + if ( !orig ) return 0; + + x = params[5] ; + y = params[6] ; + w = params[7] ; + h = params[8] ; + dx = params[2] ; + dy = params[3] ; + flag = params[9] ; + + if ( orig->ncpoints > 0 && orig->cpoints[0].x != CPOINT_UNDEFINED ) + { + centerx = orig->cpoints[0].x ; + centery = orig->cpoints[0].y ; + } + else + { + centery = orig->height / 2 ; + centerx = orig->width / 2 ; + } + + if ( flag & B_HMIRROR ) centerx = orig->width - 1 - centerx; + if ( flag & B_VMIRROR ) centery = orig->height - 1 - centery; + + if ( x < 0 ) + { + dx += x ; + w += x ; + x = 0 ; + } + if ( y < 0 ) + { + dy += y ; + h += y ; + y = 0 ; + } + if ( dx < 0 ) + { + x += dx ; + w += dx ; + dx = 0 ; + } + if ( dy < 0 ) + { + y += dy ; + h += dy ; + dy = 0 ; + } + + if ( x + w > orig->width ) w = orig->width - x ; + + if ( y + h > orig->height ) h = orig->height - y ; + + if ( dx + w > dest->width ) w = dest->width - dx ; + + if ( dy + h > dest->height ) h = dest->height - dy ; + + if ( w <= 0 || h <= 0 ) return 0; + + clip.x = dx ; + clip.y = dy ; + clip.x2 = dx + w - 1 ; + clip.y2 = dy + h - 1 ; + gr_blit( dest, &clip, dx - x + centerx, dy - y + centery, flag, orig ) ; + + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_load_map( INSTANCE * my, int * params ) +{ + int r = gr_load_map( string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_unload_map( INSTANCE * my, int * params ) +{ + return grlib_unload_map( params[0], params[1] ) ; +} + +/* ---------------------------------------------------------------------- */ + +static int modmap_save_map( INSTANCE * my, int * params ) +{ + int r = ( int ) gr_save_map( bitmap_get( params[0], params[1] ), ( char * )string_get( params[2] ) ) ; + string_discard( params[2] ) ; + return r ; +} + +/* ---------------------------------------------------------------------- */ + +static int modmap_load_pal( INSTANCE * my, int * params ) +{ + int r = gr_load_pal( string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +/* ---------------------------------------------------------------------- */ + +static int modmap_save_pal( INSTANCE * my, int * params ) +{ + int r = gr_save_pal( string_get( params[0] ), ( PALETTE * )params[1] ); + string_discard( params[0] ); + return r; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_save_system_pal( INSTANCE * my, int * params ) +{ + int r = gr_save_system_pal( string_get( params[0] ) ); + string_discard( params[0] ); + return r; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_convert_palette( INSTANCE * my, int * params ) +{ + GRAPH * map = bitmap_get( params[0], params[1] ) ; + int * newpal = ( int * ) params[2]; + uint32_t x, y ; + uint8_t * orig, * ptr ; + + if ( !map ) return -1 ; + if ( map->format->depth != 8 ) return 0; + + orig = ( uint8_t * )map->data ; + for ( y = 0 ; y < map->height; y++ ) + { + ptr = orig + map->pitch * y ; + for ( x = 0 ; x < map->width ; x++, ptr++ ) *ptr = newpal[*ptr] ; + } + + map->modified = 1; + + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_set_colors( INSTANCE * my, int * params ) +{ + gr_set_colors( params[0], params[1], ( uint8_t * )params[2] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_colors( INSTANCE * my, int * params ) +{ + gr_get_colors( params[0], params[1], ( uint8_t * )params[2] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_roll_palette( INSTANCE * my, int * params ) +{ + gr_roll_palette( params[0], params[1], params[2] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_find_color( INSTANCE * my, int * params ) +{ + return gr_find_nearest_color( params[0], params[1], params[2] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_find_color2( INSTANCE * my, int * params ) +{ + return find_nearest_color( ( PALETTE * ) params[0], 0, 255, params[1], params[2], params[3] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_find_color3( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp || bmp->format->depth != 8 ) return 0 ; + return find_nearest_color( bmp->format->palette, 0, 255, params[2], params[3], params[4] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgb( INSTANCE * my, int * params ) +{ + gr_get_rgb( params[0], ( int * )params[1], ( int * )params[2], ( int * )params[3] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgba( INSTANCE * my, int * params ) +{ + gr_get_rgba( params[0], ( int * )params[1], ( int * )params[2], ( int * )params[3], ( int * )params[4] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgb( INSTANCE * my, int * params ) +{ + return gr_rgb( params[0], params[1], params[2] ); +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgba( INSTANCE * my, int * params ) +{ + return gr_rgba( params[0], params[1], params[2], params[3] ); +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgb_depth( INSTANCE * my, int * params ) +{ + gr_get_rgb_depth( params[4], params[0], ( int * )params[1], ( int * )params[2], ( int * )params[3] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgba_depth( INSTANCE * my, int * params ) +{ + gr_get_rgba_depth( params[5], params[0], ( int * )params[1], ( int * )params[2], ( int * )params[3], ( int * )params[4] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgb_depth( INSTANCE * my, int * params ) +{ + return params[3] > 8 ? + gr_rgb_depth( params[3], params[0], params[1], params[2] ) : + gr_find_nearest_color( params[0], params[1], params[2] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgba_depth( INSTANCE * my, int * params ) +{ + return params[4] > 8 ? + gr_rgba_depth( params[4], params[0], params[1], params[2], params[3] ) : + gr_find_nearest_color( params[0], params[1], params[2] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgb_map( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + _get_rgb( bmp->format, params[2], ( int * )params[3], ( int * )params[4], ( int * )params[5] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_get_rgba_map( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + _get_rgba( bmp->format, params[2], ( int * )params[3], ( int * )params[4], ( int * )params[5], ( int * )params[6] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgb_map( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + return _rgb( bmp->format, params[2], params[3], params[4] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_rgba_map( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + return _rgba( bmp->format, params[2], params[3], params[4], params[5] ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fade( INSTANCE * my, int * params ) +{ + gr_fade_init( params[0], params[1], params[2], params[3] ); + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fade_on( INSTANCE * my, int * params ) +{ + gr_fade_init( 100, 100, 100, 16 ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fade_off( INSTANCE * my, int * params ) +{ + gr_fade_init( 0, 0, 0, 16 ) ; + return 1; +} + +/* --------------------------------------------------------------------------- */ +/* Palette */ + +static int modmap_pal_create( INSTANCE * my, int * params ) +{ + return ( int ) pal_new(( PALETTE * )NULL ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_clone( INSTANCE * my, int * params ) +{ + return ( int ) pal_new(( PALETTE * )( params[0] ) ) ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_unload( INSTANCE * my, int * params ) +{ + pal_destroy(( PALETTE * )( params[0] ) ) ; + return 1; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_refresh( INSTANCE * my, int * params ) +{ + pal_refresh( NULL ) ; + return 1; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_refresh_2( INSTANCE * my, int * params ) +{ + pal_refresh(( PALETTE * )( params[0] ) ); + return 1; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_map_assign( INSTANCE * my, int * params ) +{ + return pal_map_assign( params[0], params[1], ( PALETTE * )( params[2] ) ); +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_map_remove( INSTANCE * my, int * params ) +{ + return pal_map_remove( params[0], params[1] ); +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_map_getid( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp || bmp->format->depth != 8 ) return 0 ; + return ( int ) bmp->format->palette ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_set_system_pal( INSTANCE * my, int * params ) +{ + if ( pal_set(( PALETTE * )NULL, 0, 256, ( uint8_t * )(( PALETTE * )params[0])->rgb ) ) + { + pal_refresh( sys_pixel_format->palette ); + return 1; + } + return 0; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_set_system_pal_raw( INSTANCE * my, int * params ) +{ + if ( pal_set(( PALETTE * )NULL, 0, 256, ( uint8_t * )params[0] ) ) + { + pal_refresh( sys_pixel_format->palette ); + return 1; + } + return 0; +} + +/* ---------------------------------------------------------------------- */ + +static int modmap_pal_set( INSTANCE * my, int * params ) +{ + int ret = pal_set(( PALETTE * )( params[0] ), params[1], params[2], ( uint8_t * )params[3] ) ; + if ( ret && !params[0] ) pal_refresh( sys_pixel_format->palette ); + return ret; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_pal_get( INSTANCE * my, int * params ) +{ + return ( pal_get(( PALETTE * )( params[0] ), params[1], params[2], ( uint8_t * )params[3] ) ) ; +} + +/* ---------------------------------------------------------------------- */ + +/* Funciones de FPG */ + +static int modmap_load_fpg( INSTANCE * my, int * params ) +{ + int r; + r = gr_load_fpg( string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_save_fpg( INSTANCE * my, int * params ) +{ + int r; + r = gr_save_fpg( params[0], string_get( params[1] ) ) ; + string_discard( params[1] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_unload_fpg( INSTANCE * my, int * params ) +{ + grlib_destroy( params[0] ) ; + return 1 ; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fpg_exists( INSTANCE * my, int * params ) +{ + GRLIB * lib = grlib_get( params[0] ); + return lib == NULL ? 0 : 1; +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fpg_add( INSTANCE * my, int * params ) +{ + GRAPH * orig = bitmap_get( params[2], params[3] ); + GRAPH * dest ; + + if ( orig == NULL ) return 0; + dest = bitmap_clone( orig ) ; + dest->code = params[1] ; + + return grlib_add_map( params[0], dest ); +} + +/* --------------------------------------------------------------------------- */ + +static int modmap_fpg_new( INSTANCE * my, int * params ) +{ + return grlib_new(); +} + +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- */ +/** LOAD_FNT (STRING FILENAME) + * Load a .FNT font from disk (returns the font ID) + */ + +static int modmap_load_fnt( INSTANCE * my, int * params ) +{ + int r = gr_font_load( ( char * )string_get( params[0] ) ); + string_discard( params[0] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ +/* --------------------------------------------------------------------------- */ + +/* --------------------------------------------------------------------------- */ +/** LOAD_BDF (STRING FILENAME) + * Load a .BDF font from disk (returns the font ID) + */ + +static int modmap_load_bdf( INSTANCE * my, int * params ) +{ + int r = gr_load_bdf( ( char * )string_get( params[0] ) ) ; + string_discard( params[0] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ +/** UNLOAD_FNT (FONT) + * Destroys a font in memory + */ + +static int modmap_unload_fnt( INSTANCE * my, int * params ) +{ + if ( params[0] > 0 ) gr_font_destroy( params[0] ); + return 0; +} + +/* --------------------------------------------------------------------------- */ +/** FNT_NEW (DEPTH) + * Create a new font in memory (returns the font ID) + */ + +static int modmap_fnt_new( INSTANCE * my, int * params ) +{ + return gr_font_new( CHARSET_CP850, params[0] ); +} + +/* --------------------------------------------------------------------------- */ + +/** FNT_NEW (CHARSET, DEPTH) + * Create a new font in memory (returns the font ID) + */ + +static int modmap_fnt_new_charset( INSTANCE * my, int * params ) +{ + return gr_font_new( params[0], params[1] ); +} + +/* --------------------------------------------------------------------------- */ + +/** FNT_NEW (FILE, GRAPH, CHARSET, WIDTH, HEIGHT, FIRST, LAST, FLAGS) + * Create a new font in memory (returns the font ID) + */ + +static int modmap_fnt_new_from_bitmap( INSTANCE * my, int * params ) +{ + GRAPH * bmp = bitmap_get( params[0], params[1] ) ; + if ( !bmp ) return -1; + return gr_font_newfrombitmap( bmp, params[2], params[3], params[4], params[5], params[6], params[7] ); +} + +/* --------------------------------------------------------------------------- */ +/** GET_GLYPH (FONT, GLYPH) + * Create a system map as a copy of one of the font glyphs (returns the map ID) + */ + +static int modmap_get_glyph( INSTANCE * my, int * params ) +{ + FONT * font = gr_font_get( params[0] ); + GRAPH * map ; + unsigned char c = params[1]; + + if ( font->charset == /*CHARSET_CP850*/ CHARSET_ISO8859 ) c = win_to_dos[c]; + if ( !font ) return 0; + if ( !font->glyph[c].bitmap ) return 0; + + map = bitmap_clone( font->glyph[c].bitmap ); + if ( !map ) return 0; + + map->code = bitmap_next_code(); + + if ( !map->ncpoints ) bitmap_add_cpoint( map, map->width / 2, map->height / 2 ); + bitmap_add_cpoint( map, font->glyph[c].xoffset, font->glyph[c].yoffset ); + bitmap_add_cpoint( map, font->glyph[c].xadvance, font->glyph[c].yadvance ); + + grlib_add_map( 0, map ); + + return map->code; +} + +/* --------------------------------------------------------------------------- */ +/** SET_GLYPH (FONT, GLYPH, LIBRARY, GRAPHIC) + * Change one of the font's glyphs + */ + +static int modmap_set_glyph( INSTANCE * my, int * params ) +{ + FONT * font = gr_font_get( params[0] ); + GRAPH * map = bitmap_get( params[2], params[3] ); + unsigned char c = params[1]; + + if ( font->charset == /*CHARSET_CP850*/CHARSET_ISO8859 ) c = win_to_dos[c]; + + if ( font && map ) + { + if ( font->glyph[c].bitmap ) grlib_unload_map( 0, font->glyph[c].bitmap->code ); + font->glyph[c].bitmap = bitmap_clone( map ); + if ( font->glyph[c].bitmap ) + { + font->glyph[c].bitmap->code = bitmap_next_code(); + + if ( map->ncpoints >= 3 && map->cpoints ) + { + font->glyph[c].xoffset = map->cpoints[1].x; + font->glyph[c].yoffset = map->cpoints[1].y; + font->glyph[c].xadvance = map->cpoints[2].x; + font->glyph[c].yadvance = map->cpoints[2].y; + } + else + { + font->glyph[c].xoffset = 0; + font->glyph[c].yoffset = 0; + font->glyph[c].xadvance = map->width + map->width / 5 ; + font->glyph[c].yadvance = map->height + map->height / 5 ; + bitmap_add_cpoint( font->glyph[c].bitmap, 0, 0 ) ; + } + grlib_add_map( 0, font->glyph[c].bitmap ); + } + } + return 0; +} + +/* --------------------------------------------------------------------------- */ +/** SAVE_FNT (FONT, STRING FILENAME) + * Saves a font to disk + */ + +static int modmap_save_fnt( INSTANCE * my, int * params ) +{ + int r = gr_font_save( params[0], ( char * )string_get( params[1] ) ) ; + string_discard( params[1] ) ; + return r ; +} + +/* --------------------------------------------------------------------------- */ +/** + int LOAD_FPG(STRING FICHERO, INT POINTER VARIABLE) + Loads fpg file FICHERO on a separate thread + VARIABLE is -2 while waiting, -1 on error, >=0 otherwise + **/ + +static int modmap_bgload_fpg( INSTANCE * my, int * params ) +{ + bgload( gr_load_fpg, params ); + return 0 ; +} + +static int modmap_bgload_map( INSTANCE * my, int * params ) +{ + bgload( gr_load_map, params ) ; + return 0 ; +} + +static int modmap_bgload_png( INSTANCE * my, int * params ) +{ + bgload( gr_load_png, params ) ; + return 0 ; +} + +static int modmap_bgload_pcx( INSTANCE * my, int * params ) +{ + bgload( gr_load_pcx, params ); + return 0 ; +} + +static int modmap_bgload_pal( INSTANCE * my, int * params ) +{ + bgload( gr_load_pal, params ) ; + return 0 ; +} + +static int modmap_bgload_fnt( INSTANCE * my, int * params ) +{ + bgload( gr_font_load, params ); + return 0 ; +} + +static int modmap_bgload_bdf( INSTANCE * my, int * params ) +{ + bgload( gr_load_bdf, params ) ; + return 0 ; +} + +/* ----------------------------------------------------------------- */ +/* exports */ +/* ----------------------------------------------------------------- */ + +#include "mod_map_exports.h" + +/* ----------------------------------------------------------------- */ -- cgit v1.2.3