mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-19 02:38:32 +00:00
AGS: Tidy some code in SpriteFile class
From upstream 923c4b3e9ab23359c57233802acf57430843a308
This commit is contained in:
parent
dccb2405e8
commit
77e4a7f520
@ -153,7 +153,6 @@ private:
|
||||
void DisposeOldest();
|
||||
|
||||
// Information required for the sprite streaming
|
||||
// TODO: split into sprite cache and sprite stream data
|
||||
struct SpriteData {
|
||||
size_t Size; // to track cache size
|
||||
uint32_t Flags;
|
||||
|
@ -74,18 +74,15 @@ HError SpriteFile::OpenFile(const String &filename, const String &sprindex_filen
|
||||
return new Error("Uknown spriteset format.");
|
||||
}
|
||||
|
||||
if (vers == kSprfVersion_Uncompressed) {
|
||||
this->_compressed = false;
|
||||
} else if (vers == kSprfVersion_Compressed) {
|
||||
this->_compressed = true;
|
||||
} else if (vers >= kSprfVersion_Last32bit) {
|
||||
this->_compressed = (_stream->ReadInt8() == 1);
|
||||
spriteFileID = _stream->ReadInt32();
|
||||
}
|
||||
|
||||
if (vers < kSprfVersion_Compressed) {
|
||||
_compressed = false;
|
||||
// skip the palette
|
||||
_stream->Seek(256 * 3); // sizeof(RGB) * 256
|
||||
} else if (vers == kSprfVersion_Compressed) {
|
||||
_compressed = true;
|
||||
} else if (vers >= kSprfVersion_Last32bit) {
|
||||
_compressed = (_stream->ReadInt8() == 1);
|
||||
spriteFileID = _stream->ReadInt32();
|
||||
}
|
||||
|
||||
sprkey_t topmost;
|
||||
@ -191,37 +188,17 @@ bool SpriteFile::LoadSpriteIndexFile(const String &filename, int expectedFileID,
|
||||
|
||||
HError SpriteFile::RebuildSpriteIndex(Stream *in, sprkey_t topmost,
|
||||
SpriteFileVersion vers, std::vector<Size> &metrics) {
|
||||
for (sprkey_t i = 0; i <= topmost; ++i) {
|
||||
topmost = std::min(topmost, (sprkey_t)_spriteData.size() - 1);
|
||||
for (sprkey_t i = 0; !in->EOS() && (i <= topmost); ++i) {
|
||||
_spriteData[i].Offset = in->GetPosition();
|
||||
|
||||
int coldep = in->ReadInt16();
|
||||
|
||||
if (coldep == 0) {
|
||||
if (in->EOS())
|
||||
break;
|
||||
continue;
|
||||
}
|
||||
|
||||
if (in->EOS())
|
||||
break;
|
||||
|
||||
if ((size_t)i >= _spriteData.size())
|
||||
break;
|
||||
|
||||
int wdd = in->ReadInt16();
|
||||
int htt = in->ReadInt16();
|
||||
metrics[i].Width = wdd;
|
||||
metrics[i].Height = htt;
|
||||
|
||||
size_t spriteDataSize;
|
||||
if (vers == kSprfVersion_Compressed) {
|
||||
spriteDataSize = in->ReadInt32();
|
||||
} else if (vers >= kSprfVersion_Last32bit) {
|
||||
spriteDataSize = this->_compressed ? in->ReadInt32() : wdd * coldep * htt;
|
||||
} else {
|
||||
spriteDataSize = wdd * coldep * htt;
|
||||
}
|
||||
in->Seek(spriteDataSize);
|
||||
int bpp = in->ReadInt16();
|
||||
if (bpp == 0) continue; // empty slot
|
||||
int w = in->ReadInt16();
|
||||
int h = in->ReadInt16();
|
||||
metrics[i].Width = w;
|
||||
metrics[i].Height = h;
|
||||
size_t data_sz = _compressed ? in->ReadInt32() : w * h * bpp;
|
||||
in->Seek(data_sz); // skip image data
|
||||
}
|
||||
return HError::None();
|
||||
}
|
||||
@ -238,17 +215,16 @@ HError SpriteFile::LoadSprite(sprkey_t index, Shared::Bitmap *&sprite) {
|
||||
SeekToSprite(index);
|
||||
_curPos = -2; // mark undefined pos
|
||||
|
||||
int coldep = _stream->ReadInt16();
|
||||
if (coldep == 0) { // empty slot, this is normal
|
||||
int bpp = _stream->ReadInt16();
|
||||
if (bpp == 0) { // empty slot, this is normal
|
||||
return HError::None();
|
||||
}
|
||||
|
||||
int wdd = _stream->ReadInt16();
|
||||
int htt = _stream->ReadInt16();
|
||||
Bitmap *image = BitmapHelper::CreateBitmap(wdd, htt, coldep * 8);
|
||||
int w = _stream->ReadInt16();
|
||||
int h = _stream->ReadInt16();
|
||||
Bitmap *image = BitmapHelper::CreateBitmap(w, h, bpp * 8);
|
||||
if (image == nullptr) {
|
||||
return new Error(String::FromFormat("LoadSprite: failed to allocate bitmap %d (%dx%d%d).",
|
||||
index, wdd, htt, coldep * 8));
|
||||
index, w, h, bpp * 8));
|
||||
}
|
||||
|
||||
if (_compressed) {
|
||||
@ -258,27 +234,28 @@ HError SpriteFile::LoadSprite(sprkey_t index, Shared::Bitmap *&sprite) {
|
||||
return new Error(String::FromFormat("LoadSprite: bad compressed data for sprite %d.", index));
|
||||
}
|
||||
rle_decompress(image, _stream.get());
|
||||
// TODO: test that not more than data_size was read!
|
||||
} else {
|
||||
if (coldep == 1) {
|
||||
for (int h = 0; h < htt; ++h)
|
||||
_stream->ReadArray(&image->GetScanLineForWriting(h)[0], coldep, wdd);
|
||||
} else if (coldep == 2) {
|
||||
for (int h = 0; h < htt; ++h)
|
||||
_stream->ReadArrayOfInt16((int16_t *)&image->GetScanLineForWriting(h)[0], wdd);
|
||||
} else {
|
||||
for (int h = 0; h < htt; ++h)
|
||||
_stream->ReadArrayOfInt32((int32_t *)&image->GetScanLineForWriting(h)[0], wdd);
|
||||
switch (bpp) {
|
||||
case 1: _stream->Read(image->GetDataForWriting(), w * h); break;
|
||||
case 2: _stream->ReadArrayOfInt16(
|
||||
reinterpret_cast<int16_t *>(image->GetDataForWriting()), w *h); break;
|
||||
case 4: _stream->ReadArrayOfInt32(
|
||||
reinterpret_cast<int32_t *>(image->GetDataForWriting()), w *h); break;
|
||||
default: assert(0); break;
|
||||
}
|
||||
}
|
||||
|
||||
sprite = image;
|
||||
_curPos = index + 1; // mark correct pos
|
||||
return HError::None();
|
||||
}
|
||||
|
||||
HError SpriteFile::LoadSpriteData(sprkey_t index, Size &metric, int &bpp,
|
||||
std::vector<uint8_t> &data) {
|
||||
std::vector<uint8_t> &data) {
|
||||
metric = Size();
|
||||
bpp = 0;
|
||||
data.resize(0);
|
||||
if (index < 0 || (size_t)index >= _spriteData.size())
|
||||
new Error(String::FromFormat("LoadSprite: slot index %d out of bounds (%d - %d).",
|
||||
index, 0, _spriteData.size() - 1));
|
||||
@ -289,26 +266,17 @@ HError SpriteFile::LoadSpriteData(sprkey_t index, Size &metric, int &bpp,
|
||||
SeekToSprite(index);
|
||||
_curPos = -2; // mark undefined pos
|
||||
|
||||
int coldep = _stream->ReadInt16();
|
||||
if (coldep == 0) { // empty slot, this is normal
|
||||
metric = Size();
|
||||
bpp = 0;
|
||||
data.resize(0);
|
||||
bpp = _stream->ReadInt16();
|
||||
if (bpp == 0) { // empty slot, this is normal
|
||||
return HError::None();
|
||||
}
|
||||
|
||||
int width = _stream->ReadInt16();
|
||||
int height = _stream->ReadInt16();
|
||||
|
||||
size_t data_size;
|
||||
if (_compressed)
|
||||
data_size = _stream->ReadInt32();
|
||||
else
|
||||
data_size = width * height * coldep;
|
||||
int w = _stream->ReadInt16();
|
||||
int h = _stream->ReadInt16();
|
||||
size_t data_size = _compressed ? _stream->ReadInt32() : w * h * bpp;
|
||||
data.resize(data_size);
|
||||
_stream->Read(&data[0], data_size);
|
||||
metric = Size(width, height);
|
||||
bpp = coldep;
|
||||
metric = Size(w, h);
|
||||
|
||||
_curPos = index + 1; // mark correct pos
|
||||
return HError::None();
|
||||
}
|
||||
@ -402,9 +370,9 @@ int SaveSpriteIndex(const String &filename, const SpriteFileIndex &index) {
|
||||
out->WriteInt32(index.GetLastSlot());
|
||||
out->WriteInt32(index.GetCount());
|
||||
if (index.GetCount() > 0) {
|
||||
out->WriteArrayOfInt16(&index.Widths.front(), index.Widths.size());
|
||||
out->WriteArrayOfInt16(&index.Heights.front(), index.Heights.size());
|
||||
out->WriteArrayOfInt64(&index.Offsets.front(), index.Offsets.size());
|
||||
out->WriteArrayOfInt16(&index.Widths[0], index.Widths.size());
|
||||
out->WriteArrayOfInt16(&index.Heights[0], index.Heights.size());
|
||||
out->WriteArrayOfInt64(&index.Offsets[0], index.Offsets.size());
|
||||
}
|
||||
delete out;
|
||||
return 0;
|
||||
@ -440,7 +408,7 @@ void SpriteFileWriter::Begin(bool compressed, sprkey_t last_slot) {
|
||||
|
||||
void SpriteFileWriter::WriteBitmap(Bitmap *image) {
|
||||
if (!_out) return;
|
||||
int bpp = image->GetColorDepth() / 8;
|
||||
int bpp = image->GetBPP();
|
||||
int w = image->GetWidth();
|
||||
int h = image->GetHeight();
|
||||
if (_compress) {
|
||||
|
@ -113,7 +113,8 @@ private:
|
||||
// Internal sprite reference
|
||||
struct SpriteRef {
|
||||
soff_t Offset = 0; // data offset
|
||||
size_t Size = 0; // cache size of element, in bytes
|
||||
size_t RawSize = 0; // file size of element, in bytes
|
||||
// TODO: RawSize is currently unused, due to incompleteness of spriteindex format
|
||||
};
|
||||
|
||||
// Array of sprite references
|
||||
|
Loading…
x
Reference in New Issue
Block a user