From 4024efaf016c62e4c17ddeb9b38ef56c7a46b45b Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Tue, 11 Feb 2025 18:46:01 +0000 Subject: [PATCH 1/7] Rename packet variables "y": packet number "d": designation code "t": triplet number "packet" renamed to "pkt" in method parameters to avoid ambiguity with the "packet" method. --- src/qteletextdecoder/levelonepage.cpp | 168 +++++++++++++------------- src/qteletextdecoder/levelonepage.h | 16 +-- src/qteletextdecoder/pagebase.cpp | 95 ++++++++------- src/qteletextdecoder/pagebase.h | 23 ++-- src/qteletextdecoder/pagex26base.cpp | 34 +++--- src/qteletextdecoder/pagex26base.h | 4 +- 6 files changed, 174 insertions(+), 166 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index f1e2201..f1c6d2e 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -39,16 +39,16 @@ LevelOnePage::LevelOnePage(const PageBase &other) m_enhancements.reserve(maxEnhancements()); clearPage(); - for (int i=0; i<26; i++) - if (other.packetExists(i)) - setPacket(i, other.packet(i)); - for (int i=26; i<30; i++) - for (int j=0; j<16; j++) - if (other.packetExists(i, j)) - setPacket(i, j, other.packet(i)); + for (int y=0; y<26; y++) + if (other.packetExists(y)) + setPacket(y, other.packet(y)); + for (int y=26; y<29; y++) + for (int d=0; d<16; d++) + if (other.packetExists(y, d)) + setPacket(y, d, other.packet(y, d)); - for (int i=PageBase::C4ErasePage; i<=PageBase::C14NOS; i++) - setControlBit(i, other.controlBit(i)); + for (int b=PageBase::C4ErasePage; b<=PageBase::C14NOS; b++) + setControlBit(b, other.controlBit(b)); } // So far we only call clearPage() once, within the constructor @@ -57,8 +57,8 @@ void LevelOnePage::clearPage() for (int r=0; r<25; r++) for (int c=0; c<40; c++) m_level1Page[r][c] = 0x20; - for (int i=C4ErasePage; i<=C14NOS; i++) - setControlBit(i, false); + for (int b=C4ErasePage; b<=C14NOS; b++) + setControlBit(b, false); for (int i=0; i<8; i++) m_composeLink[i] = { (i<4) ? i : 0, false, i>=4, 0x0ff, 0x0000 }; for (int i=0; i<6; i++) @@ -99,31 +99,31 @@ bool LevelOnePage::isEmpty() const return true; } -QByteArray LevelOnePage::packet(int packetNumber) const +QByteArray LevelOnePage::packet(int y) const { QByteArray result(40, 0x00); - if (packetNumber <= 24) { + if (y <= 24) { for (int c=0; c<40; c++) - result[c] = m_level1Page[packetNumber][c]; + result[c] = m_level1Page[y][c]; return result; } - return PageBase::packet(packetNumber); + return PageBase::packet(y); } -QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const +QByteArray LevelOnePage::packet(int y, int d) const { QByteArray result(40, 0x00); - if (packetNumber == 26) { - if (!packetFromEnhancementListNeeded(designationCode)) + if (y == 26) { + if (!packetFromEnhancementListNeeded(d)) return result; // Blank result - return packetFromEnhancementList(designationCode); + return packetFromEnhancementList(d); } - if (packetNumber == 27 && designationCode == 0) { + if (y == 27 && d == 0) { for (int i=0; i<6; i++) { result[i*6+1] = m_fastTextLink[i].pageNumber & 0x00f; result[i*6+2] = (m_fastTextLink[i].pageNumber & 0x0f0) >> 4; @@ -138,9 +138,9 @@ QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const return result; } - if (packetNumber == 27 && (designationCode == 4 || designationCode == 5)) { - for (int i=0; i<(designationCode == 4 ? 6 : 2); i++) { - int pageLinkNumber = i+(designationCode == 4 ? 0 : 6); + if (y == 27 && (d == 4 || d == 5)) { + for (int i=0; i<(d == 4 ? 6 : 2); i++) { + int pageLinkNumber = i+(d == 4 ? 0 : 6); result[i*6+1] = (m_composeLink[pageLinkNumber].level3p5 << 3) | (m_composeLink[pageLinkNumber].level2p5 << 2) | m_composeLink[pageLinkNumber].function; result[i*6+2] = ((m_composeLink[pageLinkNumber].pageNumber & 0x100) >> 3) | 0x10 | (m_composeLink[pageLinkNumber].pageNumber & 0x00f); @@ -154,8 +154,8 @@ QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const return result; } - if (packetNumber == 28 && (designationCode == 0 || designationCode == 4)) { - int CLUToffset = (designationCode == 0) ? 16 : 0; + if (y == 28 && (d == 0 || d == 4)) { + int CLUToffset = (d == 0) ? 16 : 0; result[1] = 0x00; result[2] = ((m_defaultCharSet & 0x3) << 4) | (m_defaultNOS << 1); @@ -175,36 +175,36 @@ QByteArray LevelOnePage::packet(int packetNumber, int designationCode) const return result; } - return PageBase::packet(packetNumber, designationCode); + return PageBase::packet(y, d); } -bool LevelOnePage::setPacket(int packetNumber, QByteArray packetContents) +bool LevelOnePage::setPacket(int y, QByteArray pkt) { - if (packetNumber <= 24) { + if (y <= 24) { for (int c=0; c<40; c++) - m_level1Page[packetNumber][c] = packetContents.at(c); + m_level1Page[y][c] = pkt.at(c); return true; } - qDebug("LevelOnePage unhandled setPacket X/%d", packetNumber); + qDebug("LevelOnePage unhandled setPacket X/%d", y); // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageBase::setPacket(packetNumber, packetContents); + //return PageBase::setPacket(y, pkt); return false; } -bool LevelOnePage::setPacket(int packetNumber, int designationCode, QByteArray packetContents) +bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) { - if (packetNumber == 26) { - setEnhancementListFromPacket(designationCode, packetContents); + if (y == 26) { + setEnhancementListFromPacket(d, pkt); return true; } - if (packetNumber == 27 && designationCode == 0) { + if (y == 27 && d == 0) { for (int i=0; i<6; i++) { - int relativeMagazine = (packetContents.at(i*6+4) >> 3) | ((packetContents.at(i*6+6) & 0xc) >> 1); - int pageNumber = (packetContents.at(i*6+2) << 4) | packetContents.at(i*6+1); + int relativeMagazine = (pkt.at(i*6+4) >> 3) | ((pkt.at(i*6+6) & 0xc) >> 1); + int pageNumber = (pkt.at(i*6+2) << 4) | pkt.at(i*6+1); m_fastTextLink[i].pageNumber = (relativeMagazine << 8) | pageNumber; - m_fastTextLink[i].subPageNumber = packetContents.at(i*6+3) | ((packetContents.at(i*6+4) & 0x7) << 4) | (packetContents.at(i*6+5) << 8) | ((packetContents.at(i*6+6) & 0x3) << 12); + m_fastTextLink[i].subPageNumber = pkt.at(i*6+3) | ((pkt.at(i*6+4) & 0x7) << 4) | (pkt.at(i*6+5) << 8) | ((pkt.at(i*6+6) & 0x3) << 12); // TODO remove this warning when we can preserve FastText subpage links if (m_fastTextLink[i].subPageNumber != 0x3f7f) qDebug("FastText link %d has custom subPageNumber %x - will NOT be saved!", i, m_fastTextLink[i].subPageNumber); @@ -212,73 +212,73 @@ bool LevelOnePage::setPacket(int packetNumber, int designationCode, QByteArray p return true; } - if (packetNumber == 27 && (designationCode == 4 || designationCode == 5)) { - for (int i=0; i<(designationCode == 4 ? 6 : 2); i++) { - int pageLinkNumber = i+(designationCode == 4 ? 0 : 6); - int pageFunction = packetContents.at(i*6+1) & 0x03; + if (y == 27 && (d == 4 || d == 5)) { + for (int i=0; i<(d == 4 ? 6 : 2); i++) { + int pageLinkNumber = i+(d == 4 ? 0 : 6); + int pageFunction = pkt.at(i*6+1) & 0x03; if (i >= 4) m_composeLink[pageLinkNumber].function = pageFunction; else if (i != pageFunction) qDebug("X/27/4 link number %d fixed at function %d. Attempted to set to %d.", pageLinkNumber, pageLinkNumber, pageFunction); - m_composeLink[pageLinkNumber].level2p5 = packetContents.at(i*6+1) & 0x04; - m_composeLink[pageLinkNumber].level3p5 = packetContents.at(i*6+1) & 0x08; + m_composeLink[pageLinkNumber].level2p5 = pkt.at(i*6+1) & 0x04; + m_composeLink[pageLinkNumber].level3p5 = pkt.at(i*6+1) & 0x08; - m_composeLink[pageLinkNumber].pageNumber = ((packetContents.at(i*6+3) & 0x03) << 9) | ((packetContents.at(i*6+2) & 0x20) << 3) | ((packetContents.at(i*6+3) & 0x3c) << 2) | (packetContents.at(i*6+2) & 0x0f); + m_composeLink[pageLinkNumber].pageNumber = ((pkt.at(i*6+3) & 0x03) << 9) | ((pkt.at(i*6+2) & 0x20) << 3) | ((pkt.at(i*6+3) & 0x3c) << 2) | (pkt.at(i*6+2) & 0x0f); - m_composeLink[pageLinkNumber].subPageCodes = (packetContents.at(i*6+4) >> 2) | (packetContents.at(i*6+5) << 4) | (packetContents.at(i*6+6) << 10); + m_composeLink[pageLinkNumber].subPageCodes = (pkt.at(i*6+4) >> 2) | (pkt.at(i*6+5) << 4) | (pkt.at(i*6+6) << 10); } return true; } - if (packetNumber == 28 && (designationCode == 0 || designationCode == 4)) { - int CLUToffset = (designationCode == 0) ? 16 : 0; + if (y == 28 && (d == 0 || d == 4)) { + int CLUToffset = (d == 0) ? 16 : 0; - m_defaultCharSet = ((packetContents.at(2) >> 4) & 0x3) | ((packetContents.at(3) << 2) & 0xc); - m_defaultNOS = (packetContents.at(2) >> 1) & 0x7; - m_secondCharSet = ((packetContents.at(3) >> 5) & 0x1) | ((packetContents.at(4) << 1) & 0xe); - m_secondNOS = (packetContents.at(3) >> 2) & 0x7; + m_defaultCharSet = ((pkt.at(2) >> 4) & 0x3) | ((pkt.at(3) << 2) & 0xc); + m_defaultNOS = (pkt.at(2) >> 1) & 0x7; + m_secondCharSet = ((pkt.at(3) >> 5) & 0x1) | ((pkt.at(4) << 1) & 0xe); + m_secondNOS = (pkt.at(3) >> 2) & 0x7; - m_leftSidePanelDisplayed = (packetContents.at(4) >> 3) & 1; - m_rightSidePanelDisplayed = (packetContents.at(4) >> 4) & 1; - m_sidePanelStatusL25 = (packetContents.at(4) >> 5) & 1; - m_sidePanelColumns = packetContents.at(5) & 0xf; + m_leftSidePanelDisplayed = (pkt.at(4) >> 3) & 1; + m_rightSidePanelDisplayed = (pkt.at(4) >> 4) & 1; + m_sidePanelStatusL25 = (pkt.at(4) >> 5) & 1; + m_sidePanelColumns = pkt.at(5) & 0xf; for (int c=0; c<16; c++) - m_CLUT[CLUToffset+c] = ((packetContents.at(c*2+5) << 4) & 0x300) | ((packetContents.at(c*2+6) << 10) & 0xc00) | ((packetContents.at(c*2+6) << 2) & 0x0f0) | (packetContents.at(c*2+7) & 0x00f); + m_CLUT[CLUToffset+c] = ((pkt.at(c*2+5) << 4) & 0x300) | ((pkt.at(c*2+6) << 10) & 0xc00) | ((pkt.at(c*2+6) << 2) & 0x0f0) | (pkt.at(c*2+7) & 0x00f); - m_defaultScreenColour = (packetContents.at(37) >> 4) | ((packetContents.at(38) << 2) & 0x1c); - m_defaultRowColour = ((packetContents.at(38)) >> 3) | ((packetContents.at(39) << 3) & 0x18); - m_blackBackgroundSubst = (packetContents.at(39) >> 2) & 1; - m_colourTableRemap = (packetContents.at(39) >> 3) & 7; + m_defaultScreenColour = (pkt.at(37) >> 4) | ((pkt.at(38) << 2) & 0x1c); + m_defaultRowColour = ((pkt.at(38)) >> 3) | ((pkt.at(39) << 3) & 0x18); + m_blackBackgroundSubst = (pkt.at(39) >> 2) & 1; + m_colourTableRemap = (pkt.at(39) >> 3) & 7; return true; } - qDebug("LevelOnePage unhandled setPacket X/%d/%d", packetNumber, designationCode); + qDebug("LevelOnePage unhandled setPacket X/%d/%d", y, d); // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageBase::setPacket(packetNumber, designationCode, packetContents); + //return PageBase::setPacket(y, d, pkt); return false; } -bool LevelOnePage::packetExists(int packetNumber) const +bool LevelOnePage::packetExists(int y) const { - if (packetNumber <= 24) { + if (y <= 24) { for (int c=0; c<40; c++) - if (m_level1Page[packetNumber][c] != 0x20) + if (m_level1Page[y][c] != 0x20) return true; return false; } - return PageBase::packetExists(packetNumber); + return PageBase::packetExists(y); } -bool LevelOnePage::packetExists(int packetNumber, int designationCode) const +bool LevelOnePage::packetExists(int y, int d) const { - if (packetNumber == 26) - return packetFromEnhancementListNeeded(designationCode); + if (y == 26) + return packetFromEnhancementListNeeded(d); - if (packetNumber == 27 && designationCode == 0) { + if (y == 27 && d == 0) { for (int i=0; i<6; i++) if ((m_fastTextLink[i].pageNumber & 0x0ff) != 0xff) return true; @@ -286,31 +286,31 @@ bool LevelOnePage::packetExists(int packetNumber, int designationCode) const return false; } - if (packetNumber == 27 && (designationCode == 4 || designationCode == 5)) { - for (int i=0; i<(designationCode == 4 ? 6 : 2); i++) { - int pageLinkNumber = i+(designationCode == 4 ? 0 : 6); + if (y == 27 && (d == 4 || d == 5)) { + for (int i=0; i<(d == 4 ? 6 : 2); i++) { + int pageLinkNumber = i+(d == 4 ? 0 : 6); if ((m_composeLink[pageLinkNumber].pageNumber & 0x0ff) != 0x0ff) return true; } return false; } - if (packetNumber == 28) { - if (designationCode == 0) { + if (y == 28) { + if (d == 0) { if (m_leftSidePanelDisplayed || m_rightSidePanelDisplayed || m_defaultScreenColour !=0 || m_defaultRowColour !=0 || m_blackBackgroundSubst || m_colourTableRemap !=0 || m_defaultCharSet != 0 || m_secondCharSet != 0xf) return true; return !isPaletteDefault(16, 31); } - if (designationCode == 4) + if (d == 4) return !isPaletteDefault(0, 15); } - return PageBase::packetExists(packetNumber, designationCode); + return PageBase::packetExists(y, d); } -bool LevelOnePage::controlBit(int bitNumber) const +bool LevelOnePage::controlBit(int b) const { - switch (bitNumber) { + switch (b) { case C12NOS: return (m_defaultNOS & 1) == 1; case C13NOS: @@ -318,13 +318,13 @@ bool LevelOnePage::controlBit(int bitNumber) const case C14NOS: return (m_defaultNOS & 4) == 4; default: - return PageBase::controlBit(bitNumber); + return PageBase::controlBit(b); } } -bool LevelOnePage::setControlBit(int bitNumber, bool active) +bool LevelOnePage::setControlBit(int b, bool active) { - switch (bitNumber) { + switch (b) { case C12NOS: m_defaultNOS &= 0x06; if (active) @@ -341,7 +341,7 @@ bool LevelOnePage::setControlBit(int bitNumber, bool active) m_defaultNOS |= 0x04; return true; default: - return PageBase::setControlBit(bitNumber, active); + return PageBase::setControlBit(b, active); } } diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index e1b65ee..f2c40f8 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -41,15 +41,15 @@ public: bool isEmpty() const override; - QByteArray packet(int packetNumber) const override; - QByteArray packet(int packetNumber, int designationCode) const override; - bool packetExists(int packetNumber) const override; - bool packetExists(int packetNumber, int designationCode) const override; - bool setPacket(int packetNumber, QByteArray packetContents) override; - bool setPacket(int packetNumber, int designationCode, QByteArray packetContents) override; + QByteArray packet(int y) const override; + QByteArray packet(int y, int d) const override; + bool packetExists(int y) const override; + bool packetExists(int y, int d) const override; + bool setPacket(int y, QByteArray pkt) override; + bool setPacket(int y, int d, QByteArray pkt) override; - bool controlBit(int bitNumber) const override; - bool setControlBit(int bitNumber, bool active) override; + bool controlBit(int b) const override; + bool setControlBit(int b, bool active) override; void clearPage(); diff --git a/src/qteletextdecoder/pagebase.cpp b/src/qteletextdecoder/pagebase.cpp index 510b9ce..16bd179 100644 --- a/src/qteletextdecoder/pagebase.cpp +++ b/src/qteletextdecoder/pagebase.cpp @@ -24,99 +24,108 @@ PageBase::PageBase() { // We use nullptrs to keep track of allocated packets, so initialise them this way - for (int i=0; i<26; i++) - m_displayPackets[i] = nullptr; - for (int i=0; i<4; i++) - for (int j=0; j<16; j++) - m_designationPackets[i][j] = nullptr; + for (int y=0; y<26; y++) + m_displayPackets[y] = nullptr; + for (int y=0; y<3; y++) + for (int d=0; d<16; d++) + m_designationPackets[y][d] = nullptr; - for (int i=PageBase::C4ErasePage; i<=PageBase::C14NOS; i++) - m_controlBits[i] = false; + for (int b=PageBase::C4ErasePage; b<=PageBase::C14NOS; b++) + m_controlBits[b] = false; } PageBase::~PageBase() { - for (int i=0; i<26; i++) - if (m_displayPackets[i] != nullptr) - delete m_displayPackets[i]; - for (int i=0; i<4; i++) - for (int j=0; j<16; j++) - if (m_designationPackets[i][j] != nullptr) - delete m_designationPackets[i][j]; + for (int y=0; y<26; y++) + if (m_displayPackets[y] != nullptr) + delete m_displayPackets[y]; + for (int y=0; y<3; y++) + for (int d=0; d<16; d++) + if (m_designationPackets[y][d] != nullptr) + delete m_designationPackets[y][d]; } bool PageBase::isEmpty() const { - for (int i=0; i<26; i++) - if (m_displayPackets[i] != nullptr) + for (int y=0; y<26; y++) + if (m_displayPackets[y] != nullptr) return false; - for (int i=0; i<4; i++) - for (int j=0; j<16; j++) - if (m_designationPackets[i][j] != nullptr) + for (int y=0; y<3; y++) + for (int d=0; d<16; d++) + if (m_designationPackets[y][d] != nullptr) return false; return true; } -QByteArray PageBase::packet(int i) const +QByteArray PageBase::packet(int y) const { - if (m_displayPackets[i] == nullptr) + if (m_displayPackets[y] == nullptr) return QByteArray(); // Blank result - return *m_displayPackets[i]; + return *m_displayPackets[y]; } -QByteArray PageBase::packet(int i, int j) const +QByteArray PageBase::packet(int y, int d) const { - if (m_designationPackets[i-26][j] == nullptr) + if (m_designationPackets[y-26][d] == nullptr) return QByteArray(); // Blank result - return *m_designationPackets[i-26][j]; + return *m_designationPackets[y-26][d]; } -bool PageBase::setPacket(int i, QByteArray packetContents) +bool PageBase::setPacket(int y, QByteArray pkt) { - if (m_displayPackets[i] == nullptr) - m_displayPackets[i] = new QByteArray(40, 0x00); - *m_displayPackets[i] = packetContents; + if (m_displayPackets[y] == nullptr) + m_displayPackets[y] = new QByteArray(40, 0x00); + *m_displayPackets[y] = pkt; return true; } -bool PageBase::setPacket(int i, int j, QByteArray packetContents) +bool PageBase::setPacket(int y, int d, QByteArray pkt) { - if (m_designationPackets[i-26][j] == nullptr) - m_designationPackets[i-26][j] = new QByteArray(40, 0x00); - *m_designationPackets[i-26][j] = packetContents; + if (m_designationPackets[y-26][d] == nullptr) + m_designationPackets[y-26][d] = new QByteArray(40, 0x00); + *m_designationPackets[y-26][d] = pkt; return true; } /* -bool PageBase::deletePacket(int i) +bool PageBase::clearPacket(int y) { - if (m_displayPackets[i] != nullptr) { - delete m_displayPackets[i]; - m_displayPackets[i] = nullptr; + if (m_displayPackets[y] != nullptr) { + delete m_displayPackets[y]; + m_displayPackets[y] = nullptr; } return true; } -bool PageBase::deletePacket(int i) +bool PageBase::clearPacket(int y, int d) { - if (m_designationPackets[i-26][j] != nullptr) { - delete m_designationPackets[i-26][j]; - m_designationPackets[i-26][j] = nullptr; + if (m_designationPackets[y-26][d] != nullptr) { + delete m_designationPackets[y-26][d]; + m_designationPackets[y-26][d] = nullptr; } return true; } + +void SubPage::clearAllPackets() +{ + for (int y=0; y<26; y++) + clearPacket(y); + for (int y=0; y<3; y++) + for (int d=0; d<16; d++) + clearPacket(y, d); +} */ -bool PageBase::setControlBit(int bitNumber, bool active) +bool PageBase::setControlBit(int b, bool active) { - m_controlBits[bitNumber] = active; + m_controlBits[b] = active; return true; } diff --git a/src/qteletextdecoder/pagebase.h b/src/qteletextdecoder/pagebase.h index 6824dd9..ac8c9ef 100644 --- a/src/qteletextdecoder/pagebase.h +++ b/src/qteletextdecoder/pagebase.h @@ -35,21 +35,22 @@ public: virtual bool isEmpty() const; - virtual QByteArray packet(int i) const; - virtual QByteArray packet(int i, int j) const; - virtual bool packetExists(int i) const { return m_displayPackets[i] != nullptr; } - virtual bool packetExists(int i, int j) const { return m_designationPackets[i-26][j] != nullptr; } - virtual bool setPacket(int i, QByteArray packetContents); - virtual bool setPacket(int i, int j, QByteArray packetContents); -// bool deletePacket(int); -// bool deletePacket(int, int); + virtual QByteArray packet(int y) const; + virtual QByteArray packet(int y, int d) const; + virtual bool packetExists(int y) const { return m_displayPackets[y] != nullptr; } + virtual bool packetExists(int y, int d) const { return m_designationPackets[y-26][d] != nullptr; } + virtual bool setPacket(int y, QByteArray packet); + virtual bool setPacket(int y, int d, QByteArray pkt); +// bool clearPacket(int y); +// bool clearPacket(int y, int d); +// void clearAllPackets(); - virtual bool controlBit(int bitNumber) const { return m_controlBits[bitNumber]; } - virtual bool setControlBit(int bitNumber, bool active); + virtual bool controlBit(int b) const { return m_controlBits[b]; } + virtual bool setControlBit(int b, bool active); private: bool m_controlBits[11]; - QByteArray *m_displayPackets[26], *m_designationPackets[4][16]; + QByteArray *m_displayPackets[26], *m_designationPackets[3][16]; }; #endif diff --git a/src/qteletextdecoder/pagex26base.cpp b/src/qteletextdecoder/pagex26base.cpp index 8eacb4c..730bc29 100644 --- a/src/qteletextdecoder/pagex26base.cpp +++ b/src/qteletextdecoder/pagex26base.cpp @@ -21,20 +21,19 @@ #include "pagex26base.h" -QByteArray PageX26Base::packetFromEnhancementList(int packetNumber) const +QByteArray PageX26Base::packetFromEnhancementList(int p) const { QByteArray result(40, 0x00); - int enhanceListPointer; X26Triplet lastTriplet; - for (int i=0; i<13; i++) { - enhanceListPointer = packetNumber*13+i; + for (int t=0; t<13; t++) { + const int enhanceListPointer = p*13+t; if (enhanceListPointer < m_enhancements.size()) { - result[i*3+1] = m_enhancements.at(enhanceListPointer).address(); - result[i*3+2] = m_enhancements.at(enhanceListPointer).mode() | ((m_enhancements.at(enhanceListPointer).data() & 1) << 5); - result[i*3+3] = m_enhancements.at(enhanceListPointer).data() >> 1; + result[t*3+1] = m_enhancements.at(enhanceListPointer).address(); + result[t*3+2] = m_enhancements.at(enhanceListPointer).mode() | ((m_enhancements.at(enhanceListPointer).data() & 1) << 5); + result[t*3+3] = m_enhancements.at(enhanceListPointer).data() >> 1; // If this is the last triplet, get a copy to repeat to the end of the packet if (enhanceListPointer == m_enhancements.size()-1) { @@ -48,32 +47,31 @@ QByteArray PageX26Base::packetFromEnhancementList(int packetNumber) const } } else { // We've gone past the end of the triplet list, so repeat the Termination Marker to the end - result[i*3+1] = lastTriplet.address(); - result[i*3+2] = lastTriplet.mode() | ((lastTriplet.data() & 1) << 5); - result[i*3+3] = lastTriplet.data() >> 1; + result[t*3+1] = lastTriplet.address(); + result[t*3+2] = lastTriplet.mode() | ((lastTriplet.data() & 1) << 5); + result[t*3+3] = lastTriplet.data() >> 1; } } return result; } -void PageX26Base::setEnhancementListFromPacket(int packetNumber, QByteArray packetContents) +void PageX26Base::setEnhancementListFromPacket(int p, QByteArray pkt) { // Preallocate entries in the m_enhancements list to hold our incoming triplets. // We write "dummy" reserved 11110 Row Triplets in the allocated entries which then get overwritten by the packet contents. // This is in case of missing packets so we can keep Local Object pointers valid. - while (m_enhancements.size() < (packetNumber+1)*13) + while (m_enhancements.size() < (p+1)*13) m_enhancements.append(m_paddingX26Triplet); - int enhanceListPointer; X26Triplet newX26Triplet; - for (int i=0; i<13; i++) { - enhanceListPointer = packetNumber*13+i; + for (int t=0; t<13; t++) { + const int enhanceListPointer = p*13+t; - newX26Triplet.setAddress(packetContents.at(i*3+1) & 0x3f); - newX26Triplet.setMode(packetContents.at(i*3+2) & 0x1f); - newX26Triplet.setData(((packetContents.at(i*3+3) & 0x3f) << 1) | ((packetContents.at(i*3+2) & 0x20) >> 5)); + newX26Triplet.setAddress(pkt.at(t*3+1) & 0x3f); + newX26Triplet.setMode(pkt.at(t*3+2) & 0x1f); + newX26Triplet.setData(((pkt.at(t*3+3) & 0x3f) << 1) | ((pkt.at(t*3+2) & 0x20) >> 5)); m_enhancements.replace(enhanceListPointer, newX26Triplet); } if (newX26Triplet.mode() == 0x1f && newX26Triplet.address() == 0x3f && newX26Triplet.data() & 0x01) diff --git a/src/qteletextdecoder/pagex26base.h b/src/qteletextdecoder/pagex26base.h index ea32ba0..32c3899 100644 --- a/src/qteletextdecoder/pagex26base.h +++ b/src/qteletextdecoder/pagex26base.h @@ -35,8 +35,8 @@ public: virtual int maxEnhancements() const =0; protected: - QByteArray packetFromEnhancementList(int packetNumber) const; - void setEnhancementListFromPacket(int packetNumber, QByteArray packetContents); + QByteArray packetFromEnhancementList(int p) const; + void setEnhancementListFromPacket(int p, QByteArray pkt); bool packetFromEnhancementListNeeded(int n) const { return ((m_enhancements.size()+12) / 13) > n; }; X26TripletList m_enhancements; From 0a1c018a02cfdb1cb7dc6dc0d14b29f87bce7c69 Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Tue, 11 Feb 2025 20:48:05 +0000 Subject: [PATCH 2/7] Remove unused and incorrect subclass copy constructor --- src/qteletextdecoder/levelonepage.cpp | 18 ------------------ src/qteletextdecoder/levelonepage.h | 2 -- 2 files changed, 20 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index f1c6d2e..414bc9d 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -33,24 +33,6 @@ LevelOnePage::LevelOnePage() clearPage(); } -// BUG this copy constructor isn't used? Parameter should be LevelOnePage -LevelOnePage::LevelOnePage(const PageBase &other) -{ - m_enhancements.reserve(maxEnhancements()); - clearPage(); - - for (int y=0; y<26; y++) - if (other.packetExists(y)) - setPacket(y, other.packet(y)); - for (int y=26; y<29; y++) - for (int d=0; d<16; d++) - if (other.packetExists(y, d)) - setPacket(y, d, other.packet(y, d)); - - for (int b=PageBase::C4ErasePage; b<=PageBase::C14NOS; b++) - setControlBit(b, other.controlBit(b)); -} - // So far we only call clearPage() once, within the constructor void LevelOnePage::clearPage() { diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index f2c40f8..3a283f8 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -36,8 +36,6 @@ public: enum CycleTypeEnum { CTcycles, CTseconds }; LevelOnePage(); - // BUG this copy constructor isn't used? Parameter should be LevelOnePage - LevelOnePage(const PageBase &other); bool isEmpty() const override; From 8bb05ed250f488135387393b33cceeb1a054aeda Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Tue, 11 Feb 2025 21:29:58 +0000 Subject: [PATCH 3/7] Use proper superclass --- src/qteletextdecoder/levelonepage.cpp | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index 414bc9d..16677c2 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -91,7 +91,7 @@ QByteArray LevelOnePage::packet(int y) const return result; } - return PageBase::packet(y); + return PageX26Base::packet(y); } QByteArray LevelOnePage::packet(int y, int d) const @@ -157,7 +157,7 @@ QByteArray LevelOnePage::packet(int y, int d) const return result; } - return PageBase::packet(y, d); + return PageX26Base::packet(y, d); } bool LevelOnePage::setPacket(int y, QByteArray pkt) @@ -170,7 +170,7 @@ bool LevelOnePage::setPacket(int y, QByteArray pkt) qDebug("LevelOnePage unhandled setPacket X/%d", y); // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageBase::setPacket(y, pkt); + //return PageX26Base::setPacket(y, pkt); return false; } @@ -239,7 +239,7 @@ bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) qDebug("LevelOnePage unhandled setPacket X/%d/%d", y, d); // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageBase::setPacket(y, d, pkt); + //return PageX26Base::setPacket(y, d, pkt); return false; } @@ -252,7 +252,7 @@ bool LevelOnePage::packetExists(int y) const return false; } - return PageBase::packetExists(y); + return PageX26Base::packetExists(y); } bool LevelOnePage::packetExists(int y, int d) const @@ -287,7 +287,7 @@ bool LevelOnePage::packetExists(int y, int d) const return !isPaletteDefault(0, 15); } - return PageBase::packetExists(y, d); + return PageX26Base::packetExists(y, d); } bool LevelOnePage::controlBit(int b) const @@ -300,7 +300,7 @@ bool LevelOnePage::controlBit(int b) const case C14NOS: return (m_defaultNOS & 4) == 4; default: - return PageBase::controlBit(b); + return PageX26Base::controlBit(b); } } @@ -323,7 +323,7 @@ bool LevelOnePage::setControlBit(int b, bool active) m_defaultNOS |= 0x04; return true; default: - return PageBase::setControlBit(b, active); + return PageX26Base::setControlBit(b, active); } } From 0cc49e7ea505b6b60a1dafb256cd318ffb24be40 Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Wed, 12 Feb 2025 19:03:48 +0000 Subject: [PATCH 4/7] Move from dynamically allocating arrays to fixed arrays This should allow the page bass class to be copy constructed. --- src/qteletextdecoder/pagebase.cpp | 61 ++++--------------------------- src/qteletextdecoder/pagebase.h | 19 +++++----- 2 files changed, 16 insertions(+), 64 deletions(-) diff --git a/src/qteletextdecoder/pagebase.cpp b/src/qteletextdecoder/pagebase.cpp index 16bd179..69ff112 100644 --- a/src/qteletextdecoder/pagebase.cpp +++ b/src/qteletextdecoder/pagebase.cpp @@ -23,98 +23,52 @@ PageBase::PageBase() { - // We use nullptrs to keep track of allocated packets, so initialise them this way - for (int y=0; y<26; y++) - m_displayPackets[y] = nullptr; - for (int y=0; y<3; y++) - for (int d=0; d<16; d++) - m_designationPackets[y][d] = nullptr; - for (int b=PageBase::C4ErasePage; b<=PageBase::C14NOS; b++) m_controlBits[b] = false; } -PageBase::~PageBase() -{ - for (int y=0; y<26; y++) - if (m_displayPackets[y] != nullptr) - delete m_displayPackets[y]; - for (int y=0; y<3; y++) - for (int d=0; d<16; d++) - if (m_designationPackets[y][d] != nullptr) - delete m_designationPackets[y][d]; -} - bool PageBase::isEmpty() const { for (int y=0; y<26; y++) - if (m_displayPackets[y] != nullptr) + if (!m_displayPackets[y].isEmpty()) return false; for (int y=0; y<3; y++) for (int d=0; d<16; d++) - if (m_designationPackets[y][d] != nullptr) + if (!m_designationPackets[y][d].isEmpty()) return false; return true; } -QByteArray PageBase::packet(int y) const -{ - if (m_displayPackets[y] == nullptr) - return QByteArray(); // Blank result - - return *m_displayPackets[y]; -} - -QByteArray PageBase::packet(int y, int d) const -{ - if (m_designationPackets[y-26][d] == nullptr) - return QByteArray(); // Blank result - - return *m_designationPackets[y-26][d]; -} - - bool PageBase::setPacket(int y, QByteArray pkt) { - if (m_displayPackets[y] == nullptr) - m_displayPackets[y] = new QByteArray(40, 0x00); - *m_displayPackets[y] = pkt; + m_displayPackets[y] = pkt; return true; } bool PageBase::setPacket(int y, int d, QByteArray pkt) { - if (m_designationPackets[y-26][d] == nullptr) - m_designationPackets[y-26][d] = new QByteArray(40, 0x00); - *m_designationPackets[y-26][d] = pkt; + m_designationPackets[y-26][d] = pkt; return true; } -/* bool PageBase::clearPacket(int y) { - if (m_displayPackets[y] != nullptr) { - delete m_displayPackets[y]; - m_displayPackets[y] = nullptr; - } + m_displayPackets[y] = QByteArray(); return true; } bool PageBase::clearPacket(int y, int d) { - if (m_designationPackets[y-26][d] != nullptr) { - delete m_designationPackets[y-26][d]; - m_designationPackets[y-26][d] = nullptr; - } + m_designationPackets[y-26][d] = QByteArray(); return true; } -void SubPage::clearAllPackets() +void PageBase::clearAllPackets() { for (int y=0; y<26; y++) clearPacket(y); @@ -122,7 +76,6 @@ void SubPage::clearAllPackets() for (int d=0; d<16; d++) clearPacket(y, d); } -*/ bool PageBase::setControlBit(int b, bool active) { diff --git a/src/qteletextdecoder/pagebase.h b/src/qteletextdecoder/pagebase.h index ac8c9ef..b627598 100644 --- a/src/qteletextdecoder/pagebase.h +++ b/src/qteletextdecoder/pagebase.h @@ -31,26 +31,25 @@ public: enum ControlBitsEnum { C4ErasePage, C5Newsflash, C6Subtitle, C7SuppressHeader, C8Update, C9InterruptedSequence, C10InhibitDisplay, C11SerialMagazine, C12NOS, C13NOS, C14NOS }; PageBase(); - virtual ~PageBase(); virtual bool isEmpty() const; - virtual QByteArray packet(int y) const; - virtual QByteArray packet(int y, int d) const; - virtual bool packetExists(int y) const { return m_displayPackets[y] != nullptr; } - virtual bool packetExists(int y, int d) const { return m_designationPackets[y-26][d] != nullptr; } - virtual bool setPacket(int y, QByteArray packet); + virtual QByteArray packet(int y) const { return m_displayPackets[y]; } + virtual QByteArray packet(int y, int d) const { return m_designationPackets[y-26][d]; } + virtual bool setPacket(int y, QByteArray pkt); virtual bool setPacket(int y, int d, QByteArray pkt); -// bool clearPacket(int y); -// bool clearPacket(int y, int d); -// void clearAllPackets(); + virtual bool packetExists(int y) const { return !m_displayPackets[y].isEmpty(); } + virtual bool packetExists(int y, int d) const { return !m_designationPackets[y-26][d].isEmpty(); } + bool clearPacket(int y); + bool clearPacket(int y, int d); + void clearAllPackets(); virtual bool controlBit(int b) const { return m_controlBits[b]; } virtual bool setControlBit(int b, bool active); private: bool m_controlBits[11]; - QByteArray *m_displayPackets[26], *m_designationPackets[3][16]; + QByteArray m_displayPackets[26], m_designationPackets[3][16]; }; #endif From 9427760631917fc5262b0efdf59272b547572c8c Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Thu, 13 Feb 2025 16:41:08 +0000 Subject: [PATCH 5/7] Put back unhandled packet storage --- src/qteletextdecoder/levelonepage.cpp | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index 16677c2..4e84532 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -169,9 +169,7 @@ bool LevelOnePage::setPacket(int y, QByteArray pkt) } qDebug("LevelOnePage unhandled setPacket X/%d", y); - // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageX26Base::setPacket(y, pkt); - return false; + return PageX26Base::setPacket(y, pkt); } bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) @@ -238,9 +236,7 @@ bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) } qDebug("LevelOnePage unhandled setPacket X/%d/%d", y, d); - // BUG can't store unhandled packets as default copy constructor uses pointers - //return PageX26Base::setPacket(y, d, pkt); - return false; + return PageX26Base::setPacket(y, d, pkt); } bool LevelOnePage::packetExists(int y) const From 923c5563d5d7e023c7be950de68e9b81986dae47 Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Thu, 13 Feb 2025 22:55:11 +0000 Subject: [PATCH 6/7] Store text in packets instead of array This removes the character array from the LevelOnePage class and stores the characters in packets 0 to 24 natively, adding a packet when a character is first added to a row and removing a packet when a row becomes space characters. --- src/qteletextdecoder/levelonepage.cpp | 65 +++++++++++---------------- src/qteletextdecoder/levelonepage.h | 14 +++--- 2 files changed, 34 insertions(+), 45 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index 4e84532..5d4ea76 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -36,9 +36,6 @@ LevelOnePage::LevelOnePage() // So far we only call clearPage() once, within the constructor void LevelOnePage::clearPage() { - for (int r=0; r<25; r++) - for (int c=0; c<40; c++) - m_level1Page[r][c] = 0x20; for (int b=C4ErasePage; b<=C14NOS; b++) setControlBit(b, false); for (int i=0; i<8; i++) @@ -74,26 +71,12 @@ bool LevelOnePage::isEmpty() const return false; for (int r=0; r<25; r++) - for (int c=0; c<40; c++) - if (m_level1Page[r][c] != 0x20) - return false; + if (!PageX26Base::packet(r).isEmpty()) + return false; return true; } -QByteArray LevelOnePage::packet(int y) const -{ - QByteArray result(40, 0x00); - - if (y <= 24) { - for (int c=0; c<40; c++) - result[c] = m_level1Page[y][c]; - return result; - } - - return PageX26Base::packet(y); -} - QByteArray LevelOnePage::packet(int y, int d) const { QByteArray result(40, 0x00); @@ -160,17 +143,15 @@ QByteArray LevelOnePage::packet(int y, int d) const return PageX26Base::packet(y, d); } +/* bool LevelOnePage::setPacket(int y, QByteArray pkt) { - if (y <= 24) { - for (int c=0; c<40; c++) - m_level1Page[y][c] = pkt.at(c); - return true; - } + if (y == 25) + qDebug("LevelOnePage unhandled setPacket X/25"); - qDebug("LevelOnePage unhandled setPacket X/%d", y); return PageX26Base::setPacket(y, pkt); } +*/ bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) { @@ -239,18 +220,6 @@ bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) return PageX26Base::setPacket(y, d, pkt); } -bool LevelOnePage::packetExists(int y) const -{ - if (y <= 24) { - for (int c=0; c<40; c++) - if (m_level1Page[y][c] != 0x20) - return true; - return false; - } - - return PageX26Base::packetExists(y); -} - bool LevelOnePage::packetExists(int y, int d) const { if (y == 26) @@ -341,7 +310,27 @@ void LevelOnePage::setSecondCharSet(int newSecondCharSet) } void LevelOnePage::setSecondNOS(int newSecondNOS) { m_secondNOS = newSecondNOS; } -void LevelOnePage::setCharacter(int row, int column, unsigned char newCharacter) { m_level1Page[row][column] = newCharacter; } + +void LevelOnePage::setCharacter(int r, int c, unsigned char newCharacter) +{ + QByteArray pkt; + + if (!packetExists(r)) { + if (newCharacter == 0x20) + return; + pkt = QByteArray(40, 0x20); + pkt[c] = newCharacter; + setPacket(r, pkt); + } else { + pkt = packet(r); + pkt[c] = newCharacter; + if (pkt == QByteArray(40, 0x20)) + clearPacket(r); + else + setPacket(r, pkt); + } +} + void LevelOnePage::setDefaultScreenColour(int newDefaultScreenColour) { m_defaultScreenColour = newDefaultScreenColour; } void LevelOnePage::setDefaultRowColour(int newDefaultRowColour) { m_defaultRowColour = newDefaultRowColour; } void LevelOnePage::setColourTableRemap(int newColourTableRemap) { m_colourTableRemap = newColourTableRemap; } diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index 3a283f8..5884520 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -33,18 +33,19 @@ class LevelOnePage : public PageX26Base //: public QObject //Q_OBJECT public: + using PageX26Base::packet; + using PageX26Base::setPacket; + using PageX26Base::packetExists; + enum CycleTypeEnum { CTcycles, CTseconds }; LevelOnePage(); bool isEmpty() const override; - QByteArray packet(int y) const override; QByteArray packet(int y, int d) const override; - bool packetExists(int y) const override; - bool packetExists(int y, int d) const override; - bool setPacket(int y, QByteArray pkt) override; bool setPacket(int y, int d, QByteArray pkt) override; + bool packetExists(int y, int d) const override; bool controlBit(int b) const override; bool setControlBit(int b, bool active) override; @@ -66,8 +67,8 @@ public: void setSecondCharSet(int newSecondCharSet); int secondNOS() const { return m_secondNOS; } void setSecondNOS(int newSecondNOS); - unsigned char character(int row, int column) const { return m_level1Page[row][column]; } - void setCharacter(int row, int column, unsigned char newCharacter); + unsigned char character(int r, int c) const { return PageX26Base::packetExists(r) ? PageX26Base::packet(r).at(c) : 0x20; } + void setCharacter(int r, int c, unsigned char newChar); int defaultScreenColour() const { return m_defaultScreenColour; } void setDefaultScreenColour(int newDefaultScreenColour); int defaultRowColour() const { return m_defaultRowColour; } @@ -104,7 +105,6 @@ public: void setComposeLinkSubPageCodes(int linkNumber, int newSubPageCodes); private: - unsigned char m_level1Page[25][40]; /* int m_subPageNumber; */ int m_cycleValue; CycleTypeEnum m_cycleType; From 0901803186a61822acddbd0a6be5d2c3bfd8915f Mon Sep 17 00:00:00 2001 From: Gavin MacGregor Date: Wed, 19 Feb 2025 15:22:28 +0000 Subject: [PATCH 7/7] Simplify storage of NOS control bits --- src/qteletextdecoder/levelonepage.cpp | 40 ++++++++++----------------- src/qteletextdecoder/levelonepage.h | 1 - 2 files changed, 15 insertions(+), 26 deletions(-) diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index 5d4ea76..0333f78 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -255,41 +255,27 @@ bool LevelOnePage::packetExists(int y, int d) const return PageX26Base::packetExists(y, d); } -bool LevelOnePage::controlBit(int b) const -{ - switch (b) { - case C12NOS: - return (m_defaultNOS & 1) == 1; - case C13NOS: - return (m_defaultNOS & 2) == 2; - case C14NOS: - return (m_defaultNOS & 4) == 4; - default: - return PageX26Base::controlBit(b); - } -} - bool LevelOnePage::setControlBit(int b, bool active) { switch (b) { case C12NOS: - m_defaultNOS &= 0x06; + m_defaultNOS &= 0x6; if (active) - m_defaultNOS |= 0x01; - return true; + m_defaultNOS |= 0x1; + break; case C13NOS: - m_defaultNOS &= 0x05; + m_defaultNOS &= 0x5; if (active) - m_defaultNOS |= 0x02; - return true; + m_defaultNOS |= 0x2; + break; case C14NOS: - m_defaultNOS &= 0x03; + m_defaultNOS &= 0x3; if (active) - m_defaultNOS |= 0x04; - return true; - default: - return PageX26Base::setControlBit(b, active); + m_defaultNOS |= 0x4; + break; } + + return PageX26Base::setControlBit(b, active); } /* void LevelOnePage::setSubPageNumber(int newSubPageNumber) { m_subPageNumber = newSubPageNumber; } */ @@ -300,6 +286,10 @@ void LevelOnePage::setDefaultCharSet(int newDefaultCharSet) { m_defaultCharSet = void LevelOnePage::setDefaultNOS(int defaultNOS) { m_defaultNOS = defaultNOS; + + PageX26Base::setControlBit(C12NOS, m_defaultNOS & 0x1); + PageX26Base::setControlBit(C13NOS, m_defaultNOS & 0x2); + PageX26Base::setControlBit(C14NOS, m_defaultNOS & 0x4); } void LevelOnePage::setSecondCharSet(int newSecondCharSet) diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index 5884520..02f6c6e 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -47,7 +47,6 @@ public: bool setPacket(int y, int d, QByteArray pkt) override; bool packetExists(int y, int d) const override; - bool controlBit(int b) const override; bool setControlBit(int b, bool active) override; void clearPage();