Clean up some compressed texture loading code.

This commit is contained in:
Alex Szpakowski
2022-04-22 22:55:48 -03:00
parent 4e051c6faa
commit a9cca65a14
16 changed files with 37 additions and 68 deletions
+4 -4
View File
@@ -105,7 +105,7 @@ bool ASTCHandler::canParseCompressed(Data *data)
return true;
}
StrongRef<CompressedMemory> ASTCHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
StrongRef<ByteData> ASTCHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
{
if (!canParseCompressed(filedata))
throw love::Exception("Could not decode compressed data (not an .astc file?)");
@@ -125,15 +125,15 @@ StrongRef<CompressedMemory> ASTCHandler::parseCompressed(Data *filedata, std::ve
uint32 blocksY = (sizeY + header.blockdimY - 1) / header.blockdimY;
uint32 blocksZ = (sizeZ + header.blockdimZ - 1) / header.blockdimZ;
size_t totalsize = blocksX * blocksY * blocksZ * 16;
size_t totalsize = (size_t) blocksX * blocksY * blocksZ * 16;
if (totalsize + sizeof(header) > filedata->getSize())
throw love::Exception("Could not parse .astc file: file is too small.");
StrongRef<CompressedMemory> memory(new CompressedMemory(totalsize), Acquire::NORETAIN);
StrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);
// .astc files only store a single mipmap level.
memcpy(memory->data, (uint8 *) filedata->getData() + sizeof(ASTCHeader), totalsize);
memcpy(memory->getData(), (uint8 *) filedata->getData() + sizeof(ASTCHeader), totalsize);
images.emplace_back(new CompressedSlice(cformat, sizeX, sizeY, memory, 0, totalsize), Acquire::NORETAIN);
+1 -1
View File
@@ -43,7 +43,7 @@ public:
// Implements FormatHandler.
bool canParseCompressed(Data *data) override;
StrongRef<CompressedMemory> parseCompressed(Data *filedata,
StrongRef<ByteData> parseCompressed(Data *filedata,
std::vector<StrongRef<CompressedSlice>> &images,
PixelFormat &format, bool &sRGB) override;
+3 -4
View File
@@ -298,7 +298,7 @@ bool KTXHandler::canParseCompressed(Data *data)
return true;
}
StrongRef<CompressedMemory> KTXHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
StrongRef<ByteData> KTXHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
{
if (!canParseCompressed(filedata))
throw love::Exception("Could not decode compressed data (not a KTX file?)");
@@ -354,8 +354,7 @@ StrongRef<CompressedMemory> KTXHandler::parseCompressed(Data *filedata, std::vec
fileoffset += mipsizepadded;
}
StrongRef<CompressedMemory> memory;
memory.set(new CompressedMemory(totalsize), Acquire::NORETAIN);
StrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);
// Reset the file offset to the start of the file's image data.
fileoffset = sizeof(KTXHeader) + header.bytesOfKeyValueData;
@@ -376,7 +375,7 @@ StrongRef<CompressedMemory> KTXHandler::parseCompressed(Data *filedata, std::vec
int width = (int) std::max(header.pixelWidth >> i, 1u);
int height = (int) std::max(header.pixelHeight >> i, 1u);
memcpy(memory->data + dataoffset, filebytes + fileoffset, mipsize);
memcpy((uint8 *) memory->getData() + dataoffset, filebytes + fileoffset, mipsize);
auto slice = new CompressedSlice(cformat, width, height, memory, dataoffset, mipsize);
images.push_back(slice);
+1 -1
View File
@@ -42,7 +42,7 @@ public:
// Implements FormatHandler.
bool canParseCompressed(Data *data) override;
StrongRef<CompressedMemory> parseCompressed(Data *filedata,
StrongRef<ByteData> parseCompressed(Data *filedata,
std::vector<StrongRef<CompressedSlice>> &images,
PixelFormat &format, bool &sRGB) override;
+3 -4
View File
@@ -114,7 +114,7 @@ bool PKMHandler::canParseCompressed(Data *data)
return true;
}
StrongRef<CompressedMemory> PKMHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
StrongRef<ByteData> PKMHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
{
if (!canParseCompressed(filedata))
throw love::Exception("Could not decode compressed data (not a PKM file?)");
@@ -135,11 +135,10 @@ StrongRef<CompressedMemory> PKMHandler::parseCompressed(Data *filedata, std::vec
// The rest of the file after the header is all texture data.
size_t totalsize = filedata->getSize() - sizeof(PKMHeader);
StrongRef<CompressedMemory> memory;
memory.set(new CompressedMemory(totalsize), Acquire::NORETAIN);
StrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);
// PKM files only store a single mipmap level.
memcpy(memory->data, (uint8 *) filedata->getData() + sizeof(PKMHeader), totalsize);
memcpy(memory->getData(), (uint8 *) filedata->getData() + sizeof(PKMHeader), totalsize);
// TODO: verify whether glCompressedTexImage works properly with the unpadded
// width and height values (extended == padded.)
+1 -1
View File
@@ -42,7 +42,7 @@ public:
// Implements FormatHandler.
bool canParseCompressed(Data *data) override;
StrongRef<CompressedMemory> parseCompressed(Data *filedata,
StrongRef<ByteData> parseCompressed(Data *filedata,
std::vector<StrongRef<CompressedSlice>> &images,
PixelFormat &format, bool &sRGB) override;
+4 -4
View File
@@ -475,7 +475,7 @@ bool PVRHandler::canParseCompressed(Data *data)
return false;
}
StrongRef<CompressedMemory> PVRHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
StrongRef<ByteData> PVRHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
{
if (!canParseCompressed(filedata))
throw love::Exception("Could not decode compressed data (not a PVR file?)");
@@ -525,8 +525,8 @@ StrongRef<CompressedMemory> PVRHandler::parseCompressed(Data *filedata, std::vec
if (filedata->getSize() < fileoffset + totalsize)
throw love::Exception("Could not parse PVR file: invalid size calculation.");
StrongRef<CompressedMemory> memory;
memory.set(new CompressedMemory(totalsize), Acquire::NORETAIN);
;
StrongRef<ByteData> memory(new ByteData(totalsize, false), Acquire::NORETAIN);
size_t curoffset = 0;
const uint8 *filebytes = (uint8 *) filedata->getData() + fileoffset;
@@ -541,7 +541,7 @@ StrongRef<CompressedMemory> PVRHandler::parseCompressed(Data *filedata, std::vec
int width = std::max((int) header3.width >> i, 1);
int height = std::max((int) header3.height >> i, 1);
memcpy(memory->data + curoffset, filebytes + curoffset, mipsize);
memcpy((uint8 *) memory->getData() + curoffset, filebytes + curoffset, mipsize);
auto slice = new CompressedSlice(cformat, width, height, memory, curoffset, mipsize);
images.push_back(slice);
+1 -1
View File
@@ -40,7 +40,7 @@ public:
// Implements FormatHandler.
bool canParseCompressed(Data *data) override;
StrongRef<CompressedMemory> parseCompressed(Data *filedata,
StrongRef<ByteData> parseCompressed(Data *filedata,
std::vector<StrongRef<CompressedSlice>> &images,
PixelFormat &format, bool &sRGB) override;
+3 -4
View File
@@ -229,7 +229,7 @@ bool DDSHandler::canParseCompressed(Data *data)
return dds::isCompressedDDS(data->getData(), data->getSize());
}
StrongRef<CompressedMemory> DDSHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
StrongRef<ByteData> DDSHandler::parseCompressed(Data *filedata, std::vector<StrongRef<CompressedSlice>> &images, PixelFormat &format, bool &sRGB)
{
if (!dds::isCompressedDDS(filedata->getData(), filedata->getSize()))
throw love::Exception("Could not decode compressed data (not a DDS file?)");
@@ -238,7 +238,6 @@ StrongRef<CompressedMemory> DDSHandler::parseCompressed(Data *filedata, std::vec
bool isSRGB = false;
bool bgra = false;
StrongRef<CompressedMemory> memory;
size_t dataSize = 0;
images.clear();
@@ -261,7 +260,7 @@ StrongRef<CompressedMemory> DDSHandler::parseCompressed(Data *filedata, std::vec
dataSize += img->dataSize;
}
memory.set(new CompressedMemory(dataSize), Acquire::NORETAIN);
StrongRef<ByteData> memory(new ByteData(dataSize, false), Acquire::NORETAIN);
size_t dataOffset = 0;
@@ -272,7 +271,7 @@ StrongRef<CompressedMemory> DDSHandler::parseCompressed(Data *filedata, std::vec
const dds::Image *img = parser.getImageData(i);
// Copy the mipmap image from the FileData to our block of memory.
memcpy(memory->data + dataOffset, img->data, img->dataSize);
memcpy((uint8 *) memory->getData() + dataOffset, img->data, img->dataSize);
auto slice = new CompressedSlice(texformat, img->width, img->height, memory, dataOffset, img->dataSize);
images.emplace_back(slice, Acquire::NORETAIN);
+1 -1
View File
@@ -46,7 +46,7 @@ public:
bool canDecode(Data *data) override;
DecodedImage decode(Data *data) override;
bool canParseCompressed(Data *data) override;
StrongRef<CompressedMemory> parseCompressed(Data *filedata,
StrongRef<ByteData> parseCompressed(Data *filedata,
std::vector<StrongRef<CompressedSlice>> &images,
PixelFormat &format, bool &sRGB) override;