mirror of
https://github.com/ZDoom/gzdoom.git
synced 2024-11-22 12:11:25 +00:00
- avoid high stack usage in anmtexture.cpp
MSVC warned about this one.
This commit is contained in:
parent
d93657a11d
commit
afecb1ca0f
1 changed files with 25 additions and 20 deletions
|
@ -33,6 +33,7 @@
|
|||
**
|
||||
*/
|
||||
|
||||
#include <memory>
|
||||
#include "files.h"
|
||||
#include "filesystem.h"
|
||||
#include "bitmap.h"
|
||||
|
@ -72,12 +73,12 @@ FImageSource *AnmImage_TryCreate(FileReader & file, int lumpnum)
|
|||
file.Seek(0, FileReader::SeekSet);
|
||||
auto buffer = file.ReadPadded(1);
|
||||
|
||||
anim_t anim;
|
||||
if (ANIM_LoadAnim(&anim, buffer.data(), buffer.size() - 1) < 0)
|
||||
std::unique_ptr<anim_t> anim = std::make_unique<anim_t>(); // note that this struct is very large and should not go onto the stack!
|
||||
if (ANIM_LoadAnim(anim.get(), buffer.data(), buffer.size() - 1) < 0)
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
int numframes = ANIM_NumFrames(&anim);
|
||||
int numframes = ANIM_NumFrames(anim.get());
|
||||
if (numframes >= 1)
|
||||
{
|
||||
return new FAnmTexture(lumpnum, 320, 200);
|
||||
|
@ -106,14 +107,14 @@ void FAnmTexture::ReadFrame(uint8_t *pixels, uint8_t *palette)
|
|||
auto lump = fileSystem.ReadFile (SourceLump);
|
||||
auto source = lump.GetBytes();
|
||||
|
||||
anim_t anim;
|
||||
if (ANIM_LoadAnim(&anim, source, (int)lump.GetSize()) >= 0)
|
||||
std::unique_ptr<anim_t> anim = std::make_unique<anim_t>(); // note that this struct is very large and should not go onto the stack!
|
||||
if (ANIM_LoadAnim(anim.get(), source, (int)lump.GetSize()) >= 0)
|
||||
{
|
||||
int numframes = ANIM_NumFrames(&anim);
|
||||
int numframes = ANIM_NumFrames(anim.get());
|
||||
if (numframes >= 1)
|
||||
{
|
||||
memcpy(palette, ANIM_GetPalette(&anim), 768);
|
||||
memcpy(pixels, ANIM_DrawFrame(&anim, 1), Width*Height);
|
||||
memcpy(palette, ANIM_GetPalette(anim.get()), 768);
|
||||
memcpy(pixels, ANIM_DrawFrame(anim.get(), 1), Width * Height);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
@ -121,6 +122,12 @@ void FAnmTexture::ReadFrame(uint8_t *pixels, uint8_t *palette)
|
|||
memset(palette, 0, 768);
|
||||
}
|
||||
|
||||
struct workbuf
|
||||
{
|
||||
uint8_t buffer[64000];
|
||||
uint8_t palette[768];
|
||||
};
|
||||
|
||||
//==========================================================================
|
||||
//
|
||||
//
|
||||
|
@ -130,16 +137,15 @@ void FAnmTexture::ReadFrame(uint8_t *pixels, uint8_t *palette)
|
|||
PalettedPixels FAnmTexture::CreatePalettedPixels(int conversion, int frame)
|
||||
{
|
||||
PalettedPixels pixels(Width*Height);
|
||||
uint8_t buffer[64000];
|
||||
uint8_t palette[768];
|
||||
uint8_t remap[256];
|
||||
std::unique_ptr<workbuf> w = std::make_unique<workbuf>();
|
||||
|
||||
ReadFrame(buffer, palette);
|
||||
ReadFrame(w->buffer, w->palette);
|
||||
for(int i=0;i<256;i++)
|
||||
{
|
||||
remap[i] = ColorMatcher.Pick(palette[i*3], palette[i*3+1], palette[i*3+2]);
|
||||
remap[i] = ColorMatcher.Pick(w->palette[i*3], w->palette[i*3+1], w->palette[i*3+2]);
|
||||
}
|
||||
ImageHelpers::FlipNonSquareBlockRemap (pixels.Data(), buffer, Width, Height, Width, remap);
|
||||
ImageHelpers::FlipNonSquareBlockRemap (pixels.Data(), w->buffer, Width, Height, Width, remap);
|
||||
return pixels;
|
||||
}
|
||||
|
||||
|
@ -151,18 +157,17 @@ PalettedPixels FAnmTexture::CreatePalettedPixels(int conversion, int frame)
|
|||
|
||||
int FAnmTexture::CopyPixels(FBitmap *bmp, int conversion, int frame)
|
||||
{
|
||||
uint8_t buffer[64000];
|
||||
uint8_t palette[768];
|
||||
ReadFrame(buffer, palette);
|
||||
std::unique_ptr<workbuf> w = std::make_unique<workbuf>();
|
||||
ReadFrame(w->buffer, w->palette);
|
||||
|
||||
auto dpix = bmp->GetPixels();
|
||||
for (int i = 0; i < Width * Height; i++)
|
||||
{
|
||||
int p = i * 4;
|
||||
int index = buffer[i];
|
||||
dpix[p + 0] = palette[index * 3 + 2];
|
||||
dpix[p + 1] = palette[index * 3 + 1];
|
||||
dpix[p + 2] = palette[index * 3];
|
||||
int index = w->buffer[i];
|
||||
dpix[p + 0] = w->palette[index * 3 + 2];
|
||||
dpix[p + 1] = w->palette[index * 3 + 1];
|
||||
dpix[p + 2] = w->palette[index * 3];
|
||||
dpix[p + 3] = 255;
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue