From 816780e80943ef0ae6e645c1f912a5575fca9770 Mon Sep 17 00:00:00 2001 From: Georg Gadinger Date: Sun, 9 May 2021 21:08:04 +0200 Subject: skinned: use bitmap font if we really have all the characters available MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit This makes tracks from e.g. "Turmion Kätilöt" or "Die Ärzte" display using the bitmap font. Since the characters seem to be UTF-8 anyway, it seems to be fine in my initial tests... --- src/plugins/Ui/skinned/playlisttitlebar.cpp | 3 +-- src/plugins/Ui/skinned/skin.cpp | 15 +++++++++++++++ src/plugins/Ui/skinned/skin.h | 6 ++++++ src/plugins/Ui/skinned/textscroller.cpp | 2 +- 4 files changed, 23 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/plugins/Ui/skinned/playlisttitlebar.cpp b/src/plugins/Ui/skinned/playlisttitlebar.cpp index d9ada09b8..6a15319f5 100644 --- a/src/plugins/Ui/skinned/playlisttitlebar.cpp +++ b/src/plugins/Ui/skinned/playlisttitlebar.cpp @@ -155,8 +155,7 @@ void PlayListTitleBar::updatePixmap() } if (m_shaded) { - bool useBitmapFont = m_bitmap && (m_text.toLatin1() == m_text.toLocal8Bit()); //use bitmap font if possible - if (useBitmapFont) + if (m_bitmap && m_skin->canUseBitmapFont(m_text)) // use bitmap font if possible { int durationTextWidth = bitmapTextWidth(m_durationText, m_skin) + 1; // +1 to ensure a space in front of it int maxChars = (width() - durationTextWidth - 35 * m_ratio) / m_skin->getLetter('a').width(); diff --git a/src/plugins/Ui/skinned/skin.cpp b/src/plugins/Ui/skinned/skin.cpp index f1b6f8b79..425a34d45 100644 --- a/src/plugins/Ui/skinned/skin.cpp +++ b/src/plugins/Ui/skinned/skin.cpp @@ -185,6 +185,12 @@ const QRegion Skin::getRegion(uint r) const return m_regions[r]; } +const bool Skin::canUseBitmapFont(const QString& s) const +{ + qDebug("Skin: canUseBitmapFont %s", m_bitmapLetters.exactMatch(s) ? "true" : "false"); + return m_bitmapLetters.exactMatch(s); +} + void Skin::setSkin (const QString& path) { QSettings settings(Qmmp::configFile(), QSettings::IniFormat); @@ -795,6 +801,15 @@ void Skin::loadLetters(void) /* text background */ //m_items->insert (TEXTBG, letters[2][6]); + + // set up a regexp that matches all letters with a mapping + QStringList regexpChars; + for (auto &ch : m_letters.keys()) + { + regexpChars.append(ch); + } + m_bitmapLetters = QRegExp("[" + QRegExp::escape(regexpChars.join("")) + "]+"); + m_bitmapLetters.setCaseSensitivity(Qt::CaseSensitivity::CaseInsensitive); } void Skin::loadMonoSter() diff --git a/src/plugins/Ui/skinned/skin.h b/src/plugins/Ui/skinned/skin.h index d342c1e5a..42f63946c 100644 --- a/src/plugins/Ui/skinned/skin.h +++ b/src/plugins/Ui/skinned/skin.h @@ -66,6 +66,11 @@ public: const QColor getMainColor(int n) const; const QColor &getVisColor(int n) const; const QRegion getRegion(uint r) const; + /*! + * Returns whether s only contains characters which have a bitmapped + * equivalent. + */ + const bool canUseBitmapFont(const QString& s) const; enum Button { @@ -297,6 +302,7 @@ private: QMap m_ms_parts; QMap m_parts; QMap m_letters; + QRegExp m_bitmapLetters; QMap m_pledit_txt; QMap m_regions; QPixmap m_main; diff --git a/src/plugins/Ui/skinned/textscroller.cpp b/src/plugins/Ui/skinned/textscroller.cpp index b41041985..b114fbdfa 100644 --- a/src/plugins/Ui/skinned/textscroller.cpp +++ b/src/plugins/Ui/skinned/textscroller.cpp @@ -263,7 +263,7 @@ void TextScroller::processMetaData() void TextScroller::preparePixmap(const QString &text, bool scrollable) { m_scroll = scrollable; - bool bitmap = m_bitmap && (text.toLatin1() == text.toLocal8Bit()); //use bitmap font if possible + bool bitmap = m_bitmap && m_skin->canUseBitmapFont(text); // use bitmap font if possible if(scrollable) { int textWidth = m_bitmap ? QString(text + SCROLL_SEP).size() * 5 -- cgit v1.2.3-13-gbd6f