diff --git a/src/qteletextdecoder/decode.cpp b/src/qteletextdecoder/decode.cpp index c374320..3b1bca1 100644 --- a/src/qteletextdecoder/decode.cpp +++ b/src/qteletextdecoder/decode.cpp @@ -348,12 +348,13 @@ QImage TeletextPageDecode::drcsImage(DRCSSource pageType, int subTable, int chr, QImage result = QImage(rawData, 12, 10, 12, QImage::Format_Indexed8); // Now put in the colours - // TODO read colours from X/28/1, for now we put in the default colours for (int i=0; i<16; i++) { + const int clr = m_levelOnePage->dCLUT(pageType-1, drcsMode, i); + if (flashPhOn) - result.setColor(i, m_levelOnePage->CLUTtoQColor(i).rgb()); + result.setColor(i, m_levelOnePage->CLUTtoQColor(clr).rgb()); else - result.setColor(i, m_levelOnePage->CLUTtoQColor(i ^ 8).rgb()); + result.setColor(i, m_levelOnePage->CLUTtoQColor(clr ^ 8).rgb()); if (i == 3 && drcsMode == 1) break; diff --git a/src/qteletextdecoder/levelonepage.cpp b/src/qteletextdecoder/levelonepage.cpp index a27d63a..385f15d 100644 --- a/src/qteletextdecoder/levelonepage.cpp +++ b/src/qteletextdecoder/levelonepage.cpp @@ -234,7 +234,6 @@ bool LevelOnePage::setPacket(int y, int d, QByteArray pkt) return true; } - qDebug("LevelOnePage unhandled setPacket X/%d/%d", y, d); return PageX26Base::setPacket(y, d, pkt); } @@ -383,6 +382,42 @@ bool LevelOnePage::isPaletteDefault(int fromColour, int toColour) const return true; } +int LevelOnePage::dCLUT(bool globalDrcs, int mode, int index) const +{ + if (!packetExists(28, 1)) + // Return default DCLUT as per D.1.6 and D.2.2 in the ETSI spec + return index; + + const QByteArray pkt = packet(28, 1); + + if (mode == 1) { + if (!globalDrcs) + index += 4; + } else if (mode == 2 || mode == 3) + index += globalDrcs ? 8 : 24; + else + return 0; + + // Some tricky bit juggling to extract 5 bits from parts of a 6-bit triplet + const int l = index/6*5 + 4; + + switch (index % 6) { + case 0: + return pkt.at(l) & 0x1f; + case 1: + return ((pkt.at(l+1) & 0x0f) << 1) | (pkt.at(l) >> 5); + case 2: + return ((pkt.at(l+2) & 0x07) << 2) | (pkt.at(l+1) >> 4); + case 3: + return ((pkt.at(l+3) & 0x03) << 3) | (pkt.at(l+2) >> 3); + case 4: + return ((pkt.at(l+4) & 0x01) << 4) | (pkt.at(l+3) >> 2); + case 5: + return pkt.at(l+4) >> 1; + } + return 0; // Won't get here; used to suppress a compiler warning +} + int LevelOnePage::levelRequired() const { // X/28/4 present i.e. CLUTs 0 or 1 redefined - Level 3.5 diff --git a/src/qteletextdecoder/levelonepage.h b/src/qteletextdecoder/levelonepage.h index fddc04d..486a26c 100644 --- a/src/qteletextdecoder/levelonepage.h +++ b/src/qteletextdecoder/levelonepage.h @@ -85,6 +85,7 @@ public: QColor CLUTtoQColor(int index, int renderlevel=3) const; bool isPaletteDefault(int colour) const; bool isPaletteDefault(int fromColour, int toColour) const; + int dCLUT(bool globalDrcs, int mode, int index) const; int levelRequired() const; bool leftSidePanelDisplayed() const { return m_leftSidePanelDisplayed; } void setLeftSidePanelDisplayed(bool newLeftSidePanelDisplayed);