Port away from GNU case range extension

Hopefully this should now compile with MSVC and other compilers
This commit is contained in:
G.K.MacGregor
2023-09-12 16:45:55 +01:00
parent 3048e4dbc6
commit 426052f573
5 changed files with 176 additions and 78 deletions

View File

@@ -98,26 +98,6 @@ void TeletextPageDecode::Invocation::buildMap(int level)
continue; continue;
switch (triplet.modeExt()) { switch (triplet.modeExt()) {
case 0x21: // G1 character
case 0x22: // G3 character at Level 1.5
case 0x29: // G0 character
case 0x2b: // G3 character at Level 2.5
case 0x2f: // G2 character
case 0x30 ... 0x3f: // G0 character with diacritical
m_characterMap.insert(qMakePair(targetRow, targetColumn), triplet);
// Store rightmost column in this row for Adaptive Object attribute tracking
// QMap stores one value per key, QMap::insert will replace the value if the key already exists
m_rightMostColumn.insert(targetRow, targetColumn);
break;
case 0x20: // Foreground colour
case 0x23: // Background colour
case 0x27: // Additional flash functions
case 0x28: // Modified G0 and G2 character set designation
case 0x2c: // Display attributes
case 0x2e: // Font style
m_attributeMap.insert(qMakePair(targetRow, targetColumn), triplet);
m_rightMostColumn.insert(targetRow, targetColumn);
break;
case 0x00: // Full screen colour case 0x00: // Full screen colour
if ((triplet.data() & 0x60) != 0x00) if ((triplet.data() & 0x60) != 0x00)
break; break;
@@ -133,6 +113,31 @@ void TeletextPageDecode::Invocation::buildMap(int level)
if (targetRow == 0) if (targetRow == 0)
m_fullRowCLUTMap.insert(targetRow, triplet); m_fullRowCLUTMap.insert(targetRow, triplet);
break; break;
case 0x20: // Foreground colour
case 0x23: // Background colour
case 0x27: // Additional flash functions
case 0x28: // Modified G0 and G2 character set designation
case 0x2c: // Display attributes
case 0x2e: // Font style
m_attributeMap.insert(qMakePair(targetRow, targetColumn), triplet);
// Store rightmost column in this row for Adaptive Object attribute tracking
// QMap stores one value per key, QMap::insert will replace the value if the key already exists
m_rightMostColumn.insert(targetRow, targetColumn);
break;
case 0x21: // G1 character
case 0x22: // G3 character at Level 1.5
case 0x29: // G0 character
case 0x2b: // G3 character at Level 2.5
case 0x2f: // G2 character
m_characterMap.insert(qMakePair(targetRow, targetColumn), triplet);
m_rightMostColumn.insert(targetRow, targetColumn);
break;
default:
if (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f) {
// G0 character with diacritical
m_characterMap.insert(qMakePair(targetRow, targetColumn), triplet);
m_rightMostColumn.insert(targetRow, targetColumn);
}
} }
} }
} }
@@ -322,9 +327,10 @@ TeletextPageDecode::textCharacter TeletextPageDecode::characterFromTriplets(cons
case 0x2f: // G2 character case 0x2f: // G2 character
result = { charCode, 2, 0 }; result = { charCode, 2, 0 };
break; break;
case 0x30 ... 0x3f: // G0 character with diacritical default:
result = { charCode, 0, triplet.mode() & 0xf }; if (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f)
break; // G0 character with diacritical
result = { charCode, 0, triplet.mode() & 0xf };
} }
if (m_level == 1) if (m_level == 1)
@@ -945,7 +951,14 @@ void TeletextPageDecode::decodeRow(int r)
// Level 1 set-after spacing attributes // Level 1 set-after spacing attributes
if (c < 40 && m_rowHeight[r] != BottomHalf) if (c < 40 && m_rowHeight[r] != BottomHalf)
switch (m_levelOnePage->character(r, c)) { switch (m_levelOnePage->character(r, c)) {
case 0x00 ... 0x07: // Alphanumeric and foreground colour case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07: // Alphanumeric and foreground colour
level1Mosaics = false; level1Mosaics = false;
level1ForegroundCLUT = m_levelOnePage->character(r, c); level1ForegroundCLUT = m_levelOnePage->character(r, c);
if (m_level >= 2) if (m_level >= 2)
@@ -957,7 +970,14 @@ void TeletextPageDecode::decodeRow(int r)
level1HoldMosaicCharacter = 0x20; level1HoldMosaicCharacter = 0x20;
level1HoldMosaicSeparated = false; level1HoldMosaicSeparated = false;
break; break;
case 0x10 ... 0x17: // Mosaic and foreground colour case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17: // Mosaic and foreground colour
level1Mosaics = true; level1Mosaics = true;
level1ForegroundCLUT = m_levelOnePage->character(r, c) & 0x07; level1ForegroundCLUT = m_levelOnePage->character(r, c) & 0x07;
if (m_level >= 2) if (m_level >= 2)

View File

@@ -433,9 +433,12 @@ int LevelOnePage::levelRequired() const
case 0x1f: // Termination case 0x1f: // Termination
case 0x22: // G3 character @ Level 1.5 case 0x22: // G3 character @ Level 1.5
case 0x2f: // G2 character case 0x2f: // G2 character
case 0x30 ... 0x3f: // G0 character with diacritical
levelSeen = 1; levelSeen = 1;
break; break;
default:
if (m_enhancements.at(i).modeExt() >= 0x30 && m_enhancements.at(i).modeExt() <= 0x3f)
// G0 character with diacritical
levelSeen = 1;
} }
if (levelSeen < 2) if (levelSeen < 2)
@@ -443,14 +446,23 @@ int LevelOnePage::levelRequired() const
// Check for Level 2.5 triplets // Check for Level 2.5 triplets
case 0x00: // Full screen colour case 0x00: // Full screen colour
case 0x01: // Full row colour case 0x01: // Full row colour
case 0x10 ... 0x13: // Origin Modifer and Object Invocation case 0x10: // Origin Modifier
case 0x15 ... 0x17: // Object Definition case 0x11: // Invoke Active Object
case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
case 0x18: // DRCS Mode case 0x18: // DRCS Mode
case 0x20: // Foreground colour case 0x20: // Foreground colour
case 0x21: // G1 character case 0x21: // G1 character
case 0x23: // Background colour case 0x23: // Background colour
case 0x27 ... 0x29: // Flash functions, G0 and G2 charset designation, G0 character @ Level 2.5 case 0x27: // Flash functions
case 0x2b ... 0x2d: // G3 character @ Level 2.5, display attributes, DRCS character case 0x28: // G0 and G2 charset designation
case 0x29: // G0 character @ Level 2.5
case 0x2b: // G3 character @ Level 2.5
case 0x2c: // Display attributes
case 0x2d: // DRCS character
levelSeen = 2; levelSeen = 2;
break; break;
} }
@@ -458,7 +470,9 @@ int LevelOnePage::levelRequired() const
if (levelSeen == 2) if (levelSeen == 2)
switch (m_enhancements.at(i).modeExt()) { switch (m_enhancements.at(i).modeExt()) {
// Check for triplets with "required at Level 3.5 only" parameters // Check for triplets with "required at Level 3.5 only" parameters
case 0x15 ... 0x17: // Object Definition case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
if ((m_enhancements.at(i).address() & 0x18) == 0x10) if ((m_enhancements.at(i).address() & 0x18) == 0x10)
return 3; return 3;
break; break;

View File

@@ -748,7 +748,23 @@ void X26DockWidget::updateAllCookedTripletWidgets(const QModelIndex &index)
case 0x22: // G3 character at Level 1.5 case 0x22: // G3 character at Level 1.5
case 0x29: // G0 character case 0x29: // G0 character
case 0x2b: // G3 character at Level 2.5 case 0x2b: // G3 character at Level 2.5
case 0x2f ... 0x3f: // G2 character, G0 character with diacritical case 0x2f: // G2 character
case 0x30:
case 0x31:
case 0x32:
case 0x33:
case 0x34:
case 0x35:
case 0x36:
case 0x37:
case 0x38:
case 0x39:
case 0x3a:
case 0x3b:
case 0x3c:
case 0x3d:
case 0x3e:
case 0x3f: // G0 character with diacritical
m_characterCodeComboBox->blockSignals(true); m_characterCodeComboBox->blockSignals(true);
if (modeExt == 0x21) if (modeExt == 0x21)
m_characterListModel.setCharacterSet(24); m_characterListModel.setCharacterSet(24);
@@ -788,8 +804,12 @@ void X26DockWidget::updateAllCookedTripletWidgets(const QModelIndex &index)
m_displayAttributeUnderlineCheckBox->blockSignals(false); m_displayAttributeUnderlineCheckBox->blockSignals(false);
m_tripletParameterStackedLayout->setCurrentIndex(4); m_tripletParameterStackedLayout->setCurrentIndex(4);
break; break;
case 0x11 ... 0x13: // Invoke object case 0x11: // Invoke Active Object
case 0x15 ... 0x17: // Define object case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
if (index.model()->data(index.model()->index(index.row(), 1), Qt::UserRole).toInt() & 0x04) { if (index.model()->data(index.model()->index(index.row(), 1), Qt::UserRole).toInt() & 0x04) {
// Define object // Define object
m_objectSourceComboBox->setVisible(false); m_objectSourceComboBox->setVisible(false);

View File

@@ -134,7 +134,9 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
case 0x10: // Origin Modifier case 0x10: // Origin Modifier
// For Set Active Position and Origin Modifier, data is the column, so return blank // For Set Active Position and Origin Modifier, data is the column, so return blank
return QVariant(); return QVariant();
case 0x11 ... 0x13: // Invoke object case 0x11: // Invoke Active Object
case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
switch (triplet.address() & 0x18) { switch (triplet.address() & 0x18) {
case 0x08: case 0x08:
return QString("Local: d%1 t%2").arg((triplet.data() >> 4) | ((triplet.address() & 0x01) << 3)).arg(triplet.data() & 0x0f); return QString("Local: d%1 t%2").arg((triplet.data() >> 4) | ((triplet.address() & 0x01) << 3)).arg(triplet.data() & 0x0f);
@@ -152,7 +154,9 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
else else
result.append("1-9"); result.append("1-9");
return result; return result;
case 0x15 ... 0x17: // Define object case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
switch (triplet.address() & 0x18) { switch (triplet.address() & 0x18) {
case 0x08: case 0x08:
return "Local: L2.5 only"; return "Local: L2.5 only";
@@ -212,7 +216,12 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
break; break;
} }
break; break;
case 0x08 ... 0x0d: // PDC case 0x08: // PDC country of origin & programme source
case 0x09: // PDC month & day
case 0x0a: // PDC cursor row & announced start hour
case 0x0b: // PDC cursor row & announced finish hour
case 0x0c: // PDC cursor row & local time offset
case 0x0d: // PDC series ID & series code
return QString("0x%1").arg(triplet.data(), 2, 16, QChar('0')); return QString("0x%1").arg(triplet.data(), 2, 16, QChar('0'));
case 0x20: // Foreground colour case 0x20: // Foreground colour
case 0x23: // Background colour case 0x23: // Background colour
@@ -223,7 +232,7 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
case 0x22: // G3 mosaic character at level 1.5 case 0x22: // G3 mosaic character at level 1.5
case 0x29: // G0 character case 0x29: // G0 character
case 0x2b: // G3 mosaic character at level >=2.5 case 0x2b: // G3 mosaic character at level >=2.5
case 0x2f ... 0x3f: // G2 character or G0 diacritical mark case 0x2f: // G2 character
if (triplet.data() >= 0x20) if (triplet.data() >= 0x20)
return QString("0x%1").arg(triplet.data(), 2, 16); return QString("0x%1").arg(triplet.data(), 2, 16);
break; break;
@@ -339,8 +348,13 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
return result; return result;
case 0x26: // PDC case 0x26: // PDC
return QString("0x%1").arg(triplet.data(), 2, 16, QChar('0')); return QString("0x%1").arg(triplet.data(), 2, 16, QChar('0'));
default: // Reserved default:
return QString("Reserved 0x%1").arg(triplet.data(), 2, 16, QChar('0')); if (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f && triplet.data() >= 0x20)
// G0 with diacritical
return QString("0x%1").arg(triplet.data(), 2, 16);
else
// Reserved
return QString("Reserved 0x%1").arg(triplet.data(), 2, 16, QChar('0'));
} }
// Reserved mode or data // Reserved mode or data
return QString("Reserved 0x%1").arg(triplet.data(), 2, 16, QChar('0')); return QString("Reserved 0x%1").arg(triplet.data(), 2, 16, QChar('0'));
@@ -372,11 +386,11 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
if (triplet.data() >= 0x20) if (triplet.data() >= 0x20)
return m_fontBitmap.rawBitmap()->copy((triplet.data()-32)*12, m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())*10, 12, 10); return m_fontBitmap.rawBitmap()->copy((triplet.data()-32)*12, m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())*10, 12, 10);
break; break;
case 0x29: // G0 character default:
case 0x30 ... 0x3f: // G0 diacritical mark if (triplet.modeExt() == 0x29 || (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f))
if (triplet.data() >= 0x20) // G0 character or G0 diacritical mark
return m_fontBitmap.rawBitmap()->copy((triplet.data()-32)*12, m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())*10, 12, 10); if (triplet.data() >= 0x20)
break; return m_fontBitmap.rawBitmap()->copy((triplet.data()-32)*12, m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())*10, 12, 10);
} }
if (role == Qt::EditRole && index.column() == 2) if (role == Qt::EditRole && index.column() == 2)
@@ -397,7 +411,9 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
if (role == Qt::UserRole+1) // Colour index if (role == Qt::UserRole+1) // Colour index
return triplet.data() & 0x1f; return triplet.data() & 0x1f;
break; break;
case 0x11 ... 0x13: // Invoke object case 0x11: // Invoke Active Object
case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
switch (role) { switch (role) {
case Qt::UserRole+1: // Object source: Local, POP or GPOP case Qt::UserRole+1: // Object source: Local, POP or GPOP
return ((triplet.address() & 0x18) >> 3) - 1; return ((triplet.address() & 0x18) >> 3) - 1;
@@ -421,7 +437,9 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
return (triplet.data() & 0x10) >> 4; return (triplet.data() & 0x10) >> 4;
} }
break; break;
case 0x15 ... 0x17: // Define object case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
switch (role) { switch (role) {
case Qt::UserRole+1: // Required at which levels case Qt::UserRole+1: // Required at which levels
return ((triplet.address() & 0x18) >> 3) - 1; return ((triplet.address() & 0x18) >> 3) - 1;
@@ -496,12 +514,12 @@ QVariant X26Model::data(const QModelIndex &index, int role) const
if (role == Qt::UserRole+2) // Character set if (role == Qt::UserRole+2) // Character set
return m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn()); return m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn());
break; break;
case 0x29: // G0 character default:
case 0x30 ... 0x3f: // G0 diacritical mark if (triplet.modeExt() == 0x29 || (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f))
// Qt::UserRole+1 is character number, returned by default below // G0 character or G0 diacritical mark
if (role == Qt::UserRole+2) // Character set // Qt::UserRole+1 is character number, returned by default below
return m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn()); if (role == Qt::UserRole+2) // Character set
break; return m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn());
}; };
// For characters and other triplet modes, return the complete data value // For characters and other triplet modes, return the complete data value
@@ -635,15 +653,6 @@ bool X26Model::setData(const QModelIndex &index, const QVariant &value, int role
if (triplet.data() & 0x78) if (triplet.data() & 0x78)
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x07, 0x00, role)); m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x07, 0x00, role));
break; break;
case 0x21: // G1 mosaic character
case 0x22: // G3 mosaic character at level 1.5
case 0x29: // G0 character
case 0x2b: // G3 mosaic character at level >=2.5
case 0x2f ... 0x3f: // G2 character or G0 diacritical mark
// Data range 0x20-0x7f
if (triplet.data() < 0x20)
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x00, 0x20, role));
break;
case 0x27: // Additional flash functions case 0x27: // Additional flash functions
// D6 and D5 must be clear, D4 and D3 set is reserved phase // D6 and D5 must be clear, D4 and D3 set is reserved phase
if (triplet.data() >= 0x18) if (triplet.data() >= 0x18)
@@ -660,6 +669,20 @@ bool X26Model::setData(const QModelIndex &index, const QVariant &value, int role
if ((triplet.data() & 0x3f) >= 48) if ((triplet.data() & 0x3f) >= 48)
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x40, 0x77, role)); m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x40, 0x77, role));
break; break;
case 0x21: // G1 mosaic character
case 0x22: // G3 mosaic character at level 1.5
case 0x29: // G0 character
case 0x2b: // G3 mosaic character at level >=2.5
case 0x2f: // G2 character
// Data range 0x20-0x7f
if (triplet.data() < 0x20)
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x00, 0x20, role));
break;
default:
if (intValue >= 0x30 && intValue <= 0x3f && triplet.data() < 0x20)
// G0 diacritical mark
// Data range 0x20-0x7f
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETdata, 0x00, 0x20, role));
} }
return true; return true;
} }
@@ -681,7 +704,9 @@ bool X26Model::setData(const QModelIndex &index, const QVariant &value, int role
break; break;
} }
break; break;
case 0x11 ... 0x13: // Invoke object case 0x11: // Invoke Active Object
case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
switch (role) { switch (role) {
case Qt::UserRole+1: // Object source: Local, POP or GPOP case Qt::UserRole+1: // Object source: Local, POP or GPOP
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETaddress, 0x27, (intValue+1) << 3, role)); m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETaddress, 0x27, (intValue+1) << 3, role));
@@ -711,7 +736,9 @@ bool X26Model::setData(const QModelIndex &index, const QVariant &value, int role
return true; return true;
} }
break; break;
case 0x15 ... 0x17: // Define object case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
switch (role) { switch (role) {
case Qt::UserRole+1: // Required at which levels case Qt::UserRole+1: // Required at which levels
m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETaddress, 0x27, (intValue+1) << 3, role)); m_parentMainWidget->document()->undoStack()->push(new EditTripletCommand(m_parentMainWidget->document(), this, index.row(), EditTripletCommand::ETaddress, 0x27, (intValue+1) << 3, role));

