From 9b4ee66e1c672fbc6174b12a62e837a2bc5dd46c Mon Sep 17 00:00:00 2001 From: "G.K.MacGregor" Date: Tue, 25 Jun 2024 18:49:38 +0100 Subject: [PATCH] Revert "Convert font image straight to QIcons" This reverts commit 7cd632b4e2d350131b4c6884de56eca5ba2b9951. The commit would cause the font icons to be inverted sometimes. This reversion is altered to return the font bitmaps as a QPixmap instead of a QBitmap to be compatible with Qt6. --- render.cpp | 27 +++++++++------------------ render.h | 6 ++++-- x26dockwidget.cpp | 4 ++-- x26menus.cpp | 2 +- x26model.cpp | 12 +++++++----- 5 files changed, 23 insertions(+), 28 deletions(-) diff --git a/render.cpp b/render.cpp index 8e07b23..2ecbe17 100644 --- a/render.cpp +++ b/render.cpp @@ -19,9 +19,9 @@ #include #include -#include #include #include +#include #include "render.h" @@ -29,34 +29,25 @@ int TeletextFontBitmap::s_instances = 0; +QBitmap *TeletextFontBitmap::s_fontBitmap = nullptr; QImage *TeletextFontBitmap::s_fontImage = nullptr; TeletextFontBitmap::TeletextFontBitmap() { - if (s_instances == 0) - s_fontImage = new QImage(":/images/teletextfont.png"); - + if (s_instances == 0) { + s_fontBitmap = new QBitmap(":/images/teletextfont.png"); + s_fontImage = new QImage(s_fontBitmap->toImage()); + } s_instances++; } TeletextFontBitmap::~TeletextFontBitmap() { s_instances--; - - if (s_instances == 0) + if (s_instances == 0) { delete s_fontImage; -} - -QIcon TeletextFontBitmap::charIcon(int c, int s) const -{ - QImage glyphImage; - QBitmap glyphBitmap; - - glyphImage = s_fontImage->copy((c-32)*12, s*10, 12, 10); - glyphImage.invertPixels(); - glyphBitmap = QBitmap::fromImage(glyphImage); - - return QIcon(glyphBitmap); + delete s_fontBitmap; + } } diff --git a/render.h b/render.h index ba76d76..39003cb 100644 --- a/render.h +++ b/render.h @@ -20,9 +20,10 @@ #ifndef RENDER_H #define RENDER_H +#include #include -#include #include +#include #include "decode.h" @@ -33,10 +34,11 @@ public: ~TeletextFontBitmap(); QImage *image() const { return s_fontImage; } - QIcon charIcon(int c, int s) const; + QPixmap charBitmap(int c, int s) const { return s_fontBitmap->copy((c-32)*12, s*10, 12, 10); } private: static int s_instances; + static QBitmap* s_fontBitmap; static QImage* s_fontImage; }; diff --git a/x26dockwidget.cpp b/x26dockwidget.cpp index 15e2c45..7b44432 100644 --- a/x26dockwidget.cpp +++ b/x26dockwidget.cpp @@ -61,9 +61,9 @@ QVariant CharacterListModel::data(const QModelIndex &index, int role) const if (role == Qt::DecorationRole) { if (m_mosaic && (index.row()+32) & 0x20) - return m_fontBitmap.charIcon(index.row()+32, 24); + return m_fontBitmap.charBitmap(index.row()+32, 24); else - return m_fontBitmap.charIcon(index.row()+32, m_characterSet); + return m_fontBitmap.charBitmap(index.row()+32, m_characterSet); } return QVariant(); diff --git a/x26menus.cpp b/x26menus.cpp index 3dd55c7..7c98d97 100644 --- a/x26menus.cpp +++ b/x26menus.cpp @@ -140,7 +140,7 @@ TripletCharacterQMenu::TripletCharacterQMenu(int charSet, bool mosaic, QWidget * const int charSetInColumn = (mosaic && ((r & 0x2) == 0)) ? 24 : charSet; for (int c=0; c<16; c++) - m_actions[r*16+c] = charRange[r]->addAction(m_fontBitmap.charIcon(r*16+c+32, charSetInColumn), QString("0x%1").arg(r*16+c+32, 2, 16, QChar('0'))); + m_actions[r*16+c] = charRange[r]->addAction(QIcon(m_fontBitmap.charBitmap(r*16+c+32, charSetInColumn)), QString("0x%1").arg(r*16+c+32, 2, 16, QChar('0'))); } } diff --git a/x26model.cpp b/x26model.cpp index 621f900..58ad8b7 100644 --- a/x26model.cpp +++ b/x26model.cpp @@ -376,25 +376,27 @@ QVariant X26Model::data(const QModelIndex &index, int role) const break; case 0x21: // G1 mosaic character if (triplet.data() & 0x20) - return m_fontBitmap.charIcon(triplet.data(), 24); + // Returning the bitmap as-is doesn't seem to work here + // but putting it inside a QIcon... does? + return QIcon(m_fontBitmap.charBitmap(triplet.data(), 24)); else if (triplet.data() >= 0x20) // Blast-through - return m_fontBitmap.charIcon(triplet.data(), m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())); + return QIcon(m_fontBitmap.charBitmap(triplet.data(), m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn()))); break; case 0x22: // G3 mosaic character at level 1.5 case 0x2b: // G3 mosaic character at level >=2.5 if (triplet.data() >= 0x20) - return m_fontBitmap.charIcon(triplet.data(), 26); + return QIcon(m_fontBitmap.charBitmap(triplet.data(), 26)); break; case 0x2f: // G2 character if (triplet.data() >= 0x20) - return m_fontBitmap.charIcon(triplet.data(), m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())); + return QIcon(m_fontBitmap.charBitmap(triplet.data(), m_parentMainWidget->pageDecode()->cellG2CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn()))); break; default: if (triplet.modeExt() == 0x29 || (triplet.modeExt() >= 0x30 && triplet.modeExt() <= 0x3f)) // G0 character or G0 diacritical mark if (triplet.data() >= 0x20) - return m_fontBitmap.charIcon(triplet.data(), m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn())); + return QIcon(m_fontBitmap.charBitmap(triplet.data(), m_parentMainWidget->pageDecode()->cellG0CharacterSet(triplet.activePositionRow(), triplet.activePositionColumn()))); } if (role == Qt::EditRole && index.column() == 2)