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)