11#include <promeki/config.h>
12#if PROMEKI_ENABLE_PROAV
17PROMEKI_NAMESPACE_BEGIN
55 static constexpr uint8_t withOddParity(uint8_t c) {
56 uint8_t v =
static_cast<uint8_t
>(c & 0x7F);
58 for (
int i = 0; i < 7; ++i) {
59 if (v & (1u << i)) ++ones;
61 if ((ones & 1u) == 0u) v =
static_cast<uint8_t
>(v | 0x80);
67 static constexpr bool checkOddParity(uint8_t c) {
69 for (
int i = 0; i < 8; ++i) {
70 if (c & (1u << i)) ++ones;
72 return (ones & 1u) != 0u;
76 static constexpr uint8_t stripParity(uint8_t c) {
return static_cast<uint8_t
>(c & 0x7F); }
86 static constexpr uint8_t Cc1MiscFirstByte = 0x14;
90 static constexpr uint8_t MiscRCL = 0x20;
91 static constexpr uint8_t MiscBS = 0x21;
92 static constexpr uint8_t MiscDER = 0x24;
93 static constexpr uint8_t MiscRU2 = 0x25;
94 static constexpr uint8_t MiscRU3 = 0x26;
95 static constexpr uint8_t MiscRU4 = 0x27;
96 static constexpr uint8_t MiscFON = 0x28;
97 static constexpr uint8_t MiscRDC = 0x29;
98 static constexpr uint8_t MiscTR = 0x2A;
99 static constexpr uint8_t MiscRTD = 0x2B;
100 static constexpr uint8_t MiscEDM = 0x2C;
101 static constexpr uint8_t MiscCR = 0x2D;
102 static constexpr uint8_t MiscENM = 0x2E;
103 static constexpr uint8_t MiscEOC = 0x2F;
108 static constexpr uint8_t RclB1 = Cc1MiscFirstByte;
109 static constexpr uint8_t RclB2 = MiscRCL;
112 static constexpr uint8_t EocB1 = Cc1MiscFirstByte;
113 static constexpr uint8_t EocB2 = MiscEOC;
116 static constexpr uint8_t EdmB1 = Cc1MiscFirstByte;
117 static constexpr uint8_t EdmB2 = MiscEDM;
120 static constexpr uint8_t EnmB1 = Cc1MiscFirstByte;
121 static constexpr uint8_t EnmB2 = MiscENM;
131 static constexpr uint8_t PacRow15Col0WhiteB1 = 0x14;
132 static constexpr uint8_t PacRow15Col0WhiteB2 = 0x70;
166 enum class CaptionColor : uint8_t {
181 static constexpr size_t CaptionColorCount = 8;
197 static constexpr size_t FgCaptionColorCount = 7;
215 static Color::List palette();
228 CaptionColor color = CaptionColor::White;
234 bool underline =
false;
255 static void encodePac(
const PacAttr &attr, uint8_t &b1, uint8_t &b2);
266 static bool isPac(uint8_t b1, uint8_t b2);
274 static bool decodePac(uint8_t b1, uint8_t b2, PacAttr &out);
292 static void encodeMidRow(CaptionColor color,
bool italic,
bool underline, uint8_t &b1,
299 static bool isMidRow(uint8_t b1, uint8_t b2);
306 static bool decodeMidRow(uint8_t b1, uint8_t b2, CaptionColor &outColor,
bool &outItalic,
332 static void encodeBgAttribute(CaptionColor color,
bool semiTransparent, uint8_t &b1,
339 static bool isBgAttribute(uint8_t b1, uint8_t b2);
347 static bool decodeBgAttribute(uint8_t b1, uint8_t b2, CaptionColor &outColor,
348 bool &outSemiTransparent);
363 static constexpr uint8_t TabOffsetB1 = 0x17;
368 static constexpr uint8_t TabOffsetT1 = 0x21;
369 static constexpr uint8_t TabOffsetT2 = 0x22;
370 static constexpr uint8_t TabOffsetT3 = 0x23;
388 static void encodeTabOffset(
int columns, uint8_t &b1, uint8_t &b2);
394 static bool isTabOffset(uint8_t b1, uint8_t b2);
405 static bool decodeTabOffset(uint8_t b1, uint8_t b2,
int &outColumns);
414 static constexpr uint8_t NullB1 = 0x00;
415 static constexpr uint8_t NullB2 = 0x00;
426 static constexpr bool isBasicChar(uint8_t c) {
427 const uint8_t v = stripParity(c);
428 return v >= 0x20 && v <= 0x7F;