From 71fb1ed22615a8ff90330bf3d0cab4d98ccc97a3 Mon Sep 17 00:00:00 2001 From: MacDue Date: Sun, 9 Oct 2022 16:30:00 +0100 Subject: [PATCH] PixelPaint: Add InplaceFilter and convert FastBoxBlur to be one This is a simple base class for filters that need to work on the image in-place. --- .../PixelPaint/Filters/FastBoxBlur.cpp | 9 +----- .../PixelPaint/Filters/FastBoxBlur.h | 8 ++--- .../PixelPaint/Filters/InplaceFilter.h | 32 +++++++++++++++++++ 3 files changed, 37 insertions(+), 12 deletions(-) create mode 100644 Userland/Applications/PixelPaint/Filters/InplaceFilter.h diff --git a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp index 4813a8de10..e12d15bf1a 100644 --- a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp +++ b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp @@ -14,15 +14,8 @@ namespace PixelPaint::Filters { -void FastBoxBlur::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const +void FastBoxBlur::apply(Gfx::Bitmap& target_bitmap) const { - // This filter only works in-place, so if we have different target and source, we first copy over - // the source bitmap to the target one. - if (&target_bitmap != &source_bitmap) { - VERIFY(source_bitmap.size_in_bytes() == target_bitmap.size_in_bytes()); - memcpy(target_bitmap.scanline(0), source_bitmap.scanline(0), source_bitmap.size_in_bytes()); - } - Gfx::FastBoxBlurFilter filter(target_bitmap); if (m_use_asymmetric_radii) { diff --git a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h index 85006620ad..c041c2213c 100644 --- a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h +++ b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h @@ -6,21 +6,21 @@ #pragma once -#include "Filter.h" +#include "InplaceFilter.h" #include #include namespace PixelPaint::Filters { -class FastBoxBlur final : public Filter { +class FastBoxBlur final : public InplaceFilter { public: - virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; + virtual void apply(Gfx::Bitmap& target_bitmap) const override; virtual RefPtr get_settings_widget() override; virtual StringView filter_name() const override { return "Fast Box Blur (& Gauss)"sv; } FastBoxBlur(ImageEditor* editor) - : Filter(editor) {}; + : InplaceFilter(editor) {}; private: size_t m_radius { 5 }; diff --git a/Userland/Applications/PixelPaint/Filters/InplaceFilter.h b/Userland/Applications/PixelPaint/Filters/InplaceFilter.h new file mode 100644 index 0000000000..fd9ef94b76 --- /dev/null +++ b/Userland/Applications/PixelPaint/Filters/InplaceFilter.h @@ -0,0 +1,32 @@ +/* + * Copyright (c) 2022, MacDue + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include "Filter.h" + +namespace PixelPaint { + +class InplaceFilter : public Filter { +public: + using Filter::apply; + using Filter::Filter; + + virtual void apply(Gfx::Bitmap& target_bitmap) const = 0; + + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override + { + // This filter only works in-place, so if we have different target and source, we first copy over + // the source bitmap to the target one. + if (&target_bitmap != &source_bitmap) { + VERIFY(source_bitmap.size_in_bytes() == target_bitmap.size_in_bytes()); + memcpy(target_bitmap.scanline(0), source_bitmap.scanline(0), source_bitmap.size_in_bytes()); + } + apply(target_bitmap); + } +}; + +}