diff --git a/third_party/blurhash/blurhash.cpp b/third_party/blurhash/blurhash.cpp index bcfcce5c..c7e935ff 100644 --- a/third_party/blurhash/blurhash.cpp +++ b/third_party/blurhash/blurhash.cpp @@ -7,7 +7,11 @@ #include #ifdef DOCTEST_CONFIG_IMPLEMENT_WITH_MAIN +#if __has_include() #include +#else +#include +#endif #endif 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); + std::vector basis_x(width * components.x, 0.f); + std::vector 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(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(ny * y) / float(height)); + } + } + for (size_t y = 0; y < height; y++) { for (size_t x = 0; x < width; x++) { Color c{}; for (size_t nx = 0; nx < size_t(components.x); nx++) { for (size_t ny = 0; ny < size_t(components.y); ny++) { - float basis = - std::cos(pi * float(nx * x) / float(width)) * - std::cos(pi * float(ny * y) / float(height)); + float basis = basis_x[x * components.x + nx] * + basis_y[y * components.y + ny]; c += values[nx + ny * components.x] * basis; } }