diff --git a/ref/gl/gl_sprite.c b/ref/gl/gl_sprite.c index fd7fa7e1..c8dff220 100644 --- a/ref/gl/gl_sprite.c +++ b/ref/gl/gl_sprite.c @@ -152,11 +152,11 @@ load sprite model */ void Mod_LoadSpriteModel( model_t *mod, const void *buffer, qboolean *loaded, uint texFlags ) { - const dsprite_t *pin; - const short *numi = NULL; - const byte *pframetype; - msprite_t *psprite; - int i; + const dsprite_t *pin; + const short *numi = NULL; + const byte *pframetype; + msprite_t *psprite; + int i; pin = buffer; psprite = mod->cache.data; @@ -164,7 +164,7 @@ void Mod_LoadSpriteModel( model_t *mod, const void *buffer, qboolean *loaded, ui if( pin->version == SPRITE_VERSION_Q1 || pin->version == SPRITE_VERSION_32 ) numi = NULL; else if( pin->version == SPRITE_VERSION_HL ) - numi = (const short *)((const byte*)buffer + sizeof( dsprite_hl_t )); + numi = (const short *)((const byte *)buffer + sizeof( dsprite_hl_t )); r_texFlags = texFlags; sprite_version = pin->version; @@ -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 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); rgbdata_t *pal; + size_t pal_bytes = *numi * 3; // install palette switch( psprite->texFormat ) { case SPR_INDEXALPHA: - pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, pal_bytes ); break; case SPR_ALPHTEST: - pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, pal_bytes ); break; default: - pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, pal_bytes ); break; } - pframetype = (const byte *)(src + 768); + pframetype = (const byte *)(src + pal_bytes); gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data } 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; } diff --git a/ref/soft/r_sprite.c b/ref/soft/r_sprite.c index 3546fd3c..0ba9e0c0 100644 --- a/ref/soft/r_sprite.c +++ b/ref/soft/r_sprite.c @@ -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 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 ); - rgbdata_t *pal; + const byte *src = (const byte *)(numi+1); + rgbdata_t *pal; + size_t pal_bytes = *numi * 3; // install palette switch( psprite->texFormat ) { case SPR_INDEXALPHA: - pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#gradient.pal", src, pal_bytes ); break; case SPR_ALPHTEST: - pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#masked.pal", src, pal_bytes ); break; default: - pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, 768 ); + pal = gEngfuncs.FS_LoadImage( "#normal.pal", src, pal_bytes ); break; } - pframetype = (const byte *)( src + 768 ); + pframetype = (const byte *)(src + pal_bytes); gEngfuncs.FS_FreeImage( pal ); // palette installed, no reason to keep this data } 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; }