From 807daf323785c4a034a11b850dc6da7da2bbfe53 Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 13 Sep 2020 11:09:12 +0300 Subject: [PATCH] Add pixmap bluring --- libs/pcg/include/psemek/pcg/blur.hpp | 11 ++++++ libs/pcg/source/blur.cpp | 55 ++++++++++++++++++++++++++++ 2 files changed, 66 insertions(+) create mode 100644 libs/pcg/include/psemek/pcg/blur.hpp create mode 100644 libs/pcg/source/blur.cpp diff --git a/libs/pcg/include/psemek/pcg/blur.hpp b/libs/pcg/include/psemek/pcg/blur.hpp new file mode 100644 index 00000000..3121f518 --- /dev/null +++ b/libs/pcg/include/psemek/pcg/blur.hpp @@ -0,0 +1,11 @@ +#pragma once + +#include +#include + +namespace psemek::pcg +{ + + gfx::basic_pixmap blur(gfx::basic_pixmap const & p, int size, float sigma, seamless_tag); + +} diff --git a/libs/pcg/source/blur.cpp b/libs/pcg/source/blur.cpp new file mode 100644 index 00000000..ea1fe88d --- /dev/null +++ b/libs/pcg/source/blur.cpp @@ -0,0 +1,55 @@ +#include + +#include +#include + +namespace psemek::pcg +{ + + static std::vector gauss_coeffs(int size, float sigma) + { + std::vector res(2 * size + 1); + float sum = 0.f; + for (int i = -size; i <= size; ++i) + { + float x = (i / sigma); + res[i + size] = std::exp(- x * x); + sum += res[i + size]; + } + for (auto & c : res) + c /= sum; + return res; + } + + gfx::basic_pixmap blur(gfx::basic_pixmap const & p, int size, float sigma, seamless_tag) + { + gfx::basic_pixmap res({p.width(), p.height()}, 0.f); + + auto c = gauss_coeffs(size, sigma); + + for (int y = 0; y < p.height(); ++y) + { + for (int x = 0; x < p.width(); ++x) + { + for (int j = - size; j <= size; ++j) + { + for (int i = - size; i <= size; ++i) + { + int ix = (x + i); + while (ix < 0) ix += p.width(); + if (ix >= p.width()) ix = ix % p.width(); + + int iy = (y + j); + while (iy < 0) iy += p.height(); + if (iy >= p.height()) iy = iy % p.height(); + + res(x, y) += p(ix, iy) * c[i + size] * c[j + size]; + } + } + } + } + + return res; + } + +}