6# define RETROFLAT_BMP_TEX
279#ifndef RETROFLAT_BITMAP_TRACE_LVL
280# define RETROFLAT_BITMAP_TRACE_LVL 0
283#ifndef RETROFLAT_KB_TRACE_LVL
284# define RETROFLAT_KB_TRACE_LVL 0
306#define RETROFLAT_COLOR_TABLE( f ) \
307 f( 0, black, BLACK, 0, 0, 0, BLACK, BLACK ) \
308 f( 1, darkblue, DARKBLUE, 0, 0, 170, CYAN, BLACK ) \
309 f( 2, darkgreen, DARKGREEN, 0, 170, 0, CYAN, BLACK ) \
310 f( 3, teal, TEAL, 0, 170, 170, CYAN, CYAN ) \
311 f( 4, darkred, DARKRED, 170, 0, 0, MAGENTA, BLACK ) \
312 f( 5, violet, VIOLET, 170, 0, 170, MAGENTA, BLACK ) \
313 f( 6, brown, BROWN, 170, 85, 0, CYAN, MAGENTA ) \
314 f( 7, gray, GRAY, 170, 170, 170, WHITE, BLACK ) \
315 f( 8, darkgray, DARKGRAY, 85, 85, 85, WHITE, BLACK ) \
316 f( 9, blue, BLUE, 85, 85, 255, CYAN, WHITE ) \
317 f( 10, green, GREEN, 85, 255, 85, CYAN, CYAN ) \
318 f( 11, cyan, CYAN, 85, 255, 255, CYAN, CYAN ) \
319 f( 12, red, RED, 255, 85, 85, MAGENTA, WHITE ) \
320 f( 13, magenta, MAGENTA, 255, 85, 255, MAGENTA, MAGENTA ) \
321 f( 14, yellow, YELLOW, 255, 255, 85, CYAN, MAGENTA ) \
322 f( 15, white, WHITE, 255, 255, 255, WHITE, WHITE )
327# define RETROFLAT_COLOR_NULL (-1)
329# define RETROFLAT_COLORS_SZ 16
334#if defined( RETROFLAT_OS_UNIX ) || defined( RETROFLAT_OS_WIN )
335#define RETROFLAT_MOUSE
345#define RETROFLAT_OK 0x00
346#define RETROFLAT_ERROR_ENGINE 0x01
347#define RETROFLAT_ERROR_GRAPHICS 0x02
348#define RETROFLAT_ERROR_MOUSE 0x04
354#define RETROFLAT_ERROR_BITMAP 0x08
355#define RETROFLAT_ERROR_TIMER 0x0f
373#define RETROFLAT_FLAGS_FILL 0x01
379#define RETROFLAT_FLAGS_OPAQUE 0x01
387#define RETROFLAT_FLAGS_ALL_CAPS 0x02
392#define RETROFLAT_FLAGS_LITERAL_PATH 0x02
400#define RETROFLAT_FLAGS_SCREEN_BUFFER 0x80
415#define RETROFLAT_FLAGS_RUNNING 0x01
421#define RETROFLAT_FLAGS_UNLOCK_FPS 0x02
427#define RETROFLAT_FLAGS_KEY_REPEAT 0x04
433#define RETROFLAT_FLAGS_SCREENSAVER 0x08
438#define RETROFLAT_FLAGS_WAIT_FOR_FPS 0x20
450#define RETROFLAT_MSG_FLAG_TYPE_MASK 0x07
456#define RETROFLAT_MSG_FLAG_ERROR 0x01
463#define RETROFLAT_MSG_FLAG_INFO 0x02
470#define RETROFLAT_MSG_FLAG_WARNING 0x04
495#define RETROFLAT_VDP_FLAG_PXLOCK 0x01
513 uint16_t new_w, uint16_t new_h,
void* data );
520#define RETROSND_ARGS_FLAG_LIST_DEVS 0x01
553#define RETROFLAT_FLAGS_LOCK 0x01
555#define RETROFLAT_FLAGS_SCREEN_LOCK 0x02
557#define RETROFLAT_FLAGS_BITMAP_RO 0x04
564#define RETROFLAT_INSTANCE_NULL (0)
570#define retroflat_instance_tile( instance ) \
577#ifndef RETROFLAT_BITMAP_EXT
578# define RETROFLAT_BITMAP_EXT "bmp"
581#ifndef RETROFLAT_OPENGL_BPP
582# define RETROFLAT_OPENGL_BPP 32
585#ifndef RETROFLAT_TILE_W
586# define RETROFLAT_TILE_W 16
589#ifndef RETROFLAT_TILE_W_BITS
590# define RETROFLAT_TILE_W_BITS 4
593#ifndef RETROFLAT_TILE_H
594# define RETROFLAT_TILE_H 16
597#ifndef RETROFLAT_TILE_H_BITS
598# define RETROFLAT_TILE_H_BITS 4
602#ifndef RETROFLAT_TXP_R
608# define RETROFLAT_TXP_R 0x00
611#ifndef RETROFLAT_TXP_G
617# define RETROFLAT_TXP_G 0x00
620#ifndef RETROFLAT_TXP_B
626# define RETROFLAT_TXP_B 0x00
629#ifndef RETROFLAT_TXP_PAL_IDX
630# define RETROFLAT_TXP_PAL_IDX 0
635#ifndef RETROFLAT_DEFAULT_SCREEN_W
636# define RETROFLAT_DEFAULT_SCREEN_W 320
639#ifndef RETROFLAT_DEFAULT_SCREEN_H
640# define RETROFLAT_DEFAULT_SCREEN_H 200
643#define retroflat_on_resize( w, h ) \
644 g_retroflat_state->screen_w = w; \
645 g_retroflat_state->screen_h = h;
652#ifndef RETROFLAT_LINE_THICKNESS
657# define RETROFLAT_LINE_THICKNESS 1
660#define RETROFLAT_PI 3.14159
674# define RETROFLAT_FPS 30
677#define retroflat_fps_next() (1000 / RETROFLAT_FPS)
679#ifndef RETROFLAT_WINDOW_CLASS
684# define RETROFLAT_WINDOW_CLASS "RetroFlatWindowClass"
687#ifndef RETROFLAT_WIN_FRAME_TIMER_ID
692# define RETROFLAT_WIN_FRAME_TIMER_ID 6001
695#ifndef RETROFLAT_WIN_LOOP_TIMER_ID
700# define RETROFLAT_WIN_LOOP_TIMER_ID 6002
703#ifndef RETROFLAT_MSG_MAX
708# define RETROFLAT_MSG_MAX 4096
711#define RETROFLAT_PATH_MAX MAUG_PATH_MAX
713#ifndef RETROFLAT_TITLE_MAX
714# define RETROFLAT_TITLE_MAX 255
717#ifndef RETROFLAT_VDP_ARGS_SZ_MAX
721# define RETROFLAT_VDP_ARGS_SZ_MAX 255
724#if defined( RETROFLAT_API_SDL2 )
725# if !defined( NO_RETROFLAT_RESIZABLE )
726# define RETROFLAT_WIN_FLAGS SDL_WINDOW_RESIZABLE
728# define RETROFLAT_WIN_FLAGS 0
732#if defined( RETROFLAT_API_SDL1 )
733# define RETROFLAT_SDL_CC_FLAGS (SDL_RLEACCEL | SDL_SRCCOLORKEY)
734#elif defined( RETROFLAT_API_SDL2 )
735# define RETROFLAT_SDL_CC_FLAGS (SDL_TRUE)
738#ifdef RETROFLAT_OS_DOS
739# define RETROFLAT_PATH_SEP '\\'
742# define RETROFLAT_PATH_SEP '/'
746#define RETROFLAT_ASSETS_PATH_MAX (RETROFLAT_PATH_MAX >> 1)
748#ifndef RETROFLAT_BMP_COLORS_SZ_MAX
749# define RETROFLAT_BMP_COLORS_SZ_MAX 256
754#define retroflat_wait_for_frame() \
755 (g_retroflat_state->retroflat_flags |= RETROFLAT_FLAGS_WAIT_FOR_FPS)
757#define retroflat_is_waiting_for_frame() \
758 (RETROFLAT_FLAGS_WAIT_FOR_FPS == \
759 (g_retroflat_state->retroflat_flags & RETROFLAT_FLAGS_WAIT_FOR_FPS))
776#define retroflat_cmp_asset_path( a, b ) strncmp( a, b, RETROFLAT_PATH_MAX )
778#define retroflat_assign_asset_path( tgt, src ) \
779 maug_strncpy( tgt, src, RETROFLAT_PATH_MAX )
781#define retroflat_assign_asset_trim_ext( tgt, src ) \
782 maug_snprintf( tgt, RETROFLAT_PATH_MAX, "%s", src ); \
783 if( NULL != strrchr( tgt, '.' ) ) { \
784 *(strrchr( tgt, '.' )) = '\0'; \
803#define retroflat_buffer_bksp( buffer, buffer_cur, buffer_sz ) \
804 if( 0 < buffer_cur ) { \
805 if( buffer_cur < buffer_sz ) { \
807 &(buffer[(buffer_cur) - 1]), \
808 &(buffer[buffer_cur]), \
809 (buffer_sz) - (buffer_cur) ); \
813 buffer[buffer_sz] = '\0'; \
819#define retroflat_buffer_insert( c, buffer, buffer_cur, buffer_sz, buffer_mx ) \
820 if( buffer_sz + 1 < buffer_mx ) { \
821 if( buffer_cur < buffer_sz ) { \
823 &(buffer[(buffer_cur) + 1]), \
824 &(buffer[buffer_cur]), \
825 (buffer_sz) - (buffer_cur) ); \
827 buffer[buffer_cur] = c; \
830 buffer[buffer_sz] = '\0'; \
833#define RETROFLAT_INPUT_MOD_SHIFT 0x01
835#define RETROFLAT_INPUT_MOD_ALT 0x02
837#define RETROFLAT_INPUT_MOD_CTRL 0x04
839#define RETROFLAT_INPUT_FORCE_UPPER 0x08
865typedef int8_t retroflat_dir4_t;
867typedef int8_t retroflat_dir8_t;
869#define RETROFLAT_DIR4_NONE (-1)
870#define RETROFLAT_DIR4_NORTH 0
871#define RETROFLAT_DIR4_EAST 1
872#define RETROFLAT_DIR4_SOUTH 2
873#define RETROFLAT_DIR4_WEST 3
875#define RETROFLAT_DIR8_NONE (-1)
876#define RETROFLAT_DIR8_NORTH 0
877#define RETROFLAT_DIR8_EAST 2
878#define RETROFLAT_DIR8_SOUTH 4
879#define RETROFLAT_DIR8_WEST 6
881#define retroflat_dir8_reverse( dir ) \
884#define retroflat_dir8_bounce( dir ) \
899#ifndef RETRO2D_TRACE_LVL
900# define RETRO2D_TRACE_LVL 0
903#ifndef RETROFLAT_NO_SOUND
933#ifndef RETROSND_TRACE_LVL
934# define RETROSND_TRACE_LVL 0
937#ifndef RETROSND_REG_TRACE_LVL
938# define RETROSND_REG_TRACE_LVL 0
951#define RETROSND_FLAG_INIT 0x01
955#define RETROSND_VOICE_BREATH 122
957#define RETROSND_VOICE_SEASHORE 123
959#define RETROSND_VOICE_BIRD_TWEET 124
961#define RETROSND_VOICE_PHONE_RING 125
963#define RETROSND_VOICE_HELICOPTER 126
965#define RETROSND_VOICE_APPLAUSE 127
971#define RETROSND_VOICE_GUNSHOT 128
973#define RETROSND_CHANNEL_CT 8
990void retrosnd_midi_set_voice( uint8_t channel, uint8_t voice );
992void retrosnd_midi_set_control( uint8_t channel, uint8_t key, uint8_t val );
994void retrosnd_midi_note_on( uint8_t channel, uint8_t pitch, uint8_t vel );
996void retrosnd_midi_note_off( uint8_t channel, uint8_t pitch, uint8_t vel );
1000uint8_t retrosnd_midi_is_playing_smf();
1002void retrosnd_shutdown();
1013#ifndef RETROFLAT_NO_SOUND
1014# include <retapis.h>
1024#if defined( RETROFLAT_OS_WIN ) && !defined( MAUG_WINDOWS_H )
1025# include <windows.h>
1026# define MAUG_WINDOWS_H
1029#if defined( RETROFLAT_BMP_TEX ) || defined( DOCUMENTATION )
1038 MAUG_MHANDLE bytes_h;
1053#ifndef retroflat_system_task
1059# define retroflat_system_task()
1062typedef maug_ms_t retroflat_ms_t;
1064#include "retrom2d.h"
1082# if !defined( RETROFLAT_NO_CLI_SZ )
1091 struct RETROFLAT_PLATFORM_ARGS platform;
1092# ifndef RETROFLAT_NO_SOUND
1093 struct RETROFLAT_SOUND_ARGS sound;
1191 int16_t world_tile_x;
1192 int16_t world_tile_y;
1193#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
1194 MAUG_MHANDLE refresh_grid_h;
1209# define retroflat_screen_colors() (g_retroflat_state->screen_colors)
1211#ifndef DOCUMENTATION
1213# define retroflat_viewport_world_x_generic() \
1214 (g_retroflat_state->viewport.world_x)
1216# define retroflat_viewport_world_y_generic() \
1217 (g_retroflat_state->viewport.world_y)
1219# define retroflat_viewport_world_tile_x_generic() \
1220 (g_retroflat_state->viewport.world_tile_x)
1222# define retroflat_viewport_world_tile_y_generic() \
1223 (g_retroflat_state->viewport.world_tile_y)
1225# define retroflat_viewport_world_w_generic() \
1226 (g_retroflat_state->viewport.world_w)
1228# define retroflat_viewport_world_h_generic() \
1229 (g_retroflat_state->viewport.world_h)
1231# define retroflat_viewport_screen_tile_w_generic() \
1232 (g_retroflat_state->viewport.screen_tile_w)
1234# define retroflat_viewport_screen_tile_h_generic() \
1235 (g_retroflat_state->viewport.screen_tile_h)
1237# define retroflat_viewport_screen_w_generic() \
1238 (g_retroflat_state->viewport.screen_w)
1240# define retroflat_viewport_screen_h_generic() \
1241 (g_retroflat_state->viewport.screen_h)
1243# define retroflat_viewport_screen_w_remainder_generic() \
1244 (g_retroflat_state->viewport.screen_w_remainder)
1246# define retroflat_viewport_screen_h_remainder_generic() \
1247 (g_retroflat_state->viewport.screen_h_remainder)
1249# define retroflat_viewport_set_world_generic( w, h ) \
1250 debug_printf( 1, "setting viewport size to %d x %d...", \
1251 (int16_t)(w), (int16_t)(h) ); \
1252 (g_retroflat_state->viewport.world_w) = w; \
1253 (g_retroflat_state->viewport.world_h) = h;
1255# define retroflat_viewport_set_world_pos_generic( x, y ) \
1256 debug_printf( 1, "setting viewport world pos to %d, %d...", x, y ); \
1257 (g_retroflat_state->viewport.world_x) = x; \
1258 (g_retroflat_state->viewport.world_y) = y; \
1259 (g_retroflat_state->viewport.world_tile_x) = (x) >> RETROFLAT_TILE_W_BITS; \
1260 (g_retroflat_state->viewport.world_tile_y) = (y) >> RETROFLAT_TILE_H_BITS;
1262# define retroflat_viewport_set_pos_size_generic( x_px, y_px, w_px, h_px ) \
1263 g_retroflat_state->viewport.screen_x = (x_px); \
1264 g_retroflat_state->viewport.screen_y = (y_px); \
1265 g_retroflat_state->viewport.screen_tile_w = \
1266 ((w_px) / RETROFLAT_TILE_W); \
1267 g_retroflat_state->viewport.screen_tile_h = \
1268 ((h_px) / RETROFLAT_TILE_H); \
1272 g_retroflat_state->viewport.screen_w = \
1273 ((w_px) / RETROFLAT_TILE_W) * RETROFLAT_TILE_W; \
1274 g_retroflat_state->viewport.screen_h = \
1275 ((h_px) / RETROFLAT_TILE_H) * RETROFLAT_TILE_H; \
1276 g_retroflat_state->viewport.screen_w_remainder = \
1277 (x_px) + (w_px) - g_retroflat_state->viewport.screen_w; \
1278 g_retroflat_state->viewport.screen_h_remainder = \
1279 (y_px) + (h_px) - g_retroflat_state->viewport.screen_h;
1281#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
1283# define retroflat_viewport_lock_refresh_generic() \
1284 if( NULL == g_retroflat_state->viewport.refresh_grid ) { \
1286 g_retroflat_state->viewport.refresh_grid_h, \
1287 g_retroflat_state->viewport.refresh_grid ); \
1288 maug_cleanup_if_null_lock( retroflat_tile_t*, \
1289 g_retroflat_state->viewport.refresh_grid ); \
1292# define retroflat_viewport_unlock_refresh_generic() \
1293 if( NULL != g_retroflat_state->viewport.refresh_grid ) { \
1295 g_retroflat_state->viewport.refresh_grid_h, \
1296 g_retroflat_state->viewport.refresh_grid ); \
1299# define _retroflat_viewport_refresh_tile_x( x_px ) \
1300 (((x_px) + RETROFLAT_TILE_W) >> RETROFLAT_TILE_W_BITS)
1302# define _retroflat_viewport_refresh_tile_y( y_px ) \
1303 (((y_px) + RETROFLAT_TILE_H) >> RETROFLAT_TILE_H_BITS)
1305# define retroflat_viewport_set_refresh_generic( x_px, y_px, tid ) \
1306 assert( NULL != g_retroflat_state->viewport.refresh_grid ); \
1309 -(RETROFLAT_TILE_W) <= x_px && -(RETROFLAT_TILE_H) <= y_px && \
1310 retroflat_screen_w() > x_px && \
1311 retroflat_screen_h() > y_px \
1313 assert( 0 < g_retroflat_state->viewport.screen_tile_w ); \
1314 assert( 0 <= (((y_px) + RETROFLAT_TILE_H) >> RETROFLAT_TILE_H_BITS) ); \
1315 assert( 0 <= (((x_px) + RETROFLAT_TILE_W) >> RETROFLAT_TILE_W_BITS) ); \
1316 g_retroflat_state->viewport.refresh_grid[ \
1318 ((_retroflat_viewport_refresh_tile_y( y_px ) + 1) * \
1319 (g_retroflat_state->viewport.screen_tile_w + 2)) + \
1320 (_retroflat_viewport_refresh_tile_x( x_px ) + 1)] = tid; \
1323# define retroflat_viewport_tile_is_stale( x_px, y_px, tile_id ) \
1325 g_retroflat_state->viewport.refresh_grid[ \
1326 ((_retroflat_viewport_refresh_tile_y( y_px ) + 1) * \
1327 (g_retroflat_state->viewport.screen_tile_w + 2)) + \
1328 (_retroflat_viewport_refresh_tile_x( x_px ) + 1)])
1332uint8_t retroflat_viewport_move_x_generic( int16_t x );
1334uint8_t retroflat_viewport_move_y_generic( int16_t y );
1336uint8_t retroflat_viewport_focus_generic(
1337 size_t x1,
size_t y1,
size_t range,
size_t speed );
1339# define retroflat_viewport_screen_x_generic( world_x ) \
1340 (g_retroflat_state->viewport.screen_x + \
1341 ((world_x) - retroflat_viewport_world_x()))
1343# define retroflat_viewport_screen_y_generic( world_y ) \
1344 (g_retroflat_state->viewport.screen_y + \
1345 ((world_y) - retroflat_viewport_world_y()))
1349#if defined( RETROFLAT_SOFT_VIEWPORT ) || defined( DOCUMENTATION )
1351# ifndef RETROFLAT_NO_VIEWPORT_REFRESH
1360# define retroflat_viewport_world_x() \
1361 ((retroflat_viewport_world_x_generic() \
1362 >> RETROFLAT_TILE_W_BITS) << RETROFLAT_TILE_W_BITS)
1368# define retroflat_viewport_world_y() \
1369 ((retroflat_viewport_world_y_generic() \
1370 >> RETROFLAT_TILE_H_BITS) << RETROFLAT_TILE_H_BITS)
1372# define retroflat_viewport_world_x() retroflat_viewport_world_x_generic()
1373# define retroflat_viewport_world_y() retroflat_viewport_world_y_generic()
1376# define retroflat_viewport_world_tile_x() \
1377 retroflat_viewport_world_tile_x_generic()
1378# define retroflat_viewport_world_tile_y() \
1379 retroflat_viewport_world_tile_y_generic()
1385# define retroflat_viewport_world_w() \
1386 retroflat_viewport_world_w_generic()
1392# define retroflat_viewport_world_h() \
1393 retroflat_viewport_world_h_generic()
1399# define retroflat_viewport_screen_tile_w() \
1400 retroflat_viewport_screen_tile_w_generic()
1406# define retroflat_viewport_screen_tile_h() \
1407 retroflat_viewport_screen_tile_h_generic()
1413# define retroflat_viewport_screen_w() \
1414 retroflat_viewport_screen_w_generic()
1420# define retroflat_viewport_screen_h() \
1421 retroflat_viewport_screen_h_generic()
1428# define retroflat_viewport_screen_w_remainder() \
1429 retroflat_viewport_screen_w_remainder_generic()
1436# define retroflat_viewport_screen_h_remainder() \
1437 retroflat_viewport_screen_h_remainder_generic()
1446# define retroflat_viewport_set_world( w, h ) \
1447 retroflat_viewport_set_world_generic( w, h )
1453# define retroflat_viewport_set_world_pos( x, y ) \
1454 retroflat_viewport_set_world_pos_generic( x, y )
1461# define retroflat_viewport_set_pos_size( x_px, y_px, w_px, h_px ) \
1462 retroflat_viewport_set_pos_size_generic( x_px, y_px, w_px, h_px )
1464#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
1473# define retroflat_viewport_lock_refresh() \
1474 retroflat_viewport_lock_refresh_generic()
1483# define retroflat_viewport_unlock_refresh() \
1484 retroflat_viewport_unlock_refresh_generic()
1497# define retroflat_viewport_set_refresh( x, y, tid ) \
1498 retroflat_viewport_set_refresh_generic( x, y, tid )
1514# define retroflat_viewport_focus( x1, y1, range, speed ) \
1515 retroflat_viewport_focus_generic( x1, y1, range, speed )
1521# define retroflat_viewport_screen_x( world_x ) \
1522 retroflat_viewport_screen_x_generic( world_x )
1528# define retroflat_viewport_screen_y( world_y ) \
1529 retroflat_viewport_screen_y_generic( world_y )
1531# ifndef RETROFLAT_VIEWPORT_OVERRIDE_MOVE
1532# define retroflat_viewport_move_x( x ) \
1533 retroflat_viewport_move_x_generic( x )
1535# define retroflat_viewport_move_y( y ) \
1536 retroflat_viewport_move_y_generic( y )
1549#define retroflat_heartbeat_set( len, max ) \
1550 g_retroflat_state->heartbeat_max = max; \
1551 g_retroflat_state->heartbeat_len = len;
1557#define retroflat_heartbeat() (g_retroflat_state->heartbeat_frame)
1565#define retroflat_heartbeat_update() \
1567 if( g_retroflat_state->heartbeat_next <= retroflat_get_ms() ) { \
1568 g_retroflat_state->heartbeat_frame++; \
1570 g_retroflat_state->heartbeat_frame >= \
1571 g_retroflat_state->heartbeat_max \
1573 g_retroflat_state->heartbeat_frame = 0; \
1575 g_retroflat_state->heartbeat_next = \
1576 retroflat_get_ms() + g_retroflat_state->heartbeat_len; \
1590 size_t offset_tex_pal;
1596 char config_path[RETROFLAT_PATH_MAX + 1];
1602# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION ) || \
1603defined( RETROVDP_C )
1609# ifdef RETROFLAT_OS_WIN
1659 retroflat_ms_t heartbeat_next;
1678 retroflat_proc_resize_t on_resize;
1679 void* on_resize_data;
1681#ifndef RETROFLAT_OPENGL
1689 struct RETROFLAT_PLATFORM platform;
1691# if defined( RETROFLAT_3D )
1696 uint8_t tex_palette[RETROFLAT_COLORS_SZ][3];
1699 struct RETROFLAT_INPUT_STATE input;
1701# ifndef RETROFLAT_NO_SOUND
1702 struct RETROFLAT_SOUND_STATE sound;
1710# ifdef retroflat_loop
1730 uint8_t flags,
const char* title,
const char* format, ... );
1749# if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION )
1763void retroflat_set_title(
const char* format, ... );
1765retroflat_ms_t retroflat_get_ms();
1767uint32_t retroflat_get_rand();
1769# if !defined( RETROFLAT_NO_KEYBOARD )
1770char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags );
1789 const char* filename,
struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
1792 size_t w,
size_t h,
struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
1817 struct RETROFLAT_BITMAP* target,
struct RETROFLAT_BITMAP* src,
1818 size_t s_x,
size_t s_y, int16_t d_x, int16_t d_y,
size_t w,
size_t h,
1828#define retroflat_constrain_px( x, y, bmp, retact ) \
1830 x >= retroflat_bitmap_w( bmp ) || y >= retroflat_bitmap_h( bmp ) \
1851MERROR_RETVAL retroflat_draw_release(
struct RETROFLAT_BITMAP* bmp );
1855 size_t x,
size_t y, uint8_t flags );
1857#ifdef RETROFLAT_SOFT_SHAPES
1858# ifdef RETROFLAT_OPENGL
1862# define retroflat_rect( t, c, x, y, w, h, f ) \
1863 assert( NULL != t ); \
1864 retrosoft_rect( t, c, x, y, w, h, f );
1865# define retroflat_ellipse( t, c, x, y, w, h, f ) \
1866 assert( NULL != t ); \
1867 retrosoft_ellipse( t, c, x, y, w, h, f )
1869# define retroflat_rect( t, c, x, y, w, h, f ) \
1870 retrosoft_rect( t, c, x, y, w, h, f )
1871# define retroflat_ellipse( t, c, x, y, w, h, f ) \
1872 retrosoft_ellipse( t, c, x, y, w, h, f )
1888 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
1902 int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
1906#ifdef RETROFLAT_SOFT_LINES
1907# define retroflat_line( t, c, x1, y1, x2, y2, f ) \
1908 retrosoft_line( t, c, x1, y1, x2, y2, f )
1924 int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags );
1928void retroflat_cursor(
struct RETROFLAT_BITMAP* target, uint8_t flags );
1943 struct RETROFLAT_BITMAP* target,
const char* str,
size_t str_sz,
1944 const char* font_str,
size_t* w_out,
size_t* h_out, uint8_t flags );
1965 const char* str,
int str_sz,
const char* font_str, int16_t x_orig, int16_t y_orig,
1969void retroflat_get_palette( uint8_t idx, uint32_t* rgb );
1971MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb );
1985 retroflat_proc_resize_t on_resize_in,
void* data_in );
2009MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_x[8] =
2010 { 0, 1, 1, 1, 0, -1, -1, -1 };
2011MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_y[8] =
2012 { -1, -1, 0, 1, 1, 1, 0, -1 };
2014MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_x[4] =
2016MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_y[4] =
2019MAUG_MHANDLE g_retroflat_state_h = (MAUG_MHANDLE)NULL;
2022# define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
2023 MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u = idx;
2027# define RETROFLAT_COLOR_TABLE_NAMES( idx, name_l, name_u, r, g, b, cgac, cgad ) \
2030MAUG_CONST
char* SEG_MCONST gc_retroflat_color_names[] = {
2039 const char* filename_in,
2040 char* buffer_out,
size_t buffer_out_sz, uint8_t flags
2044 assert( 1 < buffer_out_sz );
2047 memset( buffer_out,
'\0', buffer_out_sz );
2053 maug_snprintf( buffer_out, buffer_out_sz - 1,
"%s", filename_in );
2056 maug_snprintf( buffer_out, buffer_out_sz - 1,
"%s%c%s.%s",
2066# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \
2067 defined( RETROFLAT_3D ))
2072# define RETROSOFT_PRESENT
2075# if defined( RETROFLAT_3D )
2076# if !defined( MAUG_NO_AUTO_C )
2081# include <retro3dp.h>
2082# include <retro3d.h>
2083# include <retro3du.h>
2084# include <retapi3.h>
2087# ifdef RETROSOFT_PRESENT
2088# if !defined( MAUG_NO_AUTO_C )
2091# define RETROSOFT_PRESENT
2095# ifndef RETROFLAT_NO_SOUND
2096# include <retapis.h>
2099# include <retapii.h>
2101# if defined( RETROFLAT_VDP ) && defined( RETROFLAT_OS_UNIX )
2109#ifndef RETROFLAT_NO_GENERIC_LOOP
2115 retroflat_ms_t next = 0,
2119 g_retroflat_state->loop_data = (
void*)data;
2129 debug_printf( 1,
"main loop already running!" );
2142 NULL != g_retroflat_state->loop_iter
2145 g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
2150 retroflat_get_ms() < next
2158 if( NULL != g_retroflat_state->frame_iter ) {
2160 g_retroflat_state->frame_iter( g_retroflat_state->loop_data );
2164 now = retroflat_get_ms();
2165 if( now + retroflat_fps_next() > now ) {
2166 next = now + retroflat_fps_next();
2176 retval = g_retroflat_state->retval;
2188# if !defined( RETROFLAT_NO_KEYBOARD )
2190char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags ) {
2192 char offset_lower = 0;
2194 if( RETROFLAT_INPUT_MOD_SHIFT != (RETROFLAT_INPUT_MOD_SHIFT & flags) ) {
2197 if( RETROFLAT_KEY_A <= k && RETROFLAT_KEY_Z >= k ) {
2199 RETROFLAT_INPUT_FORCE_UPPER !=
2200 (RETROFLAT_INPUT_FORCE_UPPER & flags)
2203 offset_lower = 0x20;
2211 case RETROFLAT_KEY_A: c = 0x41 + offset_lower;
break;
2212 case RETROFLAT_KEY_B: c = 0x42 + offset_lower;
break;
2213 case RETROFLAT_KEY_C: c = 0x43 + offset_lower;
break;
2214 case RETROFLAT_KEY_D: c = 0x44 + offset_lower;
break;
2215 case RETROFLAT_KEY_E: c = 0x45 + offset_lower;
break;
2216 case RETROFLAT_KEY_F: c = 0x46 + offset_lower;
break;
2217 case RETROFLAT_KEY_G: c = 0x47 + offset_lower;
break;
2218 case RETROFLAT_KEY_H: c = 0x48 + offset_lower;
break;
2219 case RETROFLAT_KEY_I: c = 0x49 + offset_lower;
break;
2220 case RETROFLAT_KEY_J: c = 0x4a + offset_lower;
break;
2221 case RETROFLAT_KEY_K: c = 0x4b + offset_lower;
break;
2222 case RETROFLAT_KEY_L: c = 0x4c + offset_lower;
break;
2223 case RETROFLAT_KEY_M: c = 0x4d + offset_lower;
break;
2224 case RETROFLAT_KEY_N: c = 0x4e + offset_lower;
break;
2225 case RETROFLAT_KEY_O: c = 0x4f + offset_lower;
break;
2226 case RETROFLAT_KEY_P: c = 0x50 + offset_lower;
break;
2227 case RETROFLAT_KEY_Q: c = 0x51 + offset_lower;
break;
2228 case RETROFLAT_KEY_R: c = 0x52 + offset_lower;
break;
2229 case RETROFLAT_KEY_S: c = 0x53 + offset_lower;
break;
2230 case RETROFLAT_KEY_T: c = 0x54 + offset_lower;
break;
2231 case RETROFLAT_KEY_U: c = 0x55 + offset_lower;
break;
2232 case RETROFLAT_KEY_V: c = 0x56 + offset_lower;
break;
2233 case RETROFLAT_KEY_W: c = 0x57 + offset_lower;
break;
2234 case RETROFLAT_KEY_X: c = 0x58 + offset_lower;
break;
2235 case RETROFLAT_KEY_Y: c = 0x59 + offset_lower;
break;
2236 case RETROFLAT_KEY_Z: c = 0x60 + offset_lower;
break;
2237 case RETROFLAT_KEY_0: c = offset_lower ? 0x30 :
')';
break;
2238 case RETROFLAT_KEY_1: c = offset_lower ? 0x31 :
'!';
break;
2239 case RETROFLAT_KEY_2: c = offset_lower ? 0x32 :
'@';
break;
2240 case RETROFLAT_KEY_3: c = offset_lower ? 0x33 :
'#';
break;
2241 case RETROFLAT_KEY_4: c = offset_lower ? 0x34 :
'$';
break;
2242 case RETROFLAT_KEY_5: c = offset_lower ? 0x35 :
'%';
break;
2243 case RETROFLAT_KEY_6: c = offset_lower ? 0x36 :
'^';
break;
2244 case RETROFLAT_KEY_7: c = offset_lower ? 0x37 :
'&';
break;
2245 case RETROFLAT_KEY_8: c = offset_lower ? 0x38 :
'*';
break;
2246 case RETROFLAT_KEY_9: c = offset_lower ? 0x39 :
'(';
break;
2247 case RETROFLAT_KEY_SPACE: c =
' ';
break;
2248 case RETROFLAT_KEY_BKSP: c = 0x08;
break;
2249 case RETROFLAT_KEY_ENTER: c =
'\n';
break;
2250 case RETROFLAT_KEY_SEMICOLON: c = offset_lower ?
';' :
':';
break;
2251 case RETROFLAT_KEY_DASH: c = offset_lower ?
'-' :
'_';
break;
2252 case RETROFLAT_KEY_SLASH: c = offset_lower ?
'/' :
'?';
break;
2253 case RETROFLAT_KEY_PERIOD: c = offset_lower ?
'.' :
'>';
break;
2254 case RETROFLAT_KEY_COMMA: c = offset_lower ?
',' :
'<';
break;
2255 case RETROFLAT_KEY_QUOTE: c = offset_lower ?
'\'' :
'"';
break;
2256 case RETROFLAT_KEY_EQUALS: c = offset_lower ?
'=' :
'+';
break;
2257 case RETROFLAT_KEY_BACKSLASH: c = offset_lower ?
'\\' :
'|';
break;
2258 case RETROFLAT_KEY_BRACKETL: c = offset_lower ?
'[' :
'{';
break;
2259 case RETROFLAT_KEY_BRACKETR: c = offset_lower ?
']' :
'}';
break;
2260#ifndef RETROFLAT_API_PC_BIOS
2262 case RETROFLAT_KEY_GRAVE: c = offset_lower ?
'`' :
'~';
break;
2266 debug_printf( RETROFLAT_KB_TRACE_LVL,
"0x%02x", c );
2280# ifndef RETROFLAT_NO_CLI
2282# if !defined( RETROFLAT_NO_SOUND ) && defined( RETROSND_ARGS )
2291 args->sound.flags |= RETROSND_ARGS_FLAG_LIST_DEVS;
2298# if !defined( RETROFLAT_API_PC_BIOS ) && !defined( RETROFLAT_NO_CLI_SZ )
2304 g_retroflat_state->scale = atoi( arg );
2305 debug_printf( 3,
"screen scale set to: %d",
2306 g_retroflat_state->scale );
2315 if( 0 == args->screen_w ) {
2349 if( 0 == args->screen_w ) {
2350 args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
2357 args->screen_w = atoi( arg );
2367 args->
screen_h = RETROFLAT_DEFAULT_SCREEN_H;
2381# ifdef RETROFLAT_VDP
2385 if( 0 == strncmp(
MAUG_CLI_SIGIL "vdp", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
2389 debug_printf( 1,
"VDP args: %s", g_retroflat_state->vdp_args );
2403 debug_printf( 1,
"unlocking FPS..." );
2423# ifdef RETROFLAT_COMMIT_HASH
2424 debug_printf( 1,
"retroflat commit: " RETROFLAT_COMMIT_HASH );
2427 debug_printf( 1,
"retroflat: initializing..." );
2431 assert( 4 ==
sizeof( uint32_t ) );
2432 assert( 4 ==
sizeof( int32_t ) );
2433 assert( 2 ==
sizeof( uint16_t ) );
2434 assert( 2 ==
sizeof( int16_t ) );
2435 assert( 1 ==
sizeof( uint8_t ) );
2436 assert( 1 ==
sizeof( int8_t ) );
2437 assert( NULL != args );
2438 assert( 1 << RETROFLAT_TILE_W_BITS == RETROFLAT_TILE_W );
2439 assert( 1 << RETROFLAT_TILE_H_BITS == RETROFLAT_TILE_H );
2444# if defined( RETROFLAT_BMP_TEX )
2445 retroflat_2d_px = (retroflat_px_cb)retro3d_texture_px;
2448 retroflat_2d_blit_bitmap = (retroflat_blit_bitmap_cb)retro3d_texture_blit;
2449 retroflat_2d_load_bitmap =
2450 (retroflat_load_bitmap_cb)retro3d_texture_load_bitmap;
2451 retroflat_2d_create_bitmap =
2452 (retroflat_create_bitmap_cb)retro3d_texture_create;
2454 retroflat_2d_px = (retroflat_px_cb)retroflat_px;
2455# ifdef RETROFLAT_SOFT_SHAPES
2465 retroflat_2d_create_bitmap =
2466 (retroflat_create_bitmap_cb)retroflat_create_bitmap;
2469 debug_printf( 1,
"retroflat: MFIX_PRECISION: %f", MFIX_PRECISION );
2471 debug_printf( 1,
"retroflat: allocating state (" SIZE_T_FMT
" bytes)...",
2474 debug_printf( 1,
"retroflat: size_t is (" SIZE_T_FMT
" bytes)...",
2477 debug_printf( 1,
"retroflat: ssize_t is (" SIZE_T_FMT
" bytes)...",
2478 sizeof( ssize_t ) );
2480 debug_printf( 1,
"retroflat: off_t is (" SIZE_T_FMT
" bytes)...",
2483 g_retroflat_state_h = maug_malloc( 1,
sizeof(
struct RETROFLAT_STATE ) );
2484 if( (MAUG_MHANDLE)NULL == g_retroflat_state_h ) {
2486 "Error",
"Could not allocate global state!" );
2487 retval = MERROR_ALLOC;
2491 maug_mlock( g_retroflat_state_h, g_retroflat_state );
2492 if( (MAUG_MHANDLE)NULL == g_retroflat_state ) {
2494 "Error",
"Could not lock global state!" );
2495 retval = MERROR_ALLOC;
2503 g_retroflat_state->scale = 1;
2505# ifndef RETROFLAT_NO_CLI
2507 debug_printf( 1,
"retroflat: parsing args..." );
2511# if !defined( RETROFLAT_NO_SOUND ) && defined( RETROSND_ARGS )
2513 "Select MIDI device", 0, (maug_cli_cb)retrosnd_cli_rsd, args );
2514 maug_cleanup_if_not_ok();
2516 "List MIDI devices", 0, (maug_cli_cb)retrosnd_cli_rsl, args );
2517 maug_cleanup_if_not_ok();
2520# ifdef RETROFLAT_SCREENSAVER
2522 "Preview screensaver", 0, (maug_cli_cb)retroflat_cli_p, args );
2523 maug_cleanup_if_not_ok();
2525 "Launch screensaver", 0, (maug_cli_cb)retroflat_cli_s, args );
2526 maug_cleanup_if_not_ok();
2529# ifdef RETROFLAT_API_PC_BIOS
2531 "Set the screen mode.", 0,
2532 (maug_cli_cb)retroflat_cli_rfm, args );
2533 maug_cleanup_if_not_ok();
2534# elif !defined( RETROFLAT_NO_CLI_SZ )
2536 "Set screen scale factor.", 0,
2537 (maug_cli_cb)retroflat_cli_rfs, args );
2538 maug_cleanup_if_not_ok();
2540 "Set the screen X position.", 0,
2541 (maug_cli_cb)retroflat_cli_rfx, args );
2542 maug_cleanup_if_not_ok();
2544 "Set the screen Y position.", 0,
2545 (maug_cli_cb)retroflat_cli_rfy, args );
2546 maug_cleanup_if_not_ok();
2548 "Set the screen width.", 0,
2549 (maug_cli_cb)retroflat_cli_rfw, args );
2550 maug_cleanup_if_not_ok();
2552 "Set the screen height.", 0,
2553 (maug_cli_cb)retroflat_cli_rfh, args );
2554 maug_cleanup_if_not_ok();
2557# ifdef RETROFLAT_VDP
2559 "Pass a string of args to the VDP.", 0,
2560 (maug_cli_cb)retroflat_cli_vdp, args );
2561 maug_cleanup_if_not_ok();
2566 (maug_cli_cb)retroflat_cli_u, args );
2567 maug_cleanup_if_not_ok();
2570 retval = maug_parse_args( argc, argv );
2571 maug_cleanup_if_not_ok();
2575 args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
2576 args->
screen_h = RETROFLAT_DEFAULT_SCREEN_H;
2586 debug_printf( 1,
"retroflat: setting config..." );
2591 maug_strncpy( g_retroflat_state->assets_path,
2595# if defined( RETROFLAT_SCREENSAVER )
2604# if !defined( RETROFLAT_NO_CLI_SZ )
2606 g_retroflat_state->screen_v_w = args->screen_w;
2607 g_retroflat_state->screen_v_h = args->
screen_h;
2608 g_retroflat_state->screen_w = args->screen_w;
2609 g_retroflat_state->screen_h = args->
screen_h;
2614 retval = retroflat_init_platform( argc, argv, args );
2615 maug_cleanup_if_not_ok();
2617 debug_printf( 3,
"screen initialized with: " SIZE_T_FMT
"x" SIZE_T_FMT
2618 " pixels with " SIZE_T_FMT
" colors",
2619 retroflat_screen_w(), retroflat_screen_h(), retroflat_screen_colors() );
2625 (
size_t)0, retroflat_screen_w(), SIZE_T_FMT, MERROR_GUI );
2627 (
size_t)0, retroflat_screen_h(), SIZE_T_FMT, MERROR_GUI );
2629 (
size_t)0, retroflat_screen_colors(), SIZE_T_FMT, MERROR_GUI );
2634 retroflat_viewport_set_pos_size(
2635 0, 0, retroflat_screen_w(), retroflat_screen_h() );
2637#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
2638 debug_printf( 1,
"allocating refresh grid (%d tiles...)",
2639 g_retroflat_state->viewport.screen_tile_w *
2640 g_retroflat_state->viewport.screen_tile_h );
2641 g_retroflat_state->viewport.refresh_grid_h = maug_malloc(
2642 (g_retroflat_state->viewport.screen_tile_w + 2) *
2643 (g_retroflat_state->viewport.screen_tile_h + 2),
2645 maug_cleanup_if_null_alloc( MAUG_MHANDLE,
2646 g_retroflat_state->viewport.refresh_grid_h );
2649# ifdef RETROFLAT_VDP
2650# if defined( RETROFLAT_OS_UNIX )
2651 g_retroflat_state->vdp_exe = dlopen(
2652 "./" RETROFLAT_VDP_LIB_NAME
".so", RTLD_LAZY );
2653# elif defined( RETROFLAT_OS_WIN )
2654 g_retroflat_state->vdp_exe = LoadLibrary(
2655 "./" RETROFLAT_VDP_LIB_NAME
".dll" );
2657# error "dlopen undefined!"
2660 if( !(g_retroflat_state->vdp_exe) ) {
2661 error_printf(
"not loading VDP" );
2667 debug_printf( 1,
"creating VDP buffer, " SIZE_T_FMT
" x " SIZE_T_FMT,
2668 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h );
2669 g_retroflat_state->vdp_buffer =
2670 calloc( 1,
sizeof(
struct RETROFLAT_BITMAP ) );
2671 maug_cleanup_if_null_alloc(
2672 struct RETROFLAT_BITMAP*, g_retroflat_state->vdp_buffer );
2673 retval = retroflat_create_bitmap(
2674 g_retroflat_state->screen_v_w, g_retroflat_state->screen_v_h,
2676 maug_cleanup_if_not_ok();
2678 debug_printf( 1,
"initializing VDP..." );
2686 retro3d_platform_init();
2689# if !defined( RETROFLAT_NO_BLANK_INIT ) && !defined( RETROFLAT_3D )
2692 NULL, RETROFLAT_COLOR_BLACK, 0, 0,
2693 retroflat_screen_w(), retroflat_screen_h(),
2695 retroflat_draw_release( NULL );
2707 debug_printf( 1,
"retroflat shutdown called..." );
2709#ifndef RETROFLAT_NO_VIEWPORT_REFRESH
2710 if( (MAUG_MHANDLE)NULL != g_retroflat_state->viewport.refresh_grid_h ) {
2711 maug_mfree( g_retroflat_state->viewport.refresh_grid_h );
2715# if defined( RETROFLAT_VDP )
2716 if( NULL != g_retroflat_state->vdp_exe ) {
2718# ifdef RETROFLAT_OS_UNIX
2719 dlclose( g_retroflat_state->vdp_exe );
2720# elif defined( RETROFLAT_OS_WIN )
2721 FreeLibrary( g_retroflat_state->vdp_exe );
2723# error "dlclose undefined!"
2727 if( NULL != g_retroflat_state->vdp_buffer ) {
2728 debug_printf( 1,
"destroying VPD buffer..." );
2730 free( g_retroflat_state->vdp_buffer );
2737 retro3d_platform_shutdown();
2740 retroflat_shutdown_platform( retval );
2742 maug_munlock( g_retroflat_state_h, g_retroflat_state );
2743 maug_mfree( g_retroflat_state );
2749# ifdef RETROFLAT_VDP
2754# ifdef RETROFLAT_OS_WIN
2755 char proc_name_ex[256];
2758 if( NULL == g_retroflat_state->vdp_exe ) {
2762# ifdef RETROFLAT_OS_UNIX
2763 vdp_proc = dlsym( g_retroflat_state->vdp_exe, proc_name );
2764# elif defined( RETROFLAT_OS_WIN )
2766 maug_snprintf( proc_name_ex, 255,
"%s_", proc_name );
2768 g_retroflat_state->vdp_exe, proc_name_ex );
2770# error "dlsym undefined!"
2776# ifdef RETROFLAT_OS_WIN
2782 0 == strcmp(
"retroflat_vdp_flip", proc_name ) &&
2786 retroflat_vdp_lock( &(g_retroflat_state->buffer) );
2787 retroflat_vdp_lock( g_retroflat_state->vdp_buffer );
2790 retval = vdp_proc( g_retroflat_state );
2793 0 == strcmp(
"retroflat_vdp_flip", proc_name ) &&
2797 retroflat_vdp_release( &(g_retroflat_state->buffer) );
2798 retroflat_vdp_release( g_retroflat_state->vdp_buffer );
2801# ifdef RETROFLAT_OS_WIN
2802 retroflat_draw_release( g_retroflat_state->vdp_buffer );
2815void retroflat_cursor(
struct RETROFLAT_BITMAP* target, uint8_t flags ) {
2817 char mouse_str[11] =
"";
2820 mouse_str, 10,
"%02d, %02d", g_retroflat_state->last_mouse_x, g_retroflat_state->last_mouse_y );
2823 target, RETROFLAT_COLOR_BLACK,
2824 mouse_str, 10, NULL, 0, 0, 0 );
2826 target, RETROFLAT_COLOR_BLACK,
2827 g_retroflat_state->last_mouse_x - 5, g_retroflat_state->last_mouse_y - 5, 10, 10, 0 );
2836 retroflat_proc_resize_t on_resize_in,
void* data_in
2838 g_retroflat_state->on_resize = on_resize_in;
2839 g_retroflat_state->on_resize_data = data_in;
2844uint8_t retroflat_viewport_move_x_generic( int16_t x ) {
2845 int16_t new_world_x = g_retroflat_state->viewport.world_x + x;
2850 g_retroflat_state->viewport.world_w >= new_world_x +
2851 g_retroflat_state->viewport.screen_w
2853 g_retroflat_state->viewport.world_x += x;
2854 g_retroflat_state->viewport.world_tile_x += x >> RETROFLAT_TILE_W_BITS;
2863uint8_t retroflat_viewport_move_y_generic( int16_t y ) {
2864 int16_t new_world_y = g_retroflat_state->viewport.world_y + y;
2869 g_retroflat_state->viewport.world_h >= new_world_y +
2870 g_retroflat_state->viewport.screen_h
2872 g_retroflat_state->viewport.world_y += y;
2873 g_retroflat_state->viewport.world_tile_y += y >> RETROFLAT_TILE_H_BITS;
2882uint8_t retroflat_viewport_focus_generic(
2883 size_t x1,
size_t y1,
size_t range,
size_t speed
2889# define _retroflat_viewport_focus_dir( n, xy, wh, gl, pm, dir, range, speed ) \
2890 new_pt = n - retroflat_viewport_world_ ## xy(); \
2891 if( new_pt gl (retroflat_screen_ ## wh() >> 1) pm range ) { \
2892 new_moved = retroflat_viewport_move_ ## xy( \
2893 gc_retroflat_offsets8_ ## xy[RETROFLAT_DIR8_ ## dir] * speed ); \
2894 if( !moved && new_moved ) { \
2895 moved = new_moved; \
2899 _retroflat_viewport_focus_dir( x1, x, w, <, -, WEST, range, speed );
2900 _retroflat_viewport_focus_dir( x1, x, w, >, +, EAST, range, speed );
2901 _retroflat_viewport_focus_dir( y1, y, h, <, -, NORTH, range, speed );
2902 _retroflat_viewport_focus_dir( y1, y, h, >, +, SOUTH, range, speed );
2909#elif !defined( RETROVDP_C )
2916extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_x[8];
2917extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_y[8];
2918extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_x[4];
2919extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_y[4];
2923#define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \
2924 extern MAUG_CONST RETROFLAT_COLOR RETROFLAT_COLOR_ ## name_u;
2928extern MAUG_CONST
char* SEG_MCONST gc_retroflat_color_names[];
2931# if defined( RETROFLAT_API_WIN16 ) || defined( RETROFLAT_API_WIN32 )
2932 extern HINSTANCE g_retroflat_instance;
2933 extern int g_retroflat_cmd_show;
2936# if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \
2937 defined( RETROFLAT_3D ))
2938# define RETROSOFT_PRESENT
2942# include <retro3dp.h>
2943# include <retro3d.h>
2944# include <retro3du.h>
2947# ifdef RETROSOFT_PRESENT
2958#include <retroxpm.h>
MERROR_RETVAL maug_add_arg(const char *arg, int arg_sz, const char *help, int help_sz, maug_cli_cb arg_cb, void *data)
Add a command-line argument to the built-in parser.
#define MAUG_CLI_SIGIL
Default flag to prepend to CLI arguments. Is "/" on Windows/DOS and "-" on other platforms....
Definition marge.h:39
int MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition merror.h:19
#define maug_mzero(ptr, sz)
Zero the block of memory pointed to by ptr.
Definition mmem.h:65
#define retroflat_heartbeat_update()
Check and update RETROFLAT_STATE::heartbeat_frame. This should be called in the API HAL on every iter...
Definition retroflt.h:1565
void retroflat_shutdown(int retval)
Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the progra...
#define retroflat_heartbeat_set(len, max)
Set parameters for the RETROFLAT_STATE::heartbeat_frame.
Definition retroflt.h:1549
#define retroflat_system_task()
Platform-specific task that should be called on every iteration of the generic loop....
Definition retroflt.h:1059
void retroflat_resize_v()
Platform-specific function to resize virtual screen to match physical window size.
MERROR_RETVAL retroflat_loop(retroflat_loop_iter frame_iter, retroflat_loop_iter loop_iter, void *data)
This should be called once in the main body of the program in order to enter the main loop....
void retroflat_message(uint8_t flags, const char *title, const char *format,...)
Display a message in a dialog box and/or on stderr.
MERROR_RETVAL retroflat_init(int argc, char *argv[], struct RETROFLAT_ARGS *args)
Initialize RetroFlat and its underlying layers. This should be called once at the beginning of the pr...
void retroflat_set_proc_resize(retroflat_proc_resize_t on_resize_in, void *data_in)
Set the procedure to call when the window is resized (on platforms that support resizing).
char retroflat_asset_path[RETROFLAT_PATH_MAX+1]
Path/name used to load an asset from disk.
Definition retroflt.h:771
#define RETROFLAT_BITMAP_EXT
The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap()....
Definition retroflt.h:578
MERROR_RETVAL retroflat_blit_bitmap(struct RETROFLAT_BITMAP *target, struct RETROFLAT_BITMAP *src, size_t s_x, size_t s_y, int16_t d_x, int16_t d_y, size_t w, size_t h, int16_t instance)
Blit the contents of a ::RETROFLAT_BITMAP onto another ::RETROFLAT_BITMAP.
void retroflat_destroy_bitmap(struct RETROFLAT_BITMAP *bitmap)
Unload a bitmap from a ::RETROFLAT_BITMAP struct. The struct, itself, is not freed (in case it is on ...
MERROR_RETVAL retroflat_load_bitmap(const char *filename, struct RETROFLAT_BITMAP *bmp_out, uint8_t flags)
Load a bitmap into the given ::RETROFLAT_BITMAP structure if it is available. Bitmaps are subject to ...
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition retroflt.h:325
#define RETROFLAT_COLOR_TABLE(f)
This macro defines all colors supported by RetroFlat for primative operations, particularly using ret...
Definition retroflt.h:306
#define RETROFLAT_VDP_ARGS_SZ_MAX
Definition retroflt.h:721
#define RETROFLAT_ASSETS_PATH_MAX
Maximum size of the assets path, to allow room for appending.
Definition retroflt.h:746
#define RETROFLAT_PATH_SEP
The valid path separator on the target platform.
Definition retroflt.h:742
#define RETROFLAT_FLAGS_LITERAL_PATH
Flag for retroflat_load_bitmap() to not use assets path.
Definition retroflt.h:392
void retroflat_ellipse(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
Draw an ellipse onto the target ::RETROFLAT_BITMAP.
#define RETROFLAT_FLAGS_OPAQUE
Flag for retroflat_create_bitmap() to create a bitmap without transparency.
Definition retroflt.h:379
MERROR_RETVAL retroflat_draw_lock(struct RETROFLAT_BITMAP *bmp)
Lock a bitmap for drawing. This will be done automatically if necessary and not called explicitly,...
void retroflat_string_sz(struct RETROFLAT_BITMAP *target, const char *str, size_t str_sz, const char *font_str, size_t *w_out, size_t *h_out, uint8_t flags)
Get the size in pixels of a text string when drawn with a given font by retroflat_string().
void retroflat_rect(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags)
Draw a rectangle onto the target ::RETROFLAT_BITMAP.
#define RETROFLAT_FLAGS_FILL
Flag for retroflat_rect() or retroflat_ellipse(), indicating drawn shape should be filled.
Definition retroflt.h:373
void retroflat_string(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, const char *str, int str_sz, const char *font_str, int16_t x_orig, int16_t y_orig, uint8_t flags)
Draw a text string at the specified location in the specified font and color on the target ::RETROFLA...
void retroflat_line(struct RETROFLAT_BITMAP *target, const RETROFLAT_COLOR color, int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags)
Draw a straight line onto the target ::RETROFLAT_BITMAP.
#define RETROFLAT_FLAGS_SCREENSAVER
Flag indicating the current application is running as a screensaver.
Definition retroflt.h:433
#define RETROFLAT_FLAGS_UNLOCK_FPS
Flag indicating FPS should not be capped.
Definition retroflt.h:421
#define RETROFLAT_FLAGS_RUNNING
Flag indicating that retroflat_loop() should continue executing.
Definition retroflt.h:415
#define RETROFLAT_FLAGS_WAIT_FOR_FPS
Do not execute any more inter-frame loops until next frame.
Definition retroflt.h:438
#define RETROFLAT_MSG_FLAG_ERROR
This icon/type flag indicates an error. It will try to display messages in an urgent way with a red i...
Definition retroflt.h:456
MERROR_RETVAL retroflat_vdp_call(const char *proc_name)
Call a function from the retroflat VDP.
MERROR_RETVAL(* retroflat_vdp_proc_t)(struct RETROFLAT_STATE *)
VDP function called from the VDP library.
Definition retroflt.h:508
#define RETROFLAT_VDP_FLAG_PXLOCK
Flag for RETROFLAT_STATE::vdp_flags indicating the VDP requires RetroFlat to pixel-lock the frame bef...
Definition retroflt.h:495
uint16_t screen_w_remainder
Difference between viewport width and screen width in pixels. Should only be retrieved through retrof...
Definition retroflt.h:1169
char vdp_args[RETROFLAT_VDP_ARGS_SZ_MAX]
CLI args passed with -vdp to the RetroFlat VDP API.
Definition retroflt.h:1621
char * config_path
Relative path of local config file (if not using registry).
Definition retroflt.h:1081
int16_t screen_x
X position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition retroflt.h:1120
size_t screen_h
The screen height as seen by the system, after scaling.
Definition retroflt.h:1647
char * assets_path
Relative path under which bitmap assets are stored.
Definition retroflt.h:1079
uint8_t vdp_flags
Flags set by the RetroFlat VDP API.
Definition retroflt.h:1623
uint16_t screen_h_remainder
Difference between viewport height and screen height in pixels. Should only be retrieved through retr...
Definition retroflt.h:1176
size_t screen_v_w
The screen width as seen by our program, before scaling.
Definition retroflt.h:1636
size_t screen_colors
The number of colors the screen is capable of displaying.
Definition retroflt.h:1649
int mouse_y
Y-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
Definition retroflt.h:852
uint8_t retroflat_flags
Global Flags indicating current system status.
Definition retroflt.h:1595
uint8_t heartbeat_max
When RETROFLAT_STATE::heartbeat_frame reaches this value, it will reset to 0.
Definition retroflt.h:1676
retroflat_tile_t * refresh_grid
A grid of tile values representing the last-drawn values on-screen.
Definition retroflt.h:1205
struct RETROFLAT_BITMAP * vdp_buffer
A buffer assembled and passed to the RetroFlat VDP API for it to modify, or NULL if no VDP is loaded.
Definition retroflt.h:1608
uint8_t heartbeat_frame
Simple iteration loop that can be used to time e.g. perpetual sprite animations. Modify parameters wi...
Definition retroflt.h:1671
size_t screen_w
The screen width as seen by the system, after scaling.
Definition retroflt.h:1645
uint16_t screen_h
Viewport height in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thr...
Definition retroflt.h:1162
int screen_h
Desired screen or window height in pixels.
Definition retroflt.h:1085
int16_t world_w
The width of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport_...
Definition retroflt.h:1144
int mouse_x
X-coordinate of the mouse pointer in pixels if the returned event is a mouse click.
Definition retroflt.h:847
void(* retroflat_loop_iter)(void *data)
Prototype for the main loop function passed to retroflat_loop().
Definition retroflt.h:792
int16_t screen_tile_w
The number of tiles across that fit in the viewport. Should only be retrieved through retroflat_viewp...
Definition retroflt.h:1183
size_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:895
struct RETROFLAT_BITMAP buffer
Off-screen buffer bitmap.
Definition retroflt.h:1599
void * vdp_exe
A handle for the loaded RetroFlat VDP API module.
Definition retroflt.h:1613
RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
Index of available colors, initialized on platform init.
Definition retroflt.h:1683
uint16_t heartbeat_len
Number of ms to stay on current value of RETROFLAT_STATE::heartbeat_frame before incrementing....
Definition retroflt.h:1665
void * vdp_data
Pointer to data defined by the RetroFlat VDP API for its use.
Definition retroflt.h:1619
int16_t screen_tile_h
The number of tiles high that fit in the viewport. Should only be retrieved through retroflat_viewpor...
Definition retroflt.h:1190
int16_t world_h
The height of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport...
Definition retroflt.h:1150
size_t screen_v_h
The screen height as seen by our program, before scaling.
Definition retroflt.h:1643
char * title
Title to set for the main program Window if applicable on the target platform.
Definition retroflt.h:1077
int screen_y
Desired window Y position in pixels.
Definition retroflt.h:1089
int16_t world_y
The Y offset, in pixels, of the viewport on the world tilemap. Should only be retrieved through retro...
Definition retroflt.h:1138
int16_t screen_y
Y position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition retroflt.h:1126
uint16_t screen_w
Viewport width in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thro...
Definition retroflt.h:1156
int screen_x
Desired window X position in pixels.
Definition retroflt.h:1087
int16_t world_x
The X offset, in pixels, of the viewport on the world tilemap. Should only be retrieved through retro...
Definition retroflt.h:1132
void retrosoft_rect(retroflat_blit_t *target, const RETROFLAT_COLOR color_idx, int x, int y, int w, int h, uint8_t flags)
Draw a rectangle at the given coordinates, with the given dimensions.
void retrosoft_line(retroflat_blit_t *target, RETROFLAT_COLOR color, int x1, int y1, int x2, int y2, uint8_t flags)
Draw a line from x1, y1 to x2, y2.
void retrosnd_set_sf_bank(const char *filename_in)
Set the name of the voice bank filename to use.
MERROR_RETVAL retrosnd_init(struct RETROFLAT_ARGS *args)
Initialize retrosnd engine.
int16_t retroflat_tile_t
Value for an individual tile in a RETROTILE_LAYER.
Definition retroflt.h:19
Tools for drawing shape primatives.
Definition retroflt.h:1036
Struct containing configuration values for a RetroFlat program.
Definition retroflt.h:1071
Global singleton containing state for the current platform.
Definition retroflt.h:1585
The viewport data struct.
Definition retroflt.h:1114