#include #include #include #include #include "Benchmark.h" const std::string execName = "visualize-prng-distribution"; using namespace Leonetienne::GCrypt; using namespace Leonetienne::BmpPP; using namespace Leonetienne::Eule; int main() { // Black/white Benchmark( "black/white - GetBit()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); for (std::size_t x = 0; x < bmp.GetDimensions().x; x++) for (std::size_t y = 0; y < bmp.GetDimensions().y; y++) { const std::uint8_t pixel = prng.GetBit() ? 255 : 0; bmp.SetPixel(Vector2i(x, y), pixel); } bmp.Write(execName+"-blackwhite.bmp"); } ); // Grayscale (using GetRandom<>) Benchmark( "grayscale - GetRandom()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); for (std::size_t x = 0; x < bmp.GetDimensions().x; x++) for (std::size_t y = 0; y < bmp.GetDimensions().y; y++) { const std::uint8_t pixel = prng.GetRandom(); bmp.SetPixel(Vector2i(x, y), pixel); } bmp.Write(execName+"-getrandom-grayscale.bmp"); } ); // Grayscale (using operator()) (this one returns a whole uint32) Benchmark( "grayscale - operator()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); for (std::size_t x = 0; x < bmp.GetDimensions().x; x++) for (std::size_t y = 0; y < bmp.GetDimensions().y; y++) { const std::uint8_t pixel = prng() % 256; bmp.SetPixel(Vector2i(x, y), pixel); } bmp.Write(execName+"-operator-grayscale.bmp"); } ); // Color (using GetRandom<>) Benchmark( "color - GetRandom()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); for (std::size_t x = 0; x < bmp.GetDimensions().x; x++) for (std::size_t y = 0; y < bmp.GetDimensions().y; y++) { const std::uint8_t r = prng.GetRandom(); const std::uint8_t g = prng.GetRandom(); const std::uint8_t b = prng.GetRandom(); bmp.SetPixel(Vector2i(x, y), r, g, b); } bmp.Write(execName+"-getrandom-color.bmp"); } ); // Color (using operator()) (this one returns a whole uint32) Benchmark( "color - operator()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); for (std::size_t x = 0; x < bmp.GetDimensions().x; x++) for (std::size_t y = 0; y < bmp.GetDimensions().y; y++) { const std::uint8_t r = prng() % 256; const std::uint8_t g = prng() % 256; const std::uint8_t b = prng() % 256; bmp.SetPixel(Vector2i(x, y), r, g, b); } bmp.Write(execName+"-operator-color.bmp"); } ); // Color (using GetBlock()) //(this one returns a derivation of the current hashsum, without using up randomness) Benchmark( "color - GetBlock()", []() { Key seed = Key::Random(); BMP bmp(Vector2i(800, 800), Colormode::RGB); GPrng prng(seed); std::size_t bytes_written = 0; while (bytes_written < bmp.GetPixelbufferSize()) { const Block block = prng.GetBlock(); std::size_t bytesToCopy = 0; if (bmp.GetPixelbufferSize() - bytes_written < Block::BLOCK_SIZE) { bytesToCopy = bmp.GetPixelbufferSize() - bytes_written; } else { bytesToCopy = Block::BLOCK_SIZE; } memcpy( (char*)bmp.GetPixelbuffer().data() + bytes_written, (char*)block.Data(), bytesToCopy ); bytes_written += bytesToCopy; } bmp.Write(execName+"-getblock-color.bmp"); } ); return 0; }