LibGfx+Tests: Load bmp files with unpremultiplied alpha

From what I can tell BMP files with an alpha channel always store
unpremultiplied alpha. So let's load them as such to avoid rendering
artifacts from using the wrong alpha type.
This commit is contained in:
InvalidUsernameException 2025-11-27 22:18:14 +01:00 committed by Jelle Raaijmakers
parent 949053cee7
commit bc44203744
Notes: github-actions[bot] 2025-11-28 16:01:33 +00:00
3 changed files with 24 additions and 1 deletions

View file

@ -1298,7 +1298,7 @@ static ErrorOr<void> decode_bmp_pixel_data(BMPLoadingContext& context)
u32 const width = abs(context.dib.core.width);
u32 const height = !context.is_included_in_ico ? abs(context.dib.core.height) : (abs(context.dib.core.height) / 2);
context.bitmap = TRY(Bitmap::create(format, { static_cast<int>(width), static_cast<int>(height) }));
context.bitmap = TRY(Bitmap::create(format, Gfx::AlphaType::Unpremultiplied, { static_cast<int>(width), static_cast<int>(height) }));
ByteBuffer rle_buffer;
ReadonlyBytes bytes { context.file_bytes + context.data_offset, context.file_size - context.data_offset };

View file

@ -0,0 +1,11 @@
<!DOCTYPE html>
<style>
body {
color: white;
background-color: black;
}
</style>
<p>All three images should render the same</p>
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAgAAAqgAA+QAA/QAA/QAA/QAA/QAA/QAA/QAA/QAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/wDNmTtpAAAAGHRSTlMAAQIkXF11d3h6foCBiImXnZ7Iy87S3d5CsE4PAAAAZ0lEQVQY02VPwRaAIAijSMvSsrLa/39pil6KPQ5s8MYgEvDzMDV0w9CRA1ztiAwQ+wVY+giYKiB6wGcuQhkgSeVVMdnQsBfOdpyOys9ptEw3Pri1wHMIqZJrDTNrU31WBVPR1XO/918rbA2ED1iblwAAAABJRU5ErkJggg==">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAgAAAqgAA+QAA/QAA/QAA/QAA/QAA/QAA/QAA/QAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/wDNmTtpAAAAGHRSTlMAAQIkXF11d3h6foCBiImXnZ7Iy87S3d5CsE4PAAAAZ0lEQVQY02VPwRaAIAijSMvSsrLa/39pil6KPQ5s8MYgEvDzMDV0w9CRA1ztiAwQ+wVY+giYKiB6wGcuQhkgSeVVMdnQsBfOdpyOys9ptEw3Pri1wHMIqZJrDTNrU31WBVPR1XO/918rbA2ED1iblwAAAABJRU5ErkJggg==">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAgAAAqgAA+QAA/QAA/QAA/QAA/QAA/QAA/QAA/QAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/wDNmTtpAAAAGHRSTlMAAQIkXF11d3h6foCBiImXnZ7Iy87S3d5CsE4PAAAAZ0lEQVQY02VPwRaAIAijSMvSsrLa/39pil6KPQ5s8MYgEvDzMDV0w9CRA1ztiAwQ+wVY+giYKiB6wGcuQhkgSeVVMdnQsBfOdpyOys9ptEw3Pri1wHMIqZJrDTNrU31WBVPR1XO/918rbA2ED1iblwAAAABJRU5ErkJggg==">

View file

@ -0,0 +1,12 @@
<!DOCTYPE html>
<link rel="match" href="../expected/bmp-load-as-unpremultiplied-alpha-ref.html" />
<style>
body {
color: white;
background-color: black;
}
</style>
<p>All three images should render the same</p>
<img src="data:image/vnd.microsoft.icon;base64,AAABAAEAEBAAAAEAIABoBAAAFgAAACgAAAAQAAAAIAAAAAEAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QAkAP4A3gD+AN4A+QAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAEA/QBcAP0AXACAAAEAAAAAAP0AegD/AP8A/wD/AP0AegAAAAAAgAABAP0AXAD9AFwAgAABAAAAAAAAAAAA/QBdAP8A/wD/AP8A/gCdAKoAAgD+AIAA/wD/AP8A/wD+AIAAqgACAP4AnQD/AP8A/wD/AP0AXQAAAAAAAAAAAP0AXQD/AP8A/wD/AP8A/wD+AJ0A/gCBAP8A/wD/AP8A/gCBAP4AnQD/AP8A/wD/AP8A/wD9AF0AAAAAAAAAAACqAAIA/gCdAP8A/wD/AP8A/wD/AP4AzgD/AP8A/wD/AP4AzgD/AP8A/wD/AP8A/wD+AJ0AqgACAAAAAAAAAAAAAAAAAIAAAQD+AJcA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+AJ4AqgACAAAAAAAAAAAA+QAkAP0AfgD+AIgA/gCIAP4AzgD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+ANIA/gCJAP4AiAD9AH4A+QAkAP4A3QD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP4A3QD+AN0A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+AN0A+QAkAP0AdQD9AHcA/QB4AP4AyAD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+AMsA/QB4AP0AdwD9AHUA+QAkAAAAAAAAAAAAgAABAP4AlwD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP4AngCqAAIAAAAAAAAAAAAAAAAAqgACAP4AnQD/AP8A/wD/AP8A/wD+AM4A/wD/AP8A/wD+AM4A/wD/AP8A/wD/AP8A/gCdAKoAAgAAAAAAAAAAAP0AXQD/AP8A/wD/AP8A/wD+AJ0A/gCBAP8A/wD/AP8A/gCBAP4AnQD/AP8A/wD/AP8A/wD9AF0AAAAAAAAAAAD9AF0A/wD/AP8A/wD+AJ0AqgACAP4AgAD/AP8A/wD/AP4AgACqAAIA/gCdAP8A/wD/AP8A/QBdAAAAAAAAAAAAgAABAP0AXAD9AFwAgAABAAAAAAD9AHoA/wD/AP8A/wD9AHoAAAAAAIAAAQD9AFwA/QBcAIAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA+QAkAP4A3gD+AN4A+QAkAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/D8AAIQhAACAAQAAgAEAAIABAADAAwAAAAAAAAAAAAAAAAAAAAAAAMADAACAAQAAgAEAAIABAACEIQAA/D8AAA==">
<img src="data:image/bmp;base64,Qk2KBAAAAAAAAIoAAAB8AAAAEAAAABAAAAABACAAAwAAAAAEAAAjLgAAIy4AAAAAAAAAAAAAAAD/AAD/AAD/AAAAAAAA/0JHUnMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAJAD+AN4A/gDeAPkAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAABAP0AXAD9AFwAgAABAAAAAAD9AHoA/wD/AP8A/wD9AHoAAAAAAIAAAQD9AFwA/QBcAIAAAQAAAAAAAAAAAP0AXQD/AP8A/wD/AP4AnQCqAAIA/gCAAP8A/wD/AP8A/gCAAKoAAgD+AJ0A/wD/AP8A/wD9AF0AAAAAAAAAAAD9AF0A/wD/AP8A/wD/AP8A/gCdAP4AgQD/AP8A/wD/AP4AgQD+AJ0A/wD/AP8A/wD/AP8A/QBdAAAAAAAAAAAAqgACAP4AnQD/AP8A/wD/AP8A/wD+AM4A/wD/AP8A/wD+AM4A/wD/AP8A/wD/AP8A/gCdAKoAAgAAAAAAAAAAAAAAAACAAAEA/gCXAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/gCeAKoAAgAAAAAAAAAAAPkAJAD9AH4A/gCIAP4AiAD+AM4A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/gDSAP4AiQD+AIgA/QB+APkAJAD+AN0A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+AN0A/gDdAP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/gDdAPkAJAD9AHUA/QB3AP0AeAD+AMgA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/gDLAP0AeAD9AHcA/QB1APkAJAAAAAAAAAAAAIAAAQD+AJcA/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD/AP8A/wD+AJ4AqgACAAAAAAAAAAAAAAAAAKoAAgD+AJ0A/wD/AP8A/wD/AP8A/gDOAP8A/wD/AP8A/gDOAP8A/wD/AP8A/wD/AP4AnQCqAAIAAAAAAAAAAAD9AF0A/wD/AP8A/wD/AP8A/gCdAP4AgQD/AP8A/wD/AP4AgQD+AJ0A/wD/AP8A/wD/AP8A/QBdAAAAAAAAAAAA/QBdAP8A/wD/AP8A/gCdAKoAAgD+AIAA/wD/AP8A/wD+AIAAqgACAP4AnQD/AP8A/wD/AP0AXQAAAAAAAAAAAIAAAQD9AFwA/QBcAIAAAQAAAAAA/QB6AP8A/wD/AP8A/QB6AAAAAACAAAEA/QBcAP0AXACAAAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPkAJAD+AN4A/gDeAPkAJAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA==">
<img src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAS1BMVEUAAAAAgAAAqgAA+QAA/QAA/QAA/QAA/QAA/QAA/QAA/QAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/gAA/wDNmTtpAAAAGHRSTlMAAQIkXF11d3h6foCBiImXnZ7Iy87S3d5CsE4PAAAAZ0lEQVQY02VPwRaAIAijSMvSsrLa/39pil6KPQ5s8MYgEvDzMDV0w9CRA1ztiAwQ+wVY+giYKiB6wGcuQhkgSeVVMdnQsBfOdpyOys9ptEw3Pri1wHMIqZJrDTNrU31WBVPR1XO/918rbA2ED1iblwAAAABJRU5ErkJggg==">