ref: support loading sprites with truncated palette

This commit is contained in:
Alibek Omarov 2025-01-22 19:23:57 +03:00
parent 9f322df498
commit 4f2249ed8e
2 changed files with 22 additions and 20 deletions

View file

@ -179,31 +179,32 @@ void Mod_LoadSpriteModel( model_t *mod, const void *buffer, qboolean *loaded, ui
pframetype = ((const byte*)buffer + sizeof( dsprite_q1_t )); // pinq1 + 1 pframetype = ((const byte*)buffer + sizeof( dsprite_q1_t )); // pinq1 + 1
gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data
} }
else if( *numi == 256 ) else if( *numi <= 256 )
{ {
const byte *src = (const byte *)(numi+1); const byte *src = (const byte *)(numi+1);
rgbdata_t *pal; rgbdata_t *pal;
size_t pal_bytes = *numi * 3;
// install palette // install palette
switch( psprite->texFormat ) switch( psprite->texFormat )
{ {
case SPR_INDEXALPHA: case SPR_INDEXALPHA:
pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, pal_bytes );
break; break;
case SPR_ALPHTEST: case SPR_ALPHTEST:
pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, pal_bytes );
break; break;
default: default:
pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, pal_bytes );
break; break;
} }
pframetype = (const byte *)(src + 768); pframetype = (const byte *)(src + pal_bytes);
gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data
} }
else else
{ {
gEngfuncs.Con_DPrintf( S_ERROR "%s has wrong number of palette colors %i (should be 256)\n", mod->name, *numi ); gEngfuncs.Con_DPrintf( S_ERROR "%s has wrong number of palette colors %i (should be less or equal than 256)\n", mod->name, *numi );
return; return;
} }

View file

@ -165,31 +165,32 @@ void Mod_LoadSpriteModel( model_t *mod, const void *buffer, qboolean *loaded, ui
pframetype = ((const byte *)buffer + sizeof( dsprite_q1_t )); // pinq1 + 1 pframetype = ((const byte *)buffer + sizeof( dsprite_q1_t )); // pinq1 + 1
gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data
} }
else if( *numi == 256 ) else if( *numi <= 256 )
{ {
const byte *src = (const byte *)(numi+1); const byte *src = (const byte *)(numi+1);
rgbdata_t *pal; rgbdata_t *pal;
size_t pal_bytes = *numi * 3;
// install palette // install palette
switch( psprite->texFormat ) switch( psprite->texFormat )
{ {
case SPR_INDEXALPHA: case SPR_INDEXALPHA:
pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, pal_bytes );
break; break;
case SPR_ALPHTEST: case SPR_ALPHTEST:
pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, pal_bytes );
break; break;
default: default:
pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, 768 ); pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, pal_bytes );
break; break;
} }
pframetype = (const byte *)( src + 768 ); pframetype = (const byte *)(src + pal_bytes);
gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data
} }
else else
{ {
gEngfuncs.Con_DPrintf( S_ERROR "%s has wrong number of palette colors %i (should be 256)\n", mod->name, *numi ); gEngfuncs.Con_DPrintf( S_ERROR "%s has wrong number of palette colors %i (should be less or equal than 256)\n", mod->name, *numi );
return; return;
} }