View File

@@ -124,7 +124,9 @@ void X26TripletList::updateInternalData()
m_list.at(i+1).modeExt() > 0x13) m_list.at(i+1).modeExt() > 0x13)
triplet->m_error = X26Triplet::OriginModifierAlone; triplet->m_error = X26Triplet::OriginModifierAlone;
break; break;
case 0x11 ... 0x13: // Invoke Object case 0x11: // Invoke Active Object
case 0x12: // Invoke Adaptive Object
case 0x13: // Invoke Passive Object
if (triplet->objectSource() == X26Triplet::LocalObject) { if (triplet->objectSource() == X26Triplet::LocalObject) {
if (triplet->objectLocalTripletNumber() > 12 || if (triplet->objectLocalTripletNumber() > 12 ||
triplet->objectLocalIndex() > (m_list.size()-1) || triplet->objectLocalIndex() > (m_list.size()-1) ||
@@ -135,7 +137,9 @@ void X26TripletList::updateInternalData()
triplet->m_error = X26Triplet::InvokeTypeMismatch; triplet->m_error = X26Triplet::InvokeTypeMismatch;
} }
break; break;
case 0x15 ... 0x17: // Define Object case 0x15: // Define Active Object
case 0x16: // Define Adaptive Object
case 0x17: // Define Passive Object
activePosition.reset(); activePosition.reset();
// Make sure data field holds correct place of triplet // Make sure data field holds correct place of triplet
// otherwise the object won't appear // otherwise the object won't appear
@@ -145,7 +149,12 @@ void X26TripletList::updateInternalData()
if ((triplet->m_data & 0x30) == 0x00) if ((triplet->m_data & 0x30) == 0x00)
triplet->m_reservedData = true; triplet->m_reservedData = true;
case 0x1f: // Termination marker case 0x1f: // Termination marker
case 0x08 ... 0x0d: // PDC case 0x08: // PDC country of origin & programme source
case 0x09: // PDC month & day
case 0x0a: // PDC cursor row & announced start hour
case 0x0b: // PDC cursor row & announced finish hour
case 0x0c: // PDC cursor row & local time offset
case 0x0d: // PDC series ID & series code
break; break;
default: default:
triplet->m_reservedMode = true; triplet->m_reservedMode = true;
@@ -158,18 +167,10 @@ void X26TripletList::updateInternalData()
else else
switch (triplet->modeExt()) { switch (triplet->modeExt()) {
case 0x20: // Foreground colour case 0x20: // Foreground colour
case 0x23: // Foreground colour case 0x23: // Background colour
if (triplet->m_data & 0x60) if (triplet->m_data & 0x60)
triplet->m_reservedData = true; triplet->m_reservedData = true;
break; break;
case 0x21: // G1 mosaic character
case 0x22: // G3 mosaic character at level 1.5
case 0x29: // G0 character
case 0x2b: // G3 mosaic character at level >=2.5
case 0x2f ... 0x3f: // G2 character or G0 diacritical mark
if (triplet->m_data < 0x20)
triplet->m_reservedData = true;
break;
case 0x27: // Additional flash functions case 0x27: // Additional flash functions
if (triplet->m_data >= 0x18) if (triplet->m_data >= 0x18)
triplet->m_reservedData = true; triplet->m_reservedData = true;
@@ -193,6 +194,19 @@ void X26TripletList::updateInternalData()
if ((triplet->m_data & 0x3f) >= 48) if ((triplet->m_data & 0x3f) >= 48)
// Should really be an error? // Should really be an error?
triplet->m_reservedData = true; triplet->m_reservedData = true;
break;
case 0x21: // G1 mosaic character
case 0x22: // G3 mosaic character at level 1.5
case 0x29: // G0 character
case 0x2b: // G3 mosaic character at level >=2.5
case 0x2f: // G2 character
if (triplet->m_data < 0x20)
triplet->m_reservedData = true;
break;
default:
if (triplet->modeExt() >= 0x30 && triplet->modeExt() <= 0x3f && triplet->m_data < 0x20)
// G0 diacritical mark
triplet->m_reservedData = true;
} }
triplet->m_activePositionRow = activePosition.row(); triplet->m_activePositionRow = activePosition.row();
@@ -217,15 +231,18 @@ void X26TripletList::updateInternalData()
activePosition.setColumn(8); activePosition.setColumn(8);
break; break;
case 0x22: // G3 mosaic character at level 1.5 case 0x22: // G3 mosaic character at level 1.5
case 0x2f ... 0x3f: // G2 character or G0 diacritical mark case 0x2f: // G2 character
activePosition.setColumn(triplet->addressColumn()); activePosition.setColumn(triplet->addressColumn());
break; break;
default:
if (triplet->modeExt() >= 0x30 && triplet->modeExt() <= 0x3f)
// G0 diacritical mark
activePosition.setColumn(triplet->addressColumn());
} }
triplet->m_activePositionRow1p5 = activePosition.row(); triplet->m_activePositionRow1p5 = activePosition.row();
triplet->m_activePositionColumn1p5 = activePosition.column(); triplet->m_activePositionColumn1p5 = activePosition.column();
} }
} }
void X26TripletList::append(const X26Triplet &value) void X26TripletList::append(const X26Triplet &value)