Speed up blurhashes

This commit is contained in:
Nicolas Werner 2022-01-01 15:47:15 +01:00
parent 7685d1808b
commit 0d10ffc8cd
No known key found for this signature in database
GPG key ID: C8D75E610773F2D9

View file

@ -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;
} }
} }