diff --git a/Userland/Applications/PixelPaint/Image.cpp b/Userland/Applications/PixelPaint/Image.cpp index 4638b83bad703e..2f71e5b382d08c 100644 --- a/Userland/Applications/PixelPaint/Image.cpp +++ b/Userland/Applications/PixelPaint/Image.cpp @@ -155,11 +155,11 @@ void Image::export_bmp(const String& file_path) void Image::export_png(const String& file_path) { auto bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::BGRA8888, m_size); + VERIFY(bitmap); GUI::Painter painter(*bitmap); paint_into(painter, { 0, 0, m_size.width(), m_size.height() }); - Gfx::PNGWriter png_writer; - auto png = png_writer.write(bitmap); + auto png = Gfx::PNGWriter::encode(*bitmap); auto file = fopen(file_path.characters(), "wb"); fwrite(png.data(), sizeof(u8), png.size(), file); fclose(file); diff --git a/Userland/Libraries/LibGfx/PNGWriter.cpp b/Userland/Libraries/LibGfx/PNGWriter.cpp index 99fe188e4f9056..27aa6677b194b1 100644 --- a/Userland/Libraries/LibGfx/PNGWriter.cpp +++ b/Userland/Libraries/LibGfx/PNGWriter.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, Pierre Hoffmeister + * Copyright (c) 2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -24,17 +25,18 @@ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ -#include "PNGWriter.h" #include #include +#include +#include namespace Gfx { class PNGChunk { public: - PNGChunk(const String&); - const Vector& data() const { return m_data; }; - const String& type() const { return m_type; }; + explicit PNGChunk(String); + Vector const& data() const { return m_data; }; + String const& type() const { return m_type; }; void add_u8(u8); void add_u16_big(u16); void add_u32_big(u32); @@ -51,8 +53,8 @@ class NonCompressibleBlock { void finalize(PNGChunk&); void add_byte_to_block(u8 data, PNGChunk&); - u32 adler_s1() { return m_adler_s1; } - u32 adler_s2() { return m_adler_s2; } + u32 adler_s1() const { return m_adler_s1; } + u32 adler_s2() const { return m_adler_s2; } private: void add_block_to_chunk(PNGChunk&, bool); @@ -63,7 +65,7 @@ class NonCompressibleBlock { u32 m_adler_s2 { 0 }; }; -PNGChunk::PNGChunk(const String& type) +PNGChunk::PNGChunk(String type) : m_type(move(type)) { } @@ -141,7 +143,7 @@ void NonCompressibleBlock::update_adler(u8 data) m_adler_s2 = (m_adler_s2 + m_adler_s1) % 65521; } -void PNGWriter::add_chunk(const PNGChunk& png_chunk) +void PNGWriter::add_chunk(PNGChunk const& png_chunk) { Vector combined; for (auto character : png_chunk.type()) { @@ -185,7 +187,7 @@ void PNGWriter::add_IEND_chunk() add_chunk(png_chunk); } -void PNGWriter::add_IDAT_chunk(const RefPtr bitmap) +void PNGWriter::add_IDAT_chunk(Gfx::Bitmap const& bitmap) { PNGChunk png_chunk { "IDAT" }; @@ -194,11 +196,11 @@ void PNGWriter::add_IDAT_chunk(const RefPtr bitmap) NonCompressibleBlock non_compressible_block; - for (int y = 0; y < bitmap->height(); ++y) { + for (int y = 0; y < bitmap.height(); ++y) { non_compressible_block.add_byte_to_block(0, png_chunk); - for (int x = 0; x < bitmap->width(); ++x) { - auto pixel = bitmap->get_pixel(x, y); + for (int x = 0; x < bitmap.width(); ++x) { + auto pixel = bitmap.get_pixel(x, y); non_compressible_block.add_byte_to_block(pixel.red(), png_chunk); non_compressible_block.add_byte_to_block(pixel.green(), png_chunk); non_compressible_block.add_byte_to_block(pixel.blue(), png_chunk); @@ -213,16 +215,14 @@ void PNGWriter::add_IDAT_chunk(const RefPtr bitmap) add_chunk(png_chunk); } -ByteBuffer PNGWriter::write(const RefPtr bitmap) +ByteBuffer PNGWriter::encode(Gfx::Bitmap const& bitmap) { - add_png_header(); - add_IHDR_chunk(bitmap->width(), bitmap->height(), 8, 6, 0, 0, 0); - add_IDAT_chunk(bitmap); - add_IEND_chunk(); - - ByteBuffer buf; - buf.append(m_data.data(), m_data.size()); - return buf; + PNGWriter writer; + writer.add_png_header(); + writer.add_IHDR_chunk(bitmap.width(), bitmap.height(), 8, 6, 0, 0, 0); + writer.add_IDAT_chunk(bitmap); + writer.add_IEND_chunk(); + return ByteBuffer::copy(writer.m_data); } } diff --git a/Userland/Libraries/LibGfx/PNGWriter.h b/Userland/Libraries/LibGfx/PNGWriter.h index d07ed9d273a1b5..6e205ad823b82e 100644 --- a/Userland/Libraries/LibGfx/PNGWriter.h +++ b/Userland/Libraries/LibGfx/PNGWriter.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2021, Pierre Hoffmeister + * Copyright (c) 2021, Andreas Kling * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -26,9 +27,8 @@ #pragma once -#include #include -#include +#include namespace Gfx { @@ -36,14 +36,16 @@ class PNGChunk; class PNGWriter { public: - ByteBuffer write(const RefPtr); + static ByteBuffer encode(Gfx::Bitmap const&); private: + PNGWriter() { } + Vector m_data; - void add_chunk(const PNGChunk&); + void add_chunk(PNGChunk const&); void add_png_header(); void add_IHDR_chunk(u32 width, u32 height, u8 bit_depth, u8 color_type, u8 compression_method, u8 filter_method, u8 interlace_method); - void add_IDAT_chunk(const RefPtr); + void add_IDAT_chunk(Gfx::Bitmap const&); void add_IEND_chunk(); }; diff --git a/Userland/Utilities/shot.cpp b/Userland/Utilities/shot.cpp index 347362fc08e45a..ece153b9d3cad2 100644 --- a/Userland/Utilities/shot.cpp +++ b/Userland/Utilities/shot.cpp @@ -67,8 +67,7 @@ int main(int argc, char** argv) return 0; } - Gfx::PNGWriter writer; - auto encoded_bitmap = writer.write(bitmap); + auto encoded_bitmap = Gfx::PNGWriter::encode(*bitmap); if (encoded_bitmap.is_empty()) { warnln("Failed to encode PNG"); return 1;