From 978a70ddcc7b7c6ee7125717200d1ba21a3c8785 Mon Sep 17 00:00:00 2001 From: MacDue Date: Thu, 15 Sep 2022 08:31:27 +0100 Subject: [PATCH] LibGfx: Add `BrightnessFilter`, `ContrastFilter`, and `OpacityFilter` These filters are based off the ones defined in: https://drafts.fxtf.org/filter-effects-1/#supported-filter-functions --- .../LibGfx/Filters/BrightnessFilter.h | 41 +++++++++++++++++++ .../Libraries/LibGfx/Filters/ContrastFilter.h | 41 +++++++++++++++++++ .../Libraries/LibGfx/Filters/OpacityFilter.h | 33 +++++++++++++++ 3 files changed, 115 insertions(+) create mode 100644 Userland/Libraries/LibGfx/Filters/BrightnessFilter.h create mode 100644 Userland/Libraries/LibGfx/Filters/ContrastFilter.h create mode 100644 Userland/Libraries/LibGfx/Filters/OpacityFilter.h diff --git a/Userland/Libraries/LibGfx/Filters/BrightnessFilter.h b/Userland/Libraries/LibGfx/Filters/BrightnessFilter.h new file mode 100644 index 0000000000..85303ba9ae --- /dev/null +++ b/Userland/Libraries/LibGfx/Filters/BrightnessFilter.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Gfx { + +class BrightnessFilter : public ColorFilter { +public: + using ColorFilter::ColorFilter; + virtual ~BrightnessFilter() = default; + + virtual StringView class_name() const override { return "BrightnessFilter"sv; } + + virtual bool amount_handled_in_filter() const override + { + return true; + } + +protected: + Color convert_color(Color original) override + { + auto convert_channel = [&](u8 channel) { + return static_cast(clamp(round_to(channel * m_amount), 0, 255)); + }; + return Gfx::Color { + convert_channel(original.red()), + convert_channel(original.green()), + convert_channel(original.blue()), + original.alpha() + }; + }; +}; + +} diff --git a/Userland/Libraries/LibGfx/Filters/ContrastFilter.h b/Userland/Libraries/LibGfx/Filters/ContrastFilter.h new file mode 100644 index 0000000000..5bcb6764df --- /dev/null +++ b/Userland/Libraries/LibGfx/Filters/ContrastFilter.h @@ -0,0 +1,41 @@ +/* + * Copyright (c) 2022, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Gfx { + +class ContrastFilter : public ColorFilter { +public: + using ColorFilter::ColorFilter; + virtual ~ContrastFilter() = default; + + virtual StringView class_name() const override { return "ContrastFilter"sv; } + + virtual bool amount_handled_in_filter() const override + { + return true; + } + +protected: + Color convert_color(Color original) override + { + auto convert_channel = [&](u8 channel) { + return static_cast(clamp(round_to(channel * m_amount + (-128 * m_amount) + 128), 0, 255)); + }; + return Gfx::Color { + convert_channel(original.red()), + convert_channel(original.green()), + convert_channel(original.blue()), + original.alpha() + }; + }; +}; + +} diff --git a/Userland/Libraries/LibGfx/Filters/OpacityFilter.h b/Userland/Libraries/LibGfx/Filters/OpacityFilter.h new file mode 100644 index 0000000000..5e16907355 --- /dev/null +++ b/Userland/Libraries/LibGfx/Filters/OpacityFilter.h @@ -0,0 +1,33 @@ +/* + * Copyright (c) 2022, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include +#include + +namespace Gfx { + +class OpacityFilter : public ColorFilter { +public: + using ColorFilter::ColorFilter; + virtual ~OpacityFilter() = default; + + virtual StringView class_name() const override { return "OpacityFilter"sv; } + + virtual bool amount_handled_in_filter() const override + { + return true; + } + +protected: + Color convert_color(Color original) override + { + return original.with_alpha(m_amount * 255); + }; +}; + +}