diff --git a/src/pixels.cpp b/src/pixels.cpp new file mode 100644 index 0000000..a5ad44e --- /dev/null +++ b/src/pixels.cpp @@ -0,0 +1,26 @@ +#include +#include +#include +#include "pixels.hpp" + +void write_image(std::ostream& os, const std::string& path) { + std::unique_ptr infile {pm_openr(path.c_str()), pm_close}; + struct pam info; + pnm_readpaminit(infile.get(), &info, PAM_STRUCT_SIZE(tuple_type)); + std::unique_ptr row1 {pnm_allocpamrow(&info), pm_freerow}; + std::unique_ptr row2 {pnm_allocpamrow(&info), pm_freerow}; + for (int y = 0; y < info.height; y += 2) { + pnm_readpamrow(&info, row1.get()); + pnm_readpamrow(&info, row2.get()); + for (int x = 0; x < info.width; ++x) { + if (info.depth == 3) { // assume RGB, 1 byte per sample + tuple* t1 {row1.get()}; + os << sc::io::truecolorb(t1[x][0], t1[x][1], t1[x][2]); + tuple* t2 {row2.get()}; + os << sc::io::truecolorf(t2[x][0], t2[x][1], t2[x][2]); + os << u8"\u2584"; // unicode lower half block + } + } + os << sc::io::reset << '\n'; + } +} diff --git a/src/pixels.hpp b/src/pixels.hpp new file mode 100644 index 0000000..48e9338 --- /dev/null +++ b/src/pixels.hpp @@ -0,0 +1,8 @@ +#ifndef PIXELS_H_ +#define PIXELS_H_ + +#include + +void write_image(std::ostream& os, const std::string& path); + +#endif // PIXELS_H_