diff --git a/src/PNGRenderer.hpp b/src/PNGRenderer.hpp index 065e508..ddd8b54 100644 --- a/src/PNGRenderer.hpp +++ b/src/PNGRenderer.hpp @@ -1,59 +1,17 @@ #pragma once -#define STB_IMAGE_WRITE_IMPLEMENTATION - -#include #include -#include -#include -#include "stb_image_write.hpp" -#include "Renderer.hpp" +#include "PixelRenderer.hpp" namespace massivedynamic { -typedef uint32_t Color; - -class PNGRenderer : public Renderer { - private: - constexpr static Color BLACK = 0xFF000000; - constexpr static Color WHITE = 0xFFFFFFFF; - - std::vector bitmap; - - void drawPixelScaled(size_t x, size_t y, Color color) { - size_t pixelSize = floor(static_cast(this->targetSize) / static_cast(this->sourceSize + 2)); - - if (pixelSize < 1) { - std::cerr << "ERROR: output file size is too small" << std::endl; - exit(1); - } - - size_t absoluteX = pixelSize * x; - size_t absoluteY = pixelSize * y; - - for (size_t localY = absoluteY + pixelSize; localY < absoluteY + pixelSize + pixelSize; localY++) { - for (size_t localX = absoluteX + pixelSize; localX < absoluteX + pixelSize + pixelSize; localX++) { - size_t absPos = localY * this->targetSize + localX; - this->bitmap.at(absPos) = color; - } - } - } +class PNGRenderer : public PixelRenderer { public: - PNGRenderer(const std::vector& pixels, size_t sourceSize, size_t targetSize) : Renderer(pixels, sourceSize, targetSize) { - if (this->targetSize == 0) - this->targetSize = (sourceSize + 2) * 2; - this->bitmap = std::vector(this->targetSize * this->targetSize, PNGRenderer::WHITE); - } + PNGRenderer(const std::vector& pixels, size_t sourceSize, size_t targetSize) : PixelRenderer(pixels, sourceSize, targetSize) {} virtual void render(const std::string& filename) override { - for (size_t y = 0; y < sourceSize; y++) { - for (size_t x = 0; x < sourceSize; x++) { - if (!pixels.at(y * sourceSize + x)) - continue; - this->drawPixelScaled(x, y, PNGRenderer::BLACK); - } - } + this->generateBuffer(); stbi_write_png(filename.c_str(), targetSize, targetSize, 4, this->bitmap.data(), sizeof(Color) * targetSize); } diff --git a/src/PixelRenderer.hpp b/src/PixelRenderer.hpp new file mode 100644 index 0000000..a25dc81 --- /dev/null +++ b/src/PixelRenderer.hpp @@ -0,0 +1,59 @@ +#pragma once + +#include +#include + +#include "Renderer.hpp" +#define STB_IMAGE_WRITE_IMPLEMENTATION +#include "stb_image_write.hpp" + +namespace massivedynamic { + typedef uint32_t Color; + + class PixelRenderer : public Renderer { + protected: + std::vector bitmap; + + void drawPixelScaled(size_t x, size_t y, Color color) { + size_t pixelSize = floor(static_cast(this->targetSize) / static_cast(this->sourceSize + 2)); + + if (pixelSize < 1) { + std::cerr << "ERROR: output file size is too small" << std::endl; + exit(1); + } + + size_t absoluteX = pixelSize * x; + size_t absoluteY = pixelSize * y; + + for (size_t localY = absoluteY + pixelSize; localY < absoluteY + pixelSize + pixelSize; localY++) { + for (size_t localX = absoluteX + pixelSize; localX < absoluteX + pixelSize + pixelSize; localX++) { + size_t absPos = localY * this->targetSize + localX; + this->bitmap.at(absPos) = color; + } + } + } + public: + enum Colors : Color { + BLACK = 0xFF000000, + WHITE = 0xFFFFFFFF + }; + + PixelRenderer(const std::vector& pixels, size_t sourceSize, size_t targetSize) : Renderer(pixels, sourceSize, targetSize) { + if (this->targetSize == 0) + this->targetSize = (sourceSize + 2) * 2; + this->bitmap = std::vector(this->targetSize * this->targetSize, Colors::WHITE); + } + + void generateBuffer() { + for (size_t y = 0; y < sourceSize; y++) { + for (size_t x = 0; x < sourceSize; x++) { + if (!pixels.at(y * sourceSize + x)) + continue; + this->drawPixelScaled(x, y, Colors::BLACK); + } + } + + } + }; + +}