GCrypt/GCryptLib/exec/visualize-prng-distribution.cpp

147 lines
3.9 KiB
C++
Raw Normal View History

#include <iostream>
#include <GCrypt/Key.h>
#include <GCrypt/GPrng.h>
#include <BmpPP/Bmp.h>
#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<std::uint8_t>()",
[]() {
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<std::uint8_t>();
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);
}
2022-05-26 18:59:05 +02:00
bmp.Write(execName+"-operator-grayscale.bmp");
}
);
// Color (using GetRandom<>)
Benchmark(
"color - GetRandom<uint8_t>()",
[]() {
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<std::uint8_t>();
const std::uint8_t g = prng.GetRandom<std::uint8_t>();
const std::uint8_t b = prng.GetRandom<std::uint8_t>();
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);
}
2022-05-26 18:59:05 +02:00
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;
}