1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120
|
#if 0
g++ $0 -std=c++14 -Iinclude && ./a.out && rm -f a.out && qiv panda.ppm 1up.ppm
exit
#else
#include <array>
#include <frozen/map.h>
#include <fstream>
constexpr frozen::map<char, std::array<char, 3>, 5> Tans{
{'R', {(char)0xFF, (char)0x00, (char)0x00}},
{'G', {(char)0x00, (char)0xFF, (char)0x00}},
{'B', {(char)0x00, (char)0x00, (char)0xFF}},
{'#', {(char)0x00, (char)0x00, (char)0x00}},
{' ', {(char)0xFF, (char)0xFF, (char)0xFF}},
};
constexpr unsigned itoa(unsigned char * start, unsigned i) {
constexpr unsigned step = sizeof(unsigned) * 3;
for(unsigned k = 0; k < step; ++k)
*start++ = ' ';
do {
*--start = '0' + i % 10;
i /= 10;
} while(i);
return step;
}
template <unsigned H, unsigned W> struct ppm {
unsigned char bytes[9 /* fixed header*/ + sizeof(unsigned) * 3 * 2 /* to hold sizes */ + 3 * H * W];
constexpr ppm(unsigned char const *data) : bytes{0} {
unsigned j = 0;
bytes[j++] = 'P';
bytes[j++] = '6';
bytes[j++] = ' ';
j += itoa(bytes + j, H);
bytes[j++] = ' ';
j += itoa(bytes + j, W);
bytes[j++] = ' ';
bytes[j++] = '2';
bytes[j++] = '5';
bytes[j++] = '5';
bytes[j++] = '\n';
for (unsigned i = 0; i < H * W; ++i) {
auto const code = Tans.find(data[i])->second;
bytes[j + 3 * i + 0] = code[0];
bytes[j + 3 * i + 1] = code[1];
bytes[j + 3 * i + 2] = code[2];
}
}
void save(char const path[]) const {
std::ofstream out{path, std::ios::binary};
out.write((char *)bytes, sizeof bytes);
}
};
void make_panda() {
constexpr unsigned char bytes[] = " ### ### "
" ##### ########## ##### "
" ####### ####### "
" #### #### "
" ### ### "
" # # "
" # # "
" # ### ### # "
" # ##### ##### # "
" # #### # # #### # "
" # #### # # #### # "
" # ##### ##### # "
" # ### ## ### # "
" # ## # "
" #### RRR RRR #### "
" ######RRRRR RRRRR###### "
" ######RRRRRRRRRRRR###### "
" ######RRRRRRRRRRRR###### "
" ######RRRRRRRRRRRR###### "
" #######RRRRRRRRRR####### "
" ##### RRRRRRRR #### "
" ### RRRRRR ## "
" RRRR ";
constexpr ppm<26, 22> some{bytes};
some.save("panda.ppm");
}
void make_1up() {
constexpr unsigned char bytes[] = " ###### "
" ##GGGG ## "
" # GGGG # "
" # GGGGGG # "
" # GG GG # "
" #GGG GGGGG# "
" #GGG GG G# "
" # GG G # "
" # GG GG # "
" # GGGGGGGGG G# "
" # GG########GGG# "
" ### # # ### "
" # # # # "
" # # "
" # # "
" ######## "
;
constexpr ppm<18, 16> some{bytes};
some.save("1up.ppm");
}
int main() {
make_panda();
make_1up();
return 0;
}
#endif
|