21#define RETROGXC_PRESENT 1
23#ifndef RETROGXC_INITIAL_SZ
24# define RETROGXC_INITIAL_SZ 16
27#ifndef RETROGXC_TRACE_LVL
28# define RETROGXC_TRACE_LVL 0
31#define RETROGXC_ERROR_CACHE_MISS (-1)
33#define RETROGXC_ASSET_TYPE_NONE 0
34#define RETROGXC_ASSET_TYPE_BITMAP 1
35#define RETROGXC_ASSET_TYPE_FONT 2
37#define retrogxc_load_bitmap( res_p, flags ) \
38 retrogxc_load_asset( res_p, retrogxc_loader_bitmap, NULL, flags )
40#define retrogxc_load_xpm( res_p, flags ) \
41 retrogxc_load_asset( res_p, retrogxc_loader_xpm, NULL, flags )
43typedef int8_t RETROGXC_ASSET_TYPE;
45typedef RETROGXC_ASSET_TYPE (*retrogxc_loader)(
47 void* data, uint8_t flags );
58 uint16_t glyphs_count;
63void retrogxc_clear_cache();
65void retrogxc_shutdown();
67RETROGXC_ASSET_TYPE retrogxc_loader_bitmap(
69 void* data, uint8_t flags );
71RETROGXC_ASSET_TYPE retrogxc_loader_xpm(
73 void* data, uint8_t flags );
75RETROGXC_ASSET_TYPE retrogxc_loader_font(
77 void* data, uint8_t flags );
79int16_t retrogxc_load_font(
81 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count );
83int16_t retrogxc_load_asset(
88 retroflat_blit_t* target,
size_t bitmap_idx,
89 size_t s_x,
size_t s_y,
size_t d_x,
size_t d_y,
90 size_t w,
size_t h, int16_t instance );
94 const char* str,
size_t str_sz,
95 size_t font_idx,
size_t x,
size_t y,
96 size_t max_w,
size_t max_h, uint8_t flags );
99 retroflat_blit_t* target,
const char* str,
size_t str_sz,
100 size_t font_idx,
size_t max_w,
size_t max_h,
101 size_t* out_w_p,
size_t* out_h_p, uint8_t flags );
127void retrogxc_clear_cache() {
128 size_t dropped_count = 0;
130 retroflat_blit_t* bitmap = NULL;
133 mdata_vector_lock( &gs_retrogxc_bitmaps );
135 while( 0 < mdata_vector_ct( &gs_retrogxc_bitmaps ) ) {
136 asset = mdata_vector_get(
138 assert( NULL != asset );
141 switch( asset->type ) {
142 case RETROGXC_ASSET_TYPE_BITMAP:
143 maug_mlock( asset->handle, bitmap );
144 if( NULL != bitmap ) {
145 retroflat_2d_destroy_bitmap( bitmap );
147 maug_munlock( asset->handle, bitmap );
148 maug_mfree( asset->handle );
151 case RETROGXC_ASSET_TYPE_FONT:
153 maug_mfree( asset->handle );
157 mdata_vector_unlock( &gs_retrogxc_bitmaps );
158 mdata_vector_remove( &gs_retrogxc_bitmaps, 0 );
159 mdata_vector_lock( &gs_retrogxc_bitmaps );
162 debug_printf( RETROGXC_TRACE_LVL,
163 "graphics cache cleared (" SIZE_T_FMT
" assets)", dropped_count );
167 if( MERROR_OK == retval ) {
168 mdata_vector_unlock( &gs_retrogxc_bitmaps );
176void retrogxc_shutdown() {
177 retrogxc_clear_cache();
178 mdata_vector_free( &gs_retrogxc_bitmaps );
183RETROGXC_ASSET_TYPE retrogxc_loader_bitmap(
188 retroflat_blit_t* bitmap = NULL;
190 assert( (MAUG_MHANDLE)NULL == *handle_p );
192 *handle_p = maug_malloc( 1,
sizeof( retroflat_blit_t ) );
193 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *handle_p );
195 maug_mlock( *handle_p, bitmap );
196 maug_cleanup_if_null_alloc( retroflat_blit_t*, bitmap );
199 retval = retroflat_2d_load_bitmap( res_p, bitmap, flags );
200 maug_cleanup_if_not_ok();
204 if( NULL != bitmap ) {
205 maug_munlock( *handle_p, bitmap );
208 if( MERROR_OK == retval ) {
209 return RETROGXC_ASSET_TYPE_BITMAP;
211 if( NULL != *handle_p ) {
212 maug_mfree( *handle_p );
214 return RETROGXC_ASSET_TYPE_NONE;
222RETROGXC_ASSET_TYPE retrogxc_loader_xpm(
227 retroflat_blit_t* bitmap = NULL;
229 assert( (MAUG_MHANDLE)NULL == *handle_p );
231 *handle_p = maug_malloc( 1,
sizeof( retroflat_blit_t ) );
232 maug_cleanup_if_null_alloc( MAUG_MHANDLE, *handle_p );
234 maug_mlock( *handle_p, bitmap );
235 maug_cleanup_if_null_alloc( retroflat_blit_t*, bitmap );
238 retval = retroflat_load_xpm( res_p, bitmap, flags );
239 maug_cleanup_if_not_ok();
243 if( NULL != bitmap ) {
244 maug_munlock( *handle_p, bitmap );
247 if( MERROR_OK == retval ) {
248 return RETROGXC_ASSET_TYPE_BITMAP;
250 if( NULL != *handle_p ) {
251 maug_mfree( *handle_p );
253 return RETROGXC_ASSET_TYPE_NONE;
261#ifdef RETROFONT_PRESENT
263RETROGXC_ASSET_TYPE retrogxc_loader_font(
270 assert( (MAUG_MHANDLE)NULL == *handle_p );
272 debug_printf( 1,
"loading font into cache: %s (%d, %d, %d)",
273 res_p, parms->glyph_h, parms->first_glyph, parms->glyphs_count );
275 retval = retrofont_load( res_p, handle_p,
276 parms->glyph_h, parms->first_glyph, parms->glyphs_count );
277 maug_cleanup_if_not_ok();
281 if( MERROR_OK == retval ) {
282 return RETROGXC_ASSET_TYPE_FONT;
284 return RETROGXC_ASSET_TYPE_NONE;
292int16_t retrogxc_load_asset(
296 int16_t idx = RETROGXC_ERROR_CACHE_MISS,
300 RETROGXC_ASSET_TYPE asset_type = RETROGXC_ASSET_TYPE_NONE;
305 if( 0 == mdata_vector_ct( &gs_retrogxc_bitmaps ) ) {
306 goto just_load_asset;
310 mdata_vector_lock( &gs_retrogxc_bitmaps );
311 for( i = 0 ; mdata_vector_ct( &gs_retrogxc_bitmaps ) > (size_t)i ; i++ ) {
312 asset_iter = mdata_vector_get(
314 assert( NULL != asset_iter );
315 debug_printf( RETROGXC_TRACE_LVL,
"\"%s\" vs \"%s\"",
316 asset_iter->id, res_p );
318 debug_printf( RETROGXC_TRACE_LVL,
319 "found asset \"%s\" at index %d with type %d!",
320 res_p, i, asset_iter->type );
322 mdata_vector_unlock( &gs_retrogxc_bitmaps );
326 mdata_vector_unlock( &gs_retrogxc_bitmaps );
331 debug_printf( RETROGXC_TRACE_LVL,
332 "asset %s not found in cache; loading...", res_p );
335 asset_type = l( res_p, &asset_new.handle, data, flags );
336 if( RETROGXC_ASSET_TYPE_NONE != asset_type ) {
337 asset_new.type = asset_type;
338 retroflat_assign_asset_path( asset_new.id, res_p );
339 idx = mdata_vector_append(
340 &gs_retrogxc_bitmaps, &asset_new,
345 debug_printf( RETROGXC_TRACE_LVL,
346 "asset type %d, \"%s\" assigned cache ID: %d",
347 asset_type, res_p, idx );
352 error_printf(
"unable to load asset; cache full or not initialized?" );
356 if( MERROR_OK != retval ) {
366 retroflat_blit_t* target,
size_t bitmap_idx,
367 size_t s_x,
size_t s_y,
size_t d_x,
size_t d_y,
368 size_t w,
size_t h, int16_t instance
372 retroflat_blit_t* bitmap = NULL;
374 assert( NULL != gs_retrogxc_bitmaps.data_h );
376 mdata_vector_lock( &gs_retrogxc_bitmaps );
378 if( mdata_vector_ct( &gs_retrogxc_bitmaps ) <= bitmap_idx ) {
379 error_printf(
"invalid bitmap index: " SIZE_T_FMT, bitmap_idx );
380 retval = MERROR_OVERFLOW;
384 asset = mdata_vector_get(
387 if( RETROGXC_ASSET_TYPE_BITMAP != asset->type ) {
389 "index " SIZE_T_FMT
" not present in cache or not bitmap (%d)!",
390 bitmap_idx, asset->type );
391 retval = MERROR_FILE;
395 maug_mlock( asset->handle, bitmap );
397 retval = retroflat_2d_blit_bitmap(
398 target, bitmap, s_x, s_y, d_x, d_y, w, h, instance );
402 if( NULL != bitmap ) {
403 maug_munlock( asset->handle, bitmap );
406 mdata_vector_unlock( &gs_retrogxc_bitmaps );
418 retroflat_blit_t* bitmap = NULL;
420 mdata_vector_lock( &gs_retrogxc_bitmaps );
422 if( mdata_vector_ct( &gs_retrogxc_bitmaps ) <= bitmap_idx ) {
423 error_printf(
"invalid bitmap index: " SIZE_T_FMT, bitmap_idx );
424 retval = MERROR_OVERFLOW;
428 asset = mdata_vector_get(
431 if( RETROGXC_ASSET_TYPE_BITMAP != asset->type ) {
433 "index " SIZE_T_FMT
" not present in cache or not bitmap (%d)!",
434 bitmap_idx, asset->type );
435 retval = MERROR_FILE;
439 maug_mlock( asset->handle, bitmap );
442 *p_w = retroflat_2d_bitmap_w( bitmap );
446 *p_h = retroflat_2d_bitmap_h( bitmap );
451 if( NULL != bitmap ) {
452 maug_munlock( asset->handle, bitmap );
455 mdata_vector_unlock( &gs_retrogxc_bitmaps );
462#ifdef RETROFONT_PRESENT
464int16_t retrogxc_load_font(
466 uint8_t glyph_h, uint16_t first_glyph, uint16_t glyphs_count
471 parms.glyph_h = glyph_h;
472 parms.first_glyph = first_glyph;
473 parms.glyphs_count = glyphs_count;
475 idx = retrogxc_load_asset( font_name, retrogxc_loader_font, &parms, 0 );
484 const char* str,
size_t str_sz,
485 size_t font_idx,
size_t x,
size_t y,
486 size_t max_w,
size_t max_h, uint8_t flags
491 mdata_vector_lock( &gs_retrogxc_bitmaps );
493 if( mdata_vector_ct( &gs_retrogxc_bitmaps ) <= font_idx ) {
494 error_printf(
"invalid font index: " SIZE_T_FMT, font_idx );
495 retval = MERROR_OVERFLOW;
499 asset = mdata_vector_get(
502 if( RETROGXC_ASSET_TYPE_FONT != asset->type ) {
504 "index " SIZE_T_FMT
" not present in cache or not font (%d)!",
505 font_idx, asset->type );
506 retval = MERROR_FILE;
511 target, color, str, str_sz, asset->handle, x, y, max_w, max_h, flags );
515 mdata_vector_unlock( &gs_retrogxc_bitmaps );
523 retroflat_blit_t* target,
const char* str,
size_t str_sz,
524 size_t font_idx,
size_t max_w,
size_t max_h,
525 size_t* out_w_p,
size_t* out_h_p, uint8_t flags
530 mdata_vector_lock( &gs_retrogxc_bitmaps );
532 if( mdata_vector_ct( &gs_retrogxc_bitmaps ) <= font_idx ) {
533 error_printf(
"invalid font index: " SIZE_T_FMT, font_idx );
534 retval = MERROR_OVERFLOW;
538 asset = mdata_vector_get(
541 if( RETROGXC_ASSET_TYPE_FONT != asset->type ) {
543 "index " SIZE_T_FMT
" not present in cache or not font (%d)!",
544 font_idx, asset->type );
545 retval = MERROR_FILE;
550 target, str, str_sz, asset->handle,
551 max_w, max_h, out_w_p, out_h_p, flags );
555 mdata_vector_unlock( &gs_retrogxc_bitmaps );
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:62
#define retroflat_cmp_asset_path(a, b)
Compare two asset paths. Return 0 if they're the same.
Definition retroflt.h:776
char retroflat_asset_path[RETROFLAT_PATH_MAX]
Path/name used to load an asset from disk.
Definition retroflt.h:771
int8_t RETROFLAT_COLOR
Defines an index in the platform-specific color-table.
Definition retroflt.h:325
size_t retroflat_pxxy_t
Type used for surface pixel coordinates.
Definition retroflt.h:1011
A vector of uniformly-sized objects, stored contiguously.
Definition mdata.h:89