summaryrefslogtreecommitdiff
path: root/Userland/Libraries/LibGfx
diff options
context:
space:
mode:
authorXavier Defrang <xavier.defrang@gmail.com>2022-01-08 10:36:04 +0100
committerAndreas Kling <kling@serenityos.org>2022-01-08 12:31:11 +0100
commitb1a15b02f11c8f192493a238ac43673e4f09be3d (patch)
tree6dbf811a5f421fb4bdf184013a7c4f723d5746b3 /Userland/Libraries/LibGfx
parent2502a88e49a886458366145e99d8ac3d0ab0293c (diff)
downloadserenity-b1a15b02f11c8f192493a238ac43673e4f09be3d.zip
PixelPaint+LibGfx: Add sepia color filter
Diffstat (limited to 'Userland/Libraries/LibGfx')
-rw-r--r--Userland/Libraries/LibGfx/Color.h27
-rw-r--r--Userland/Libraries/LibGfx/Filters/SepiaFilter.h32
2 files changed, 59 insertions, 0 deletions
diff --git a/Userland/Libraries/LibGfx/Color.h b/Userland/Libraries/LibGfx/Color.h
index 89ed8a3a4e..38975db38e 100644
--- a/Userland/Libraries/LibGfx/Color.h
+++ b/Userland/Libraries/LibGfx/Color.h
@@ -232,6 +232,33 @@ public:
return Color(gray, gray, gray, alpha());
}
+ constexpr Color sepia(float amount = 1.0f) const
+ {
+ auto blend_factor = 1.0f - amount;
+
+ auto r1 = 0.393f + 0.607f * blend_factor;
+ auto r2 = 0.769f - 0.769f * blend_factor;
+ auto r3 = 0.189f - 0.189f * blend_factor;
+
+ auto g1 = 0.349f - 0.349f * blend_factor;
+ auto g2 = 0.686f + 0.314f * blend_factor;
+ auto g3 = 0.168f - 0.168f * blend_factor;
+
+ auto b1 = 0.272f - 0.272f * blend_factor;
+ auto b2 = 0.534f - 0.534f * blend_factor;
+ auto b3 = 0.131f + 0.869f * blend_factor;
+
+ auto r = red();
+ auto g = green();
+ auto b = blue();
+
+ return Color(
+ clamp(lroundf(r * r1 + g * r2 + b * r3), 0, 255),
+ clamp(lroundf(r * g1 + g * g2 + b * g3), 0, 255),
+ clamp(lroundf(r * b1 + g * b2 + b * b3), 0, 255),
+ alpha());
+ }
+
constexpr Color darkened(float amount = 0.5f) const
{
return Color(red() * amount, green() * amount, blue() * amount, alpha());
diff --git a/Userland/Libraries/LibGfx/Filters/SepiaFilter.h b/Userland/Libraries/LibGfx/Filters/SepiaFilter.h
new file mode 100644
index 0000000000..da7b1e7319
--- /dev/null
+++ b/Userland/Libraries/LibGfx/Filters/SepiaFilter.h
@@ -0,0 +1,32 @@
+/*
+ * Copyright (c) 2022, Xavier Defrang <xavier.defrang@gmail.com>
+ *
+ * SPDX-License-Identifier: BSD-2-Clause
+ */
+
+#pragma once
+
+#include <AK/StdLibExtras.h>
+#include <LibGfx/Filters/ColorFilter.h>
+#include <math.h>
+
+namespace Gfx {
+
+class SepiaFilter : public ColorFilter {
+public:
+ SepiaFilter(float amount = 1.0f)
+ : m_amount(amount)
+ {
+ }
+ virtual ~SepiaFilter() { }
+
+ virtual char const* class_name() const override { return "SepiaFilter"; }
+
+protected:
+ Color convert_color(Color original) override { return original.sepia(m_amount); };
+
+private:
+ float m_amount;
+};
+
+}