6#  define RETROFLAT_BMP_TEX 
  279#ifndef RETROFLAT_BITMAP_TRACE_LVL 
  280#  define RETROFLAT_BITMAP_TRACE_LVL 0 
  283#ifndef RETROINPUT_TRACE_LVL 
  284#  define RETROINPUT_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 
  384#define RETROFLAT_FLAGS_LITERAL_PATH   0x02 
  390#define RETROFLAT_FLAGS_BITMAP_SILENT   0x04 
  398#define RETROFLAT_FLAGS_ALL_CAPS 0x02 
  406#define RETROFLAT_FLAGS_SCREEN_BUFFER     0x80 
  416#define RETROFLAT_FLAGS_RUNNING  0x01 
  423#define RETROFLAT_FLAGS_UNLOCK_FPS 0x02 
  430#define RETROFLAT_FLAGS_KEY_REPEAT 0x04 
  437#define RETROFLAT_FLAGS_SCREENSAVER 0x08 
  443#define RETROFLAT_FLAGS_WAIT_FOR_FPS   0x20 
  455#define RETROFLAT_MSG_FLAG_TYPE_MASK 0x07 
  461#define RETROFLAT_MSG_FLAG_ERROR 0x01 
  468#define RETROFLAT_MSG_FLAG_INFO 0x02 
  475#define RETROFLAT_MSG_FLAG_WARNING 0x04 
  500#define RETROFLAT_VDP_FLAG_PXLOCK 0x01 
  518   uint16_t new_w, uint16_t new_h, 
