From aeab1e20ad3de2e84a137673f0879e48b1096ee8 Mon Sep 17 00:00:00 2001 From: Damien-Chen Date: Thu, 22 Aug 2024 20:35:16 +0800 Subject: [PATCH] image.c: Parse header of image to determine supported format. --- src/image.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/image.c b/src/image.c index e98f658..117a510 100644 --- a/src/image.c +++ b/src/image.c @@ -40,28 +40,35 @@ static twin_image_format_t image_type_from_name(const char *path) FILE *file = fopen(path, "rb"); if (!file) { - perror("File opening failed"); + perror("Failed to open %s"); return IMAGE_TYPE_unknown; } - unsigned char header[8]; - size_t bytesRead = fread(header, 1, sizeof(header), file); + uint8_t header[8]; + size_t bytes_read = fread(header, 1, sizeof(header), file); fclose(file); - if (bytesRead < 8) { + if (bytes_read < 8) { return IMAGE_TYPE_unknown; } #if LOADER_HAS(PNG) - if (header[0] == 0x89 && header[1] == 0x50 && header[2] == 0x4E && - header[3] == 0x47 && header[4] == 0x0D && header[5] == 0x0A && - header[6] == 0x1A && header[7] == 0x0A) { +#if __BYTE_ORDER == __BIG_ENDIAN + uint8_t png_header[8] = {0x89, 0x50, 0x4E, 0x47, 0x0D, 0x0A, 0x1A, 0x0A}; + if (memcmp(header, png_header, sizeof(png_header)) == 0) { type = IMAGE_TYPE_png; } +#else + uint8_t png_header[8] = {0x0A, 0x1A, 0x0A, 0x0D, 0x47, 0x4E, 0x50, 0x89}; + if (memcmp(header, png_header, sizeof(png_header)) == 0) { + type = IMAGE_TYPE_png; + } +#endif #endif #if LOADER_HAS(JPEG) - else if (header[0] == 0xFF && header[1] == 0xD8 && header[2] == 0xFF) { + uint8_t jpg_header[3] = {0xFF, 0xD8, 0xFF}; + if (memcmp(header, jpg_header, sizeof(jpg_header)) == 0) { type = IMAGE_TYPE_jpeg; } #endif