diff options
author | LepkoQQ <lepko.san@gmail.com> | 2020-04-26 18:30:11 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2020-04-26 20:29:17 +0200 |
commit | d009df074f9be2936df074690bc4d1616d15668a (patch) | |
tree | 9d11c7688fadeb482e0638804f565ddc362cbe98 /Libraries/LibGfx/PNGLoader.cpp | |
parent | 2778d077e598c2ab6ee4a464699065a16b4da45d (diff) | |
download | serenity-d009df074f9be2936df074690bc4d1616d15668a.zip |
LibGfx: PNGLoader support for grayscale images with 8/16bpp.
Diffstat (limited to 'Libraries/LibGfx/PNGLoader.cpp')
-rw-r--r-- | Libraries/LibGfx/PNGLoader.cpp | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/Libraries/LibGfx/PNGLoader.cpp b/Libraries/LibGfx/PNGLoader.cpp index bd11ceafe6..9c4c686368 100644 --- a/Libraries/LibGfx/PNGLoader.cpp +++ b/Libraries/LibGfx/PNGLoader.cpp @@ -304,6 +304,33 @@ template<bool has_alpha, u8 filter_type> { // First unpack the scanlines to RGBA: switch (context.color_type) { + case 0: + if (context.bit_depth == 8) { + for (int y = 0; y < context.height; ++y) { + auto* gray_values = (u8*)context.scanlines[y].data.data(); + for (int i = 0; i < context.width; ++i) { + auto& pixel = (Pixel&)context.bitmap->scanline(y)[i]; + pixel.r = gray_values[i]; + pixel.g = gray_values[i]; + pixel.b = gray_values[i]; + pixel.a = 0xff; + } + } + } else if (context.bit_depth == 16) { + for (int y = 0; y < context.height; ++y) { + auto* gray_values = (u16*)context.scanlines[y].data.data(); + for (int i = 0; i < context.width; ++i) { + auto& pixel = (Pixel&)context.bitmap->scanline(y)[i]; + pixel.r = gray_values[i] & 0xFF; + pixel.g = gray_values[i] & 0xFF; + pixel.b = gray_values[i] & 0xFF; + pixel.a = 0xff; + } + } + } else { + ASSERT_NOT_REACHED(); + } + break; case 2: if (context.bit_depth == 8) { for (int y = 0; y < context.height; ++y) { @@ -582,6 +609,13 @@ static bool process_IHDR(const ByteBuffer& data, PNGLoadingContext& context, boo switch (context.color_type) { case 0: // Each pixel is a grayscale sample. + // FIXME: Implement support for 1/2/4 bit grayscale based images. + if (ihdr.bit_depth != 8 && ihdr.bit_depth != 16) { + dbgprintf("PNGLoader::process_IHDR: Unsupported grayscale format (%d bpp).\n", context.bit_depth); + return false; + } + context.bytes_per_pixel = ihdr.bit_depth / 8; + break; case 4: // Each pixel is a grayscale sample, followed by an alpha sample. // FIXME: Implement grayscale PNG support. dbgprintf("PNGLoader::process_IHDR: Unsupported grayscale format.\n"); |