#pragma once
#include <whiteout/common_types.h>
#include <whiteout/interfaces.h>
#include <array>
#include <memory>
#include <span>
#include <vector>
namespace whiteout::textures::wu {
static constexpr u32 MAX_COLORS = 256;
struct QuantizeResult {
std::array<u32, MAX_COLORS> palette{};
u32 color_count = 0;
u8 mapPixel(u8 r, u8 g, u8 b) const;
void mapPixels(const u8* rgba, u32 pixel_count, u8* out_indices) const;
void mapPixelsDithered(const u8* rgba, u32 width, u32 height, f32 strength,
u8* out_indices) const;
void refineDitherAware(const u8* rgba, u32 width, u32 height, f32 strength, u32 iterations = 5,
interfaces::WorkerPool* pool = nullptr);
private:
friend class Quantizer;
bool srgb_ = false;
static constexpr u32 HIST_SIZE = 33;
std::vector<u8> tag_; };
class Quantizer {
public:
Quantizer();
~Quantizer();
Quantizer(Quantizer&&) noexcept;
Quantizer& operator=(Quantizer&&) noexcept;
Quantizer& maxColors(u32 count);
Quantizer& kmeansIterations(u32 iterations);
Quantizer& srgbInput(bool srgb);
Quantizer& ditherAware(u32 width, u32 height, f32 strength, u32 iterations = 5);
Quantizer& workerPool(interfaces::WorkerPool* pool);
QuantizeResult quantize(const u8* rgba, u32 pixel_count) const;
QuantizeResult quantize(const u8* rgba, u32 pixel_count, interfaces::WorkerPool* pool) const;
interfaces::TimelineSemaphore::Value quantizeAsync(
const u8* rgba, u32 pixel_count, interfaces::WorkerPool* pool,
interfaces::TimelineSemaphore* sem, interfaces::TimelineSemaphore::Value startValue,
QuantizeResult* outResult) const;
private:
struct Impl;
std::unique_ptr<Impl> m_impl;
};
}