summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.cpp38
-rw-r--r--Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.h2
2 files changed, 24 insertions, 16 deletions
diff --git a/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.cpp b/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.cpp
index 57c632521e..7cbec6ea7c 100644
--- a/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.cpp
+++ b/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.cpp
@@ -28,9 +28,14 @@ FastBoxBlurFilter::FastBoxBlurFilter(Bitmap& bitmap)
{
}
-// Based on the super fast blur algorithm by Quasimondo, explored here: https://stackoverflow.com/questions/21418892/understanding-super-fast-blur-algorithm
void FastBoxBlurFilter::apply_single_pass(size_t radius)
{
+ apply_single_pass(radius, radius);
+}
+
+// Based on the super fast blur algorithm by Quasimondo, explored here: https://stackoverflow.com/questions/21418892/understanding-super-fast-blur-algorithm
+void FastBoxBlurFilter::apply_single_pass(size_t radius_x, size_t radius_y)
+{
auto format = m_bitmap.format();
VERIFY(format == BitmapFormat::BGRA8888 || format == BitmapFormat::BGRx8888);
@@ -52,7 +57,8 @@ void FastBoxBlurFilter::apply_single_pass(size_t radius)
int height = m_bitmap.height();
int width = m_bitmap.width();
- int div = 2 * radius + 1;
+ int div_x = 2 * radius_x + 1;
+ int div_y = 2 * radius_y + 1;
Vector<u8, 1024> intermediate_red;
Vector<u8, 1024> intermediate_green;
@@ -72,7 +78,7 @@ void FastBoxBlurFilter::apply_single_pass(size_t radius)
size_t sum_alpha = 0;
// Setup sliding window
- for (int i = -(int)radius; i <= (int)radius; ++i) {
+ for (int i = -(int)radius_x; i <= (int)radius_x; ++i) {
auto color_at_px = get_pixel_function(clamp(i, 0, width - 1), y);
sum_red += red_value(color_at_px);
sum_green += green_value(color_at_px);
@@ -81,13 +87,13 @@ void FastBoxBlurFilter::apply_single_pass(size_t radius)
}
// Slide horizontally
for (int x = 0; x < width; ++x) {
- intermediate_red[y * width + x] = (sum_red / div);
- intermediate_green[y * width + x] = (sum_green / div);
- intermediate_blue[y * width + x] = (sum_blue / div);
- intermediate_alpha[y * width + x] = (sum_alpha / div);
+ intermediate_red[y * width + x] = (sum_red / div_x);
+ intermediate_green[y * width + x] = (sum_green / div_x);
+ intermediate_blue[y * width + x] = (sum_blue / div_x);
+ intermediate_alpha[y * width + x] = (sum_alpha / div_x);
- auto leftmost_x_coord = max(x - (int)radius, 0);
- auto rightmost_x_coord = min(x + (int)radius + 1, width - 1);
+ auto leftmost_x_coord = max(x - (int)radius_x, 0);
+ auto rightmost_x_coord = min(x + (int)radius_x + 1, width - 1);
auto leftmost_x_color = get_pixel_function(leftmost_x_coord, y);
auto rightmost_x_color = get_pixel_function(rightmost_x_coord, y);
@@ -111,7 +117,7 @@ void FastBoxBlurFilter::apply_single_pass(size_t radius)
size_t sum_alpha = 0;
// Setup sliding window
- for (int i = -(int)radius; i <= (int)radius; ++i) {
+ for (int i = -(int)radius_y; i <= (int)radius_y; ++i) {
int offset = clamp(i, 0, height - 1) * width + x;
sum_red += intermediate_red[offset];
sum_green += intermediate_green[offset];
@@ -121,15 +127,15 @@ void FastBoxBlurFilter::apply_single_pass(size_t radius)
for (int y = 0; y < height; ++y) {
auto color = Color(
- sum_red / div,
- sum_green / div,
- sum_blue / div,
- sum_alpha / div);
+ sum_red / div_y,
+ sum_green / div_y,
+ sum_blue / div_y,
+ sum_alpha / div_y);
set_pixel_function(x, y, color);
- auto topmost_y_coord = max(y - (int)radius, 0);
- auto bottommost_y_coord = min(y + (int)radius + 1, height - 1);
+ auto topmost_y_coord = max(y - (int)radius_y, 0);
+ auto bottommost_y_coord = min(y + (int)radius_y + 1, height - 1);
sum_red += intermediate_red[x + bottommost_y_coord * width];
sum_red -= intermediate_red[x + topmost_y_coord * width];
diff --git a/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.h b/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.h
index 57a6fd9c78..3536776298 100644
--- a/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.h
+++ b/Userland/Libraries/LibGfx/Filters/FastBoxBlurFilter.h
@@ -15,6 +15,8 @@ public:
FastBoxBlurFilter(Bitmap&);
void apply_single_pass(size_t radius);
+ void apply_single_pass(size_t radius_x, size_t radius_y);
+
void apply_three_passes(size_t radius);
private: