True color detection now done by libscterm

Also, if not supported, libscterm will automatically gracefully degrade
to the standard 216-color palette.
This commit is contained in:
Bob Polis 2024-01-29 13:37:28 +01:00
parent 14d492985e
commit 3e99af61d0

View File

@ -1,16 +1,9 @@
#include <memory> #include <memory>
#include <cmath>
#include <libscterm.hpp> #include <libscterm.hpp>
#include <netpbm/pam.h> #include <netpbm/pam.h>
#include "pixels.hpp" #include "pixels.hpp"
// truecolor to palette color (216-color)
static inline int t2p(int val) {
return round(5 * val / 255.0);
}
static void write(std::ostream& os, FILE* in) { static void write(std::ostream& os, FILE* in) {
bool has_truecolor = sc::term::has_truecolor();
struct pam info; struct pam info;
pnm_readpaminit(in, &info, PAM_STRUCT_SIZE(tuple_type)); pnm_readpaminit(in, &info, PAM_STRUCT_SIZE(tuple_type));
std::unique_ptr<tuple, void(*)(void*)> row1 {pnm_allocpamrow(&info), pm_freerow}; std::unique_ptr<tuple, void(*)(void*)> row1 {pnm_allocpamrow(&info), pm_freerow};
@ -29,16 +22,8 @@ static void write(std::ostream& os, FILE* in) {
} }
for (int x = 0; x < info.width; ++x) { for (int x = 0; x < info.width; ++x) {
if (info.depth == 3) { // assume RGB, 1 byte per sample if (info.depth == 3) { // assume RGB, 1 byte per sample
if (has_truecolor) { os << sc::io::truecolorb(t1[x][0], t1[x][1], t1[x][2]);
os << sc::io::truecolorb(t1[x][0], t1[x][1], t1[x][2]); os << sc::io::truecolorf(t2[x][0], t2[x][1], t2[x][2]);
} else {
os << sc::io::rgbb(t2p(t1[x][0]), t2p(t1[x][1]), t2p(t1[x][2]));
}
if (has_truecolor) {
os << sc::io::truecolorf(t2[x][0], t2[x][1], t2[x][2]);
} else {
os << sc::io::rgbf(t2p(t2[x][0]), t2p(t2[x][1]), t2p(t2[x][2]));
}
os << u8"\u2584"; // unicode lower half block os << u8"\u2584"; // unicode lower half block
} }
} }