void rl_imageset_destroy( const rl_imageset_t* imageset ) { for ( int i = imageset->num_images - 1; i >= 0; --i ) { rl_image_destroy( imageset->images[ i ] ); } rl_free( (void*)imageset ); }
void retro_unload_game( void ) { rl_sound_destroy( &state.sound ); rl_snddata_destroy( &state.snddata ); rl_sound_stop( state.music ); for ( unsigned i = 0; i < COUNT; i++ ) { rl_sprite_destroy( state.smiles[ i ].sprite ); } rl_imgdata_destroy( &state.imgdata ); rl_image_destroy( &state.image ); rl_backgrnd_destroy(); }
rl_imageset_t* rl_imageset_create( const void* data, size_t size ) { union { const void* restrict v; const uint8_t* restrict u8; const uint16_t* restrict u16; const uint32_t* restrict u32; } ptr; ptr.v = data; int num_images = ne16( *ptr.u16++ ); rl_imageset_t* imageset = (rl_imageset_t*)rl_malloc( sizeof( rl_imageset_t ) + num_images * sizeof( rl_image_t* ) ); if ( imageset ) { imageset->num_images = num_images; for ( int i = 0; i < num_images; i++ ) { size_t image_size = ne32( *ptr.u32++ ); imageset->images[ i ] = rl_image_create( ptr.v, image_size ); if ( !imageset->images[ i ] ) { for ( int j = i - 1; j >= 0; --j ) { rl_image_destroy( (void*)imageset->images[ j ] ); } rl_free( imageset ); return NULL; } ptr.u8 += image_size; } return imageset; } return NULL; }
bool retro_load_game( const struct retro_game_info* info ) { enum retro_pixel_format fmt = RETRO_PIXEL_FORMAT_RGB565; if ( !env_cb( RETRO_ENVIRONMENT_SET_PIXEL_FORMAT, &fmt ) ) { log_cb( RETRO_LOG_ERROR, "retroluxury needs RGB565\n" ); return false; } rl_image_init(); rl_sprite_init(); if ( rl_backgrnd_create( WIDTH, HEIGHT, RL_BACKGRND_EXACT ) != 0 ) { log_cb( RETRO_LOG_ERROR, "Error creating the framebuffer\n" ); return false; } rl_backgrnd_clear( RL_COLOR( 64, 64, 64 ) ); if ( rl_imgdata_create( &state.imgdata, res_smile_png, sizeof( res_smile_png ) ) != 0 ) { log_cb( RETRO_LOG_ERROR, "Error loading image smile.png\n" ); error1: rl_backgrnd_destroy(); return false; } if ( rl_image_create( &state.image, &state.imgdata, 0, 0 ) != 0 ) { log_cb( RETRO_LOG_ERROR, "Error creating RLE-image\n" ); error2: rl_imgdata_destroy( &state.imgdata ); goto error1; } for ( unsigned i = 0; i < COUNT; i++ ) { rl_sprite_t* sprite = rl_sprite_create(); if ( sprite == NULL ) { log_cb( RETRO_LOG_ERROR, "Error creating sprite %u of %u\n", i, COUNT ); error3: rl_image_destroy( &state.image ); for ( i = 0; i < COUNT; i++ ) { if ( state.smiles[ i ].sprite != NULL ) { rl_sprite_destroy( state.smiles[ i ].sprite ); } } goto error2; } sprite->x = rand() % ( WIDTH - state.imgdata.width + 1 ); sprite->y = rand() % ( HEIGHT - state.imgdata.height + 1 ); sprite->layer = i; sprite->image = &state.image; state.smiles[ i ].sprite = sprite; state.smiles[ i ].dx = rand() & 1 ? -1 : 1; state.smiles[ i ].dy = rand() & 1 ? -1 : 1; } state.music = rl_sound_play_ogg( res_sketch008_ogg, sizeof( res_sketch008_ogg ), 1, NULL ); if ( state.music == NULL ) { log_cb( RETRO_LOG_ERROR, "Error loading music sketch008.ogg\n" ); goto error3; } if ( rl_snddata_create( &state.snddata, res_bounce_wav, sizeof( res_bounce_wav ) ) != 0 ) { log_cb( RETRO_LOG_ERROR, "Error loading wave bounce.wav\n" ); error4: rl_sound_stop( state.music ); goto error3; } if ( rl_sound_create( &state.sound, &state.snddata ) != 0 ) { log_cb( RETRO_LOG_ERROR, "Error creating PCM data\n" ); //error5: rl_snddata_destroy( &state.snddata ); goto error4; } return true; }