summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGfx
diff options
context:
space:
mode:
authorTobias Christiansen <tobyase@serenityos.org>2022-01-03 13:13:22 +0100
committerIdan Horowitz <idan.horowitz@gmail.com>2022-01-04 21:41:14 +0200
commite4b7d38e1805bdcf047081123f3c7924078f6a57 (patch)
tree65605d9b58f6d86f921d8aac94cc8fb233bd5b1a /Userland/Libraries/LibGfx
parent06ae5b3536a14558469c4cd7e90ef60d60006b0e (diff)
downloadserenity-e4b7d38e1805bdcf047081123f3c7924078f6a57.zip
LibGfx: Add LumaFilter
This allows you to specify a luminosity range, all pixels that fall outside this range are set to black, the others are untouched.
Diffstat (limited to 'Userland/Libraries/LibGfx')
-rw-r--r--Userland/Libraries/LibGfx/CMakeLists.txt1
-rw-r--r--Userland/Libraries/LibGfx/Filters/LumaFilter.cpp33
-rw-r--r--Userland/Libraries/LibGfx/Filters/LumaFilter.h24
3 files changed, 58 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGfx/CMakeLists.txt b/Userland/Libraries/LibGfx/CMakeLists.txt
index 8e1663abcd..f4247715e7 100644
--- a/Userland/Libraries/LibGfx/CMakeLists.txt
+++ b/Userland/Libraries/LibGfx/CMakeLists.txt
@@ -16,6 +16,7 @@ set(SOURCES
Emoji.cpp
Filters/ColorBlindnessFilter.cpp
Filters/FastBoxBlurFilter.cpp
+ Filters/LumaFilter.cpp
FontDatabase.cpp
GIFLoader.cpp
ICOLoader.cpp
diff --git a/Userland/Libraries/LibGfx/Filters/LumaFilter.cpp b/Userland/Libraries/LibGfx/Filters/LumaFilter.cpp
new file mode 100644
index 0000000000..bdbbad7da2
--- /dev/null
+++ b/Userland/Libraries/LibGfx/Filters/LumaFilter.cpp
@@ -0,0 +1,33 @@
+/*
+ * Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#include "LumaFilter.h"
+namespace Gfx {
+
+void LumaFilter::apply(u8 lower_bound, u8 upper_bound)
+{
+ if (upper_bound < lower_bound)
+ return;
+
+ int height = m_bitmap.height();
+ int width = m_bitmap.width();
+
+ auto format = m_bitmap.format();
+ VERIFY(format == BitmapFormat::BGRA8888 || format == BitmapFormat::BGRx8888);
+
+ for (int y = 0; y < height; ++y) {
+ for (int x = 0; x < width; ++x) {
+ Color color;
+ color = m_bitmap.get_pixel(x, y);
+
+ auto luma = color.luminosity();
+ if (lower_bound > luma || upper_bound < luma)
+ m_bitmap.set_pixel(x, y, { 0, 0, 0, color.alpha() });
+ }
+ }
+}
+
+}
diff --git a/Userland/Libraries/LibGfx/Filters/LumaFilter.h b/Userland/Libraries/LibGfx/Filters/LumaFilter.h
new file mode 100644
index 0000000000..7f907f9ef6
--- /dev/null
+++ b/Userland/Libraries/LibGfx/Filters/LumaFilter.h
@@ -0,0 +1,24 @@
+/*
+ * Copyright (c) 2022, Tobias Christiansen <tobyase@serenityos.org>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <LibGfx/Bitmap.h>
+
+namespace Gfx {
+
+class LumaFilter {
+public:
+ LumaFilter(Bitmap& bitmap)
+ : m_bitmap(bitmap) {};
+
+ void apply(u8 lower_bound, u8 upper_bound);
+
+private:
+ Bitmap& m_bitmap;
+};
+
+}