diff --git a/Userland/Libraries/LibGfx/BitmapMixer.cpp b/Userland/Libraries/LibGfx/BitmapMixer.cpp new file mode 100644 index 0000000000..2e5269a1ae --- /dev/null +++ b/Userland/Libraries/LibGfx/BitmapMixer.cpp @@ -0,0 +1,48 @@ +/* + * Copyright (c) 2022, Tobias Christiansen + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#include "BitmapMixer.h" + +namespace Gfx { + +void BitmapMixer::mix_with(Bitmap& other_bitmap, MixingMethod mixing_method) +{ + VERIFY(m_bitmap.size() == other_bitmap.size()); + + int height = m_bitmap.height(); + int width = m_bitmap.width(); + + for (int y = 0; y < height; ++y) { + for (int x = 0; x < width; ++x) { + auto original_color = m_bitmap.get_pixel(x, y); + auto other_color = other_bitmap.get_pixel(x, y); + + Color output_color = { 0, 0, 0, original_color.alpha() }; + switch (mixing_method) { + case MixingMethod::Add: + output_color.set_red(original_color.red() + other_color.red()); + output_color.set_green(original_color.green() + other_color.green()); + output_color.set_blue(original_color.blue() + other_color.blue()); + break; + case MixingMethod::Lightest: + auto original_lightness = original_color.red() + original_color.green() + original_color.blue(); + auto other_lightness = other_color.red() + other_color.green() + other_color.blue(); + if (original_lightness > other_lightness) { + output_color = original_color; + } else { + output_color.set_red(other_color.red()); + output_color.set_green(other_color.green()); + output_color.set_blue(other_color.blue()); + } + break; + } + if (original_color != output_color) + m_bitmap.set_pixel(x, y, output_color); + } + } +} + +} diff --git a/Userland/Libraries/LibGfx/BitmapMixer.h b/Userland/Libraries/LibGfx/BitmapMixer.h new file mode 100644 index 0000000000..bd895d7ff5 --- /dev/null +++ b/Userland/Libraries/LibGfx/BitmapMixer.h @@ -0,0 +1,29 @@ +/* + * Copyright (c) 2022, Tobias Christiansen + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include "Bitmap.h" + +namespace Gfx { + +class BitmapMixer { +public: + enum class MixingMethod { + Add, + Lightest, + }; + + BitmapMixer(Bitmap& bitmap) + : m_bitmap(bitmap) {}; + + void mix_with(Bitmap&, MixingMethod); + +private: + Bitmap& m_bitmap; +}; + +} diff --git a/Userland/Libraries/LibGfx/CMakeLists.txt b/Userland/Libraries/LibGfx/CMakeLists.txt index 3086cd75d2..8e1663abcd 100644 --- a/Userland/Libraries/LibGfx/CMakeLists.txt +++ b/Userland/Libraries/LibGfx/CMakeLists.txt @@ -2,6 +2,7 @@ set(SOURCES AffineTransform.cpp AntiAliasingPainter.cpp Bitmap.cpp + BitmapMixer.cpp BitmapFont.cpp BMPLoader.cpp BMPWriter.cpp