From sam at horsedrawngames.com Thu May 19 00:17:02 2016 From: sam at horsedrawngames.com (Sam Izzo) Date: Thu, 19 May 2016 14:17:02 +1000 Subject: [mojosetup] Support for BMPV5 headers Message-ID: Hi, I added support for BMPV5 headers. Attached is a patch. I pulled the change from the latest stb_image, which already supports it. BMPV5 adds ICC colour profiles; stb_image just ignores it. My ImageMagick was generating BMPV5 format, and I had no idea why the image wasn't showing up in the installer (I also have changes to add some more debug logging if you want to merge that in too). I considered merging in the latest stb_image but it's quite a bit newer, and there were a lot of changes. It was going to be more work than I wanted to do right now :) Cheers, Sam -------------- next part -------------- # HG changeset patch # User Sam Izzo # Date 1463631005 -36000 # Thu May 19 14:10:05 2016 +1000 # Node ID 7473ad8918d5eb5fdde727027f15ea5b3e3300a9 # Parent 0e351d80da0467cc7b11a5a8c5ce5aa3f0aca153 Pulled in support for V5 BMP headers from the latest stb_image. diff -r 0e351d80da04 -r 7473ad8918d5 stb_image.c --- a/stb_image.c Fri Jan 01 19:53:21 2016 +0100 +++ b/stb_image.c Thu May 19 14:10:05 2016 +1000 @@ -2661,7 +2661,7 @@ get16le(); // discard reserved get32le(); // discard data offset sz = get32le(); - if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1; + if (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124) return 1; return 0; } @@ -2744,7 +2744,7 @@ get16le(); // discard reserved offset = get32le(); hsz = get32le(); - if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return epuc("unknown BMP", "BMP type not supported: unknown"); failure_reason = "bad BMP"; if (hsz == 12) { img_x = get16le(); @@ -2801,7 +2801,8 @@ return NULL; } } else { - assert(hsz == 108); + if (hsz != 108 && hsz != 124) + return epuc("bad BMP", "bad BMP"); mr = get32le(); mg = get32le(); mb = get32le(); @@ -2809,6 +2810,12 @@ get32le(); // discard color space for (i=0; i < 12; ++i) get32le(); // discard color space parameters + if (hsz == 124) { + get32le(); // discard rendering intent + get32le(); // discard offset of profile data + get32le(); // discard size of profile data + get32le(); // discard reserved + } } if (bpp < 16) psize = (offset - 14 - hsz) >> 2;