void* data );
 
  525#define RETROSND_ARGS_FLAG_LIST_DEVS 0x01 
  558#define RETROFLAT_FLAGS_LOCK     0x08 
  560#define RETROFLAT_FLAGS_SCREEN_LOCK     0x02 
  562#define RETROFLAT_FLAGS_BITMAP_RO   0x04 
  569#define RETROFLAT_INSTANCE_NULL (0) 
  575#define retroflat_instance_tile( instance ) \ 
  582#ifndef RETROFLAT_BITMAP_EXT 
  583#  define RETROFLAT_BITMAP_EXT "bmp" 
  586#ifndef RETROFLAT_OPENGL_BPP 
  587#  define RETROFLAT_OPENGL_BPP 32 
  590#ifndef RETROFLAT_TILE_W 
  591#  define RETROFLAT_TILE_W 16 
  594#ifndef RETROFLAT_TILE_W_BITS 
  595#  define RETROFLAT_TILE_W_BITS 4 
  598#ifndef RETROFLAT_TILE_H 
  599#  define RETROFLAT_TILE_H 16 
  602#ifndef RETROFLAT_TILE_H_BITS 
  603#  define RETROFLAT_TILE_H_BITS 4 
  607#ifndef RETROFLAT_TXP_R 
  613#  define RETROFLAT_TXP_R 0x00 
  616#ifndef RETROFLAT_TXP_G 
  622#  define RETROFLAT_TXP_G 0x00 
  625#ifndef RETROFLAT_TXP_B 
  631#  define RETROFLAT_TXP_B 0x00 
  634#ifndef RETROFLAT_TXP_PAL_IDX 
  635#  define RETROFLAT_TXP_PAL_IDX 0 
  640#ifndef RETROFLAT_DEFAULT_SCREEN_W 
  641#  define RETROFLAT_DEFAULT_SCREEN_W 320 
  644#ifndef RETROFLAT_DEFAULT_SCREEN_H 
  645#  define RETROFLAT_DEFAULT_SCREEN_H 200 
  648#define retroflat_on_resize( w, h ) \ 
  649   g_retroflat_state->screen_w = w; \ 
  650   g_retroflat_state->screen_h = h; 
  657#ifndef RETROFLAT_LINE_THICKNESS 
  662#  define RETROFLAT_LINE_THICKNESS 1 
  665#define RETROFLAT_PI 3.14159 
  679#  define RETROFLAT_FPS 30 
  682#define retroflat_fps_next() (1000 / RETROFLAT_FPS) 
  684#ifndef RETROFLAT_WINDOW_CLASS 
  689#  define RETROFLAT_WINDOW_CLASS "RetroFlatWindowClass" 
  692#ifndef RETROFLAT_WIN_FRAME_TIMER_ID 
  697#  define RETROFLAT_WIN_FRAME_TIMER_ID 6001 
  700#ifndef RETROFLAT_WIN_LOOP_TIMER_ID 
  705#  define RETROFLAT_WIN_LOOP_TIMER_ID 6002 
  708#ifndef RETROFLAT_MSG_MAX 
  713#  define RETROFLAT_MSG_MAX 4096 
  716#ifndef RETROFLAT_TITLE_MAX 
  717#  define RETROFLAT_TITLE_MAX 255 
  720#ifndef RETROFLAT_VDP_ARGS_SZ_MAX 
  724#  define RETROFLAT_VDP_ARGS_SZ_MAX 255 
  727#if defined( RETROFLAT_API_SDL2 ) 
  728#  if !defined( NO_RETROFLAT_RESIZABLE ) 
  729#     define RETROFLAT_WIN_FLAGS SDL_WINDOW_RESIZABLE 
  731#     define RETROFLAT_WIN_FLAGS 0 
  735#if defined( RETROFLAT_API_SDL1 ) 
  736#  define RETROFLAT_SDL_CC_FLAGS (SDL_RLEACCEL | SDL_SRCCOLORKEY) 
  737#elif defined( RETROFLAT_API_SDL2 ) 
  738#  define RETROFLAT_SDL_CC_FLAGS (SDL_TRUE) 
  741#ifdef RETROFLAT_OS_DOS 
  742#  define RETROFLAT_PATH_SEP '\\' 
  745#  define RETROFLAT_PATH_SEP '/' 
  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)) 
  775#define retroflat_buffer_bksp( buffer, buffer_cur, buffer_sz ) \ 
  776   if( 0 < buffer_cur ) { \ 
  777      if( buffer_cur < buffer_sz ) { \ 
  779            &(buffer[(buffer_cur) - 1]), \ 
  780            &(buffer[buffer_cur]), \ 
  781            (buffer_sz) - (buffer_cur) ); \ 
  785      buffer[buffer_sz] = '\0'; \ 
  791#define retroflat_buffer_insert( c, buffer, buffer_cur, buffer_sz, buffer_mx ) \ 
  792   if( buffer_sz + 1 < buffer_mx ) { \ 
  793      if( buffer_cur < buffer_sz ) { \ 
  795            &(buffer[(buffer_cur) + 1]), \ 
  796            &(buffer[buffer_cur]), \ 
  797            (buffer_sz) - (buffer_cur) ); \ 
  799      buffer[buffer_cur] = c; \ 
  802      buffer[buffer_sz] = '\0'; \ 
  805#define RETROFLAT_INPUT_MOD_SHIFT   0x01 
  807#define RETROFLAT_INPUT_MOD_ALT     0x02 
  809#define RETROFLAT_INPUT_MOD_CTRL    0x04 
  811#define RETROFLAT_INPUT_FORCE_UPPER    0x08 
  837typedef int8_t retroflat_dir4_t;
 
  839typedef int8_t retroflat_dir8_t;
 
  841#define RETROFLAT_DIR4_NONE  (-1) 
  842#define RETROFLAT_DIR4_NORTH  0 
  843#define RETROFLAT_DIR4_EAST   1 
  844#define RETROFLAT_DIR4_SOUTH  2 
  845#define RETROFLAT_DIR4_WEST   3 
  847#define RETROFLAT_DIR8_NONE   (-1) 
  848#define RETROFLAT_DIR8_NORTH  0 
  849#define RETROFLAT_DIR8_EAST   2 
  850#define RETROFLAT_DIR8_SOUTH  4 
  851#define RETROFLAT_DIR8_WEST   6 
  853#define retroflat_dir4_rotate_cw( dir ) \ 
  856#define retroflat_dir8_reverse( dir ) \ 
  859#define retroflat_dir8_bounce( dir ) \ 
  872#define PXXY_FMT SIZE_T_FMT 
  876#ifndef RETRO2D_TRACE_LVL 
  877#  define RETRO2D_TRACE_LVL 0 
  880#ifndef RETROFLAT_NO_SOUND 
  910#ifndef RETROSND_TRACE_LVL 
  911#  define RETROSND_TRACE_LVL 0 
  914#ifndef RETROSND_REG_TRACE_LVL 
  915#  define RETROSND_REG_TRACE_LVL 0 
  928#define RETROSND_FLAG_INIT 0x01 
  932#define RETROSND_VOICE_BREATH       122 
  934#define RETROSND_VOICE_SEASHORE     123 
  936#define RETROSND_VOICE_BIRD_TWEET   124 
  938#define RETROSND_VOICE_PHONE_RING   125 
  940#define RETROSND_VOICE_HELICOPTER   126 
  942#define RETROSND_VOICE_APPLAUSE     127 
  948#define RETROSND_VOICE_GUNSHOT      128 
  950#define RETROSND_CHANNEL_CT         8 
  967void retrosnd_midi_set_voice( uint8_t channel, uint8_t voice );
 
  969void retrosnd_midi_set_control( uint8_t channel, uint8_t key, uint8_t val );
 
  971void retrosnd_midi_note_on( uint8_t channel, uint8_t pitch, uint8_t vel );
 
  973void retrosnd_midi_note_off( uint8_t channel, uint8_t pitch, uint8_t vel );
 
  977uint8_t retrosnd_midi_is_playing_smf();
 
  979void retrosnd_shutdown();
 
  990#ifndef RETROFLAT_NO_SOUND 
 1002#  if defined( RETROFLAT_NO_KEYBOARD ) 
 1003#     define retroflat_case_key( key, pad ) case pad: 
 1004#     define retroflat_or_key( input, key, pad ) ((input) == (pad)) 
 1005#  elif defined( RETROFLAT_NO_PAD ) 
 1006#     define retroflat_case_key( key, pad ) case key: 
 1007#     define retroflat_or_key( input, key, pad ) ((input) == (key)) 
 1016#     define retroflat_case_key( key, pad ) case pad: case key: 
 1017#     define retroflat_or_key( input, key, pad ) \ 
 1018         (((input) == (pad)) || ((input) == (key))) 
 1025#if defined( RETROFLAT_OS_WIN ) && !defined( MAUG_WINDOWS_H ) 
 1026#  include <windows.h> 
 1027#  define MAUG_WINDOWS_H 
 1030#if defined( RETROFLAT_BMP_TEX ) || defined( DOCUMENTATION ) 
 1034   MAUG_MHANDLE bytes_h;
 
 1049#ifndef retroflat_system_task 
 1055#  define retroflat_system_task() 
 1058typedef maug_ms_t retroflat_ms_t;
 
 1060#include "retrom2d.h" 
 1078#  if !defined( RETROFLAT_NO_CLI_SZ ) 
 1089   struct RETROFLAT_PLATFORM_ARGS platform;
 
 1090#  ifndef RETROFLAT_NO_SOUND 
 1091   struct RETROFLAT_SOUND_ARGS sound;
 
 1189   int16_t world_tile_x;
 
 1190   int16_t world_tile_y;
 
 1191#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 1192   MAUG_MHANDLE refresh_grid_h;
 
 1207#  define retroflat_screen_colors() (g_retroflat_state->screen_colors) 
 1209#ifndef DOCUMENTATION 
 1211#  define retroflat_viewport_world_x_generic() \ 
 1212   (g_retroflat_state->viewport.world_x) 
 1214#  define retroflat_viewport_world_y_generic() \ 
 1215   (g_retroflat_state->viewport.world_y) 
 1217#  define retroflat_viewport_world_tile_x_generic() \ 
 1218   (g_retroflat_state->viewport.world_tile_x) 
 1220#  define retroflat_viewport_world_tile_y_generic() \ 
 1221   (g_retroflat_state->viewport.world_tile_y) 
 1223#  define retroflat_viewport_world_w_generic() \ 
 1224   (g_retroflat_state->viewport.world_w) 
 1226#  define retroflat_viewport_world_h_generic() \ 
 1227   (g_retroflat_state->viewport.world_h) 
 1229#  define retroflat_viewport_screen_tile_w_generic() \ 
 1230   (g_retroflat_state->viewport.screen_tile_w) 
 1232#  define retroflat_viewport_screen_tile_h_generic() \ 
 1233   (g_retroflat_state->viewport.screen_tile_h) 
 1235#  define retroflat_viewport_screen_w_generic() \ 
 1236   (g_retroflat_state->viewport.screen_w) 
 1238#  define retroflat_viewport_screen_h_generic() \ 
 1239   (g_retroflat_state->viewport.screen_h) 
 1241#  define retroflat_viewport_screen_w_remainder_generic() \ 
 1242   (g_retroflat_state->viewport.screen_w_remainder) 
 1244#  define retroflat_viewport_screen_h_remainder_generic() \ 
 1245   (g_retroflat_state->viewport.screen_h_remainder) 
 1247#  define retroflat_viewport_set_world_generic( w, h ) \ 
 1248   debug_printf( 1, "setting viewport size to %d x %d...", \
 
 1249      (int16_t)(w), (int16_t)(h) ); \
 
 1250   (g_retroflat_state->viewport.world_w) = w; \
 
 1251   (g_retroflat_state->viewport.world_h) = h;
 
 1253#  define retroflat_viewport_set_world_pos_generic( x, y ) \ 
 1254   debug_printf( 1, "setting viewport world pos to %d, %d...", x, y ); \
 
 1255   (g_retroflat_state->viewport.world_x) = x; \
 
 1256   (g_retroflat_state->viewport.world_y) = y; \
 
 1257   (g_retroflat_state->viewport.world_tile_x) = (x) >> RETROFLAT_TILE_W_BITS; \
 
 1258   (g_retroflat_state->viewport.world_tile_y) = (y) >> RETROFLAT_TILE_H_BITS;
 
 1260#  define retroflat_viewport_set_pos_size_generic( x_px, y_px, w_px, h_px ) \ 
 1261   g_retroflat_state->viewport.screen_x = (x_px); \ 
 1262   g_retroflat_state->viewport.screen_y = (y_px); \ 
 1263   g_retroflat_state->viewport.screen_tile_w = \ 
 1264      ((w_px) / RETROFLAT_TILE_W); \ 
 1265   g_retroflat_state->viewport.screen_tile_h = \ 
 1266      ((h_px) / RETROFLAT_TILE_H); \ 
 1270   g_retroflat_state->viewport.screen_w = \ 
 1271      ((w_px) / RETROFLAT_TILE_W) * RETROFLAT_TILE_W; \ 
 1272   g_retroflat_state->viewport.screen_h = \ 
 1273      ((h_px) / RETROFLAT_TILE_H) * RETROFLAT_TILE_H; \ 
 1274   g_retroflat_state->viewport.screen_w_remainder = \ 
 1275      (x_px) + (w_px) - g_retroflat_state->viewport.screen_w; \ 
 1276   g_retroflat_state->viewport.screen_h_remainder = \ 
 1277      (y_px) + (h_px) - g_retroflat_state->viewport.screen_h; 
 1279#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 1281#  define retroflat_viewport_lock_refresh_generic() \ 
 1282   if( NULL == g_retroflat_state->viewport.refresh_grid ) { \ 
 1284         g_retroflat_state->viewport.refresh_grid_h, \ 
 1285         g_retroflat_state->viewport.refresh_grid ); \ 
 1286      maug_cleanup_if_null_lock( retroflat_tile_t*, \ 
 1287         g_retroflat_state->viewport.refresh_grid ); \ 
 1290#  define retroflat_viewport_unlock_refresh_generic() \ 
 1291   if( NULL != g_retroflat_state->viewport.refresh_grid ) { \ 
 1293         g_retroflat_state->viewport.refresh_grid_h, \ 
 1294         g_retroflat_state->viewport.refresh_grid ); \ 
 1297#  define _retroflat_viewport_refresh_tile_x( x_px ) \ 
 1298   (((x_px) + RETROFLAT_TILE_W) >> RETROFLAT_TILE_W_BITS) 
 1300#  define _retroflat_viewport_refresh_tile_y( y_px ) \ 
 1301   (((y_px) + RETROFLAT_TILE_H) >> RETROFLAT_TILE_H_BITS) 
 1303#  define retroflat_viewport_set_refresh_generic( x_px, y_px, tid ) \ 
 1304   assert( NULL != g_retroflat_state->viewport.refresh_grid ); \ 
 1307      -(RETROFLAT_TILE_W) <= x_px && -(RETROFLAT_TILE_H) <= y_px && \ 
 1308      retroflat_screen_w() > x_px && \ 
 1309      retroflat_screen_h() > y_px \ 
 1311      assert( 0 < g_retroflat_state->viewport.screen_tile_w ); \ 
 1312      assert( 0 <= (((y_px) + RETROFLAT_TILE_H) >> RETROFLAT_TILE_H_BITS) ); \ 
 1313      assert( 0 <= (((x_px) + RETROFLAT_TILE_W) >> RETROFLAT_TILE_W_BITS) ); \ 
 1314      g_retroflat_state->viewport.refresh_grid[ \ 
 1316         ((_retroflat_viewport_refresh_tile_y( y_px ) + 1) * \ 
 1317            (g_retroflat_state->viewport.screen_tile_w + 2)) + \ 
 1318               (_retroflat_viewport_refresh_tile_x( x_px ) + 1)] = tid; \ 
 1321#  define retroflat_viewport_tile_is_stale( x_px, y_px, tile_id ) \ 
 1323      g_retroflat_state->viewport.refresh_grid[ \ 
 1324         ((_retroflat_viewport_refresh_tile_y( y_px ) + 1) * \ 
 1325            (g_retroflat_state->viewport.screen_tile_w + 2)) + \ 
 1326               (_retroflat_viewport_refresh_tile_x( x_px ) + 1)]) 
 1330uint8_t retroflat_viewport_move_x_generic( int16_t x );
 
 1332uint8_t retroflat_viewport_move_y_generic( int16_t y );
 
 1334uint8_t retroflat_viewport_focus_generic(
 
 1335   size_t x1, 
size_t y1, 
size_t range, 
size_t speed );
 
 1337#  define retroflat_viewport_screen_x_generic( world_x ) \ 
 1338   (g_retroflat_state->viewport.screen_x + \ 
 1339      ((world_x) - retroflat_viewport_world_x())) 
 1341#  define retroflat_viewport_screen_y_generic( world_y ) \ 
 1342   (g_retroflat_state->viewport.screen_y + \ 
 1343      ((world_y) - retroflat_viewport_world_y())) 
 1347#if defined( RETROFLAT_SOFT_VIEWPORT ) || defined( DOCUMENTATION ) 
 1349#  ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 1358#     define retroflat_viewport_world_x() \ 
 1359         ((retroflat_viewport_world_x_generic() \ 
 1360            >> RETROFLAT_TILE_W_BITS) << RETROFLAT_TILE_W_BITS) 
 1366#     define retroflat_viewport_world_y() \ 
 1367         ((retroflat_viewport_world_y_generic() \ 
 1368            >> RETROFLAT_TILE_H_BITS) << RETROFLAT_TILE_H_BITS) 
 1370#     define retroflat_viewport_world_x() retroflat_viewport_world_x_generic() 
 1371#     define retroflat_viewport_world_y() retroflat_viewport_world_y_generic() 
 1374#     define retroflat_viewport_world_tile_x() \ 
 1375         retroflat_viewport_world_tile_x_generic() 
 1376#     define retroflat_viewport_world_tile_y() \ 
 1377         retroflat_viewport_world_tile_y_generic() 
 1383#  define retroflat_viewport_world_w() \ 
 1384   retroflat_viewport_world_w_generic() 
 1390#  define retroflat_viewport_world_h() \ 
 1391   retroflat_viewport_world_h_generic() 
 1397#  define retroflat_viewport_screen_tile_w() \ 
 1398   retroflat_viewport_screen_tile_w_generic() 
 1404#  define retroflat_viewport_screen_tile_h() \ 
 1405   retroflat_viewport_screen_tile_h_generic() 
 1411#  define retroflat_viewport_screen_w() \ 
 1412   retroflat_viewport_screen_w_generic() 
 1418#  define retroflat_viewport_screen_h() \ 
 1419   retroflat_viewport_screen_h_generic() 
 1426#  define retroflat_viewport_screen_w_remainder() \ 
 1427   retroflat_viewport_screen_w_remainder_generic() 
 1434#  define retroflat_viewport_screen_h_remainder() \ 
 1435   retroflat_viewport_screen_h_remainder_generic() 
 1444#  define retroflat_viewport_set_world( w, h ) \ 
 1445   retroflat_viewport_set_world_generic( w, h ) 
 1451#  define retroflat_viewport_set_world_pos( x, y ) \ 
 1452   retroflat_viewport_set_world_pos_generic( x, y ) 
 1459#  define retroflat_viewport_set_pos_size( x_px, y_px, w_px, h_px ) \ 
 1460   retroflat_viewport_set_pos_size_generic( x_px, y_px, w_px, h_px ) 
 1462#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 1471#  define retroflat_viewport_lock_refresh() \ 
 1472   retroflat_viewport_lock_refresh_generic() 
 1481#  define retroflat_viewport_unlock_refresh() \ 
 1482   retroflat_viewport_unlock_refresh_generic() 
 1495#  define retroflat_viewport_set_refresh( x, y, tid ) \ 
 1496   retroflat_viewport_set_refresh_generic( x, y, tid ) 
 1512#  define retroflat_viewport_focus( x1, y1, range, speed ) \ 
 1513   retroflat_viewport_focus_generic( x1, y1, range, speed ) 
 1519#  define retroflat_viewport_screen_x( world_x ) \ 
 1520   retroflat_viewport_screen_x_generic( world_x ) 
 1526#  define retroflat_viewport_screen_y( world_y ) \ 
 1527   retroflat_viewport_screen_y_generic( world_y ) 
 1529#  ifndef RETROFLAT_VIEWPORT_OVERRIDE_MOVE 
 1530#     define retroflat_viewport_move_x( x ) \ 
 1531         retroflat_viewport_move_x_generic( x ) 
 1533#     define retroflat_viewport_move_y( y ) \ 
 1534         retroflat_viewport_move_y_generic( y ) 
 1547#define retroflat_heartbeat_set( len, max ) \ 
 1548   g_retroflat_state->heartbeat_max = max; \ 
 1549   g_retroflat_state->heartbeat_len = len; 
 1555#define retroflat_heartbeat() (g_retroflat_state->heartbeat_frame) 
 1563#define retroflat_heartbeat_update() \ 
 1565   if( g_retroflat_state->heartbeat_next <= retroflat_get_ms() ) { \ 
 1566      g_retroflat_state->heartbeat_frame++; \ 
 1568         g_retroflat_state->heartbeat_frame >= \ 
 1569            g_retroflat_state->heartbeat_max \ 
 1571         g_retroflat_state->heartbeat_frame = 0; \ 
 1573      g_retroflat_state->heartbeat_next = \ 
 1574         retroflat_get_ms() + g_retroflat_state->heartbeat_len; \ 
 1588   size_t                  offset_tex_pal;
 
 1600#  if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION ) || \ 
 1601defined( RETROVDP_C ) 
 1607#     ifdef RETROFLAT_OS_WIN 
 1657   retroflat_ms_t heartbeat_next;
 
 1676   retroflat_proc_resize_t on_resize;
 
 1677   void* on_resize_data;
 
 1679#ifndef RETROFLAT_BMP_TEX 
 1687   struct RETROFLAT_PLATFORM platform;
 
 1689#  if defined( RETROFLAT_BMP_TEX ) 
 1694   RETROFLAT_TEX_COLOR_DEF tex_palette[RETROFLAT_COLORS_SZ];
 
 1697   struct RETROFLAT_INPUT_STATE input;
 
 1699#  ifndef RETROFLAT_NO_SOUND 
 1700   struct RETROFLAT_SOUND_STATE sound;
 
 1708#  ifdef retroflat_loop 
 1722   const char* filename_in, 
const char* filename_ext,
 
 1723   char* buffer_out, 
size_t buffer_out_sz, uint8_t flags );
 
 1737   uint8_t flags, 
const char* title, 
const char* format, ... );
 
 1758#  if defined( RETROFLAT_VDP ) || defined( DOCUMENTATION ) 
 1772RETROFLAT_IN_KEY retroflat_repeat_input(
 
 1774   RETROFLAT_IN_KEY* prev_input, 
int* prev_delay );
 
 1776void retroflat_set_title( 
const char* format, ... );
 
 1778retroflat_ms_t retroflat_get_ms();
 
 1780uint32_t retroflat_get_rand();
 
 1782#  if !defined( RETROFLAT_NO_KEYBOARD ) 
 1783char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags );
 
 1802   const char* filename, 
struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
 
 1805   size_t w, 
size_t h, 
struct RETROFLAT_BITMAP* bmp_out, uint8_t flags );
 
 1830   struct RETROFLAT_BITMAP* target, 
struct RETROFLAT_BITMAP* src,
 
 1831   size_t s_x, 
size_t s_y, int16_t d_x, int16_t d_y, 
size_t w, 
size_t h,
 
 1841#define retroflat_constrain_px( x, y, bmp, retact ) \ 
 1843      x >= retroflat_bitmap_w( bmp ) || y >= retroflat_bitmap_h( bmp ) \ 
 1864MERROR_RETVAL retroflat_draw_release( 
struct RETROFLAT_BITMAP* bmp );
 
 1868   size_t x, 
size_t y, uint8_t flags );
 
 1870#ifdef RETROFLAT_SOFT_SHAPES 
 1871#  ifdef RETROFLAT_OPENGL 
 1875#     define retroflat_rect( t, c, x, y, w, h, f ) \ 
 1876      assert( NULL != t ); \ 
 1877      retrosoft_rect( t, c, x, y, w, h, f ); 
 1878#     define retroflat_ellipse( t, c, x, y, w, h, f ) \ 
 1879      assert( NULL != t ); \ 
 1880      retrosoft_ellipse( t, c, x, y, w, h, f ) 
 1882#     define retroflat_rect( t, c, x, y, w, h, f ) \ 
 1883      retrosoft_rect( t, c, x, y, w, h, f ) 
 1884#     define retroflat_ellipse( t, c, x, y, w, h, f ) \ 
 1885      retrosoft_ellipse( t, c, x, y, w, h, f ) 
 1901   int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
 
 1915   int16_t x, int16_t y, int16_t w, int16_t h, uint8_t flags );
 
 1919#ifdef RETROFLAT_SOFT_LINES 
 1920#  define retroflat_line( t, c, x1, y1, x2, y2, f ) \ 
 1921   retrosoft_line( t, c, x1, y1, x2, y2, f ) 
 1937   int16_t x1, int16_t y1, int16_t x2, int16_t y2, uint8_t flags );
 
 1941void retroflat_cursor( 
struct RETROFLAT_BITMAP* target, uint8_t flags );
 
 1956   struct RETROFLAT_BITMAP* target, 
