summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGfx
diff options
context:
space:
mode:
authorTobias Christiansen <tobyase@serenityos.org>2022-01-03 13:48:20 +0100
committerIdan Horowitz <idan.horowitz@gmail.com>2022-01-04 21:41:14 +0200
commit06ae5b3536a14558469c4cd7e90ef60d60006b0e (patch)
treeff78203593d0b0bafdf47623706956ceb16fb815 /Userland/Libraries/LibGfx
parent9d45e5ac8f2dfbb4e46b1713229eef3777699fdb (diff)
downloadserenity-06ae5b3536a14558469c4cd7e90ef60d60006b0e.zip
LibGfx: Add BitmapMixer
With this BitmapMixer one can draw one Bitmap onto another with different modes. For now the only supported mixing methods implemented are Add and Lightest (which is very naive).
Diffstat (limited to 'Userland/Libraries/LibGfx')
-rw-r--r--Userland/Libraries/LibGfx/BitmapMixer.cpp48
-rw-r--r--Userland/Libraries/LibGfx/BitmapMixer.h29
-rw-r--r--Userland/Libraries/LibGfx/CMakeLists.txt1
3 files changed, 78 insertions, 0 deletions
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 <tobyase@serenityos.org>
+ *
+ * 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 <tobyase@serenityos.org>
+ *
+ * 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