Read DCLUTs from X/28/1

DCLUTs cannot be edited yet.
This commit is contained in:
Gavin MacGregor
2025-06-18 12:22:20 +01:00
parent 0fd581925a
commit ebee613a22
3 changed files with 41 additions and 4 deletions

View File

@@ -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;

View File

@@ -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

View File

@@ -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);