const char* str, 
size_t str_sz,
 
 1957   const char* font_str, 
size_t* w_out, 
size_t* h_out, uint8_t flags );
 
 1978   const char* str, 
int str_sz, 
const char* font_str, int16_t x_orig, int16_t y_orig,
 
 1982void retroflat_get_palette( uint8_t idx, uint32_t* rgb );
 
 1984MERROR_RETVAL retroflat_set_palette( uint8_t idx, uint32_t rgb );
 
 1998   retroflat_proc_resize_t on_resize_in, 
void* data_in );
 
 2022MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_x[8] =
 
 2023   {  0,  1, 1, 1, 0, -1, -1, -1 };
 
 2024MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_y[8] =
 
 2025   { -1, -1, 0, 1, 1,  1,  0, -1 };
 
 2027MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_x[4] =
 
 2029MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_y[4] =
 
 2032MAUG_MHANDLE SEG_MGLOBAL g_retroflat_state_h = (MAUG_MHANDLE)NULL;
 
 2035#  define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \ 
 2036      MAUG_CONST RETROFLAT_COLOR SEG_MCONST RETROFLAT_COLOR_ ## name_u = idx; 
 2040#  define RETROFLAT_COLOR_TABLE_NAMES( idx, name_l, name_u, r, g, b, cgac, cgad ) \ 
 2043MAUG_CONST 
