diff options
author | Adrian Kummerlaender | 2016-05-14 16:28:50 +0200 |
---|---|---|
committer | Adrian Kummerlaender | 2016-05-14 16:28:50 +0200 |
commit | 8e1d7c4e484ef43dddc5074055727694ceb0e37b (patch) | |
tree | 1fa2f85c723b37fd6c0a1ed81b1d488a9389bffd /src | |
parent | 0bc5575e0f744bfc3f5047e4a163cd1940864964 (diff) | |
download | voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar.gz voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar.bz2 voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar.lz voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar.xz voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.tar.zst voronoi-8e1d7c4e484ef43dddc5074055727694ceb0e37b.zip |
Extract stream management into `ppm_pixel_stream`, provide Cartesian coordinates
Diffstat (limited to 'src')
-rw-r--r-- | src/imgen.cc | 48 | ||||
-rw-r--r-- | src/imgen.h | 22 |
2 files changed, 50 insertions, 20 deletions
diff --git a/src/imgen.cc b/src/imgen.cc index d574672..25731e1 100644 --- a/src/imgen.cc +++ b/src/imgen.cc @@ -1,34 +1,50 @@ #include "imgen.h" -#include <fstream> - namespace { inline void write_color(std::ofstream& out, const imgen::color& color) { - out << std::get<0>(color); - out << std::get<1>(color); - out << std::get<2>(color); + out << std::get<0>(color) + << std::get<1>(color) + << std::get<2>(color); } } namespace imgen { +ppm_pixel_stream::ppm_pixel_stream( + const std::string& path, + const std::size_t width, + const std::size_t height +): stream_() { + this->stream_.open(path, std::ios::binary | std::ios::out); + this->stream_.sync_with_stdio(false); + + this->stream_ << "P6\n" << width << " " << height << "\n255\n"; +} + +ppm_pixel_stream& ppm_pixel_stream::operator<<(const color& value) { + write_color(this->stream_, value); + + return *this; +} + void write_ppm( - const std::string& path, - const std::size_t sizeX, - const std::size_t sizeY, - std::function<color(std::size_t, std::size_t)> generator + const std::string& path, + const std::size_t width, + const std::size_t height, + std::function<color(std::ptrdiff_t, std::ptrdiff_t)> generator ) { - std::ofstream out; - out.open(path, std::ios::binary | std::ios::out); - out.sync_with_stdio(false); + ppm_pixel_stream file(path, width, height); - out << "P6\n" << sizeX << " " << sizeY << "\n255\n"; + const std::ptrdiff_t min_y = height / 2 * -1; + const std::ptrdiff_t max_y = height / 2; + const std::ptrdiff_t min_x = width / 2 * -1; + const std::ptrdiff_t max_x = width / 2; - for ( std::size_t posY = 0; posY < sizeY; ++posY ) { - for ( std::size_t posX = 0; posX < sizeX; ++posX ) { - write_color(out, generator(posX, posY)); + for ( std::ptrdiff_t posY = min_y; posY < max_y; ++posY ) { + for ( std::ptrdiff_t posX = min_x; posX < max_x; ++posX ) { + file << generator(posX, posY); } } } diff --git a/src/imgen.h b/src/imgen.h index 5ddbaf6..35b798d 100644 --- a/src/imgen.h +++ b/src/imgen.h @@ -1,16 +1,30 @@ #include <string> #include <utility> +#include <fstream> #include <functional> namespace imgen { using color = std::tuple<std::uint8_t, std::uint8_t, std::uint8_t>; +class ppm_pixel_stream { + public: + ppm_pixel_stream(const std::string& path, + const std::size_t width, + const std::size_t height); + + ppm_pixel_stream& operator<<(const color& value); + + private: + std::ofstream stream_; + +}; + void write_ppm( - const std::string& path, - const std::size_t sizeX, - const std::size_t sizeY, - std::function<color(std::size_t, std::size_t)> generator + const std::string& path, + const std::size_t sizeX, + const std::size_t sizeY, + std::function<color(std::ptrdiff_t, std::ptrdiff_t)> generator ); } |