📄 cc.cpp
字号:
} for (int row = C_RADEON_CC_ROWS - 3; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) fText[row][column] = 0x0000; } break; case C_RU4: // rollup captions (4 rows) PRINT(("<ru4>")); for (int row = 0; row < C_RADEON_CC_ROWS - 4; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) fText[row][column] = fText[row + 2][column]; } for (int row = C_RADEON_CC_ROWS - 4; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) fText[row][column] = 0x0000; } break; case C_FON: // flash on PRINT(("<fon>")); break; case C_RDC: // resume direct captioning PRINT(("<rdc>")); break; case C_TR: // text restart PRINT(("<tr>")); fRow = fColumn = 0; break; case C_RTD: // resume text display PRINT(("<rtd>")); fRow = fColumn = 0; break; case C_EDM: // erase displayed memory PRINT(("<edm>\n")); for (int row = 0; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) fDisplayText[row][column] = 0x0000; } DisplayCaptions(); break; case C_CR: // carriage return PRINT(("<cr>")); /* has no effect in caption loading mode */ break; case C_ENM: // erase non-displayed memory PRINT(("<enm>")); for (int row = 0; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) fText[row][column] = 0x0000; } break; case C_EOC: // end of caption PRINT(("<eoc>\n")); for (int row = 0; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) { const int code = fText[row][column]; fText[row][column] = fDisplayText[row][column]; fDisplayText[row][column] = code; } } DisplayCaptions(); break; } } else if ((code & 0x7770) == 0x1720) { /* tab offset (172X) */ const int offset = code & 0x000f; if (offset >= 1 && offset <= 3) { PRINT(("<tab%d>", offset)); if ((fColumn += offset) >= C_RADEON_CC_COLUMNS - 1) fColumn = C_RADEON_CC_COLUMNS - 1; } else { PRINT(("<tab=%04X>", code & 0x7f7f)); } } else if ((code & 0x7040) == 0x1040) { /* preamble address code (1Y4X, 1Y6X) */ switch (code & 0x0720) { case C_ROW_1: PRINT(("\n<row1")); fRow = 0; break; case C_ROW_2: PRINT(("\n<row2")); fRow = 1; break; case C_ROW_3: PRINT(("\n<row3")); fRow = 2; break; case C_ROW_4: PRINT(("\n<row4")); fRow = 3; break; case C_ROW_5: PRINT(("\n<row5")); fRow = 4; break; case C_ROW_6: PRINT(("\n<row6")); fRow = 5; break; case C_ROW_7: PRINT(("\n<row7")); fRow = 6; break; case C_ROW_8: PRINT(("\n<row8")); fRow = 7; break; case C_ROW_9: PRINT(("\n<row9")); fRow = 8; break; case C_ROW_10: PRINT(("\n<row10")); fRow = 9; break; case C_ROW_11: PRINT(("\n<row11")); fRow = 10; break; case C_ROW_12: PRINT(("\n<row12")); fRow = 11; break; case C_ROW_13: PRINT(("\n<row13")); fRow = 12; break; case C_ROW_14: PRINT(("\n<row14")); fRow = 13; break; case C_ROW_15: PRINT(("\n<row15")); fRow = 14; break; default: PRINT(("\n<pac=%04X>", code & 0x7f7f)); return false; } if ((code & 0x0010) == 0x0000) { /* change color */ fColor = (code & 0x000f); fColumn = 0; switch (fColor & 0x000e) { case C_WHITE: PRINT((",white")); break; case C_GREEN: PRINT((",green")); break; case C_BLUE: PRINT((",blue")); break; case C_CYAN: PRINT((",cyan")); break; case C_RED: PRINT((",red")); break; case C_YELLOW: PRINT((",yellow")); break; case C_MAGENTA: PRINT((",magenta")); break; case C_ITALICS: PRINT((",italics")); break; } if ((fColor & 0x0001) != 0) PRINT((",underline>")); else PRINT((">")); } else { /* indent, white */ fColor = C_WHITE | (code & 0x0001); fColumn = (code & 0x000e) << 1; PRINT((",col%d>", fColumn)); } } else { /* two one-byte standard characters */ character = (code >> 8) & 0x7f; if (character >= 0x20) { PRINT(("%c", character)); fText[fRow][fColumn] = (fColor << 8) + character; if (fColumn < C_RADEON_CC_COLUMNS - 1) fColumn++; } else if (character != 0x00) { PRINT(("<%02X>", character)); } character = (code >> 0) & 0x7f; if (character >= 0x20) { PRINT(("%c", character)); fText[fRow][fColumn] = (fColor << 8) + character; if (fColumn < C_RADEON_CC_COLUMNS - 1) fColumn++; } else if (character != 0x00) { PRINT(("<%02X>", character)); } } return true;}void CCaption::DisplayCaptions() const{ printf("\x1b[H\x1b[J"); for (int row = 0; row < C_RADEON_CC_ROWS; row++) { for (int column = 0; column < C_RADEON_CC_COLUMNS; column++) { if (fDisplayText[row][column] == 0x0000) { printf("\x1b[0;47;37m "); continue; } const int code = (fDisplayText[row][column] >> 0) & 0xff; const int color = (fDisplayText[row][column] >> 8) & 0xff; switch (color & 0x000e) { case 0x0000: // WHITE printf("\x1b[0;%d;40;37m", (color & 1) << 2); break; case 0x0002: // GREEN printf("\x1b[0;%d;40;32m", (color & 1) << 2); break; case 0x0004: // BLUE printf("\x1b[0;%d;40;34m", (color & 1) << 2); break; case 0x0006: // CYAN printf("\x1b[0;%d;40;35m", (color & 1) << 2); break; case 0x0008: // RED printf("\x1b[0;%d;40;31m", (color & 1) << 2); break; case 0x000a: // YELLOW printf("\x1b[0;%d;40;33m", (color & 1) << 2); break; case 0x000c: // MAGENTA printf("\x1b[0;%d;40;36m", (color & 1) << 2); break; case 0x000e: // WHITE ITALICS if ((color & 1) == 0) printf("\x1b[1;40;37m"); else printf("\x1b[1;4;40;37m"); break; } if (code >= 0x20 && code <= 0x7f) { switch (code) { case 0x002a: // aacute printf("\xc3\xa1"); break; case 0x005c: // eacute printf("\xc3\xa9"); break; case 0x005e: // iacute printf("\xc3\xad"); break; case 0x005f: // oacute printf("\xc3\xb3"); break; case 0x0060: // uacute printf("\xc3\xba"); break; case 0x007b: // ccedil printf("\xc3\xa7"); break; case 0x007c: // division printf("\xc3\xb7"); break; case 0x007d: // Ntilde printf("\xc3\x91"); break; case 0x007e: // ntilde printf("\xc3\xb1"); break; case 0x007f: // block printf("\xc1\xbf"); break; default: // ASCII character printf("%c", code); break; } } else { switch (code) { case 0x0080: // reg printf("\xc2\xae"); break; case 0x0081: // deg printf("\xc2\xb0"); break; case 0x0082: // frac12 printf("\xc2\xbd"); break; case 0x0083: // iquest printf("\xc2\xbf"); break; case 0x0084: // trademark printf("\xe2\x84"); break; case 0x0085: // cent printf("\xc2\xa2"); break; case 0x0086: // pound printf("\xc2\xa3"); break; case 0x0087: // music printf("\xc2\xa7"); break; case 0x0088: // agrave printf("\xc3\xa0"); break; case 0x0089: // tspace printf("\x1b[0;47;37m "); break; case 0x008a: // egrave printf("\xc3\xa8"); break; case 0x008b: // acirc printf("\xc3\xa2"); break; case 0x008c: // ecirc printf("\xc3\xaa"); break; case 0x008d: // icirc printf("\xc3\xae"); break; case 0x008e: // ocirc printf("\xc3\xb4"); break; case 0x008f: // ucirc printf("\xc3\xbb"); break; default: // buggy code printf("<%02X>", code); break; } } } printf("\n"); } printf("\x1b[0;30;47m");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -