blob: 41e62ca952ebf5025122d8ca1f9cf2d6ff691df0 [file] [log] [blame]
#include <cstring>
#include "graphics/surface.hpp"
#include "metadata.hpp"
#include "executable.hpp"
using namespace blit;
void parse_metadata(char *data, uint16_t metadata_len, BlitGameMetadata &metadata, bool unpack_images) {
metadata.length = metadata_len;
auto raw_meta = reinterpret_cast<RawMetadata *>(data);
metadata.crc32 = raw_meta->crc32;
metadata.title = raw_meta->title;
metadata.description = raw_meta->description;
metadata.version = raw_meta->version;
metadata.author = raw_meta->author;
uint16_t offset = sizeof(RawMetadata);
if(unpack_images && metadata.icon)
metadata.free_surfaces();
if(offset != metadata_len && memcmp(data + offset, "BLITTYPE", 8) == 0) {
auto type_meta = reinterpret_cast<RawTypeMetadata *>(data + offset + 8);
offset += sizeof(RawTypeMetadata) + 8 + type_meta->num_filetypes * 5;
metadata.category = type_meta->category;
metadata.filetypes.resize(type_meta->num_filetypes);
for(int i = 0; i < type_meta->num_filetypes; i++)
metadata.filetypes[i] = type_meta->filetypes[i];
}
if(offset != metadata_len && unpack_images) {
// icon/splash
auto image = reinterpret_cast<packed_image *>(data + offset);
metadata.icon = Surface::load(reinterpret_cast<uint8_t *>(data + offset));
offset += image->byte_count;
image = reinterpret_cast<packed_image *>(data + offset);
metadata.splash = Surface::load(reinterpret_cast<uint8_t *>(data + offset));
}
}