From 0e6576b3761ec88c4b4b7211f24d9b6347e8bd78 Mon Sep 17 00:00:00 2001 From: Mustafa Quraish Date: Sat, 8 Jan 2022 21:23:17 -0500 Subject: [PATCH] PixelPaint: Move out common logic from Filters into base class Now, each new filter only has to describe how to actually change the bitmaps, and the common logic of pulling out the bitmap from the layer, and marking the action as done, etc is all handled in the `Filter` base class. This also makes it possible to apply filters to external bitmaps, which are not embedded in a `Layer` (which we can use to preview filters in the future!) --- .../Applications/PixelPaint/Filters/Bloom.cpp | 25 ++++++++---------- .../Applications/PixelPaint/Filters/Bloom.h | 3 ++- .../PixelPaint/Filters/BoxBlur3.cpp | 15 +++-------- .../PixelPaint/Filters/BoxBlur3.h | 2 +- .../PixelPaint/Filters/BoxBlur5.cpp | 15 +++-------- .../PixelPaint/Filters/BoxBlur5.h | 2 +- .../PixelPaint/Filters/FastBoxBlur.cpp | 26 +++++++++---------- .../PixelPaint/Filters/FastBoxBlur.h | 2 +- .../PixelPaint/Filters/Filter.cpp | 12 +++++++++ .../Applications/PixelPaint/Filters/Filter.h | 5 +++- .../PixelPaint/Filters/GaussBlur3.cpp | 15 +++-------- .../PixelPaint/Filters/GaussBlur3.h | 2 +- .../PixelPaint/Filters/GaussBlur5.cpp | 15 +++-------- .../PixelPaint/Filters/GaussBlur5.h | 2 +- .../PixelPaint/Filters/Grayscale.cpp | 12 +++------ .../PixelPaint/Filters/Grayscale.h | 2 +- .../PixelPaint/Filters/Invert.cpp | 12 +++------ .../Applications/PixelPaint/Filters/Invert.h | 2 +- .../PixelPaint/Filters/LaplaceCardinal.cpp | 15 +++-------- .../PixelPaint/Filters/LaplaceCardinal.h | 2 +- .../PixelPaint/Filters/LaplaceDiagonal.cpp | 15 +++-------- .../PixelPaint/Filters/LaplaceDiagonal.h | 2 +- .../Applications/PixelPaint/Filters/Sepia.cpp | 12 +++------ .../Applications/PixelPaint/Filters/Sepia.h | 2 +- .../PixelPaint/Filters/Sharpen.cpp | 15 +++-------- .../Applications/PixelPaint/Filters/Sharpen.h | 2 +- 26 files changed, 90 insertions(+), 144 deletions(-) diff --git a/Userland/Applications/PixelPaint/Filters/Bloom.cpp b/Userland/Applications/PixelPaint/Filters/Bloom.cpp index f20cbd8695..3c1ec93674 100644 --- a/Userland/Applications/PixelPaint/Filters/Bloom.cpp +++ b/Userland/Applications/PixelPaint/Filters/Bloom.cpp @@ -16,27 +16,24 @@ namespace PixelPaint::Filters { -void Bloom::apply() const +void Bloom::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) + auto intermediate_bitmap_or_error = source_bitmap.clone(); + if (intermediate_bitmap_or_error.is_error()) return; - if (auto* layer = m_editor->active_layer()) { - auto intermediate_bitmap_or_error = layer->bitmap().clone(); - if (intermediate_bitmap_or_error.is_error()) - return; - auto intermediate_bitmap = intermediate_bitmap_or_error.release_value(); + auto intermediate_bitmap = intermediate_bitmap_or_error.release_value(); - Gfx::LumaFilter luma_filter(intermediate_bitmap); - luma_filter.apply(m_luma_lower, 255); + Gfx::LumaFilter luma_filter(intermediate_bitmap); + luma_filter.apply(m_luma_lower, 255); - Gfx::FastBoxBlurFilter blur_filter(intermediate_bitmap); - blur_filter.apply_three_passes(m_blur_radius); + Gfx::FastBoxBlurFilter blur_filter(intermediate_bitmap); + blur_filter.apply_three_passes(m_blur_radius); - Gfx::BitmapMixer mixer(layer->bitmap()); - mixer.mix_with(intermediate_bitmap, Gfx::BitmapMixer::MixingMethod::Lightest); - } + Gfx::BitmapMixer mixer(target_bitmap); + mixer.mix_with(intermediate_bitmap, Gfx::BitmapMixer::MixingMethod::Lightest); } + RefPtr Bloom::get_settings_widget() { if (!m_settings_widget) { diff --git a/Userland/Applications/PixelPaint/Filters/Bloom.h b/Userland/Applications/PixelPaint/Filters/Bloom.h index a9ce73e25a..44a6f4d591 100644 --- a/Userland/Applications/PixelPaint/Filters/Bloom.h +++ b/Userland/Applications/PixelPaint/Filters/Bloom.h @@ -12,7 +12,8 @@ namespace PixelPaint::Filters { class Bloom final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; + virtual RefPtr get_settings_widget() override; virtual StringView filter_name() override { return "Bloom Filter"sv; } diff --git a/Userland/Applications/PixelPaint/Filters/BoxBlur3.cpp b/Userland/Applications/PixelPaint/Filters/BoxBlur3.cpp index 51aa454110..596e6819e2 100644 --- a/Userland/Applications/PixelPaint/Filters/BoxBlur3.cpp +++ b/Userland/Applications/PixelPaint/Filters/BoxBlur3.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void BoxBlur3::apply() const +void BoxBlur3::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::BoxBlurFilter<3> filter; - if (auto parameters = PixelPaint::FilterParameters>::get()) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::BoxBlurFilter<3> filter; + if (auto parameters = PixelPaint::FilterParameters>::get()) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/BoxBlur3.h b/Userland/Applications/PixelPaint/Filters/BoxBlur3.h index 1038a6307c..5ec243baa9 100644 --- a/Userland/Applications/PixelPaint/Filters/BoxBlur3.h +++ b/Userland/Applications/PixelPaint/Filters/BoxBlur3.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class BoxBlur3 final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Box Blur (3x3)"sv; } BoxBlur3(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/BoxBlur5.cpp b/Userland/Applications/PixelPaint/Filters/BoxBlur5.cpp index e757925cd3..844aa3d37d 100644 --- a/Userland/Applications/PixelPaint/Filters/BoxBlur5.cpp +++ b/Userland/Applications/PixelPaint/Filters/BoxBlur5.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void BoxBlur5::apply() const +void BoxBlur5::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::BoxBlurFilter<5> filter; - if (auto parameters = PixelPaint::FilterParameters>::get()) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::BoxBlurFilter<5> filter; + if (auto parameters = PixelPaint::FilterParameters>::get()) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/BoxBlur5.h b/Userland/Applications/PixelPaint/Filters/BoxBlur5.h index f34acdc4f0..e1b1482909 100644 --- a/Userland/Applications/PixelPaint/Filters/BoxBlur5.h +++ b/Userland/Applications/PixelPaint/Filters/BoxBlur5.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class BoxBlur5 final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Box Blur (5x5)"sv; } BoxBlur5(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp index 9eae3fc626..9375b487fa 100644 --- a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp +++ b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Tobias Christiansen + * Copyright (c) 2022, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ @@ -12,21 +13,20 @@ namespace PixelPaint::Filters { -void FastBoxBlur::apply() const +void FastBoxBlur::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::FastBoxBlurFilter filter(layer->bitmap()); - - if (m_approximate_gauss) - filter.apply_three_passes(m_radius); - else - filter.apply_single_pass(m_radius); - - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); + // 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_approximate_gauss) + filter.apply_three_passes(m_radius); + else + filter.apply_single_pass(m_radius); } RefPtr FastBoxBlur::get_settings_widget() diff --git a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h index 89b4cdd666..cd29addbad 100644 --- a/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h +++ b/Userland/Applications/PixelPaint/Filters/FastBoxBlur.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class FastBoxBlur final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual RefPtr get_settings_widget() override; virtual StringView filter_name() override { return "Fast Box Blur (& Gauss)"sv; } diff --git a/Userland/Applications/PixelPaint/Filters/Filter.cpp b/Userland/Applications/PixelPaint/Filters/Filter.cpp index 568a80403d..a7dcfa5058 100644 --- a/Userland/Applications/PixelPaint/Filters/Filter.cpp +++ b/Userland/Applications/PixelPaint/Filters/Filter.cpp @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Tobias Christiansen + * Copyright (c) 2022, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ @@ -25,4 +26,15 @@ RefPtr Filter::get_settings_widget() return m_settings_widget.ptr(); } +void Filter::apply() const +{ + if (!m_editor) + return; + if (auto* layer = m_editor->active_layer()) { + apply(layer->bitmap(), layer->bitmap()); + layer->did_modify_bitmap(layer->rect()); + m_editor->did_complete_action(); + } +} + } diff --git a/Userland/Applications/PixelPaint/Filters/Filter.h b/Userland/Applications/PixelPaint/Filters/Filter.h index 4add775e68..7752c931ad 100644 --- a/Userland/Applications/PixelPaint/Filters/Filter.h +++ b/Userland/Applications/PixelPaint/Filters/Filter.h @@ -1,5 +1,6 @@ /* * Copyright (c) 2022, Tobias Christiansen + * Copyright (c) 2022, Mustafa Quraish * * SPDX-License-Identifier: BSD-2-Clause */ @@ -14,7 +15,9 @@ namespace PixelPaint { class Filter { public: - virtual void apply() const = 0; + virtual void apply() const; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const = 0; + virtual RefPtr get_settings_widget(); virtual StringView filter_name() = 0; diff --git a/Userland/Applications/PixelPaint/Filters/GaussBlur3.cpp b/Userland/Applications/PixelPaint/Filters/GaussBlur3.cpp index 5987da3870..845802c5f7 100644 --- a/Userland/Applications/PixelPaint/Filters/GaussBlur3.cpp +++ b/Userland/Applications/PixelPaint/Filters/GaussBlur3.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void GaussBlur3::apply() const +void GaussBlur3::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::SpatialGaussianBlurFilter<3> filter; - if (auto parameters = PixelPaint::FilterParameters>::get()) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::SpatialGaussianBlurFilter<3> filter; + if (auto parameters = PixelPaint::FilterParameters>::get()) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/GaussBlur3.h b/Userland/Applications/PixelPaint/Filters/GaussBlur3.h index d62462b42b..d4b8dbf5b8 100644 --- a/Userland/Applications/PixelPaint/Filters/GaussBlur3.h +++ b/Userland/Applications/PixelPaint/Filters/GaussBlur3.h @@ -13,7 +13,7 @@ namespace PixelPaint::Filters { // FIXME: Make a generic gaussian blur that does not need the templated radius class GaussBlur3 final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Gaussian Blur (3x3)"sv; } GaussBlur3(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/GaussBlur5.cpp b/Userland/Applications/PixelPaint/Filters/GaussBlur5.cpp index aac6614eae..36cb9b64ab 100644 --- a/Userland/Applications/PixelPaint/Filters/GaussBlur5.cpp +++ b/Userland/Applications/PixelPaint/Filters/GaussBlur5.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void GaussBlur5::apply() const +void GaussBlur5::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::SpatialGaussianBlurFilter<5> filter; - if (auto parameters = PixelPaint::FilterParameters>::get()) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::SpatialGaussianBlurFilter<5> filter; + if (auto parameters = PixelPaint::FilterParameters>::get()) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/GaussBlur5.h b/Userland/Applications/PixelPaint/Filters/GaussBlur5.h index d30e8845b3..3d87e01777 100644 --- a/Userland/Applications/PixelPaint/Filters/GaussBlur5.h +++ b/Userland/Applications/PixelPaint/Filters/GaussBlur5.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class GaussBlur5 final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Gaussian Blur (5x5)"sv; } GaussBlur5(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/Grayscale.cpp b/Userland/Applications/PixelPaint/Filters/Grayscale.cpp index a7f87d5498..db8fb7e260 100644 --- a/Userland/Applications/PixelPaint/Filters/Grayscale.cpp +++ b/Userland/Applications/PixelPaint/Filters/Grayscale.cpp @@ -9,16 +9,10 @@ namespace PixelPaint::Filters { -void Grayscale::apply() const +void Grayscale::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::GrayscaleFilter filter; - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect()); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } + Gfx::GrayscaleFilter filter; + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect()); } } diff --git a/Userland/Applications/PixelPaint/Filters/Grayscale.h b/Userland/Applications/PixelPaint/Filters/Grayscale.h index 873bec04c7..2eaaa63e87 100644 --- a/Userland/Applications/PixelPaint/Filters/Grayscale.h +++ b/Userland/Applications/PixelPaint/Filters/Grayscale.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class Grayscale final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Grayscale"sv; } Grayscale(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/Invert.cpp b/Userland/Applications/PixelPaint/Filters/Invert.cpp index c9db6b7db3..c5f182d506 100644 --- a/Userland/Applications/PixelPaint/Filters/Invert.cpp +++ b/Userland/Applications/PixelPaint/Filters/Invert.cpp @@ -9,16 +9,10 @@ namespace PixelPaint::Filters { -void Invert::apply() const +void Invert::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::InvertFilter filter; - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect()); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } + Gfx::InvertFilter filter; + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect()); } } diff --git a/Userland/Applications/PixelPaint/Filters/Invert.h b/Userland/Applications/PixelPaint/Filters/Invert.h index 3adc7b9fe3..d245ff9c93 100644 --- a/Userland/Applications/PixelPaint/Filters/Invert.h +++ b/Userland/Applications/PixelPaint/Filters/Invert.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class Invert final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Invert"sv; } Invert(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.cpp b/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.cpp index 15ae82fb07..c0cf43f525 100644 --- a/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.cpp +++ b/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void LaplaceCardinal::apply() const +void LaplaceCardinal::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::LaplacianFilter filter; - if (auto parameters = PixelPaint::FilterParameters::get(false)) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::LaplacianFilter filter; + if (auto parameters = PixelPaint::FilterParameters::get(false)) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.h b/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.h index a66861e807..f3b75a2a54 100644 --- a/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.h +++ b/Userland/Applications/PixelPaint/Filters/LaplaceCardinal.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class LaplaceCardinal final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Laplacian Cardinal"sv; } LaplaceCardinal(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.cpp b/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.cpp index 01d4cfd5b3..60f1cb2254 100644 --- a/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.cpp +++ b/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void LaplaceDiagonal::apply() const +void LaplaceDiagonal::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::LaplacianFilter filter; - if (auto parameters = PixelPaint::FilterParameters::get(true)) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::LaplacianFilter filter; + if (auto parameters = PixelPaint::FilterParameters::get(true)) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.h b/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.h index c388a52d36..723d36efe0 100644 --- a/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.h +++ b/Userland/Applications/PixelPaint/Filters/LaplaceDiagonal.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class LaplaceDiagonal final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Laplacian Diagonal"sv; } LaplaceDiagonal(ImageEditor* editor) diff --git a/Userland/Applications/PixelPaint/Filters/Sepia.cpp b/Userland/Applications/PixelPaint/Filters/Sepia.cpp index ba86e6a75e..4a3b87099b 100644 --- a/Userland/Applications/PixelPaint/Filters/Sepia.cpp +++ b/Userland/Applications/PixelPaint/Filters/Sepia.cpp @@ -11,16 +11,10 @@ namespace PixelPaint::Filters { -void Sepia::apply() const +void Sepia::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::SepiaFilter filter(m_amount); - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect()); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } + Gfx::SepiaFilter filter(m_amount); + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect()); } RefPtr Sepia::get_settings_widget() diff --git a/Userland/Applications/PixelPaint/Filters/Sepia.h b/Userland/Applications/PixelPaint/Filters/Sepia.h index a8d1a8a788..17d0d025d5 100644 --- a/Userland/Applications/PixelPaint/Filters/Sepia.h +++ b/Userland/Applications/PixelPaint/Filters/Sepia.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class Sepia final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual RefPtr get_settings_widget() override; virtual StringView filter_name() override { return "Sepia"sv; } diff --git a/Userland/Applications/PixelPaint/Filters/Sharpen.cpp b/Userland/Applications/PixelPaint/Filters/Sharpen.cpp index 4a772beb75..d40e7415ea 100644 --- a/Userland/Applications/PixelPaint/Filters/Sharpen.cpp +++ b/Userland/Applications/PixelPaint/Filters/Sharpen.cpp @@ -9,18 +9,11 @@ namespace PixelPaint::Filters { -void Sharpen::apply() const +void Sharpen::apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const { - if (!m_editor) - return; - if (auto* layer = m_editor->active_layer()) { - Gfx::SharpenFilter filter; - if (auto parameters = PixelPaint::FilterParameters::get()) { - filter.apply(layer->bitmap(), layer->rect(), layer->bitmap(), layer->rect(), *parameters); - layer->did_modify_bitmap(layer->rect()); - m_editor->did_complete_action(); - } - } + Gfx::SharpenFilter filter; + if (auto parameters = PixelPaint::FilterParameters::get()) + filter.apply(target_bitmap, target_bitmap.rect(), source_bitmap, source_bitmap.rect(), *parameters); } } diff --git a/Userland/Applications/PixelPaint/Filters/Sharpen.h b/Userland/Applications/PixelPaint/Filters/Sharpen.h index 76594340be..a718a9f95d 100644 --- a/Userland/Applications/PixelPaint/Filters/Sharpen.h +++ b/Userland/Applications/PixelPaint/Filters/Sharpen.h @@ -12,7 +12,7 @@ namespace PixelPaint::Filters { class Sharpen final : public Filter { public: - virtual void apply() const override; + virtual void apply(Gfx::Bitmap& target_bitmap, Gfx::Bitmap const& source_bitmap) const override; virtual StringView filter_name() override { return "Sharpen"sv; } Sharpen(ImageEditor* editor)