Version numer v1.1.0

This commit is contained in:
Stefan Haustein 2020-07-05 16:42:42 +02:00
parent 81717de7c4
commit 9566005db8

View file

@ -19,6 +19,7 @@ const int FLAG_BG = 2;
const int FLAG_MODE_256 = 4; const int FLAG_MODE_256 = 4;
const int FLAG_24BIT = 8; const int FLAG_24BIT = 8;
const int FLAG_NOOPT = 16; const int FLAG_NOOPT = 16;
const int FLAG_TELETEXT = 32;
const int COLOR_STEP_COUNT = 6; const int COLOR_STEP_COUNT = 6;
const int COLOR_STEPS[COLOR_STEP_COUNT] = {0, 0x5f, 0x87, 0xaf, 0xd7, 0xff}; const int COLOR_STEPS[COLOR_STEP_COUNT] = {0, 0x5f, 0x87, 0xaf, 0xd7, 0xff};
@ -118,7 +119,77 @@ const unsigned int BITMAPS[] = {
//0x000fec80, 0x25e4, //0x000fec80, 0x25e4,
//0x000f7310, 0x25e5, //0x000f7310, 0x25e5,
0, 0 // End marker 0, 0, // End marker for "regular" characters
// Teletext / legacy graphics 3x2 block character codes.
// Using a 3-2-3 pattern consistently, perhaps we should create automatic variations....
0xccc00000, 0xfb00,
0x33300000, 0xfb01,
0xfff00000, 0xfb02,
0x000cc000, 0xfb03,
0xccccc000, 0xfb04,
0x333cc000, 0xfb05,
0xfffcc000, 0xfb06,
0x00033000, 0xfb07,
0xccc33000, 0xfb08,
0x33333000, 0xfb09,
0xfff33000, 0xfb0a,
0x000ff000, 0xfb0b,
0xcccff000, 0xfb0c,
0x333ff000, 0xfb0d,
0xfffff000, 0xfb0e,
0x00000ccc, 0xfb0f,
0xccc00ccc, 0xfb10,
0x33300ccc, 0xfb11,
0xfff00ccc, 0xfb12,
0x000ccccc, 0xfb13,
0x333ccccc, 0xfb14,
0xfffccccc, 0xfb15,
0x00033ccc, 0xfb16,
0xccc33ccc, 0xfb17,
0x33333ccc, 0xfb18,
0xfff33ccc, 0xfb19,
0x000ffccc, 0xfb1a,
0xcccffccc, 0xfb1b,
0x333ffccc, 0xfb1c,
0xfffffccc, 0xfb1d,
0x00000333, 0xfb1e,
0xccc00333, 0xfb1f,
0x33300333, 0x1b20,
0xfff00333, 0x1b21,
0x000cc333, 0x1b22,
0xccccc333, 0x1b23,
0x333cc333, 0x1b24,
0xfffcc333, 0x1b25,
0x00033333, 0x1b26,
0xccc33333, 0x1b27,
0xfff33333, 0x1b28,
0x000ff333, 0x1b29,
0xcccff333, 0x1b2a,
0x333ff333, 0x1b2b,
0xfffff333, 0x1b2c,
0x00000fff, 0x1b2d,
0xccc00fff, 0x1b2e,
0x33300fff, 0x1b2f,
0xfff00fff, 0x1b30,
0x000ccfff, 0x1b31,
0xcccccfff, 0x1b32,
0x333ccfff, 0x1b33,
0xfffccfff, 0x1b34,
0x00033fff, 0x1b35,
0xccc33fff, 0x1b36,
0x33333fff, 0x1b37,
0xfff33fff, 0x1b38,
0x000fffff, 0x1b39,
0xcccfffff, 0x1b3a,
0x333fffff, 0x1b3b,
0, 1 // End marker for extended TELETEXT mode.
}; };
@ -130,7 +201,7 @@ struct CharData {
// Return a CharData struct with the given code point and corresponding averag fg and bg colors. // Return a CharData struct with the given code point and corresponding averag fg and bg colors.
CharData getCharData(const cimg_library::CImg<unsigned char> & image, int x0, int y0, int codepoint, int pattern) { CharData createCharData(const cimg_library::CImg<unsigned char> & image, int x0, int y0, int codepoint, int pattern) {
CharData result; CharData result;
result.codePoint = codepoint; result.codePoint = codepoint;
int fg_count = 0; int fg_count = 0;
@ -168,7 +239,7 @@ CharData getCharData(const cimg_library::CImg<unsigned char> & image, int x0, in
// Find the best character and colors for a 4x8 part of the image at the given position // Find the best character and colors for a 4x8 part of the image at the given position
CharData getCharData(const cimg_library::CImg<unsigned char> & image, int x0, int y0) { CharData findCharData(const cimg_library::CImg<unsigned char> & image, int x0, int y0, int flags) {
int min[3] = {255, 255, 255}; int min[3] = {255, 255, 255};
int max[3] = {0}; int max[3] = {0};
std::map<long,int> count_per_color; std::map<long,int> count_per_color;
@ -255,7 +326,12 @@ CharData getCharData(const cimg_library::CImg<unsigned char> & image, int x0, in
unsigned int best_pattern = 0x0000ffff; unsigned int best_pattern = 0x0000ffff;
int codepoint = 0x2584; int codepoint = 0x2584;
bool inverted = false; bool inverted = false;
for (int i = 0; BITMAPS[i + 1] != 0; i += 2) { int end_marker = flags & FLAG_TELETEXT ? 1 : 0;
for (int i = 0; BITMAPS[i + 1] != end_marker; i += 2) {
// Skip all end markers
if (BITMAPS[i + 1] < 32) {
continue;
}
unsigned int pattern = BITMAPS[i]; unsigned int pattern = BITMAPS[i];
for (int j = 0; j < 2; j++) { for (int j = 0; j < 2; j++) {
int diff = (std::bitset<32>(pattern ^ bits)).count(); int diff = (std::bitset<32>(pattern ^ bits)).count();
@ -284,7 +360,7 @@ CharData getCharData(const cimg_library::CImg<unsigned char> & image, int x0, in
} }
return result; return result;
} }
return getCharData(image, x0, y0, codepoint, best_pattern); return createCharData(image, x0, y0, codepoint, best_pattern);
} }
@ -374,8 +450,8 @@ void emit_image(const cimg_library::CImg<unsigned char> & image, int flags) {
for (int y = 0; y <= image.height() - 8; y += 8) { for (int y = 0; y <= image.height() - 8; y += 8) {
for (int x = 0; x <= image.width() - 4; x += 4) { for (int x = 0; x <= image.width() - 4; x += 4) {
CharData charData = flags & FLAG_NOOPT CharData charData = flags & FLAG_NOOPT
? getCharData(image, x, y, 0x2584, 0x0000ffff) ? createCharData(image, x, y, 0x2584, 0x0000ffff)
: getCharData(image, x, y); : findCharData(image, x, y, flags);
if (x == 0 || charData.bgColor != lastCharData.bgColor) if (x == 0 || charData.bgColor != lastCharData.bgColor)
emit_color(flags | FLAG_BG, charData.bgColor[0], charData.bgColor[1], charData.bgColor[2]); emit_color(flags | FLAG_BG, charData.bgColor[0], charData.bgColor[1], charData.bgColor[2]);
if (x == 0 || charData.fgColor != lastCharData.fgColor) if (x == 0 || charData.fgColor != lastCharData.fgColor)
@ -411,10 +487,8 @@ std::ostream& operator<<(std::ostream& stream, size sz) {
} }
void emit_usage() { void emit_usage() {
std::cerr << "Terminal Image Viewer" << std::endl << std::endl; std::cerr << "Terminal Image Viewer v1.1.0" << std::endl << std::endl;
std::cerr << "usage: tiv [options] <image> [<image>...]" << std::endl << std::endl; std::cerr << "usage: tiv [options] <image> [<image>...]" << std::endl << std::endl;
std::cerr << " -0 : No block character adjustment, always use top half block char." << std::endl; std::cerr << " -0 : No block character adjustment, always use top half block char." << std::endl;
std::cerr << " -256 : Use 256 color mode." << std::endl; std::cerr << " -256 : Use 256 color mode." << std::endl;
@ -423,7 +497,8 @@ void emit_usage() {
std::cerr << " -f : Force 'full' mode. Automatically selected for one input." << std::endl; std::cerr << " -f : Force 'full' mode. Automatically selected for one input." << std::endl;
std::cerr << " -help : Display this help text." << std::endl; std::cerr << " -help : Display this help text." << std::endl;
std::cerr << " -h <num> : Set the maximum height to <num> lines." << std::endl; std::cerr << " -h <num> : Set the maximum height to <num> lines." << std::endl;
std::cerr << " -w <num> : Set the maximum width to <num> characters." << std::endl << std::endl; std::cerr << " -w <num> : Set the maximum width to <num> characters." << std::endl;
std::cerr << " -x : Use new Unicode Teletext/legacy charactery (experimental)." << std::endl << std::endl;
} }
enum Mode {AUTO, THUMBNAILS, FULL_SIZE}; enum Mode {AUTO, THUMBNAILS, FULL_SIZE};
@ -497,6 +572,8 @@ int main(int argc, char* argv[]) {
flags |= FLAG_MODE_256; flags |= FLAG_MODE_256;
} else if (arg == "--help" || arg == "-help") { } else if (arg == "--help" || arg == "-help") {
emit_usage(); emit_usage();
} else if (arg == "-x") {
flags |= FLAG_TELETEXT;
} else if (arg[0] == '-') { } else if (arg[0] == '-') {
std::cerr << "Unrecognized argument: " << arg << std::endl; std::cerr << "Unrecognized argument: " << arg << std::endl;
} else { } else {