mirror of
https://github.com/Nheko-Reborn/nheko.git
synced 2024-11-23 19:38:48 +03:00
Speed up blurhashes
This commit is contained in:
parent
7685d1808b
commit
0d10ffc8cd
1 changed files with 22 additions and 3 deletions
25
third_party/blurhash/blurhash.cpp
vendored
25
third_party/blurhash/blurhash.cpp
vendored
|
@ -7,7 +7,11 @@
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
#ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN
|
||||||
|
#if __has_include(<doctest.h>)
|
||||||
#include <doctest.h>
|
#include <doctest.h>
|
||||||
|
#else
|
||||||
|
#include <doctest/doctest.h>
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
using namespace std::literals;
|
using namespace std::literals;
|
||||||
|
@ -279,15 +283,30 @@ decode(std::string_view blurhash, size_t width, size_t height, size_t bytesPerPi
|
||||||
|
|
||||||
i.image.reserve(height * width * bytesPerPixel);
|
i.image.reserve(height * width * bytesPerPixel);
|
||||||
|
|
||||||
|
std::vector<float> basis_x(width * components.x, 0.f);
|
||||||
|
std::vector<float> basis_y(height * components.y, 0.f);
|
||||||
|
|
||||||
|
for (size_t x = 0; x < width; x++) {
|
||||||
|
for (size_t nx = 0; nx < size_t(components.x); nx++) {
|
||||||
|
basis_x[x * components.x + nx] =
|
||||||
|
std::cos(pi<float> * float(nx * x) / float(width));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for (size_t y = 0; y < height; y++) {
|
||||||
|
for (size_t ny = 0; ny < size_t(components.y); ny++) {
|
||||||
|
basis_y[y * components.y + ny] =
|
||||||
|
std::cos(pi<float> * float(ny * y) / float(height));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t y = 0; y < height; y++) {
|
for (size_t y = 0; y < height; y++) {
|
||||||
for (size_t x = 0; x < width; x++) {
|
for (size_t x = 0; x < width; x++) {
|
||||||
Color c{};
|
Color c{};
|
||||||
|
|
||||||
for (size_t nx = 0; nx < size_t(components.x); nx++) {
|
for (size_t nx = 0; nx < size_t(components.x); nx++) {
|
||||||
for (size_t ny = 0; ny < size_t(components.y); ny++) {
|
for (size_t ny = 0; ny < size_t(components.y); ny++) {
|
||||||
float basis =
|
float basis = basis_x[x * components.x + nx] *
|
||||||
std::cos(pi<float> * float(nx * x) / float(width)) *
|
basis_y[y * components.y + ny];
|
||||||
std::cos(pi<float> * float(ny * y) / float(height));
|
|
||||||
c += values[nx + ny * components.x] * basis;
|
c += values[nx + ny * components.x] * basis;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue