From b89c2d1b70a26282bbd4bb830f5ffd124df01ab1 Mon Sep 17 00:00:00 2001 From: Halla Rempt Date: Wed, 5 Jan 2022 15:51:16 +0100 Subject: [PATCH] Deal with different offsets in kra and ora Because of a change in zip library, the location of the mimetype is different for different versions of krita. --- src/imageformats/kra.cpp | 11 +++++++---- src/imageformats/ora.cpp | 14 ++++++++++---- 2 files changed, 17 insertions(+), 8 deletions(-) diff --git a/src/imageformats/kra.cpp b/src/imageformats/kra.cpp index a5e75ca..b4cbf1d 100644 --- a/src/imageformats/kra.cpp +++ b/src/imageformats/kra.cpp @@ -18,6 +18,11 @@ static constexpr char s_magic[] = "application/x-krita"; static constexpr int s_magic_size = sizeof(s_magic) - 1; // -1 to remove the last \0 +static constexpr int s_krita3_offset = 0x26; +static constexpr int s_krita4_offset = 0x2B; +static constexpr int s_krita4_64_offset = 0x40; +static constexpr int s_krita5_offset = 0x26; +static constexpr int s_krita5_64_offset = 0x3A; KraHandler::KraHandler() { @@ -58,10 +63,8 @@ bool KraHandler::canRead(QIODevice *device) return false; } - char buff[57]; - if (device->peek(buff, sizeof(buff)) == sizeof(buff)) { - return memcmp(buff + 0x26, s_magic, s_magic_size) == 0; - } + ByteArray ba = device->peek(43 + s_magic_size); + return (ba.contains(s_magic)); return false; } diff --git a/src/imageformats/ora.cpp b/src/imageformats/ora.cpp index 96290e8..2f78035 100644 --- a/src/imageformats/ora.cpp +++ b/src/imageformats/ora.cpp @@ -17,6 +17,11 @@ static constexpr char s_magic[] = "image/openraster"; static constexpr int s_magic_size = sizeof(s_magic) - 1; // -1 to remove the last \0 +static constexpr int s_krita3_offset = 0x26; +static constexpr int s_krita4_offset = 0x2B; +static constexpr int s_krita4_64_offset = 0x40; +static constexpr int s_krita5_offset = 0x26; +static constexpr int s_krita5_64_offset = 0x3A; OraHandler::OraHandler() { @@ -57,10 +62,11 @@ bool OraHandler::canRead(QIODevice *device) return false; } - char buff[54]; - if (device->peek(buff, sizeof(buff)) == sizeof(buff)) { - return memcmp(buff + 0x26, s_magic, s_magic_size) == 0; - } + if (device->peek(s_krita3_offset + s_magic_size).contains(s_magic)) return true; + if (device->peek(s_krita4_offset + s_magic_size).contains(s_magic)) return true; + if (device->peek(s_krita4_64_offset + s_magic_size).contains(s_magic)) return true; + if (device->peek(s_krita5_offset + s_magic_size).contains(s_magic)) return true; + if (device->peek(s_krita5_64_offset + s_magic_size).contains(s_magic)) return true; return false; }