diff --git a/source/core/StarImage.cpp b/source/core/StarImage.cpp index 82e3b05..52c2370 100644 --- a/source/core/StarImage.cpp +++ b/source/core/StarImage.cpp @@ -17,6 +17,12 @@ void readPngData(png_structp pngPtr, png_bytep data, png_size_t length) { ((IODevice*)png_get_io_ptr(pngPtr))->readFull((char*)data, length); }; +bool Image::isPng(IODevicePtr device) { + png_byte header[8]; + device->readAbsolute(0, (char*)header, sizeof(header)); + return !png_sig_cmp(header, 0, sizeof(header)); +} + Image Image::readPng(IODevicePtr device) { png_byte header[8]; device->readFull((char*)header, sizeof(header)); diff --git a/source/core/StarImage.hpp b/source/core/StarImage.hpp index 478d074..aac0105 100644 --- a/source/core/StarImage.hpp +++ b/source/core/StarImage.hpp @@ -27,6 +27,7 @@ STAR_CLASS(Image); class Image { public: static Image readPng(IODevicePtr device); + static bool isPng(IODevicePtr device); // Returns the size and pixel format that would be constructed from the given // png file, without actually loading it. static tuple readPngMetadata(IODevicePtr device); diff --git a/source/game/StarImageMetadataDatabase.cpp b/source/game/StarImageMetadataDatabase.cpp index bf84e51..d04e984 100644 --- a/source/game/StarImageMetadataDatabase.cpp +++ b/source/game/StarImageMetadataDatabase.cpp @@ -174,7 +174,11 @@ Vec2U ImageMetadataDatabase::calculateImageSize(AssetPath const& path) const { imageSize = *size; } else { locker.unlock(); - imageSize = get<0>(Image::readPngMetadata(assets->openFile(path.basePath))); + auto file = assets->openFile(path.basePath); + if (Image::isPng(file)) + imageSize = get<0>(Image::readPngMetadata(file)); + else + imageSize = fallback(); locker.lock(); m_sizeCache[path.basePath] = imageSize; }