char* SEG_MCONST gc_retroflat_color_names[] = {
 
 2052   const char* filename_in, 
const char* filename_ext,
 
 2053   char* buffer_out, 
size_t buffer_out_sz, uint8_t flags
 
 2057   assert( 1 < buffer_out_sz );
 
 2060   maug_mzero( buffer_out, buffer_out_sz );
 
 2066      maug_snprintf( buffer_out, buffer_out_sz - 1, 
"%s", filename_in );
 
 2069      maug_snprintf( buffer_out, buffer_out_sz - 1, 
"%s%c%s.%s",
 
 2071         filename_in, filename_ext );
 
 2079#  if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \ 
 2080   defined( RETROFLAT_3D )) 
 2085#     define RETROSOFT_PRESENT 
 2088#  if defined( RETROFLAT_3D ) 
 2089#     if !defined( MAUG_NO_AUTO_C ) 
 2094#     include <retro3dp.h> 
 2096#     include <retro3du.h> 
 2097#     include <retapi3.h> 
 2100#  ifdef RETROSOFT_PRESENT 
 2101#     if !defined( MAUG_NO_AUTO_C ) 
 2104#     define RETROSOFT_PRESENT 
 2108#  ifndef RETROFLAT_NO_SOUND 
 2109#  include <retapis.h> 
 2112#  include <retapii.h> 
 2114#  if defined( RETROFLAT_VDP ) && defined( RETROFLAT_OS_UNIX ) 
 2122#ifndef RETROFLAT_NO_GENERIC_LOOP 
 2128   retroflat_ms_t next = 0,
 
 2132   g_retroflat_state->loop_data = (
void*)data;
 
 2142      debug_printf( 1, 
"main loop already running!" );
 
 2155         NULL != g_retroflat_state->loop_iter
 
 2158         g_retroflat_state->loop_iter( g_retroflat_state->loop_data );
 
 2163         retroflat_get_ms() < next
 
 2171      if( NULL != g_retroflat_state->frame_iter ) {
 
 2173         g_retroflat_state->frame_iter( g_retroflat_state->loop_data );
 
 2177      now = retroflat_get_ms();
 
 2178      if( now + retroflat_fps_next() > now ) {
 
 2179         next = now + retroflat_fps_next();
 
 2189   retval = g_retroflat_state->retval;
 
 2201#  if !defined( RETROFLAT_NO_KEYBOARD ) 
 2203char retroflat_vk_to_ascii( RETROFLAT_IN_KEY k, uint8_t flags ) {
 
 2205   char offset_lower = 0;
 
 2207   if( RETROFLAT_INPUT_MOD_SHIFT != (RETROFLAT_INPUT_MOD_SHIFT & flags) ) {
 
 2210      if( RETROFLAT_KEY_A <= k && RETROFLAT_KEY_Z >= k ) {
 
 2212            RETROFLAT_INPUT_FORCE_UPPER !=
 
 2213               (RETROFLAT_INPUT_FORCE_UPPER & flags)
 
 2216            offset_lower = 0x20;
 
 2224   case RETROFLAT_KEY_A: c = 0x41 + offset_lower; 
break;
 
 2225   case RETROFLAT_KEY_B: c = 0x42 + offset_lower; 
break;
 
 2226   case RETROFLAT_KEY_C: c = 0x43 + offset_lower; 
break;
 
 2227   case RETROFLAT_KEY_D: c = 0x44 + offset_lower; 
break;
 
 2228   case RETROFLAT_KEY_E: c = 0x45 + offset_lower; 
break;
 
 2229   case RETROFLAT_KEY_F: c = 0x46 + offset_lower; 
break;
 
 2230   case RETROFLAT_KEY_G: c = 0x47 + offset_lower; 
break;
 
 2231   case RETROFLAT_KEY_H: c = 0x48 + offset_lower; 
break;
 
 2232   case RETROFLAT_KEY_I: c = 0x49 + offset_lower; 
break;
 
 2233   case RETROFLAT_KEY_J: c = 0x4a + offset_lower; 
break;
 
 2234   case RETROFLAT_KEY_K: c = 0x4b + offset_lower; 
break;
 
 2235   case RETROFLAT_KEY_L: c = 0x4c + offset_lower; 
break;
 
 2236   case RETROFLAT_KEY_M: c = 0x4d + offset_lower; 
break;
 
 2237   case RETROFLAT_KEY_N: c = 0x4e + offset_lower; 
break;
 
 2238   case RETROFLAT_KEY_O: c = 0x4f + offset_lower; 
break;
 
 2239   case RETROFLAT_KEY_P: c = 0x50 + offset_lower; 
break;
 
 2240   case RETROFLAT_KEY_Q: c = 0x51 + offset_lower; 
break;
 
 2241   case RETROFLAT_KEY_R: c = 0x52 + offset_lower; 
break;
 
 2242   case RETROFLAT_KEY_S: c = 0x53 + offset_lower; 
break;
 
 2243   case RETROFLAT_KEY_T: c = 0x54 + offset_lower; 
break;
 
 2244   case RETROFLAT_KEY_U: c = 0x55 + offset_lower; 
break;
 
 2245   case RETROFLAT_KEY_V: c = 0x56 + offset_lower; 
break;
 
 2246   case RETROFLAT_KEY_W: c = 0x57 + offset_lower; 
break;
 
 2247   case RETROFLAT_KEY_X: c = 0x58 + offset_lower; 
break;
 
 2248   case RETROFLAT_KEY_Y: c = 0x59 + offset_lower; 
break;
 
 2249   case RETROFLAT_KEY_Z: c = 0x60 + offset_lower; 
break;
 
 2250   case RETROFLAT_KEY_0: c = offset_lower ? 0x30 : 
')'; 
break;
 
 2251   case RETROFLAT_KEY_1: c = offset_lower ? 0x31 : 
'!'; 
break;
 
 2252   case RETROFLAT_KEY_2: c = offset_lower ? 0x32 : 
'@'; 
break;
 
 2253   case RETROFLAT_KEY_3: c = offset_lower ? 0x33 : 
'#'; 
break;
 
 2254   case RETROFLAT_KEY_4: c = offset_lower ? 0x34 : 
'$'; 
break;
 
 2255   case RETROFLAT_KEY_5: c = offset_lower ? 0x35 : 
'%'; 
break;
 
 2256   case RETROFLAT_KEY_6: c = offset_lower ? 0x36 : 
'^'; 
break;
 
 2257   case RETROFLAT_KEY_7: c = offset_lower ? 0x37 : 
'&'; 
break;
 
 2258   case RETROFLAT_KEY_8: c = offset_lower ? 0x38 : 
'*'; 
break;
 
 2259   case RETROFLAT_KEY_9: c = offset_lower ? 0x39 : 
'('; 
break;
 
 2260   case RETROFLAT_KEY_SPACE: c = 
' '; 
break;
 
 2261   case RETROFLAT_KEY_BKSP: c = 0x08; 
break;
 
 2262   case RETROFLAT_KEY_ENTER: c = 
'\n'; 
break;
 
 2263   case RETROFLAT_KEY_SEMICOLON: c = offset_lower ? 
';' : 
':'; 
break;
 
 2264   case RETROFLAT_KEY_DASH: c = offset_lower ? 
'-' : 
'_'; 
break;
 
 2265   case RETROFLAT_KEY_SLASH: c = offset_lower ? 
'/' : 
'?'; 
break;
 
 2266   case RETROFLAT_KEY_PERIOD: c = offset_lower ? 
'.' : 
'>'; 
break;
 
 2267   case RETROFLAT_KEY_COMMA: c = offset_lower ? 
',' : 
'<'; 
break;
 
 2268   case RETROFLAT_KEY_QUOTE: c = offset_lower ? 
'\'' : 
'"'; 
break;
 
 2269   case RETROFLAT_KEY_EQUALS: c = offset_lower ? 
'=' : 
'+'; 
break;
 
 2270   case RETROFLAT_KEY_BACKSLASH: c = offset_lower ? 
'\\' : 
'|'; 
break;
 
 2271   case RETROFLAT_KEY_BRACKETL: c = offset_lower ? 
'[' : 
'{'; 
break;
 
 2272   case RETROFLAT_KEY_BRACKETR: c = offset_lower ? 
']' : 
'}'; 
break;
 
 2273#ifndef RETROFLAT_API_PC_BIOS 
 2275   case RETROFLAT_KEY_GRAVE: c = offset_lower ? 
'`' : 
'~'; 
break;
 
 2279   debug_printf( RETROINPUT_TRACE_LVL, 
"0x%02x", c );
 
 2293#  ifndef RETROFLAT_NO_CLI 
 2295#  if !defined( RETROFLAT_NO_SOUND ) && defined( RETROSND_ARGS ) 
 2304      args->sound.flags |= RETROSND_ARGS_FLAG_LIST_DEVS;
 
 2311#  if !defined( RETROFLAT_API_PC_BIOS ) && !defined( RETROFLAT_NO_CLI_SZ ) 
 2317      args->screen_scale = atoi( arg );
 
 2318      debug_printf( 3, 
"screen scale arg set to: %d", args->screen_scale );
 
 2327      if( 0 == args->screen_w ) {
 
 2361      if( 0 == args->screen_w ) {
 
 2362         args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
 
 2363         debug_printf( 1, 
"setting arg screen_w to default %d:",
 
 2371      args->screen_w = atoi( arg );
 
 2372      debug_printf( 1, 
"setting arg screen_w to: %d",
 
 2383         args->
screen_h = RETROFLAT_DEFAULT_SCREEN_H;
 
 2384         debug_printf( 1, 
"setting arg screen_h to default: %d",
 
 2393      debug_printf( 1, 
"setting arg screen_h to: %d",
 
 2401#  ifdef RETROFLAT_VDP 
 2405   if( 0 == strncmp( 
MAUG_CLI_SIGIL "vdp", arg, MAUG_CLI_SIGIL_SZ + 4 ) ) {
 
 2409      debug_printf( 1, 
"VDP args: %s", g_retroflat_state->
vdp_args );
 
 2419      args->flags &= ~RETROFLAT_FLAGS_UNLOCK_FPS;
 
 2423      debug_printf( 1, 
"unlocking FPS..." );
 
 2429#  ifndef RETROFLAT_NO_PAD 
 2435      args->joystick_id = -1;
 
 2436      debug_printf( 1, 
"setting arg joystick_id to default: %d",
 
 2437         args->joystick_id );
 
 2443      args->joystick_id = atoi( arg );
 
 2444      debug_printf( 1, 
"setting arg joystick_id to: %d",
 
 2445         args->joystick_id );
 
 2468#  ifdef RETROFLAT_COMMIT_HASH 
 2469   debug_printf( 1, 
"retroflat commit: " RETROFLAT_COMMIT_HASH  );
 
 2472   debug_printf( 1, 
"retroflat: initializing..." );
 
 2476   assert( 4 == 
sizeof( uint32_t ) );
 
 2477   assert( 4 == 
sizeof( int32_t ) );
 
 2478   assert( 2 == 
sizeof( uint16_t ) );
 
 2479   assert( 2 == 
sizeof( int16_t ) );
 
 2480   assert( 1 == 
sizeof( uint8_t ) );
 
 2481   assert( 1 == 
sizeof( int8_t ) );
 
 2482   assert( NULL != args );
 
 2483   assert( 1 << RETROFLAT_TILE_W_BITS == RETROFLAT_TILE_W );
 
 2484   assert( 1 << RETROFLAT_TILE_H_BITS == RETROFLAT_TILE_H );
 
 2486   debug_printf( 1, 
"initializing drawing routines..." );
 
 2491#     if defined( RETROFLAT_BMP_TEX ) 
 2492   retroflat_2d_px = (retroflat_px_cb)retro3d_texture_px;
 
 2495   retroflat_2d_blit_bitmap = (retroflat_blit_bitmap_cb)retro3d_texture_blit;
 
 2496   retroflat_2d_load_bitmap =
 
 2497      (retroflat_load_bitmap_cb)retro3d_texture_load_bitmap;
 
 2498   retroflat_2d_create_bitmap =
 
 2499      (retroflat_create_bitmap_cb)retro3d_texture_create;
 
 2501   retroflat_2d_px = (retroflat_px_cb)retroflat_px;
 
 2502#        ifdef RETROFLAT_SOFT_SHAPES 
 2512   retroflat_2d_create_bitmap =
 
 2513      (retroflat_create_bitmap_cb)retroflat_create_bitmap;
 
 2516   debug_printf( 1, 
"retroflat: MFIX_PRECISION: %f", MFIX_PRECISION );
 
 2518   debug_printf( 1, 
"retroflat: allocating state (" SIZE_T_FMT 
" bytes)...",
 
 2521   debug_printf( 1, 
"retroflat: size_t is (" SIZE_T_FMT 
" bytes)...",
 
 2524   debug_printf( 1, 
"retroflat: ssize_t is (" SIZE_T_FMT 
" bytes)...",
 
 2525      sizeof( ssize_t ) );
 
 2527   debug_printf( 1, 
"retroflat: off_t is (" SIZE_T_FMT 
" bytes)...",
 
 2530   debug_printf( 1, 
"initializing global state..." );
 
 2532   g_retroflat_state_h = maug_malloc( 1, 
sizeof( 
struct RETROFLAT_STATE ) );
 
 2533   if( (MAUG_MHANDLE)NULL == g_retroflat_state_h ) {
 
 2535         "Error", 
"Could not allocate global state!" );
 
 2536      retval = MERROR_ALLOC;
 
 2540   maug_mlock( g_retroflat_state_h, g_retroflat_state );
 
 2541   if( NULL == g_retroflat_state ) {
 
 2543         "Error", 
"Could not lock global state!" );
 
 2544      retval = MERROR_ALLOC;
 
 2551   debug_printf( 1, 
"initializing platform filesystem..." );
 
 2552   retval = mfile_plt_init();
 
 2553   maug_cleanup_if_not_ok();
 
 2555#  ifndef RETROFLAT_NO_CLI 
 2557   debug_printf( 1, 
"retroflat: parsing args..." );
 
 2562      MAUG_CLI_SIGIL "h", MAUG_CLI_SIGIL_SZ + 2, 
"Display command-line help",
 
 2563      26, maug_cli_h, NULL );
 
 2565#  if !defined( RETROFLAT_NO_SOUND ) && defined( RETROSND_ARGS ) 
 2567      "Select MIDI device", 0, (maug_cli_cb)retrosnd_cli_rsd, args );
 
 2568   maug_cleanup_if_not_ok();
 
 2570      "List MIDI devices", 0, (maug_cli_cb)retrosnd_cli_rsl, args );
 
 2571   maug_cleanup_if_not_ok();
 
 2574#     ifdef RETROFLAT_SCREENSAVER 
 2576      "Preview screensaver", 0, (maug_cli_cb)retroflat_cli_p, args );
 
 2577   maug_cleanup_if_not_ok();
 
 2579      "Launch screensaver", 0, (maug_cli_cb)retroflat_cli_s, args );
 
 2580   maug_cleanup_if_not_ok();
 
 2583#     ifdef RETROFLAT_API_PC_BIOS 
 2585      "Set the screen mode.", 0,
 
 2586      (maug_cli_cb)retroflat_cli_rfm, args );
 
 2587   maug_cleanup_if_not_ok();
 
 2588#     elif !defined( RETROFLAT_NO_CLI_SZ ) 
 2590      "Set screen scale factor.", 0,
 
 2591      (maug_cli_cb)retroflat_cli_rfs, args );
 
 2592   maug_cleanup_if_not_ok();
 
 2594      "Set the screen X position.", 0,
 
 2595      (maug_cli_cb)retroflat_cli_rfx, args );
 
 2596   maug_cleanup_if_not_ok();
 
 2598      "Set the screen Y position.", 0,
 
 2599      (maug_cli_cb)retroflat_cli_rfy, args );
 
 2600   maug_cleanup_if_not_ok();
 
 2602      "Set the screen width.", 0,
 
 2603      (maug_cli_cb)retroflat_cli_rfw, args );
 
 2604   maug_cleanup_if_not_ok();
 
 2606      "Set the screen height.", 0,
 
 2607      (maug_cli_cb)retroflat_cli_rfh, args );
 
 2608   maug_cleanup_if_not_ok();
 
 2611#     ifdef RETROFLAT_VDP 
 2613      "Pass a string of args to the VDP.", 0,
 
 2614      (maug_cli_cb)retroflat_cli_vdp, args );
 
 2615   maug_cleanup_if_not_ok();
 
 2620      (maug_cli_cb)retroflat_cli_u, args );
 
 2621   maug_cleanup_if_not_ok();
 
 2623#     ifndef RETROFLAT_NO_PAD 
 2625      "Specify joystick ID to use.", 0,
 
 2626      (maug_cli_cb)retroflat_cli_rfj, args );
 
 2627   maug_cleanup_if_not_ok();
 
 2631   retval = maug_parse_args( argc, argv );
 
 2632   maug_cleanup_if_not_ok();
 
 2636   if( 0 == args->screen_w ) {
 
 2637      args->screen_w = RETROFLAT_DEFAULT_SCREEN_W;
 
 2638      debug_printf( 1, 
"setting arg screen_w to default: %d",
 
 2642      args->
screen_h = RETROFLAT_DEFAULT_SCREEN_H;
 
 2643      debug_printf( 1, 
"setting arg screen_h to default: %d",
 
 2646   args->joystick_id = -1;
 
 2650#  if !defined( RETROFLAT_NO_CLI_SZ ) 
 2652   if( 0 < args->screen_scale ) {
 
 2653      debug_printf( 1, 
"setting screen scale to: %d", args->screen_scale );
 
 2654      g_retroflat_state->scale = args->screen_scale;
 
 2656      debug_printf( 1, 
"setting screen scale to default: 1" );
 
 2657      g_retroflat_state->scale = 1;
 
 2667   debug_printf( 1, 
"retroflat: setting config..." );
 
 2672      maug_strncpy( g_retroflat_state->assets_path,
 
 2676#  if defined( RETROFLAT_SCREENSAVER ) 
 2685#  if !defined( RETROFLAT_NO_CLI_SZ ) 
 2687   g_retroflat_state->
screen_v_w = args->screen_w;
 
 2689   g_retroflat_state->
screen_w = args->screen_w *
 
 2690      g_retroflat_state->scale;
 
 2692      g_retroflat_state->scale;
 
 2697   debug_printf( 3, 
"attempting to initialize platform with: "  
 2698      SIZE_T_FMT 
"x" SIZE_T_FMT 
" pixels (scaled to " SIZE_T_FMT 
"x" SIZE_T_FMT 
 
 2703   retval = retroflat_init_platform( argc, argv, args );
 
 2704   maug_cleanup_if_not_ok();
 
 2706   retval = retroflat_init_input( args );
 
 2707   maug_cleanup_if_not_ok();
 
 2709   debug_printf( 3, 
"screen initialized with: " SIZE_T_FMT 
"x" SIZE_T_FMT
 
 2710      " pixels (scaled to " SIZE_T_FMT 
"x" SIZE_T_FMT 
 
 2711      ") with " SIZE_T_FMT 
" colors",
 
 2714      retroflat_screen_colors() );
 
 2720      (
size_t)0, retroflat_screen_w(), SIZE_T_FMT, MERROR_GUI );
 
 2722      (
size_t)0, retroflat_screen_h(), SIZE_T_FMT, MERROR_GUI );
 
 2724      (
size_t)0, retroflat_screen_colors(), SIZE_T_FMT, MERROR_GUI );
 
 2730      0, 0, retroflat_screen_w(), retroflat_screen_h() );
 
 2732#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 2733   debug_printf( 1, 
"allocating refresh grid (%d tiles...)",
 
 2736   g_retroflat_state->viewport.refresh_grid_h = maug_malloc(
 
 2740   maug_cleanup_if_null_alloc( MAUG_MHANDLE,
 
 2741      g_retroflat_state->viewport.refresh_grid_h );
 
 2744#  ifdef RETROFLAT_VDP 
 2745#     if defined( RETROFLAT_OS_UNIX ) 
 2746   g_retroflat_state->
vdp_exe = dlopen(
 
 2747      "./" RETROFLAT_VDP_LIB_NAME 
".so", RTLD_LAZY );
 
 2748#     elif defined( RETROFLAT_OS_WIN ) 
 2749   g_retroflat_state->
vdp_exe = LoadLibrary(
 
 2750      "./" RETROFLAT_VDP_LIB_NAME 
".dll" );
 
 2752#        error "dlopen undefined!" 
 2755   if( !(g_retroflat_state->
vdp_exe) ) {
 
 2756      error_printf( 
"not loading VDP" );
 
 2762   debug_printf( 1, 
"creating VDP buffer, " SIZE_T_FMT 
" x " SIZE_T_FMT,
 
 2765      calloc( 1, 
sizeof( 
struct RETROFLAT_BITMAP ) );
 
 2766   maug_cleanup_if_null_alloc(
 
 2767      struct RETROFLAT_BITMAP*, g_retroflat_state->
vdp_buffer );
 
 2768   retval = retroflat_create_bitmap(
 
 2771   maug_cleanup_if_not_ok();
 
 2773   debug_printf( 1, 
"initializing VDP..." );
 
 2781   retro3d_platform_init();
 
 2784#  if !defined( RETROFLAT_NO_BLANK_INIT ) && !defined( RETROFLAT_3D ) 
 2787      NULL, RETROFLAT_COLOR_BLACK, 0, 0,
 
 2788      retroflat_screen_w(), retroflat_screen_h(),
 
 2790   retroflat_draw_release( NULL );
 
 2802   debug_printf( 1, 
"retroflat shutdown called..." );
 
 2804#ifndef RETROFLAT_NO_VIEWPORT_REFRESH 
 2806      NULL != g_retroflat_state &&
 
 2807      (MAUG_MHANDLE)NULL != g_retroflat_state->viewport.refresh_grid_h
 
 2809      maug_mfree( g_retroflat_state->viewport.refresh_grid_h );
 
 2813#  if defined( RETROFLAT_VDP ) 
 2814   if( NULL != g_retroflat_state->
vdp_exe ) {
 
 2816#     ifdef RETROFLAT_OS_UNIX 
 2817      dlclose( g_retroflat_state->
vdp_exe );
 
 2818#     elif defined( RETROFLAT_OS_WIN ) 
 2819      FreeLibrary( g_retroflat_state->
vdp_exe );
 
 2821#        error "dlclose undefined!" 
 2825   if( NULL != g_retroflat_state->
vdp_buffer ) {
 
 2826      debug_printf( 1, 
"destroying VPD buffer..." );
 
 2835   retro3d_platform_shutdown();
 
 2838   retroflat_shutdown_platform( retval );
 
 2840   maug_munlock( g_retroflat_state_h, g_retroflat_state );
 
 2841   maug_mfree( g_retroflat_state_h );
 
 2847RETROFLAT_IN_KEY retroflat_repeat_input(
 
 2849   RETROFLAT_IN_KEY* prev_input, 
int* prev_delay
 
 2853   if( 0 < (*prev_delay) ) {
 
 2855         RETROINPUT_TRACE_LVL,
 
 2856         "repeat delay: %d", (*prev_delay) );
 
 2872      key_out = *prev_input;
 
 2874      debug_printf( RETROINPUT_TRACE_LVL, 
"repeat: %d", key_out );
 
 2882#  ifdef RETROFLAT_VDP 
 2887#     ifdef RETROFLAT_OS_WIN 
 2888   char proc_name_ex[256];
 
 2891   if( NULL == g_retroflat_state->
vdp_exe ) {
 
 2895#     ifdef RETROFLAT_OS_UNIX 
 2896   vdp_proc = dlsym( g_retroflat_state->
vdp_exe, proc_name );
 
 2897#     elif defined( RETROFLAT_OS_WIN ) 
 2899   maug_snprintf( proc_name_ex, 255, 
"%s_", proc_name );
 
 2901      g_retroflat_state->
vdp_exe, proc_name_ex );
 
 2903#        error "dlsym undefined!" 
 2909#     ifdef RETROFLAT_OS_WIN 
 2915      0 == strcmp( 
"retroflat_vdp_flip", proc_name ) &&
 
 2919      retroflat_vdp_lock( &(g_retroflat_state->
buffer) );
 
 2920      retroflat_vdp_lock( g_retroflat_state->
vdp_buffer );
 
 2923   retval = vdp_proc( g_retroflat_state );
 
 2926      0 == strcmp( 
"retroflat_vdp_flip", proc_name ) &&
 
 2930      retroflat_vdp_release( &(g_retroflat_state->
buffer) );
 
 2931      retroflat_vdp_release( g_retroflat_state->
vdp_buffer );
 
 2934#     ifdef RETROFLAT_OS_WIN 
 2935   retroflat_draw_release( g_retroflat_state->
vdp_buffer );
 
 2948void retroflat_cursor( 
struct RETROFLAT_BITMAP* target, uint8_t flags ) {
 
 2950   char mouse_str[11] = 
"";
 
 2953      mouse_str, 10, 
"%02d, %02d", g_retroflat_state->last_mouse_x, g_retroflat_state->last_mouse_y );
 
 2956      target, RETROFLAT_COLOR_BLACK,
 
 2957      mouse_str, 10, NULL, 0, 0, 0 );
 
 2959      target, RETROFLAT_COLOR_BLACK,
 
 2960      g_retroflat_state->last_mouse_x - 5, g_retroflat_state->last_mouse_y - 5, 10, 10, 0 );
 
 2969   retroflat_proc_resize_t on_resize_in, 
void* data_in
 
 2971   g_retroflat_state->on_resize = on_resize_in;
 
 2972   g_retroflat_state->on_resize_data = data_in;
 
 2977uint8_t retroflat_viewport_move_x_generic( int16_t x ) {
 
 2978   int16_t new_world_x = g_retroflat_state->viewport.
world_x + x;
 
 2983      g_retroflat_state->viewport.
world_w >= new_world_x +
 
 2984         g_retroflat_state->viewport.
screen_w 
 2986      g_retroflat_state->viewport.
world_x += x;
 
 2987      g_retroflat_state->viewport.world_tile_x += x >> RETROFLAT_TILE_W_BITS;
 
 2996uint8_t retroflat_viewport_move_y_generic( int16_t y ) {
 
 2997   int16_t new_world_y = g_retroflat_state->viewport.
world_y + y;
 
 3002      g_retroflat_state->viewport.
world_h >= new_world_y +
 
 3003         g_retroflat_state->viewport.
screen_h 
 3005      g_retroflat_state->viewport.
world_y += y;
 
 3006      g_retroflat_state->viewport.world_tile_y += y >> RETROFLAT_TILE_H_BITS;
 
 3015uint8_t retroflat_viewport_focus_generic(
 
 3016   size_t x1, 
size_t y1, 
size_t range, 
size_t speed
 
 3022#  define _retroflat_viewport_focus_dir( n, xy, wh, gl, pm, dir, range, speed ) \ 
 3023      new_pt = n - retroflat_viewport_world_ ## xy(); \ 
 3024      if( new_pt gl (retroflat_screen_ ## wh() >> 1) pm range ) { \ 
 3025         new_moved = retroflat_viewport_move_ ## xy( \ 
 3026            gc_retroflat_offsets8_ ## xy[RETROFLAT_DIR8_ ## dir] * speed ); \ 
 3027         if( !moved && new_moved ) { \ 
 3028            moved = new_moved; \ 
 3032   _retroflat_viewport_focus_dir( x1, x, w, <, -, WEST, range, speed );
 
 3033   _retroflat_viewport_focus_dir( x1, x, w, >, +, EAST, range, speed );
 
 3034   _retroflat_viewport_focus_dir( y1, y, h, <, -, NORTH, range, speed );
 
 3035   _retroflat_viewport_focus_dir( y1, y, h, >, +, SOUTH, range, speed );
 
 3042#ifdef RETROFLAT_LOAD_BITMAP_GENERIC 
 3050   const char* filename, 
struct RETROFLAT_BITMAP* bmp_out, uint8_t flags
 
 3056   uint8_t bmp_flags = 0;
 
 3058   assert( NULL != bmp_out );
 
 3059   maug_mzero( bmp_out, 
sizeof( 
struct RETROFLAT_BITMAP ) );
 
 3060   retval = retroflat_build_filename_path(
 
 3063   maug_cleanup_if_not_ok();
 
 3064   debug_printf( 1, 
"retroflat: loading bitmap: %s", filename_path );
 
 3066   bmp_out->flags = flags;
 
 3070   maug_cleanup_if_not_ok();
 
 3074   header_bmp.magic[0] = 
'B';
 
 3075   header_bmp.magic[1] = 
'M';
 
 3076   header_bmp.info.sz = 40;
 
 3078   retval = mfmt_read_bmp_header(
 
 3080      &bmp_file, 0, mfile_get_sz( &bmp_file ), &bmp_flags );
 
 3081   maug_cleanup_if_not_ok();
 
 3083   retval = retroflat_create_bitmap(
 
 3084      header_bmp.info.width, header_bmp.info.height, bmp_out, flags );
 
 3085   maug_cleanup_if_not_ok();
 
 3092      header_bmp.px_offset,
 
 3093      mfile_get_sz( &bmp_file ) - header_bmp.px_offset,
 
 3095      retroflat_load_bitmap_px_cb,
 
 3097   maug_cleanup_if_not_ok();
 
 3099   retroflat_draw_release( bmp_out );
 
 3110#elif !defined( RETROVDP_C )  
 3117extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_x[8];
 
 3118extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets8_y[8];
 
 3119extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_x[4];
 
 3120extern MAUG_CONST int16_t SEG_MCONST gc_retroflat_offsets4_y[4];
 
 3124#define RETROFLAT_COLOR_TABLE_CONSTS( idx, name_l, name_u, r, g, b, cgac, cgad ) \ 
 3125   extern MAUG_CONST RETROFLAT_COLOR SEG_MCONST RETROFLAT_COLOR_ ## name_u; 
 3129extern MAUG_CONST 
char* SEG_MCONST gc_retroflat_color_names[];
 
 3133#  if (defined( RETROFLAT_SOFT_SHAPES ) || defined( RETROFLAT_SOFT_LINES ) || \ 
 3134   defined( RETROFLAT_3D )) 
 3135#     define RETROSOFT_PRESENT 
 3139#     include <retro3dp.h> 
 3141#     include <retro3du.h> 
 3144#  ifdef RETROSOFT_PRESENT 
 3155#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
uint16_t MERROR_RETVAL
Return type indicating function returns a value from this list.
Definition: merror.h:19
MERROR_RETVAL mfmt_read_bmp_px_cb(struct MFMT_STRUCT *header, mfile_t *p_file_in, uint32_t px_offset, off_t file_sz, uint8_t flags, mfmt_read_1px_cb px_cb, void *px_cb_data)
Read mfmt_bitmap pixels and process them using a callback.
#define MAUG_PATH_SZ_MAX
Maximum size allocated for asset paths.
Definition: mfile.h:35
MERROR_RETVAL mfile_open_read(const char *filename, mfile_t *p_file)
Open a file and read it into memory or memory-map it.
void mfile_close(mfile_t *p_file)
Close a file opened with mfile_open_read().
#define RETROFLAT_BITMAP_EXT
The filename suffix to be appended with a "." to filenames passed to retroflat_load_bitmap()....
Definition: retroflt.h:583
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:724
#define RETROFLAT_PATH_SEP
The valid path separator on the target platform.
Definition: retroflt.h:745
#define RETROFLAT_FLAGS_LITERAL_PATH
Flag for retroflat_load_bitmap() to not use assets path.
Definition: retroflt.h:384
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() or retroflat_load_bitmap() to create or load a bitmap without tran...
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.
void retroflat_message(uint8_t flags, const char *title, const char *format,...)
Display a message in a dialog box and/or on stderr.
#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:461
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:513
#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:500
void retroflat_shutdown(int retval)
Deinitialize RetroFlat and its underlying layers. This should be called once at the end of the progra...
#define retroflat_system_task()
Platform-specific task that should be called on every iteration of the generic loop....
Definition: retroflt.h:1055
void(* retroflat_loop_iter)(void *data)
Prototype for the main loop function passed to retroflat_loop().
Definition: retroflt.h:764
void retroflat_resize_v()
Platform-specific function to resize virtual screen to match physical window size.
size_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition: retroflt.h:870
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....
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).
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
Lower-level retargetable 3D engine wrapper.
Tools for drawing shape primatives.
Generic image description struct.
Definition: mfmt.h:69
Definition: retroflt.h:1032
Struct containing configuration values for a RetroFlat program.
Definition: retroflt.h:1067
char * config_path
Relative path of local config file (if not using registry).
Definition: retroflt.h:1077
char * assets_path
Relative path under which bitmap assets are stored.
Definition: retroflt.h:1075
int screen_h
Desired screen or window height in pixels.
Definition: retroflt.h:1081
char * title
Title to set for the main program Window if applicable on the target platform.
Definition: retroflt.h:1073
int screen_y
Desired window Y position in pixels.
Definition: retroflt.h:1085
int screen_x
Desired window X position in pixels.
Definition: retroflt.h:1083
Global singleton containing state for the current platform.
Definition: retroflt.h:1583
#define RETROFLAT_FLAGS_SCREENSAVER
Flag indicating the current application is running as a screensaver.
Definition: retroflt.h:437
char vdp_args[RETROFLAT_VDP_ARGS_SZ_MAX]
CLI args passed with -vdp to the RetroFlat VDP API.
Definition: retroflt.h:1619
size_t screen_h
The screen height as seen by the system, after scaling.
Definition: retroflt.h:1645
uint8_t vdp_flags
Flags set by the RetroFlat VDP API.
Definition: retroflt.h:1621
#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:1563
size_t screen_v_w
The screen width as seen by our program, before scaling.
Definition: retroflt.h:1634
size_t screen_colors
The number of colors the screen is capable of displaying.
Definition: retroflt.h:1647
uint8_t retroflat_flags
maug_retroflt_flags indicating current system status.
Definition: retroflt.h:1593
#define RETROFLAT_FLAGS_UNLOCK_FPS
Flag indicating FPS should not be capped.
Definition: retroflt.h:423
uint8_t heartbeat_max
When RETROFLAT_STATE::heartbeat_frame reaches this value, it will reset to 0.
Definition: retroflt.h:1674
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:1606
uint8_t heartbeat_frame
Simple iteration loop that can be used to time e.g. perpetual sprite animations. Modify parameters wi...
Definition: retroflt.h:1669
size_t screen_w
The screen width as seen by the system, after scaling.
Definition: retroflt.h:1643
#define retroflat_heartbeat_set(len, max)
Set parameters for the RETROFLAT_STATE::heartbeat_frame.
Definition: retroflt.h:1547
struct RETROFLAT_BITMAP buffer
Off-screen buffer bitmap.
Definition: retroflt.h:1597
void * vdp_exe
A handle for the loaded RetroFlat VDP API module.
Definition: retroflt.h:1611
RETROFLAT_COLOR_DEF palette[RETROFLAT_COLORS_SZ]
Index of available colors, initialized on platform init.
Definition: retroflt.h:1681
uint16_t heartbeat_len
Number of ms to stay on current value of RETROFLAT_STATE::heartbeat_frame before incrementing....
Definition: retroflt.h:1663
void * vdp_data
Pointer to data defined by the RetroFlat VDP API for its use.
Definition: retroflt.h:1617
size_t screen_v_h
The screen height as seen by our program, before scaling.
Definition: retroflt.h:1641
#define RETROFLAT_FLAGS_RUNNING
Flag indicating that retroflat_loop() should continue executing.
Definition: retroflt.h:416
#define RETROFLAT_FLAGS_WAIT_FOR_FPS
Do not execute any more inter-frame loops until next frame.
Definition: retroflt.h:443
#define RETROFLAT_FLAGS_KEY_REPEAT
Flag indicating keyboard repeat is enabled.
Definition: retroflt.h:430
The viewport data struct.
Definition: retroflt.h:1112
uint16_t screen_w_remainder
Difference between viewport width and screen width in pixels. Should only be retrieved through retrof...
Definition: retroflt.h:1167
int16_t screen_x
X position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition: retroflt.h:1118
uint16_t screen_h_remainder
Difference between viewport height and screen height in pixels. Should only be retrieved through retr...
Definition: retroflt.h:1174
retroflat_tile_t * refresh_grid
A grid of tile values representing the last-drawn values on-screen.
Definition: retroflt.h:1203
uint16_t screen_h
Viewport height in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thr...
Definition: retroflt.h:1160
int16_t world_w
The width of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport_...
Definition: retroflt.h:1142
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:1181
#define retroflat_viewport_set_pos_size(x_px, y_px, w_px, h_px)
Set the pixel width and height of the viewport, as well as some other dependent values frequently use...
Definition: retroflt.h:1459
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:1188
int16_t world_h
The height of the entire world tilemap in pixels. Should only be retrieved through retroflat_viewport...
Definition: retroflt.h:1148
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:1136
int16_t screen_y
Y position of the viewport in real screen memory in pixels. Should only be retrieved through retrofla...
Definition: retroflt.h:1124
uint16_t screen_w
Viewport width in pixels. Should only be retrieved through retroflat_viewport_screen_w() and set thro...
Definition: retroflt.h:1154
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:1130