+static void skateshop_update_preview_image_thread(void *_args)
+{
+ char path_buf[4096];
+ vg_str folder;
+ vg_strnull( &folder, path_buf, sizeof(path_buf) );
+
+ SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+ addon_reg *reg_preview = global_skateshop.reg_preview;
+ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+
+ if( !addon_get_content_folder( reg_preview, &folder, 1 ) )
+ {
+ SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+ global_skateshop.reg_loaded_preview = reg_preview;
+ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+ return;
+ }
+
+ vg_strcat( &folder, "/preview.jpg" );
+ vg_async_item *call =
+ vg_async_alloc( sizeof(struct async_preview_load_thread_data) );
+ struct async_preview_load_thread_data *inf = call->payload;
+
+ inf->reg = reg_preview;
+
+ if( vg_strgood( &folder ) )
+ {
+ stbi_set_flip_vertically_on_load(1);
+ int x, y, nc;
+ inf->data = stbi_load( folder.buffer, &x, &y, &nc, 3 );
+
+ if( inf->data )
+ {
+ if( (x != WORKSHOP_PREVIEW_WIDTH) || (y != WORKSHOP_PREVIEW_HEIGHT) )
+ {
+ vg_error( "Resolution does not match framebuffer, so we can't"
+ " show it\n" );
+ stbi_image_free( inf->data );
+ inf->data = NULL;
+ }
+ }
+
+ vg_async_dispatch( call, skateshop_async_preview_imageload );
+ }
+ else
+ {
+ vg_error( "Path too long to workshop preview image.\n" );
+
+ SDL_AtomicLock( &addon_system.sl_cache_using_resources );
+ global_skateshop.reg_loaded_preview = reg_preview;
+ SDL_AtomicUnlock( &addon_system.sl_cache_using_resources );
+ }