From 9bcd966ca1fb9f13fcd8bce112d63a295db95c55 Mon Sep 17 00:00:00 2001 From: Igor Korsukov Date: Mon, 25 Jul 2022 17:56:56 +0200 Subject: [PATCH] [engraving] restructured engraving fonts --- sandbox/engraving/fontproviderstub.cpp | 7 +- sandbox/engraving/fontproviderstub.h | 3 +- src/engraving/CMakeLists.txt | 6 + src/engraving/engravingmodule.cpp | 94 ++++++- .../infrastructure/smufl.cpp} | 80 +++++- .../infrastructure/smufl.h} | 39 ++- .../symbolfont.cpp} | 261 ++++-------------- .../symbolfont.h} | 42 +-- src/engraving/infrastructure/symbolfonts.cpp | 109 ++++++++ .../infrastructure/symbolfonts.h} | 36 ++- src/engraving/layout/layout.cpp | 1 - src/engraving/libmscore/accidental.cpp | 6 +- src/engraving/libmscore/arpeggio.cpp | 8 +- src/engraving/libmscore/bagpembell.cpp | 8 +- src/engraving/libmscore/barline.cpp | 10 +- src/engraving/libmscore/engravingitem.cpp | 26 +- src/engraving/libmscore/glissando.cpp | 4 +- src/engraving/libmscore/libmscore.cmake | 2 - src/engraving/libmscore/mscore.cpp | 4 +- src/engraving/libmscore/note.cpp | 8 +- src/engraving/libmscore/score.cpp | 10 +- src/engraving/libmscore/score.h | 8 +- src/engraving/libmscore/slur.cpp | 4 +- src/engraving/libmscore/symbol.cpp | 4 +- src/engraving/libmscore/symbol.h | 6 +- src/engraving/libmscore/systemdivider.cpp | 4 +- src/engraving/libmscore/textbase.cpp | 10 +- src/engraving/libmscore/textedit.cpp | 4 +- src/engraving/libmscore/timesig.cpp | 4 +- src/engraving/libmscore/trill.cpp | 6 +- src/engraving/libmscore/undo.cpp | 5 +- src/engraving/libmscore/vibrato.cpp | 6 +- src/engraving/rw/compat/read206.cpp | 4 +- src/engraving/rw/compat/read302.cpp | 4 +- src/framework/draw/ifontprovider.h | 4 +- src/framework/draw/internal/qfontprovider.cpp | 13 +- src/framework/draw/internal/qfontprovider.h | 5 +- src/framework/fonts/CMakeLists.txt | 2 - src/framework/fonts/fontsmodule.cpp | 10 - src/framework/fonts/fontsmodule.h | 2 - src/framework/fonts/internal/fontssetup.cpp | 68 ----- src/framework/global/CMakeLists.txt | 2 - src/framework/ui/uimodule.cpp | 3 + .../internal/musicxml/importmxmlpass1.cpp | 5 +- .../internal/musicxml/importmxmlpass2.cpp | 4 +- .../notes/noteheads/noteheadgroupsmodel.cpp | 4 +- src/notation/internal/notation.cpp | 1 - src/notation/internal/notationplayback.cpp | 1 - src/notation/view/loopmarker.cpp | 4 +- src/notation/view/playbackcursor.cpp | 1 - src/notation/view/widgets/editstyle.cpp | 8 +- .../view/widgets/editdrumsetdialog.cpp | 11 +- src/palette/view/widgets/masterpalette.cpp | 15 +- .../view/widgets/specialcharactersdialog.cpp | 12 +- src/palette/view/widgets/symboldialog.cpp | 13 +- .../widgets/timesignaturepropertiesdialog.cpp | 12 +- src/project/internal/projectmigrator.cpp | 5 +- .../fontproviderstub.cpp | 7 +- .../check_build_without_qt/fontproviderstub.h | 3 +- 59 files changed, 568 insertions(+), 480 deletions(-) rename src/{framework/global/smuflranges.cpp => engraving/infrastructure/smufl.cpp} (51%) rename src/{framework/global/smuflranges.h => engraving/infrastructure/smufl.h} (52%) rename src/engraving/{libmscore/scorefont.cpp => infrastructure/symbolfont.cpp} (71%) rename src/engraving/{libmscore/scorefont.h => infrastructure/symbolfont.h} (79%) create mode 100644 src/engraving/infrastructure/symbolfonts.cpp rename src/{framework/fonts/internal/fontssetup.h => engraving/infrastructure/symbolfonts.h} (51%) delete mode 100644 src/framework/fonts/internal/fontssetup.cpp diff --git a/sandbox/engraving/fontproviderstub.cpp b/sandbox/engraving/fontproviderstub.cpp index 0d38c6373fd29..fccd67e077916 100644 --- a/sandbox/engraving/fontproviderstub.cpp +++ b/sandbox/engraving/fontproviderstub.cpp @@ -3,7 +3,12 @@ using namespace mu; using namespace mu::draw; -int FontProviderStub::addApplicationFont(const QString&, const QString&) +int FontProviderStub::addSymbolFont(const QString&, const io::path_t &) +{ + return -1; +} + +int FontProviderStub::addTextFont(const io::path_t& path) { return -1; } diff --git a/sandbox/engraving/fontproviderstub.h b/sandbox/engraving/fontproviderstub.h index 6beccd4403cab..cc0a8124a0c39 100644 --- a/sandbox/engraving/fontproviderstub.h +++ b/sandbox/engraving/fontproviderstub.h @@ -8,7 +8,8 @@ class FontProviderStub : public IFontProvider { public: - int addApplicationFont(const QString& family, const QString& path) override; + int addSymbolFont(const QString& family, const io::path_t& path) override; + int addTextFont(const io::path_t& path) override; void insertSubstitution(const QString& familyName, const QString& substituteName) override; qreal lineSpacing(const Font& f) const override; diff --git a/src/engraving/CMakeLists.txt b/src/engraving/CMakeLists.txt index 856e036cc19ec..aeff0749437e1 100644 --- a/src/engraving/CMakeLists.txt +++ b/src/engraving/CMakeLists.txt @@ -52,6 +52,12 @@ set(MODULE_SRC ${CMAKE_CURRENT_LIST_DIR}/infrastructure/debugpaint.h ${CMAKE_CURRENT_LIST_DIR}/infrastructure/paintdebugger.cpp ${CMAKE_CURRENT_LIST_DIR}/infrastructure/paintdebugger.h + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/symbolfonts.cpp + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/symbolfonts.h + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/symbolfont.cpp + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/symbolfont.h + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/smufl.cpp + ${CMAKE_CURRENT_LIST_DIR}/infrastructure/smufl.h ${LIBMSCORE_SRC} diff --git a/src/engraving/engravingmodule.cpp b/src/engraving/engravingmodule.cpp index f31ffc3aab428..a28a0fa4e3058 100644 --- a/src/engraving/engravingmodule.cpp +++ b/src/engraving/engravingmodule.cpp @@ -24,6 +24,10 @@ #include "modularity/ioc.h" #include "global/allocator.h" +#include "draw/ifontprovider.h" +#include "infrastructure/smufl.h" +#include "infrastructure/symbolfonts.h" + #ifndef ENGRAVING_NO_INTERNAL #include "internal/engravingconfiguration.h" #endif @@ -36,12 +40,14 @@ #include "engraving/libmscore/mscore.h" #include "engraving/libmscore/masterscore.h" -#include "engraving/libmscore/scorefont.h" #include "compat/scoreaccess.h" +#include "log.h" + using namespace mu::engraving; using namespace mu::modularity; +using namespace mu::draw; #ifndef ENGRAVING_NO_INTERNAL static std::shared_ptr s_configuration = std::make_shared(); @@ -82,6 +88,67 @@ void EngravingModule::registerUiTypes() void EngravingModule::onInit(const framework::IApplication::RunMode&) { + // Init fonts + { + // Symbols + Smufl::init(); + + SymbolFonts::addFont(u"Leland", u"Leland", ":/fonts/leland/Leland.otf"); + SymbolFonts::addFont(u"Bravura", u"Bravura", ":/fonts/bravura/Bravura.otf"); + SymbolFonts::addFont(u"Emmentaler", u"MScore", ":/fonts/mscore/mscore.ttf"); + SymbolFonts::addFont(u"Gonville", u"Gootville", ":/fonts/gootville/Gootville.otf"); + SymbolFonts::addFont(u"MuseJazz", u"MuseJazz", ":/fonts/musejazz/MuseJazz.otf"); + SymbolFonts::addFont(u"Petaluma", u"Petaluma", ":/fonts/petaluma/Petaluma.otf"); + SymbolFonts::addFont(u"Finale Maestro", u"Finale Maestro", ":/fonts/finalemaestro/FinaleMaestro.otf"); + SymbolFonts::addFont(u"Finale Broadway", u"Finale Broadway", ":/fonts/finalebroadway/FinaleBroadway.otf"); + + SymbolFonts::setFallbackFont(u"Bravura"); + + // Text + const std::vector textFonts = { + ":/fonts/musejazz/MuseJazzText.otf", + ":/fonts/campania/Campania.otf", + ":/fonts/edwin/Edwin-Roman.otf", + ":/fonts/edwin/Edwin-Bold.otf", + ":/fonts/edwin/Edwin-Italic.otf", + ":/fonts/edwin/Edwin-BdIta.otf", + ":/fonts/FreeSans.ttf", + ":/fonts/FreeSerif.ttf", + ":/fonts/FreeSerifBold.ttf", + ":/fonts/FreeSerifItalic.ttf", + ":/fonts/FreeSerifBoldItalic.ttf", + ":/fonts/mscoreTab.ttf", + ":/fonts/mscore-BC.ttf", + ":/fonts/leland/LelandText.otf", + ":/fonts/leland/Leland.otf", + ":/fonts/bravura/BravuraText.otf", + ":/fonts/gootville/GootvilleText.otf", + ":/fonts/mscore/MScoreText.ttf", + ":/fonts/petaluma/PetalumaText.otf", + ":/fonts/petaluma/PetalumaScript.otf", + ":/fonts/finalemaestro/FinaleMaestroText.otf", + ":/fonts/finalebroadway/FinaleBroadwayText.otf", + }; + + std::shared_ptr fontProvider = ioc()->resolve("fonts"); + for (const io::path_t& font : textFonts) { + int loadStatusCode = fontProvider->addTextFont(font); + if (loadStatusCode == -1) { + LOGE() << "Fatal error: cannot load internal font " << font; + } + } + + fontProvider->insertSubstitution(u"Leland Text", u"Bravura Text"); + fontProvider->insertSubstitution(u"Bravura Text", u"Leland Text"); + fontProvider->insertSubstitution(u"MScore Text", u"Leland Text"); + fontProvider->insertSubstitution(u"Gootville Text", u"Leland Text"); + fontProvider->insertSubstitution(u"MuseJazz Text", u"Leland Text"); + fontProvider->insertSubstitution(u"Petaluma Text", u"MuseJazz Text"); + fontProvider->insertSubstitution(u"Finale Maestro Text", u"Leland Text"); + fontProvider->insertSubstitution(u"Finale Broadway Text", u"MuseJazz Text"); + fontProvider->insertSubstitution(u"ScoreFont", u"Leland Text");// alias for current Musical Text Font + } + #ifndef ENGRAVING_NO_INTERNAL s_configuration->init(); @@ -95,24 +162,27 @@ void EngravingModule::onInit(const framework::IApplication::RunMode&) MScore::setNudgeStep10(1.0); // Ctrl + cursor key (default 1.0) MScore::setNudgeStep50(0.01); // Alt + cursor key (default 0.01) + // Palette + { #ifndef ENGRAVING_NO_ACCESSIBILITY - AccessibleItem::enabled = false; + AccessibleItem::enabled = false; #endif - gpaletteScore = compat::ScoreAccess::createMasterScore(); + gpaletteScore = compat::ScoreAccess::createMasterScore(); #ifndef ENGRAVING_NO_ACCESSIBILITY - AccessibleItem::enabled = true; + AccessibleItem::enabled = true; #endif - if (EngravingObject::elementsProvider()) { - EngravingObject::elementsProvider()->unreg(gpaletteScore); - } + if (EngravingObject::elementsProvider()) { + EngravingObject::elementsProvider()->unreg(gpaletteScore); + } - gpaletteScore->setStyle(DefaultStyle::baseStyle()); + gpaletteScore->setStyle(DefaultStyle::baseStyle()); - gpaletteScore->style().set(Sid::MusicalTextFont, String(u"Leland Text")); - ScoreFont* scoreFont = ScoreFont::fontByName(u"Leland"); - gpaletteScore->setScoreFont(scoreFont); - gpaletteScore->setNoteHeadWidth(scoreFont->width(SymId::noteheadBlack, gpaletteScore->spatium()) / SPATIUM20); + gpaletteScore->style().set(Sid::MusicalTextFont, String(u"Leland Text")); + SymbolFont* scoreFont = SymbolFonts::fontByName(u"Leland"); + gpaletteScore->setSymbolFont(scoreFont); + gpaletteScore->setNoteHeadWidth(scoreFont->width(SymId::noteheadBlack, gpaletteScore->spatium()) / SPATIUM20); + } //! NOTE And some initialization in the `Notation::init()` } diff --git a/src/framework/global/smuflranges.cpp b/src/engraving/infrastructure/smufl.cpp similarity index 51% rename from src/framework/global/smuflranges.cpp rename to src/engraving/infrastructure/smufl.cpp index 360dc7bf8abe3..4b2d803e009da 100644 --- a/src/framework/global/smuflranges.cpp +++ b/src/engraving/infrastructure/smufl.cpp @@ -19,22 +19,98 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "smuflranges.h" +#include "smufl.h" #include "io/file.h" #include "serialization/json.h" +#include "types/symnames.h" + +#include "libmscore/mscore.h" + #include "log.h" using namespace mu; using namespace mu::io; +using namespace mu::engraving; + +std::array Smufl::s_symIdCodes { { } }; + +const Smufl::Code Smufl::code(SymId id) +{ + return s_symIdCodes.at(static_cast(id)); +} + +char32_t Smufl::smuflCode(SymId id) +{ + return s_symIdCodes.at(static_cast(id)).smuflCode; +} + +bool Smufl::init() +{ + bool ok = initGlyphNamesJson(); + + return ok; +} + +bool Smufl::initGlyphNamesJson() +{ + File file(":fonts/smufl/glyphnames.json"); + if (!file.open(IODevice::ReadOnly)) { + LOGE() << "could not open glyph names JSON file."; + return false; + } + + std::string error; + JsonObject glyphNamesJson = JsonDocument::fromJson(file.readAll(), &error).rootObject(); + file.close(); + + if (!error.empty()) { + LOGE() << "JSON parse error in glyph names file: " << error; + return false; + } + + IF_ASSERT_FAILED(!glyphNamesJson.empty()) { + LOGE() << "Could not read glyph names JSON"; + return false; + } + + for (size_t i = 0; i < s_symIdCodes.size(); ++i) { + SymId sym = static_cast(i); + if (sym == SymId::noSym || sym == SymId::lastSym) { + continue; + } + + std::string name(SymNames::nameForSymId(sym).ascii()); + JsonObject symObj = glyphNamesJson.value(name).toObject(); + if (!symObj.isValid()) { + continue; + } + + bool ok; + uint code = symObj.value("codepoint").toString().mid(2).toUInt(&ok, 16); + if (ok) { + s_symIdCodes[i].smuflCode = code; + } else if (MScore::debugMode) { + LOGD() << "could not read codepoint for glyph " << name; + } + + uint alernativeCode = symObj.value("alternateCodepoint").toString().mid(2).toUInt(&ok, 16); + if (ok) { + s_symIdCodes[i].musicSymBlockCode = alernativeCode; + } else if (MScore::debugMode) { + LOGD() << "could not read alternate codepoint for glyph " << name; + } + } + return true; +} //--------------------------------------------------------- // smuflRanges // read smufl ranges.json file //--------------------------------------------------------- -const std::map& mu::smuflRanges() +const std::map& Smufl::smuflRanges() { static std::map ranges; StringList allSymbols; diff --git a/src/framework/global/smuflranges.h b/src/engraving/infrastructure/smufl.h similarity index 52% rename from src/framework/global/smuflranges.h rename to src/engraving/infrastructure/smufl.h index 4c04c33d8879c..48f580a8d5c75 100644 --- a/src/framework/global/smuflranges.h +++ b/src/engraving/infrastructure/smufl.h @@ -19,16 +19,41 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef SMUFLRANGES_H -#define SMUFLRANGES_H +#ifndef MU_ENGRAVING_SMUFL_H +#define MU_ENGRAVING_SMUFL_H +#include #include + #include "types/string.h" +#include "types/symid.h" + +namespace mu::engraving { +class Smufl +{ +public: + + static bool init(); + + struct Code { + char32_t smuflCode = 0; + char32_t musicSymBlockCode = 0; + + bool isValid() const { return smuflCode != 0 || musicSymBlockCode != 0; } + }; + + static const Code code(SymId id); + static char32_t smuflCode(SymId id); + + static const std::map& smuflRanges(); + static constexpr const char* SMUFL_ALL_SYMBOLS = "All symbols"; + +private: + + static bool initGlyphNamesJson(); -//! NOTE temporary place for this method -namespace mu { -const std::map& smuflRanges(); -constexpr const char* SMUFL_ALL_SYMBOLS = "All symbols"; + static std::array s_symIdCodes; +}; } -#endif // SMUFLRANGES_H +#endif // MU_ENGRAVING_SMUFL_H diff --git a/src/engraving/libmscore/scorefont.cpp b/src/engraving/infrastructure/symbolfont.cpp similarity index 71% rename from src/engraving/libmscore/scorefont.cpp rename to src/engraving/infrastructure/symbolfont.cpp index ac415735c4f5a..d6b09edf7e8aa 100644 --- a/src/engraving/libmscore/scorefont.cpp +++ b/src/engraving/infrastructure/symbolfont.cpp @@ -19,14 +19,18 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#include "scorefont.h" +#include "symbolfont.h" #include "serialization/json.h" #include "io/file.h" +#include "io/fileinfo.h" #include "draw/painter.h" #include "types/symnames.h" -#include "mscore.h" +#include "libmscore/mscore.h" + +#include "symbolfonts.h" +#include "smufl.h" #include "log.h" @@ -35,211 +39,64 @@ using namespace mu::io; using namespace mu::draw; using namespace mu::engraving; -static constexpr int FALLBACK_FONT_INDEX = 1; // Bravura - -std::vector ScoreFont::s_scoreFonts { - ScoreFont("Leland", "Leland", ":/fonts/leland/", "Leland.otf"), - ScoreFont("Bravura", "Bravura", ":/fonts/bravura/", "Bravura.otf"), - ScoreFont("Emmentaler", "MScore", ":/fonts/mscore/", "mscore.ttf"), - ScoreFont("Gonville", "Gootville", ":/fonts/gootville/", "Gootville.otf"), - ScoreFont("MuseJazz", "MuseJazz", ":/fonts/musejazz/", "MuseJazz.otf"), - ScoreFont("Petaluma", "Petaluma", ":/fonts/petaluma/", "Petaluma.otf"), - ScoreFont("Finale Maestro", "Finale Maestro", ":/fonts/finalemaestro/", "FinaleMaestro.otf"), - ScoreFont("Finale Broadway", "Finale Broadway", ":/fonts/finalebroadway/", "FinaleBroadway.otf"), -}; - -std::array ScoreFont::s_symIdCodes { { } }; - // ============================================= // ScoreFont // ============================================= -ScoreFont::ScoreFont(const char* name, const char* family, const char* path, const char* filename) +SymbolFont::SymbolFont(const String& name, const String& family, const path_t& filePath) : m_symbols(static_cast(SymId::lastSym) + 1), - m_name(String::fromUtf8(name)), - m_family(String::fromUtf8(family)), - m_fontPath(String::fromUtf8(path)), - m_filename(String::fromUtf8(filename)) + m_name(name), + m_family(family), + m_fontPath(filePath) { } -ScoreFont::ScoreFont(const ScoreFont& other) +SymbolFont::SymbolFont(const SymbolFont& other) { m_loaded = false; m_symbols = other.m_symbols; m_name = other.m_name; m_family = other.m_family; m_fontPath = other.m_fontPath; - m_filename = other.m_filename; } // ============================================= // Properties // ============================================= -const String& ScoreFont::name() const +const String& SymbolFont::name() const { return m_name; } -const String& ScoreFont::family() const +const String& SymbolFont::family() const { return m_family; } -const String& ScoreFont::fontPath() const +const path_t& SymbolFont::fontPath() const { return m_fontPath; } -std::unordered_map ScoreFont::engravingDefaults() +std::unordered_map SymbolFont::engravingDefaults() { return m_engravingDefaults; } -double ScoreFont::textEnclosureThickness() +double SymbolFont::textEnclosureThickness() { return m_textEnclosureThickness; } -// ============================================= -// Init ScoreFonts -// ============================================= - -void ScoreFont::initScoreFonts() -{ - initGlyphNamesJson(); - - fontProvider()->insertSubstitution(u"Leland Text", u"Bravura Text"); - fontProvider()->insertSubstitution(u"Bravura Text", u"Leland Text"); - fontProvider()->insertSubstitution(u"MScore Text", u"Leland Text"); - fontProvider()->insertSubstitution(u"Gootville Text", u"Leland Text"); - fontProvider()->insertSubstitution(u"MuseJazz Text", u"Leland Text"); - fontProvider()->insertSubstitution(u"Petaluma Text", u"MuseJazz Text"); - fontProvider()->insertSubstitution(u"Finale Maestro Text", u"Leland Text"); - fontProvider()->insertSubstitution(u"Finale Broadway Text", u"MuseJazz Text"); - fontProvider()->insertSubstitution(u"ScoreFont", u"Leland Text"); // alias for current Musical Text Font - - fallbackFont(); // load fallback font -} - -bool ScoreFont::initGlyphNamesJson() -{ - File file(":fonts/smufl/glyphnames.json"); - if (!file.open(IODevice::ReadOnly)) { - LOGE() << "could not open glyph names JSON file."; - return false; - } - - std::string error; - JsonObject glyphNamesJson = JsonDocument::fromJson(file.readAll(), &error).rootObject(); - file.close(); - - if (!error.empty()) { - LOGE() << "JSON parse error in glyph names file: " << error; - return false; - } - - IF_ASSERT_FAILED(!glyphNamesJson.empty()) { - LOGE() << "Could not read glyph names JSON"; - return false; - } - - for (size_t i = 0; i < s_symIdCodes.size(); ++i) { - SymId sym = static_cast(i); - if (sym == SymId::noSym || sym == SymId::lastSym) { - continue; - } - - std::string name(SymNames::nameForSymId(sym).ascii()); - JsonObject symObj = glyphNamesJson.value(name).toObject(); - if (!symObj.isValid()) { - continue; - } - - bool ok; - uint code = symObj.value("codepoint").toString().mid(2).toUInt(&ok, 16); - if (ok) { - s_symIdCodes[i].smuflCode = code; - } else if (MScore::debugMode) { - LOGD() << "could not read codepoint for glyph " << name; - } - - uint alernativeCode = symObj.value("alternateCodepoint").toString().mid(2).toUInt(&ok, 16); - if (ok) { - s_symIdCodes[i].musicSymBlockCode = alernativeCode; - } else if (MScore::debugMode) { - LOGD() << "could not read alternate codepoint for glyph " << name; - } - } - return true; -} - -// ============================================= -// Available ScoreFonts -// ============================================= - -const std::vector& ScoreFont::scoreFonts() -{ - return s_scoreFonts; -} - -ScoreFont* ScoreFont::fontByName(const String& name) -{ - ScoreFont* font = nullptr; - for (ScoreFont& f : s_scoreFonts) { - if (f.name().toLower() == name.toLower()) { // case insensitive - font = &f; - break; - } - } - - if (!font) { - LOGE() << "ScoreFont not found in list: " << name; - LOGE() << "ScoreFonts in list:"; - - for (const ScoreFont& f : s_scoreFonts) { - LOGE() << " " << f.name(); - } - - font = fallbackFont(); - - LOGE() << "Using fallback font " << font->name() << " instead."; - return font; - } - - if (!font->m_loaded) { - font->load(); - } - - return font; -} - -ScoreFont* ScoreFont::fallbackFont() -{ - ScoreFont* font = &s_scoreFonts[FALLBACK_FONT_INDEX]; - - if (!font->m_loaded) { - font->load(); - } - - return font; -} - -const char* ScoreFont::fallbackTextFont() -{ - return "Bravura Text"; -} - // ============================================= // Load // ============================================= -void ScoreFont::load() +void SymbolFont::load() { - String facePath = m_fontPath + m_filename; - if (-1 == fontProvider()->addApplicationFont(m_family, facePath)) { - LOGE() << "fatal error: cannot load internal font: " << facePath; + if (-1 == fontProvider()->addSymbolFont(m_family, m_fontPath)) { + LOGE() << "fatal error: cannot load internal font: " << m_fontPath; return; } @@ -249,16 +106,16 @@ void ScoreFont::load() m_font.setNoFontMerging(true); m_font.setHinting(mu::draw::Font::Hinting::PreferVerticalHinting); - for (size_t id = 0; id < s_symIdCodes.size(); ++id) { - Code code = s_symIdCodes[id]; - if (code.smuflCode == 0 && code.musicSymBlockCode == 0) { + for (size_t id = 0; id < m_symbols.size(); ++id) { + Smufl::Code code = Smufl::code(static_cast(id)); + if (!code.isValid()) { continue; } Sym& sym = m_symbols[id]; computeMetrics(sym, code); } - File metadataFile(m_fontPath + u"metadata.json"); + File metadataFile(io::FileInfo(m_fontPath).path() + u"/metadata.json"); if (!metadataFile.open(IODevice::ReadOnly)) { LOGE() << "Failed to open glyph metadata file: " << metadataFile.filePath(); return; @@ -279,7 +136,7 @@ void ScoreFont::load() m_loaded = true; } -void ScoreFont::loadGlyphsWithAnchors(const JsonObject& glyphsWithAnchors) +void SymbolFont::loadGlyphsWithAnchors(const JsonObject& glyphsWithAnchors) { for (const std::string& symName : glyphsWithAnchors.keys()) { SymId symId = SymNames::symIdByName(symName); @@ -320,7 +177,7 @@ void ScoreFont::loadGlyphsWithAnchors(const JsonObject& glyphsWithAnchors) } } -void ScoreFont::loadComposedGlyphs() +void SymbolFont::loadComposedGlyphs() { static const struct ComposedGlyph { const SymId id; @@ -381,7 +238,7 @@ void ScoreFont::loadComposedGlyphs() } } -void ScoreFont::loadStylisticAlternates(const JsonObject& glyphsWithAlternatesObject) +void SymbolFont::loadStylisticAlternates(const JsonObject& glyphsWithAlternatesObject) { if (!glyphsWithAlternatesObject.isValid()) { return; @@ -536,13 +393,13 @@ void ScoreFont::loadStylisticAlternates(const JsonObject& glyphsWithAlternatesOb JsonObject symObj = val.toObject(); Sym& sym = this->sym(glyph.alternateSymId); - Code code; - uint smuflCode = symObj.value("codepoint").toString().mid(2).toUInt(&ok, 16); + Smufl::Code code; + char32_t smuflCode = symObj.value("codepoint").toString().mid(2).toUInt(&ok, 16); if (ok) { code.smuflCode = smuflCode; } - uint musicSymBlockCode = symObj.value("alternateCodepoint").toString().mid(2).toUInt(&ok, 16); + char32_t musicSymBlockCode = symObj.value("alternateCodepoint").toString().mid(2).toUInt(&ok, 16); if (ok) { code.musicSymBlockCode = musicSymBlockCode; } @@ -555,7 +412,7 @@ void ScoreFont::loadStylisticAlternates(const JsonObject& glyphsWithAlternatesOb } } -void ScoreFont::loadEngravingDefaults(const JsonObject& engravingDefaultsObject) +void SymbolFont::loadEngravingDefaults(const JsonObject& engravingDefaultsObject) { struct EngravingDefault { std::vector sids; @@ -641,7 +498,7 @@ void ScoreFont::loadEngravingDefaults(const JsonObject& engravingDefaultsObject) m_engravingDefaults.insert({ Sid::MusicalTextFont, String(u"%1 Text").arg(m_family) }); } -void ScoreFont::computeMetrics(ScoreFont::Sym& sym, const Code& code) +void SymbolFont::computeMetrics(SymbolFont::Sym& sym, const Smufl::Code& code) { if (fontProvider()->inFontUcs4(m_font, code.smuflCode)) { sym.code = code.smuflCode; @@ -659,17 +516,17 @@ void ScoreFont::computeMetrics(ScoreFont::Sym& sym, const Code& code) // Symbol properties // ============================================= -ScoreFont::Sym& ScoreFont::sym(SymId id) +SymbolFont::Sym& SymbolFont::sym(SymId id) { return m_symbols[static_cast(id)]; } -const ScoreFont::Sym& ScoreFont::sym(SymId id) const +const SymbolFont::Sym& SymbolFont::sym(SymId id) const { return m_symbols.at(static_cast(id)); } -uint ScoreFont::symCode(SymId id) const +uint SymbolFont::symCode(SymId id) const { const Sym& s = sym(id); if (s.isValid()) { @@ -677,10 +534,10 @@ uint ScoreFont::symCode(SymId id) const } // fallback: search in the common SMuFL table - return s_symIdCodes.at(static_cast(id)).smuflCode; + return Smufl::smuflCode(id); } -SymId ScoreFont::fromCode(uint code) const +SymId SymbolFont::fromCode(uint code) const { auto it = std::find_if(m_symbols.begin(), m_symbols.end(), [code](const Sym& s) { return s.code == code; }); return static_cast(it == m_symbols.end() ? 0 : it - m_symbols.begin()); @@ -691,34 +548,34 @@ static String codeToString(char32_t code) return String::fromUcs4(&code, 1); } -String ScoreFont::toString(SymId id) const +String SymbolFont::toString(SymId id) const { return codeToString(symCode(id)); } -bool ScoreFont::isValid(SymId id) const +bool SymbolFont::isValid(SymId id) const { return sym(id).isValid(); } -bool ScoreFont::useFallbackFont(SymId id) const +bool SymbolFont::useFallbackFont(SymId id) const { - return MScore::useFallbackFont && !sym(id).isValid() && this != ScoreFont::fallbackFont(); + return MScore::useFallbackFont && !sym(id).isValid() && this != SymbolFonts::fallbackFont(); } // ============================================= // Symbol bounding box // ============================================= -const RectF ScoreFont::bbox(SymId id, double mag) const +const RectF SymbolFont::bbox(SymId id, double mag) const { return bbox(id, SizeF(mag, mag)); } -const RectF ScoreFont::bbox(SymId id, const SizeF& mag) const +const RectF SymbolFont::bbox(SymId id, const SizeF& mag) const { if (useFallbackFont(id)) { - return fallbackFont()->bbox(id, mag); + return SymbolFonts::fallbackFont()->bbox(id, mag); } RectF r = sym(id).bbox; @@ -726,12 +583,12 @@ const RectF ScoreFont::bbox(SymId id, const SizeF& mag) const r.width() * mag.width(), r.height() * mag.height()); } -const RectF ScoreFont::bbox(const SymIdList& s, double mag) const +const RectF SymbolFont::bbox(const SymIdList& s, double mag) const { return bbox(s, SizeF(mag, mag)); } -const RectF ScoreFont::bbox(const SymIdList& s, const SizeF& mag) const +const RectF SymbolFont::bbox(const SymIdList& s, const SizeF& mag) const { RectF r; PointF pos; @@ -746,34 +603,34 @@ const RectF ScoreFont::bbox(const SymIdList& s, const SizeF& mag) const // Symbol metrics // ============================================= -double ScoreFont::width(SymId id, double mag) const +double SymbolFont::width(SymId id, double mag) const { return bbox(id, mag).width(); } -double ScoreFont::height(SymId id, double mag) const +double SymbolFont::height(SymId id, double mag) const { return bbox(id, mag).height(); } -double ScoreFont::advance(SymId id, double mag) const +double SymbolFont::advance(SymId id, double mag) const { if (useFallbackFont(id)) { - return fallbackFont()->advance(id, mag); + return SymbolFonts::fallbackFont()->advance(id, mag); } return sym(id).advance * mag; } -double ScoreFont::width(const SymIdList& s, double mag) const +double SymbolFont::width(const SymIdList& s, double mag) const { return bbox(s, mag).width(); } -PointF ScoreFont::smuflAnchor(SymId symId, SmuflAnchorId anchorId, double mag) const +PointF SymbolFont::smuflAnchor(SymId symId, SmuflAnchorId anchorId, double mag) const { if (useFallbackFont(symId)) { - return fallbackFont()->smuflAnchor(symId, anchorId, mag); + return SymbolFonts::fallbackFont()->smuflAnchor(symId, anchorId, mag); } return const_cast(sym(symId)).smuflAnchors[anchorId] * mag; @@ -783,7 +640,7 @@ PointF ScoreFont::smuflAnchor(SymId symId, SmuflAnchorId anchorId, double mag) c // Draw // ============================================= -void ScoreFont::draw(SymId id, Painter* painter, const SizeF& mag, const PointF& pos) const +void SymbolFont::draw(SymId id, Painter* painter, const SizeF& mag, const PointF& pos) const { const Sym& sym = this->sym(id); if (sym.isCompound()) { // is this a compound symbol? @@ -792,8 +649,8 @@ void ScoreFont::draw(SymId id, Painter* painter, const SizeF& mag, const PointF& } if (!sym.isValid()) { - if (MScore::useFallbackFont && this != ScoreFont::fallbackFont()) { - fallbackFont()->draw(id, painter, mag, pos); + if (MScore::useFallbackFont && this != SymbolFonts::fallbackFont()) { + SymbolFonts::fallbackFont()->draw(id, painter, mag, pos); } else { LOGE() << "invalid sym: " << static_cast(id); } @@ -810,18 +667,18 @@ void ScoreFont::draw(SymId id, Painter* painter, const SizeF& mag, const PointF& painter->restore(); } -void ScoreFont::draw(SymId id, Painter* painter, double mag, const PointF& pos) const +void SymbolFont::draw(SymId id, Painter* painter, double mag, const PointF& pos) const { draw(id, painter, SizeF(mag, mag), pos); } -void ScoreFont::draw(SymId id, mu::draw::Painter* painter, double mag, const PointF& pos, int n) const +void SymbolFont::draw(SymId id, mu::draw::Painter* painter, double mag, const PointF& pos, int n) const { SymIdList list(n, id); draw(list, painter, mag, pos); } -void ScoreFont::draw(const SymIdList& ids, Painter* painter, double mag, const PointF& startPos) const +void SymbolFont::draw(const SymIdList& ids, Painter* painter, double mag, const PointF& startPos) const { PointF pos(startPos); for (SymId id : ids) { @@ -830,7 +687,7 @@ void ScoreFont::draw(const SymIdList& ids, Painter* painter, double mag, const P } } -void ScoreFont::draw(const SymIdList& ids, Painter* painter, const SizeF& mag, const PointF& startPos) const +void SymbolFont::draw(const SymIdList& ids, Painter* painter, const SizeF& mag, const PointF& startPos) const { PointF pos(startPos); for (SymId id : ids) { diff --git a/src/engraving/libmscore/scorefont.h b/src/engraving/infrastructure/symbolfont.h similarity index 79% rename from src/engraving/libmscore/scorefont.h rename to src/engraving/infrastructure/symbolfont.h index e08d72b95c03a..7ac263b7c6749 100644 --- a/src/engraving/libmscore/scorefont.h +++ b/src/engraving/infrastructure/symbolfont.h @@ -19,8 +19,8 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef MS_SCOREFONT_H -#define MS_SCOREFONT_H +#ifndef MU_ENGRAVING_SYMBOLFONT_H +#define MU_ENGRAVING_SYMBOLFONT_H #include @@ -30,6 +30,9 @@ #include "modularity/ioc.h" #include "draw/ifontprovider.h" +#include "io/path.h" + +#include "smufl.h" namespace mu { class JsonObject; @@ -40,27 +43,21 @@ class Painter; } namespace mu::engraving { -class ScoreFont +class SymbolFont { INJECT_STATIC(score, mu::draw::IFontProvider, fontProvider) public: - ScoreFont(const char* name, const char* family, const char* path, const char* filename); - ScoreFont(const ScoreFont& other); + SymbolFont(const String& name, const String& family, const io::path_t& filePath); + SymbolFont(const SymbolFont& other); const String& name() const; const String& family() const; - const String& fontPath() const; + const io::path_t& fontPath() const; std::unordered_map engravingDefaults(); double textEnclosureThickness(); - static void initScoreFonts(); - static const std::vector& scoreFonts(); - static ScoreFont* fontByName(const String& name); - static ScoreFont* fallbackFont(); - static const char* fallbackTextFont(); - uint symCode(SymId id) const; SymId fromCode(uint code) const; String toString(SymId id) const; @@ -88,13 +85,10 @@ class ScoreFont private: - struct Code { - uint smuflCode = 0; - uint musicSymBlockCode = 0; - }; + friend class SymbolFonts; struct Sym { - uint code; + char32_t code; mu::RectF bbox; double advance = 0.0; @@ -112,33 +106,27 @@ class ScoreFont } }; - static bool initGlyphNamesJson(); - void load(); void loadGlyphsWithAnchors(const JsonObject& glyphsWithAnchors); void loadComposedGlyphs(); void loadStylisticAlternates(const JsonObject& glyphsWithAlternatesObject); void loadEngravingDefaults(const JsonObject& engravingDefaultsObject); - void computeMetrics(Sym& sym, const Code& code); + void computeMetrics(Sym& sym, const Smufl::Code& code); Sym& sym(SymId id); const Sym& sym(SymId id) const; bool m_loaded = false; std::vector m_symbols; - mutable mu::draw::Font m_font; + mutable draw::Font m_font; String m_name; String m_family; - String m_fontPath; - String m_filename; + io::path_t m_fontPath; std::unordered_map m_engravingDefaults; double m_textEnclosureThickness = 0; - - static std::vector s_scoreFonts; - static std::array s_symIdCodes; }; } -#endif // MS_SCOREFONT_H +#endif // MU_ENGRAVING_SYMBOLFONT_H diff --git a/src/engraving/infrastructure/symbolfonts.cpp b/src/engraving/infrastructure/symbolfonts.cpp new file mode 100644 index 0000000000000..1d5d94525033f --- /dev/null +++ b/src/engraving/infrastructure/symbolfonts.cpp @@ -0,0 +1,109 @@ +/* + * SPDX-License-Identifier: GPL-3.0-only + * MuseScore-CLA-applies + * + * MuseScore + * Music Composition & Notation + * + * Copyright (C) 2021 MuseScore BVBA and others + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License version 3 as + * published by the Free Software Foundation. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include "symbolfonts.h" + +#include "containers.h" + +#include "log.h" + +using namespace mu::engraving; + +std::vector SymbolFonts::s_symbolFonts {}; +SymbolFonts::Fallback SymbolFonts::s_fallback = {}; + +void SymbolFonts::addFont(const String& name, const String& family, const io::path_t& filePath) +{ + s_symbolFonts.push_back(SymbolFont(name, family, filePath)); +} + +const std::vector& SymbolFonts::scoreFonts() +{ + return s_symbolFonts; +} + +SymbolFont* SymbolFonts::fontByName(const String& name) +{ + SymbolFont* font = nullptr; + for (SymbolFont& f : s_symbolFonts) { + if (f.name().toLower() == name.toLower()) { // case insensitive + font = &f; + break; + } + } + + if (!font) { + LOGE() << "ScoreFont not found in list: " << name; + LOGE() << "ScoreFonts in list:"; + + for (const SymbolFont& f : s_symbolFonts) { + LOGE() << " " << f.name(); + } + + font = fallbackFont(); + + LOGE() << "Using fallback font " << font->name() << " instead."; + return font; + } + + if (!font->m_loaded) { + font->load(); + } + + return font; +} + +void SymbolFonts::setFallbackFont(const String& name) +{ + s_fallback.name = name; + + size_t idx = mu::nidx; + for (size_t i = 0; i < s_symbolFonts.size(); ++i) { + if (s_symbolFonts.at(i).name() == name) { + idx = i; + break; + } + } + + if (idx != mu::nidx) { + s_fallback.index = idx; + } else { + s_fallback.index = 0; + LOGE() << "not found font with name: " << name; + } +} + +SymbolFont* SymbolFonts::fallbackFont() +{ + SymbolFont* font = &s_symbolFonts[s_fallback.index]; + + if (!font->m_loaded) { + font->load(); + } + + return font; +} + +const char* SymbolFonts::fallbackTextFont() +{ + return "Bravura Text"; +} diff --git a/src/framework/fonts/internal/fontssetup.h b/src/engraving/infrastructure/symbolfonts.h similarity index 51% rename from src/framework/fonts/internal/fontssetup.h rename to src/engraving/infrastructure/symbolfonts.h index f9b294fa25ad3..5e75b1b6babb6 100644 --- a/src/framework/fonts/internal/fontssetup.h +++ b/src/engraving/infrastructure/symbolfonts.h @@ -19,15 +19,39 @@ * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ -#ifndef MU_FONTS_FONTSSETUP_H -#define MU_FONTS_FONTSSETUP_H -namespace mu::fonts { -class FontsSetup +#ifndef MU_ENGRAVING_SYMBOLFONTS_H +#define MU_ENGRAVING_SYMBOLFONTS_H + +#include + +#include "types/string.h" + +#include "symbolfont.h" + +namespace mu::engraving { +class SymbolFonts { public: - void setup(); + + static void addFont(const String& name, const String& family, const io::path_t& filePath); + static const std::vector& scoreFonts(); + static SymbolFont* fontByName(const String& name); + + static void setFallbackFont(const String& name); + static SymbolFont* fallbackFont(); + static const char* fallbackTextFont(); + +private: + + struct Fallback { + String name; + size_t index = 0; + }; + + static Fallback s_fallback; + static std::vector s_symbolFonts; }; } -#endif // MU_FONTS_FONTSSETUP_H +#endif // MU_ENGRAVING_SYMBOLFONTS_H diff --git a/src/engraving/layout/layout.cpp b/src/engraving/layout/layout.cpp index 6a37c31806fc1..bc40c87eb3615 100644 --- a/src/engraving/layout/layout.cpp +++ b/src/engraving/layout/layout.cpp @@ -27,7 +27,6 @@ #include "libmscore/score.h" #include "libmscore/masterscore.h" #include "libmscore/measure.h" -#include "libmscore/scorefont.h" #include "libmscore/bracket.h" #include "libmscore/chordrest.h" #include "libmscore/box.h" diff --git a/src/engraving/libmscore/accidental.cpp b/src/engraving/libmscore/accidental.cpp index 4e22dc925bd57..e4f0183d9dc30 100644 --- a/src/engraving/libmscore/accidental.cpp +++ b/src/engraving/libmscore/accidental.cpp @@ -25,11 +25,11 @@ #include "rw/xml.h" #include "types/symnames.h" #include "types/typesconv.h" +#include "infrastructure/symbolfont.h" #include "note.h" #include "symbol.h" #include "score.h" -#include "scorefont.h" #include "actionicon.h" #include "staff.h" #include "undo.h" @@ -429,7 +429,7 @@ void Accidental::layoutSingleGlyphAccidental() default: break; } - if (!score()->scoreFont()->isValid(s)) { + if (!score()->symbolFont()->isValid(s)) { layoutMultiGlyphAccidental(); return; } @@ -532,7 +532,7 @@ void Accidental::draw(mu::draw::Painter* painter) const painter->setPen(curColor()); for (const SymElement& e : el) { - score()->scoreFont()->draw(e.sym, painter, magS(), PointF(e.x, e.y)); + score()->symbolFont()->draw(e.sym, painter, magS(), PointF(e.x, e.y)); } } diff --git a/src/engraving/libmscore/arpeggio.cpp b/src/engraving/libmscore/arpeggio.cpp index 39b0fa6067e7a..0e3f9ff37e199 100644 --- a/src/engraving/libmscore/arpeggio.cpp +++ b/src/engraving/libmscore/arpeggio.cpp @@ -28,7 +28,7 @@ #include "rw/xml.h" #include "types/typesconv.h" -#include "scorefont.h" +#include "symbolfont.h" #include "accidental.h" #include "chord.h" #include "note.h" @@ -136,7 +136,7 @@ void Arpeggio::symbolLine(SymId end, SymId fill) double bottom = calcBottom(); double w = bottom - top; double mag = magS(); - ScoreFont* f = score()->scoreFont(); + SymbolFont* f = score()->symbolFont(); symbols.clear(); double w1 = f->advance(end, mag); @@ -310,7 +310,7 @@ void Arpeggio::draw(mu::draw::Painter* painter) const { RectF r(symBbox(symbols)); painter->rotate(-90.0); - score()->scoreFont()->draw(symbols, painter, magS(), PointF(-r.right() - y1, -r.bottom() + r.height())); + score()->symbolFont()->draw(symbols, painter, magS(), PointF(-r.right() - y1, -r.bottom() + r.height())); } break; @@ -318,7 +318,7 @@ void Arpeggio::draw(mu::draw::Painter* painter) const { RectF r(symBbox(symbols)); painter->rotate(90.0); - score()->scoreFont()->draw(symbols, painter, magS(), PointF(-r.left() + y1, -r.top() - r.height())); + score()->symbolFont()->draw(symbols, painter, magS(), PointF(-r.left() + y1, -r.top() - r.height())); } break; diff --git a/src/engraving/libmscore/bagpembell.cpp b/src/engraving/libmscore/bagpembell.cpp index 3c723d95979a0..b065929d67ebc 100644 --- a/src/engraving/libmscore/bagpembell.cpp +++ b/src/engraving/libmscore/bagpembell.cpp @@ -27,7 +27,7 @@ #include "types/typesconv.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" using namespace mu; @@ -122,7 +122,7 @@ struct BEDrawingDataX { lw(0.1 * s), xcorr(0.1 * s) { - double w = Score::paletteScore()->scoreFont()->width(hs, mags); + double w = Score::paletteScore()->symbolFont()->width(hs, mags); headw = 1.2 * w; // using 1.0 the stem xpos is off headp = 1.6 * w; xl = (1 - 1.6 * (nn - 1)) * w / 2; @@ -226,7 +226,7 @@ void BagpipeEmbellishment::layout() BEDrawingDataY dy(line, score()->spatium()); // head - addbbox(score()->scoreFont()->bbox(headsym, dx.mags).translated(PointF(x - dx.lw * .5 - dx.headw, dy.y2))); + addbbox(score()->symbolFont()->bbox(headsym, dx.mags).translated(PointF(x - dx.lw * .5 - dx.headw, dy.y2))); /* if (_embelType == 0 || _embelType == 8 || _embelType == 9) { printBBox(" notehead", bbox()); @@ -244,7 +244,7 @@ void BagpipeEmbellishment::layout() // flag if (drawFlag) { - addbbox(score()->scoreFont()->bbox(flagsym, dx.mags).translated(PointF(x - dx.lw * .5 + dx.xcorr, dy.y1f + dy.ycorr))); + addbbox(score()->symbolFont()->bbox(flagsym, dx.mags).translated(PointF(x - dx.lw * .5 + dx.xcorr, dy.y1f + dy.ycorr))); // printBBox(" notehead + stem + flag", bbox()); } diff --git a/src/engraving/libmscore/barline.cpp b/src/engraving/libmscore/barline.cpp index f57f87cc0660c..f84f81b7b700c 100644 --- a/src/engraving/libmscore/barline.cpp +++ b/src/engraving/libmscore/barline.cpp @@ -31,7 +31,7 @@ #include "factory.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "staff.h" #include "part.h" #include "system.h" @@ -504,9 +504,9 @@ void BarLine::drawDots(Painter* painter, double x) const y2l = st->doty2() * _spatium; //workaround to make Bravura, Petaluma and Leland font work correctly with repeatDots - if (!(score()->scoreFont()->name() == "Leland" - || score()->scoreFont()->name() == "Bravura" - || score()->scoreFont()->name() == "Petaluma")) { + if (!(score()->symbolFont()->name() == "Leland" + || score()->symbolFont()->name() == "Bravura" + || score()->symbolFont()->name() == "Petaluma")) { double offset = 0.5 * score()->spatium() * mag(); y1l += offset; y2l += offset; @@ -1163,7 +1163,7 @@ void BarLine::endEditDrag(EditData& ed) double BarLine::layoutWidth(Score* score, BarLineType type) { - double dotwidth = score->scoreFont()->width(SymId::repeatDot, 1.0); + double dotwidth = score->symbolFont()->width(SymId::repeatDot, 1.0); double w { 0.0 }; switch (type) { diff --git a/src/engraving/libmscore/engravingitem.cpp b/src/engraving/libmscore/engravingitem.cpp index fb00ffc89f78b..44b8d338568aa 100644 --- a/src/engraving/libmscore/engravingitem.cpp +++ b/src/engraving/libmscore/engravingitem.cpp @@ -87,7 +87,7 @@ #include "measurerepeat.h" #include "rest.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "segment.h" #include "slur.h" #include "spacer.h" @@ -1737,22 +1737,22 @@ void EngravingItem::undoAddElement(EngravingItem* element) void EngravingItem::drawSymbol(SymId id, mu::draw::Painter* p, const mu::PointF& o, double scale) const { - score()->scoreFont()->draw(id, p, magS() * scale, o); + score()->symbolFont()->draw(id, p, magS() * scale, o); } void EngravingItem::drawSymbol(SymId id, mu::draw::Painter* p, const mu::PointF& o, int n) const { - score()->scoreFont()->draw(id, p, magS(), o, n); + score()->symbolFont()->draw(id, p, magS(), o, n); } void EngravingItem::drawSymbols(const SymIdList& symbols, mu::draw::Painter* p, const PointF& o, double scale) const { - score()->scoreFont()->draw(symbols, p, magS() * scale, o); + score()->symbolFont()->draw(symbols, p, magS() * scale, o); } void EngravingItem::drawSymbols(const SymIdList& symbols, mu::draw::Painter* p, const PointF& o, const SizeF& scale) const { - score()->scoreFont()->draw(symbols, p, SizeF(magS() * scale), PointF(o)); + score()->symbolFont()->draw(symbols, p, SizeF(magS() * scale), PointF(o)); } //--------------------------------------------------------- @@ -1761,7 +1761,7 @@ void EngravingItem::drawSymbols(const SymIdList& symbols, mu::draw::Painter* p, double EngravingItem::symHeight(SymId id) const { - return score()->scoreFont()->height(id, magS()); + return score()->symbolFont()->height(id, magS()); } //--------------------------------------------------------- @@ -1770,12 +1770,12 @@ double EngravingItem::symHeight(SymId id) const double EngravingItem::symWidth(SymId id) const { - return score()->scoreFont()->width(id, magS()); + return score()->symbolFont()->width(id, magS()); } double EngravingItem::symWidth(const SymIdList& symbols) const { - return score()->scoreFont()->width(symbols, magS()); + return score()->symbolFont()->width(symbols, magS()); } //--------------------------------------------------------- @@ -1784,7 +1784,7 @@ double EngravingItem::symWidth(const SymIdList& symbols) const double EngravingItem::symAdvance(SymId id) const { - return score()->scoreFont()->advance(id, magS()); + return score()->symbolFont()->advance(id, magS()); } //--------------------------------------------------------- @@ -1793,12 +1793,12 @@ double EngravingItem::symAdvance(SymId id) const RectF EngravingItem::symBbox(SymId id) const { - return score()->scoreFont()->bbox(id, magS()); + return score()->symbolFont()->bbox(id, magS()); } RectF EngravingItem::symBbox(const SymIdList& symbols) const { - return score()->scoreFont()->bbox(symbols, magS()); + return score()->symbolFont()->bbox(symbols, magS()); } //--------------------------------------------------------- @@ -1807,7 +1807,7 @@ RectF EngravingItem::symBbox(const SymIdList& symbols) const PointF EngravingItem::symSmuflAnchor(SymId symId, SmuflAnchorId anchorId) const { - return score()->scoreFont()->smuflAnchor(symId, anchorId, magS()); + return score()->symbolFont()->smuflAnchor(symId, anchorId, magS()); } //--------------------------------------------------------- @@ -1816,7 +1816,7 @@ PointF EngravingItem::symSmuflAnchor(SymId symId, SmuflAnchorId anchorId) const bool EngravingItem::symIsValid(SymId id) const { - return score()->scoreFont()->isValid(id); + return score()->symbolFont()->isValid(id); } //--------------------------------------------------------- diff --git a/src/engraving/libmscore/glissando.cpp b/src/engraving/libmscore/glissando.cpp index e07cf81ea2e0e..58aa8f9c33ab9 100644 --- a/src/engraving/libmscore/glissando.cpp +++ b/src/engraving/libmscore/glissando.cpp @@ -48,7 +48,7 @@ NICE-TO-HAVE TODO: #include "note.h" #include "notedot.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "segment.h" #include "staff.h" #include "system.h" @@ -128,7 +128,7 @@ void GlissandoSegment::draw(mu::draw::Painter* painter) const ids.push_back(SymId::wiggleTrill); } - score()->scoreFont()->draw(ids, painter, magS(), PointF(x, -(b.y() + b.height() * 0.5))); + score()->symbolFont()->draw(ids, painter, magS(), PointF(x, -(b.y() + b.height() * 0.5))); } if (glissando()->showText()) { diff --git a/src/engraving/libmscore/libmscore.cmake b/src/engraving/libmscore/libmscore.cmake index 44a4e8d3db06c..97d9d67aedd4c 100644 --- a/src/engraving/libmscore/libmscore.cmake +++ b/src/engraving/libmscore/libmscore.cmake @@ -237,8 +237,6 @@ set(LIBMSCORE_SRC ${CMAKE_CURRENT_LIST_DIR}/rootitem.h ${CMAKE_CURRENT_LIST_DIR}/score.cpp ${CMAKE_CURRENT_LIST_DIR}/scorefile.cpp - ${CMAKE_CURRENT_LIST_DIR}/scorefont.cpp - ${CMAKE_CURRENT_LIST_DIR}/scorefont.h ${CMAKE_CURRENT_LIST_DIR}/scoreorder.cpp ${CMAKE_CURRENT_LIST_DIR}/scoreorder.h ${CMAKE_CURRENT_LIST_DIR}/score.h diff --git a/src/engraving/libmscore/mscore.cpp b/src/engraving/libmscore/mscore.cpp index 2298640cca1b6..a46ae0f4d84c4 100644 --- a/src/engraving/libmscore/mscore.cpp +++ b/src/engraving/libmscore/mscore.cpp @@ -64,7 +64,7 @@ #include "excerpt.h" #include "barline.h" #include "skyline.h" -#include "scorefont.h" +#include "symbolfont.h" #include "config.h" @@ -137,8 +137,6 @@ void MScore::init() // // initialize styles // - - ScoreFont::initScoreFonts(); StaffType::initStaffTypes(); initDrumset(); FiguredBass::readConfigFile(String()); diff --git a/src/engraving/libmscore/note.cpp b/src/engraving/libmscore/note.cpp index 8bd2ebbe14f74..947a03707805b 100644 --- a/src/engraving/libmscore/note.cpp +++ b/src/engraving/libmscore/note.cpp @@ -59,7 +59,7 @@ #include "part.h" #include "pitchspelling.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "segment.h" #include "slur.h" #include "spanner.h" @@ -958,7 +958,7 @@ SymId Note::noteHead() const //--------------------------------------------------------- double Note::bboxRightPos() const { - const auto& bbox = score()->scoreFont()->bbox(noteHead(), magS()); + const auto& bbox = score()->symbolFont()->bbox(noteHead(), magS()); return bbox.right(); } @@ -1074,7 +1074,7 @@ double Note::headWidth() const //--------------------------------------------------------- double Note::bboxXShift() const { - const auto& bbox = score()->scoreFont()->bbox(noteHead(), magS()); + const auto& bbox = score()->symbolFont()->bbox(noteHead(), magS()); return bbox.bottomLeft().x(); } @@ -1085,7 +1085,7 @@ double Note::bboxXShift() const //--------------------------------------------------------- double Note::noteheadCenterX() const { - return score()->scoreFont()->width(noteHead(), magS()) / 2 + bboxXShift(); + return score()->symbolFont()->width(noteHead(), magS()) / 2 + bboxXShift(); } //--------------------------------------------------------- diff --git a/src/engraving/libmscore/score.cpp b/src/engraving/libmscore/score.cpp index 14b2c6ded978f..89bddfd9e6eac 100644 --- a/src/engraving/libmscore/score.cpp +++ b/src/engraving/libmscore/score.cpp @@ -38,6 +38,7 @@ #include "compat/dummyelement.h" #include "rw/xml.h" #include "types/typesconv.h" +#include "infrastructure/symbolfonts.h" #include "articulation.h" #include "audio.h" @@ -75,7 +76,6 @@ #include "rehearsalmark.h" #include "repeatlist.h" #include "rest.h" -#include "scorefont.h" #include "scoreorder.h" #include "segment.h" #include "select.h" @@ -325,7 +325,7 @@ Score::Score() _layer.push_back(l); _layerTags[0] = u"default"; - _scoreFont = ScoreFont::fontByName(u"Leland"); + m_symbolFont = SymbolFonts::fontByName(u"Leland"); _fileDivision = Constants::division; _style = DefaultStyle::defaultStyle(); @@ -1446,7 +1446,7 @@ void Score::spatiumChanged(double oldValue, double newValue) for (Staff* staff : _staves) { staff->spatiumChanged(oldValue, newValue); } - _noteHeadWidth = _scoreFont->width(SymId::noteheadBlack, newValue / SPATIUM20); + _noteHeadWidth = m_symbolFont->width(SymId::noteheadBlack, newValue / SPATIUM20); createPaddingTable(); } @@ -5481,8 +5481,8 @@ void Score::doLayoutRange(const Fraction& st, const Fraction& et) { TRACEFUNC; - _scoreFont = ScoreFont::fontByName(style().value(Sid::MusicalSymbolFont).value()); - _noteHeadWidth = _scoreFont->width(SymId::noteheadBlack, spatium() / SPATIUM20); + m_symbolFont = SymbolFonts::fontByName(style().value(Sid::MusicalSymbolFont).value()); + _noteHeadWidth = m_symbolFont->width(SymId::noteheadBlack, spatium() / SPATIUM20); m_layoutOptions.updateFromStyle(style()); m_layout.doLayoutRange(m_layoutOptions, st, et); diff --git a/src/engraving/libmscore/score.h b/src/engraving/libmscore/score.h index 76d357867c8a5..aa5c4bd7c6446 100644 --- a/src/engraving/libmscore/score.h +++ b/src/engraving/libmscore/score.h @@ -103,7 +103,7 @@ class RepeatList; class Rest; class Score; class ScoreElement; -class ScoreFont; +class SymbolFont; class Segment; class Slur; class Spanner; @@ -412,7 +412,7 @@ class Score : public EngravingObject std::vector _layer; int _currentLayer { 0 }; - ScoreFont* _scoreFont; + SymbolFont* m_symbolFont = nullptr; int _pageNumberOffset { 0 }; ///< Offset for page numbers. UpdateState _updateState; @@ -1178,8 +1178,8 @@ class Score : public EngravingObject ChordRest* findCRinStaff(const Fraction& tick, staff_idx_t staffIdx) const; void insertTime(const Fraction& tickPos, const Fraction& tickLen); - ScoreFont* scoreFont() const { return _scoreFont; } - void setScoreFont(ScoreFont* f) { _scoreFont = f; } + SymbolFont* symbolFont() const { return m_symbolFont; } + void setSymbolFont(SymbolFont* f) { m_symbolFont = f; } double noteHeadWidth() const { return _noteHeadWidth; } void setNoteHeadWidth(double n) { _noteHeadWidth = n; } diff --git a/src/engraving/libmscore/slur.cpp b/src/engraving/libmscore/slur.cpp index 53b0da4b502ae..f0da1caa31644 100644 --- a/src/engraving/libmscore/slur.cpp +++ b/src/engraving/libmscore/slur.cpp @@ -42,7 +42,7 @@ #include "hook.h" // included for gonville/musejazz hook hack in SlurPos -#include "scorefont.h" +#include "symbolfont.h" #include "log.h" @@ -784,7 +784,7 @@ void Slur::slurPos(SlurPos* sp) // Gonville and MuseJazz have really weirdly-shaped hooks compared to Leland and Bravura and Emmentaler, // so we need to adjust the slope of our hook-avoidance line. this will be unnecessary when hooks have // SMuFL anchors - bool bulkyHook = score()->scoreFont()->family() == "Gonville" || score()->scoreFont()->family() == "MuseJazz"; + bool bulkyHook = score()->symbolFont()->family() == "Gonville" || score()->symbolFont()->family() == "MuseJazz"; const double fakeCutoutSlope = bulkyHook ? 1.5 : 1.0; if (endCR() == 0) { diff --git a/src/engraving/libmscore/symbol.cpp b/src/engraving/libmscore/symbol.cpp index 8132db286dd1e..6181ec166efb4 100644 --- a/src/engraving/libmscore/symbol.cpp +++ b/src/engraving/libmscore/symbol.cpp @@ -25,8 +25,8 @@ #include "draw/fontmetrics.h" #include "rw/xml.h" #include "types/symnames.h" +#include "infrastructure/symbolfonts.h" -#include "scorefont.h" #include "system.h" #include "staff.h" #include "measure.h" @@ -165,7 +165,7 @@ void Symbol::read(XmlReader& e) } setSym(symId); } else if (tag == "font") { - _scoreFont = ScoreFont::fontByName(e.readText()); + _scoreFont = SymbolFonts::fontByName(e.readText()); } else if (tag == "Symbol") { Symbol* s = new Symbol(this); s->read(e); diff --git a/src/engraving/libmscore/symbol.h b/src/engraving/libmscore/symbol.h index 8951b1105d05f..eccea647ff94b 100644 --- a/src/engraving/libmscore/symbol.h +++ b/src/engraving/libmscore/symbol.h @@ -29,7 +29,7 @@ namespace mu::engraving { class Segment; -class ScoreFont; +class SymbolFont; //--------------------------------------------------------- // @@ Symbol @@ -43,7 +43,7 @@ class Symbol : public BSymbol OBJECT_ALLOCATOR(engraving, Symbol) protected: SymId _sym; - const ScoreFont* _scoreFont = nullptr; + const SymbolFont* _scoreFont = nullptr; public: Symbol(const ElementType& type, EngravingItem* parent, ElementFlags f = ElementFlag::MOVABLE); @@ -54,7 +54,7 @@ class Symbol : public BSymbol Symbol* clone() const override { return new Symbol(*this); } - void setSym(SymId s, const ScoreFont* sf = nullptr) { _sym = s; _scoreFont = sf; } + void setSym(SymId s, const SymbolFont* sf = nullptr) { _sym = s; _scoreFont = sf; } SymId sym() const { return _sym; } mu::AsciiStringView symName() const; diff --git a/src/engraving/libmscore/systemdivider.cpp b/src/engraving/libmscore/systemdivider.cpp index 2068a72f61ebe..5bb5dede19ce4 100644 --- a/src/engraving/libmscore/systemdivider.cpp +++ b/src/engraving/libmscore/systemdivider.cpp @@ -61,7 +61,7 @@ SystemDivider::SystemDivider(const SystemDivider& sd) void SystemDivider::layout() { SymId sid; - ScoreFont* sf = score()->scoreFont(); + SymbolFont* sf = score()->symbolFont(); if (_dividerType == SystemDivider::Type::LEFT) { sid = SymNames::symIdByName(score()->styleSt(Sid::dividerLeftSym)); @@ -113,7 +113,7 @@ void SystemDivider::write(XmlWriter& xml) const void SystemDivider::read(XmlReader& e) { - ScoreFont* sf = score()->scoreFont(); + SymbolFont* sf = score()->symbolFont(); if (e.attribute("type") == "left") { _dividerType = SystemDivider::Type::LEFT; SymId sym = SymNames::symIdByName(score()->styleSt(Sid::dividerLeftSym)); diff --git a/src/engraving/libmscore/textbase.cpp b/src/engraving/libmscore/textbase.cpp index cbfa908f92738..02262128ef2fb 100644 --- a/src/engraving/libmscore/textbase.cpp +++ b/src/engraving/libmscore/textbase.cpp @@ -30,6 +30,7 @@ #include "rw/xml.h" #include "types/symnames.h" #include "types/typesconv.h" +#include "infrastructure/symbolfonts.h" #include "text.h" #include "textedit.h" @@ -42,7 +43,6 @@ #include "box.h" #include "page.h" #include "textframe.h" -#include "scorefont.h" #include "undo.h" #include "mscore.h" @@ -792,7 +792,7 @@ mu::draw::Font TextFragment::font(const TextBase* t) const String family; if (format.fontFamily() == "ScoreText") { if (t->isDynamic() || t->textStyleType() == TextStyleType::OTTAVA) { - family = t->score()->scoreFont()->fontByName(t->score()->styleSt(Sid::MusicalSymbolFont))->family(); + family = SymbolFonts::fontByName(t->score()->styleSt(Sid::MusicalSymbolFont))->family(); // to keep desired size ratio (based on 20pt symbol size to 10pt text size) m *= 2; } else if (t->isTempoText()) { @@ -828,7 +828,7 @@ mu::draw::Font TextFragment::font(const TextBase* t) const } } if (fail) { - family = String::fromUtf8(ScoreFont::fallbackTextFont()); + family = String::fromUtf8(SymbolFonts::fallbackTextFont()); } } else { family = format.fontFamily(); @@ -1479,7 +1479,7 @@ TextBlock TextBlock::split(int column, TextCursor* cursor) static String toSymbolXml(Char c) { - SymId symId = ScoreFont::fallbackFont()->fromCode(c.unicode()); + SymId symId = SymbolFonts::fallbackFont()->fromCode(c.unicode()); return u"" + String::fromAscii(SymNames::nameForSymId(symId).ascii()) + u""; } @@ -1741,7 +1741,7 @@ void TextBase::createLayout() CharFormat fmt = *cursor.format(); // save format //uint code = score()->scoreFont()->symCode(id); - uint code = id == SymId::space ? static_cast(' ') : ScoreFont::fallbackFont()->symCode(id); + uint code = id == SymId::space ? static_cast(' ') : SymbolFonts::fallbackFont()->symCode(id); cursor.format()->setFontFamily(u"ScoreText"); insert(&cursor, code); cursor.setFormat(fmt); // restore format diff --git a/src/engraving/libmscore/textedit.cpp b/src/engraving/libmscore/textedit.cpp index e6cfd6fdd8ff5..e2630fcc2cc71 100644 --- a/src/engraving/libmscore/textedit.cpp +++ b/src/engraving/libmscore/textedit.cpp @@ -24,7 +24,7 @@ #include "mscoreview.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "types/symnames.h" //#include "accessibility/accessibleitem.h" @@ -225,7 +225,7 @@ void TextBase::insertSym(EditData& ed, SymId id) TextCursor* cursor = ted->cursor(); deleteSelectedText(ed); - String s = score()->scoreFont()->toString(id); + String s = score()->symbolFont()->toString(id); CharFormat fmt = *cursor->format(); // save format cursor->format()->setFontFamily(u"ScoreText"); score()->undo(new InsertText(_cursor, s), &ed); diff --git a/src/engraving/libmscore/timesig.cpp b/src/engraving/libmscore/timesig.cpp index d9fec26aadce7..fd825ca3f44ae 100644 --- a/src/engraving/libmscore/timesig.cpp +++ b/src/engraving/libmscore/timesig.cpp @@ -28,7 +28,7 @@ #include "log.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "symbol.h" #include "staff.h" #include "stafftype.h" @@ -332,7 +332,7 @@ void TimeSig::layout() ds = timeSigSymIdsFromString(_denominatorString); } - ScoreFont* font = score()->scoreFont(); + SymbolFont* font = score()->symbolFont(); SizeF mag(magS() * _scale); RectF numRect = font->bbox(ns, mag); diff --git a/src/engraving/libmscore/trill.cpp b/src/engraving/libmscore/trill.cpp index e9a1663a18510..55e614f846613 100644 --- a/src/engraving/libmscore/trill.cpp +++ b/src/engraving/libmscore/trill.cpp @@ -33,7 +33,7 @@ #include "measure.h" #include "utils.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "accidental.h" #include "segment.h" #include "staff.h" @@ -111,7 +111,7 @@ void TrillSegment::symbolLine(SymId start, SymId fill) double x2 = pos2().x(); double w = x2 - x1; double mag = magS(); - ScoreFont* f = score()->scoreFont(); + SymbolFont* f = score()->symbolFont(); _symbols.clear(); _symbols.push_back(start); @@ -131,7 +131,7 @@ void TrillSegment::symbolLine(SymId start, SymId fill, SymId end) double x2 = pos2().x(); double w = x2 - x1; double mag = magS(); - ScoreFont* f = score()->scoreFont(); + SymbolFont* f = score()->symbolFont(); _symbols.clear(); _symbols.push_back(start); diff --git a/src/engraving/libmscore/undo.cpp b/src/engraving/libmscore/undo.cpp index 879db36e98211..57b9f3571753e 100644 --- a/src/engraving/libmscore/undo.cpp +++ b/src/engraving/libmscore/undo.cpp @@ -34,6 +34,8 @@ #include "undo.h" +#include "infrastructure/symbolfonts.h" + #include "engravingitem.h" #include "note.h" #include "score.h" @@ -81,7 +83,6 @@ #include "stafftext.h" #include "chordline.h" #include "tremolo.h" -#include "scorefont.h" #include "utils.h" #include "glissando.h" #include "stafflines.h" @@ -1829,7 +1830,7 @@ void ChangeStyle::flip(EditData*) score->cmdConcertPitchChanged(style.value(Sid::concertPitch).toBool()); } if (score->styleV(Sid::MusicalSymbolFont) != style.value(Sid::MusicalSymbolFont)) { - score->setScoreFont(ScoreFont::fontByName(style.styleSt(Sid::MusicalSymbolFont))); + score->setSymbolFont(SymbolFonts::fontByName(style.styleSt(Sid::MusicalSymbolFont))); } score->setStyle(style, overlap); diff --git a/src/engraving/libmscore/vibrato.cpp b/src/engraving/libmscore/vibrato.cpp index 389914002442b..746581e4d87d5 100644 --- a/src/engraving/libmscore/vibrato.cpp +++ b/src/engraving/libmscore/vibrato.cpp @@ -31,7 +31,7 @@ #include "measure.h" #include "utils.h" #include "score.h" -#include "scorefont.h" +#include "symbolfont.h" #include "accidental.h" #include "segment.h" #include "staff.h" @@ -68,7 +68,7 @@ void VibratoSegment::symbolLine(SymId start, SymId fill) double x2 = pos2().x(); double w = x2 - x1; double mag = magS(); - ScoreFont* f = score()->scoreFont(); + SymbolFont* f = score()->symbolFont(); _symbols.clear(); _symbols.push_back(start); @@ -88,7 +88,7 @@ void VibratoSegment::symbolLine(SymId start, SymId fill, SymId end) double x2 = pos2().x(); double w = x2 - x1; double mag = magS(); - ScoreFont* f = score()->scoreFont(); + SymbolFont* f = score()->symbolFont(); _symbols.clear(); _symbols.push_back(start); diff --git a/src/engraving/rw/compat/read206.cpp b/src/engraving/rw/compat/read206.cpp index 13e1051e028a7..6d26d20c5b0f5 100644 --- a/src/engraving/rw/compat/read206.cpp +++ b/src/engraving/rw/compat/read206.cpp @@ -30,6 +30,7 @@ #include "rw/xml.h" #include "types/typesconv.h" #include "types/symnames.h" +#include "infrastructure/symbolfonts.h" #include "compat/pageformat.h" @@ -37,7 +38,6 @@ #include "libmscore/staff.h" #include "libmscore/part.h" #include "libmscore/page.h" -#include "libmscore/scorefont.h" #include "libmscore/arpeggio.h" #include "libmscore/audio.h" #include "libmscore/sig.h" @@ -3241,7 +3241,7 @@ bool Read206::readScore206(Score* score, XmlReader& e, ReadContext& ctx) // float mode score->style().set(Sid::spatium, sp); } - score->setScoreFont(ScoreFont::fontByName(score->style().styleSt(Sid::MusicalSymbolFont))); + score->setSymbolFont(SymbolFonts::fontByName(score->style().styleSt(Sid::MusicalSymbolFont))); } else if (tag == "copyright" || tag == "rights") { Text* text = Factory::createText(score->dummy(), TextStyleType::DEFAULT, false); readText206(e, ctx, text, text); diff --git a/src/engraving/rw/compat/read302.cpp b/src/engraving/rw/compat/read302.cpp index 0d983daf2d9a8..f62de14fd69da 100644 --- a/src/engraving/rw/compat/read302.cpp +++ b/src/engraving/rw/compat/read302.cpp @@ -25,12 +25,12 @@ #include "style/style.h" #include "style/defaultstyle.h" #include "rw/xml.h" +#include "infrastructure/symbolfonts.h" #include "libmscore/score.h" #include "libmscore/staff.h" #include "libmscore/part.h" #include "libmscore/page.h" -#include "libmscore/scorefont.h" #include "libmscore/audio.h" #include "libmscore/sig.h" #include "libmscore/barline.h" @@ -123,7 +123,7 @@ bool Read302::readScore302(Score* score, XmlReader& e, ReadContext& ctx) // float mode score->style().set(Sid::spatium, sp); } - score->_scoreFont = ScoreFont::fontByName(score->style().styleSt(Sid::MusicalSymbolFont)); + score->m_symbolFont = SymbolFonts::fontByName(score->style().styleSt(Sid::MusicalSymbolFont)); } else if (tag == "copyright" || tag == "rights") { score->setMetaTag(u"copyright", Text::readXmlText(e, score)); } else if (tag == "movement-number") { diff --git a/src/framework/draw/ifontprovider.h b/src/framework/draw/ifontprovider.h index 9897ca66ca25c..8229f9ae4e105 100644 --- a/src/framework/draw/ifontprovider.h +++ b/src/framework/draw/ifontprovider.h @@ -25,6 +25,7 @@ #include "modularity/imoduleexport.h" +#include "io/path.h" #include "types/string.h" #include "types/font.h" #include "types/geometry.h" @@ -37,7 +38,8 @@ class IFontProvider : MODULE_EXPORT_INTERFACE public: virtual ~IFontProvider() = default; - virtual int addApplicationFont(const String& family, const String& path) = 0; + virtual int addSymbolFont(const String& family, const io::path_t& path) = 0; + virtual int addTextFont(const io::path_t& path) = 0; virtual void insertSubstitution(const String& familyName, const String& substituteName) = 0; virtual double lineSpacing(const Font& f) const = 0; diff --git a/src/framework/draw/internal/qfontprovider.cpp b/src/framework/draw/internal/qfontprovider.cpp index 594c6b9cd7942..f798682569db3 100644 --- a/src/framework/draw/internal/qfontprovider.cpp +++ b/src/framework/draw/internal/qfontprovider.cpp @@ -52,10 +52,15 @@ class FontPaintDevice : public QPaintDevice static FontPaintDevice device; -int QFontProvider::addApplicationFont(const String& family, const String& path) +int QFontProvider::addSymbolFont(const String& family, const io::path_t& path) { - m_paths[family] = path; - return QFontDatabase::addApplicationFont(path); + m_symbolsFonts[family] = path; + return QFontDatabase::addApplicationFont(path.toQString()); +} + +int QFontProvider::addTextFont(const io::path_t& path) +{ + return QFontDatabase::addApplicationFont(path.toQString()); } void QFontProvider::insertSubstitution(const String& familyName, const String& substituteName) @@ -192,7 +197,7 @@ double QFontProvider::symAdvance(const Font& f, uint ucs4, double dpi_f) const FontEngineFT* QFontProvider::symEngine(const Font& f) const { - QString path = m_paths.value(f.family()); + QString path = m_symbolsFonts.value(f.family()).toQString(); if (path.isEmpty()) { return nullptr; } diff --git a/src/framework/draw/internal/qfontprovider.h b/src/framework/draw/internal/qfontprovider.h index 5ab577baccb3d..af9e8b3736f09 100644 --- a/src/framework/draw/internal/qfontprovider.h +++ b/src/framework/draw/internal/qfontprovider.h @@ -32,7 +32,8 @@ class QFontProvider : public IFontProvider public: QFontProvider() = default; - int addApplicationFont(const String& family, const String& path) override; + int addSymbolFont(const String& family, const io::path_t& path) override; + int addTextFont(const io::path_t& path) override; void insertSubstitution(const String& familyName, const String& substituteName) override; double lineSpacing(const Font& f) const override; @@ -61,7 +62,7 @@ class QFontProvider : public IFontProvider FontEngineFT* symEngine(const Font& f) const; - QHash m_paths; + QHash m_symbolsFonts; mutable QHash m_symEngines; }; } diff --git a/src/framework/fonts/CMakeLists.txt b/src/framework/fonts/CMakeLists.txt index 98998f5836aa1..d70189abbab18 100644 --- a/src/framework/fonts/CMakeLists.txt +++ b/src/framework/fonts/CMakeLists.txt @@ -43,8 +43,6 @@ set(MODULE_BIG_QRC set(MODULE_SRC ${CMAKE_CURRENT_LIST_DIR}/fontsmodule.cpp ${CMAKE_CURRENT_LIST_DIR}/fontsmodule.h - ${CMAKE_CURRENT_LIST_DIR}/internal/fontssetup.cpp - ${CMAKE_CURRENT_LIST_DIR}/internal/fontssetup.h ) include(${PROJECT_SOURCE_DIR}/build/module.cmake) diff --git a/src/framework/fonts/fontsmodule.cpp b/src/framework/fonts/fontsmodule.cpp index 7a2bd6f5608fc..5302eccadea06 100644 --- a/src/framework/fonts/fontsmodule.cpp +++ b/src/framework/fonts/fontsmodule.cpp @@ -23,13 +23,8 @@ #include -#include "modularity/ioc.h" -#include "internal/fontssetup.h" - using namespace mu::fonts; -static std::shared_ptr s_fontsSetup = std::make_shared(); - static void init_fonts_qrc() { Q_INIT_RESOURCE(fonts_Leland); @@ -58,8 +53,3 @@ void FontsModule::registerResources() { init_fonts_qrc(); } - -void FontsModule::onInit(const mu::framework::IApplication::RunMode&) -{ - s_fontsSetup->setup(); -} diff --git a/src/framework/fonts/fontsmodule.h b/src/framework/fonts/fontsmodule.h index 7d1745a102192..02dd35e967ec4 100644 --- a/src/framework/fonts/fontsmodule.h +++ b/src/framework/fonts/fontsmodule.h @@ -31,8 +31,6 @@ class FontsModule : public modularity::IModuleSetup std::string moduleName() const override; void registerResources() override; - - void onInit(const framework::IApplication::RunMode&) override; }; } diff --git a/src/framework/fonts/internal/fontssetup.cpp b/src/framework/fonts/internal/fontssetup.cpp deleted file mode 100644 index 6b2b18ceaa93a..0000000000000 --- a/src/framework/fonts/internal/fontssetup.cpp +++ /dev/null @@ -1,68 +0,0 @@ -/* - * SPDX-License-Identifier: GPL-3.0-only - * MuseScore-CLA-applies - * - * MuseScore - * Music Composition & Notation - * - * Copyright (C) 2021 MuseScore BVBA and others - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -#include "fontssetup.h" - -#include -#include - -#include "log.h" - -using namespace mu::fonts; - -constexpr int INVALID_LOAD_FONTS_CODE = -1; - -void FontsSetup::setup() -{ - static const QStringList fonts = { - ":/fonts/musejazz/MuseJazzText.otf", - ":/fonts/campania/Campania.otf", - ":/fonts/edwin/Edwin-Roman.otf", - ":/fonts/edwin/Edwin-Bold.otf", - ":/fonts/edwin/Edwin-Italic.otf", - ":/fonts/edwin/Edwin-BdIta.otf", - ":/fonts/FreeSans.ttf", - ":/fonts/FreeSerif.ttf", - ":/fonts/FreeSerifBold.ttf", - ":/fonts/FreeSerifItalic.ttf", - ":/fonts/FreeSerifBoldItalic.ttf", - ":/fonts/mscoreTab.ttf", - ":/fonts/mscore-BC.ttf", - ":/fonts/leland/LelandText.otf", - ":/fonts/leland/Leland.otf", - ":/fonts/mscore/MusescoreIcon.ttf", - ":/fonts/bravura/BravuraText.otf", - ":/fonts/gootville/GootvilleText.otf", - ":/fonts/mscore/MScoreText.ttf", - ":/fonts/petaluma/PetalumaText.otf", - ":/fonts/petaluma/PetalumaScript.otf", - ":/fonts/finalemaestro/FinaleMaestroText.otf", - ":/fonts/finalebroadway/FinaleBroadwayText.otf", - }; - - for (const QString& font: fonts) { - int loadStatusCode = QFontDatabase::addApplicationFont(font); - if (loadStatusCode == INVALID_LOAD_FONTS_CODE) { - LOGE() << "Fatal error: cannot load internal font " << font; - QCoreApplication::exit(loadStatusCode); - } - } -} diff --git a/src/framework/global/CMakeLists.txt b/src/framework/global/CMakeLists.txt index b34fd19438235..8c92b7c1909f4 100644 --- a/src/framework/global/CMakeLists.txt +++ b/src/framework/global/CMakeLists.txt @@ -52,8 +52,6 @@ set(MODULE_SRC ${CMAKE_CURRENT_LIST_DIR}/translation.h ${CMAKE_CURRENT_LIST_DIR}/timer.h ${CMAKE_CURRENT_LIST_DIR}/progress.h - ${CMAKE_CURRENT_LIST_DIR}/smuflranges.cpp - ${CMAKE_CURRENT_LIST_DIR}/smuflranges.h ${CMAKE_CURRENT_LIST_DIR}/utils.cpp ${CMAKE_CURRENT_LIST_DIR}/utils.h ${CMAKE_CURRENT_LIST_DIR}/defer.h diff --git a/src/framework/ui/uimodule.cpp b/src/framework/ui/uimodule.cpp index 25460eb979257..9777a408ac8a0 100644 --- a/src/framework/ui/uimodule.cpp +++ b/src/framework/ui/uimodule.cpp @@ -22,6 +22,7 @@ #include "uimodule.h" #include +#include #include "modularity/ioc.h" @@ -148,6 +149,8 @@ void UiModule::registerUiTypes() void UiModule::onInit(const framework::IApplication::RunMode&) { + QFontDatabase::addApplicationFont(":/fonts/mscore/MusescoreIcon.ttf"); // icons + s_configuration->init(); s_keyNavigationController->init(); } diff --git a/src/importexport/musicxml/internal/musicxml/importmxmlpass1.cpp b/src/importexport/musicxml/internal/musicxml/importmxmlpass1.cpp index 8f84a89af1792..7f8ed5a72eb3f 100644 --- a/src/importexport/musicxml/internal/musicxml/importmxmlpass1.cpp +++ b/src/importexport/musicxml/internal/musicxml/importmxmlpass1.cpp @@ -22,6 +22,8 @@ #include +#include "engraving/infrastructure/symbolfonts.h" + #include "engraving/libmscore/factory.h" #include "engraving/libmscore/box.h" #include "engraving/libmscore/chordrest.h" @@ -29,7 +31,6 @@ #include "engraving/libmscore/measure.h" #include "engraving/libmscore/page.h" #include "engraving/libmscore/part.h" -#include "engraving/libmscore/scorefont.h" #include "engraving/libmscore/staff.h" #include "engraving/libmscore/stringdata.h" #include "engraving/libmscore/symbol.h" @@ -1178,7 +1179,7 @@ static QString text2syms(const QString& t) // note that this takes about 1 msec on a Core i5, // caching does not gain much - ScoreFont* sf = ScoreFont::fallbackFont(); + SymbolFont* sf = SymbolFonts::fallbackFont(); QMap map; int maxStringSize = 0; // maximum string size found diff --git a/src/importexport/musicxml/internal/musicxml/importmxmlpass2.cpp b/src/importexport/musicxml/internal/musicxml/importmxmlpass2.cpp index e403a8ccbb660..2785653bee61e 100644 --- a/src/importexport/musicxml/internal/musicxml/importmxmlpass2.cpp +++ b/src/importexport/musicxml/internal/musicxml/importmxmlpass2.cpp @@ -28,6 +28,7 @@ #include "engraving/types/symnames.h" #include "engraving/types/typesconv.h" +#include "infrastructure/symbolfont.h" #include "libmscore/factory.h" #include "libmscore/accidental.h" @@ -64,7 +65,6 @@ #include "libmscore/pedal.h" #include "libmscore/rehearsalmark.h" #include "libmscore/rest.h" -#include "libmscore/scorefont.h" #include "libmscore/slur.h" #include "libmscore/staff.h" #include "libmscore/stafftext.h" @@ -672,7 +672,7 @@ static QString text2syms(const QString& t) // note that this takes about 1 msec on a Core i5, // caching does not gain much - ScoreFont* sf = ScoreFont::fallbackFont(); + SymbolFont* sf = SymbolFonts::fallbackFont(); QMap map; int maxStringSize = 0; // maximum string size found diff --git a/src/inspector/models/notation/notes/noteheads/noteheadgroupsmodel.cpp b/src/inspector/models/notation/notes/noteheads/noteheadgroupsmodel.cpp index 2773b8ba7a3cc..b761064422b0d 100644 --- a/src/inspector/models/notation/notes/noteheads/noteheadgroupsmodel.cpp +++ b/src/inspector/models/notation/notes/noteheads/noteheadgroupsmodel.cpp @@ -22,7 +22,7 @@ #include "noteheadgroupsmodel.h" #include "engraving/libmscore/note.h" -#include "engraving/libmscore/scorefont.h" +#include "engraving/infrastructure/symbolfonts.h" #include "engraving/types/typesconv.h" using namespace mu::inspector; @@ -63,7 +63,7 @@ QVariant NoteheadGroupsModel::data(const QModelIndex& index, int role) const return TConv::translatedUserName(group).toQString(); case IconCodeRole: { auto type = (group == NoteHeadGroup::HEAD_BREVIS_ALT) ? NoteHeadType::HEAD_BREVIS : NoteHeadType::HEAD_QUARTER; - return ScoreFont::fallbackFont()->symCode(Note::noteHead(0, group, type)); + return SymbolFonts::fallbackFont()->symCode(Note::noteHead(0, group, type)); } default: break; } diff --git a/src/notation/internal/notation.cpp b/src/notation/internal/notation.cpp index e2ed7e23c7e16..787640335fe72 100644 --- a/src/notation/internal/notation.cpp +++ b/src/notation/internal/notation.cpp @@ -27,7 +27,6 @@ #include "log.h" #include "libmscore/masterscore.h" -#include "libmscore/scorefont.h" #include "libmscore/page.h" #include "libmscore/rendermidi.h" #include "engraving/infrastructure/paint.h" diff --git a/src/notation/internal/notationplayback.cpp b/src/notation/internal/notationplayback.cpp index a131944778d18..e285ccd849290 100644 --- a/src/notation/internal/notationplayback.cpp +++ b/src/notation/internal/notationplayback.cpp @@ -34,7 +34,6 @@ #include "libmscore/measure.h" #include "libmscore/segment.h" #include "libmscore/system.h" -#include "libmscore/scorefont.h" #include "libmscore/page.h" #include "libmscore/staff.h" #include "libmscore/chordrest.h" diff --git a/src/notation/view/loopmarker.cpp b/src/notation/view/loopmarker.cpp index 512a4b8347f6b..92277da07823e 100644 --- a/src/notation/view/loopmarker.cpp +++ b/src/notation/view/loopmarker.cpp @@ -22,7 +22,7 @@ #include "loopmarker.h" #include "draw/types/pen.h" -#include "libmscore/scorefont.h" +#include "infrastructure/symbolfont.h" using namespace mu::notation; using namespace mu; @@ -112,7 +112,7 @@ RectF LoopMarker::resolveMarkerRectByTick(midi::tick_t _tick) const double _spatium = score->spatium(); qreal mag = _spatium / mu::engraving::SPATIUM20; - double width = (_spatium * 2.0 + score->scoreFont()->width(mu::engraving::SymId::noteheadBlack, mag)) / 3; + double width = (_spatium * 2.0 + score->symbolFont()->width(mu::engraving::SymId::noteheadBlack, mag)) / 3; double height = 6 * _spatium; // set cursor height for whole system diff --git a/src/notation/view/playbackcursor.cpp b/src/notation/view/playbackcursor.cpp index 959dd017c2937..f8cdb106d9a8c 100644 --- a/src/notation/view/playbackcursor.cpp +++ b/src/notation/view/playbackcursor.cpp @@ -22,7 +22,6 @@ #include "playbackcursor.h" #include "engraving/libmscore/system.h" -#include "engraving/libmscore/scorefont.h" using namespace mu::notation; diff --git a/src/notation/view/widgets/editstyle.cpp b/src/notation/view/widgets/editstyle.cpp index c2dfee4b40db2..ba183a3569870 100644 --- a/src/notation/view/widgets/editstyle.cpp +++ b/src/notation/view/widgets/editstyle.cpp @@ -37,7 +37,7 @@ #include "engraving/types/symnames.h" #include "engraving/types/typesconv.h" #include "engraving/libmscore/figuredbass.h" -#include "engraving/libmscore/scorefont.h" +#include "engraving/infrastructure/symbolfonts.h" #include "engraving/libmscore/realizedharmony.h" #include "ui/view/widgetstatestore.h" @@ -696,7 +696,7 @@ EditStyle::EditStyle(QWidget* parent) musicalSymbolFont->clear(); int idx = 0; - for (auto i : mu::engraving::ScoreFont::scoreFonts()) { + for (auto i : mu::engraving::SymbolFonts::scoreFonts()) { musicalSymbolFont->addItem(i.name().toQString(), i.name().toQString()); ++idx; } @@ -1740,7 +1740,7 @@ void EditStyle::setValues() QString mfont(styleValue(StyleId::MusicalSymbolFont).value()); int idx = 0; - for (const auto& i : mu::engraving::ScoreFont::scoreFonts()) { + for (const auto& i : mu::engraving::SymbolFonts::scoreFonts()) { if (i.name().toLower() == mfont.toLower()) { musicalSymbolFont->setCurrentIndex(idx); break; @@ -2035,7 +2035,7 @@ void EditStyle::valueChanged(int i) PropertyValue val = getValue(idx); bool setValue = false; if (idx == StyleId::MusicalSymbolFont && optimizeStyleCheckbox->isChecked()) { - mu::engraving::ScoreFont* scoreFont = mu::engraving::ScoreFont::fontByName(val.value()); + mu::engraving::SymbolFont* scoreFont = mu::engraving::SymbolFonts::fontByName(val.value()); if (scoreFont) { for (auto j : scoreFont->engravingDefaults()) { setStyleValue(j.first, j.second); diff --git a/src/palette/view/widgets/editdrumsetdialog.cpp b/src/palette/view/widgets/editdrumsetdialog.cpp index 12c6503da642e..62492067109af 100644 --- a/src/palette/view/widgets/editdrumsetdialog.cpp +++ b/src/palette/view/widgets/editdrumsetdialog.cpp @@ -27,6 +27,8 @@ #include "engraving/rw/xml.h" #include "engraving/types/typesconv.h" #include "engraving/types/symnames.h" +#include "engraving/infrastructure/smufl.h" +#include "engraving/infrastructure/symbolfont.h" #include "libmscore/factory.h" #include "libmscore/utils.h" @@ -34,12 +36,9 @@ #include "libmscore/score.h" #include "libmscore/note.h" #include "libmscore/stem.h" -#include "libmscore/scorefont.h" #include "draw/types/geometry.h" -#include "framework/global/smuflranges.h" - #include using namespace mu::palette; @@ -118,13 +117,13 @@ struct SymbolIcon { QPixmap image(w, h); image.fill(Qt::transparent); mu::draw::Painter painter(&image, "generateicon"); - const mu::RectF& bbox = ScoreFont::fallbackFont()->bbox(id, 1); + const mu::RectF& bbox = SymbolFonts::fallbackFont()->bbox(id, 1); const qreal actualSymbolScale = std::min(w / bbox.width(), h / bbox.height()); qreal mag = std::min(defaultScale, actualSymbolScale); const qreal& xStShift = (w - mag * bbox.width()) / 2 - mag * bbox.left(); const qreal& yStShift = (h - mag * bbox.height()) / 2 - mag * bbox.top(); const mu::PointF& stPtPos = mu::PointF(xStShift, yStShift); - ScoreFont::fallbackFont()->draw(id, &painter, mag, stPtPos); + SymbolFonts::fallbackFont()->draw(id, &painter, mag, stPtPos); icon.addPixmap(image); return SymbolIcon(id, icon); } @@ -236,7 +235,7 @@ EditDrumsetDialog::EditDrumsetDialog(QWidget* parent) } for (QString range : validNoteheadRanges) { - for (auto symName : mu::smuflRanges().at(range)) { + for (auto symName : Smufl::smuflRanges().at(range)) { SymId id = SymNames::symIdByName(symName); if (!excludeSym.contains(symName) && !primaryNoteheads.contains(symName)) { resNoteheads.append(SymbolIcon::generateIcon(id, w, h, defaultScale)); diff --git a/src/palette/view/widgets/masterpalette.cpp b/src/palette/view/widgets/masterpalette.cpp index cd1face64267d..4ca8b30d9f47c 100644 --- a/src/palette/view/widgets/masterpalette.cpp +++ b/src/palette/view/widgets/masterpalette.cpp @@ -22,6 +22,8 @@ #include "masterpalette.h" +#include "translation.h" + #include "palettewidget.h" #include "keyedit.h" #include "timedialog.h" @@ -29,10 +31,9 @@ #include "internal/palettecreator.h" -#include "smuflranges.h" +#include "engraving/infrastructure/smufl.h" #include "ui/view/widgetstatestore.h" -#include "translation.h" #include "log.h" using namespace mu::palette; @@ -144,17 +145,17 @@ MasterPalette::MasterPalette(QWidget* parent) m_symbolItem->setData(0, Qt::UserRole, m_idxAllSymbols); m_symbolItem->setText(0, QT_TRANSLATE_NOOP("palette", "Symbols")); treeWidget->addTopLevelItem(m_symbolItem); - stack->addWidget(new SymbolDialog(mu::SMUFL_ALL_SYMBOLS)); + stack->addWidget(new SymbolDialog(Smufl::SMUFL_ALL_SYMBOLS)); // Add "All symbols" entry to be first in the list of categories - QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(mu::SMUFL_ALL_SYMBOLS)); + QTreeWidgetItem* child = new QTreeWidgetItem(QStringList(Smufl::SMUFL_ALL_SYMBOLS)); child->setData(0, Qt::UserRole, m_idxAllSymbols); m_symbolItem->addChild(child); - std::vector symbols = mu::keys(mu::smuflRanges()); + std::vector symbols = mu::keys(Smufl::smuflRanges()); for (size_t i = 0; i < symbols.size(); i++) { QString symbol = symbols[i].toQString(); - if (symbol == mu::SMUFL_ALL_SYMBOLS) { + if (symbol == Smufl::SMUFL_ALL_SYMBOLS) { continue; } @@ -200,7 +201,7 @@ void MasterPalette::currentChanged(QTreeWidgetItem* item, QTreeWidgetItem*) if (idx > m_idxAllSymbols) { if (!m_symbolWidgets.contains(idx)) { - std::vector symbols = mu::keys(mu::smuflRanges()); + std::vector symbols = mu::keys(Smufl::smuflRanges()); SymbolDialog* dialog = new SymbolDialog(symbols[idx - m_idxAllSymbols - 1].toQString()); m_symbolWidgets[idx] = dialog; stack->addWidget(dialog); diff --git a/src/palette/view/widgets/specialcharactersdialog.cpp b/src/palette/view/widgets/specialcharactersdialog.cpp index 7153810713743..a22589e0c6e99 100644 --- a/src/palette/view/widgets/specialcharactersdialog.cpp +++ b/src/palette/view/widgets/specialcharactersdialog.cpp @@ -27,7 +27,6 @@ #include "palettewidget.h" #include "translation.h" -#include "smuflranges.h" #include "engraving/libmscore/text.h" #include "engraving/libmscore/symbol.h" @@ -35,6 +34,7 @@ #include "engraving/libmscore/score.h" #include "engraving/style/style.h" #include "engraving/types/symnames.h" +#include "engraving/infrastructure/smufl.h" #include "ui/view/widgetstatestore.h" @@ -444,7 +444,7 @@ SpecialCharactersDialog::SpecialCharactersDialog(QWidget* parent) m_lws = new QListWidget; QStringList keys; - std::vector symbols = mu::keys(mu::smuflRanges()); + std::vector symbols = mu::keys(Smufl::smuflRanges()); for (const String& s : symbols) { keys << s.toQString(); } @@ -679,7 +679,7 @@ void SpecialCharactersDialog::populateCommon() for (auto id : commonScoreSymbols) { std::shared_ptr s = std::make_shared(gpaletteScore->dummy()); - s->setSym(id, gpaletteScore->scoreFont()); + s->setSym(id, gpaletteScore->symbolFont()); m_pCommon->appendElement(s, SymNames::translatedUserNameForSymId(id)); } @@ -699,14 +699,14 @@ void SpecialCharactersDialog::populateSmufl() { int row = m_lws->currentRow(); - QString key = mu::keys(mu::smuflRanges()).at(row).toQString(); - QStringList smuflNames = mu::smuflRanges().at(key).toQStringList(); + QString key = mu::keys(Smufl::smuflRanges()).at(row).toQString(); + QStringList smuflNames = Smufl::smuflRanges().at(key).toQStringList(); m_pSmufl->clear(); for (const QString& name : smuflNames) { auto symId = SymNames::symIdByName(name); std::shared_ptr s = std::make_shared(gpaletteScore->dummy()); - s->setSym(symId, gpaletteScore->scoreFont()); + s->setSym(symId, gpaletteScore->symbolFont()); m_pSmufl->appendElement(s, SymNames::translatedUserNameForSymId(symId)); } } diff --git a/src/palette/view/widgets/symboldialog.cpp b/src/palette/view/widgets/symboldialog.cpp index 272fee4b4e216..8b2d286930a24 100644 --- a/src/palette/view/widgets/symboldialog.cpp +++ b/src/palette/view/widgets/symboldialog.cpp @@ -24,16 +24,15 @@ #include "engraving/style/style.h" #include "engraving/types/symnames.h" +#include "engraving/infrastructure/smufl.h" #include "libmscore/masterscore.h" -#include "libmscore/scorefont.h" +#include "infrastructure/symbolfonts.h" #include "libmscore/engravingitem.h" #include "libmscore/symbol.h" #include "palettewidget.h" -#include "smuflranges.h" - using namespace mu::engraving; using namespace mu::palette; @@ -58,11 +57,11 @@ void SymbolDialog::createSymbolPalette() void SymbolDialog::createSymbols() { int currentIndex = fontList->currentIndex(); - const ScoreFont* f = &ScoreFont::scoreFonts()[currentIndex]; + const SymbolFont* f = &SymbolFonts::scoreFonts()[currentIndex]; // init the font if not done yet - ScoreFont::fontByName(f->name()); + SymbolFonts::fontByName(f->name()); m_symbolsWidget->clear(); - for (auto name : mu::smuflRanges().at(range)) { + for (auto name : Smufl::smuflRanges().at(range)) { SymId id = SymNames::symIdByName(name); if (search->text().isEmpty() || SymNames::translatedUserNameForSymId(id).toQString().contains(search->text(), Qt::CaseInsensitive)) { @@ -84,7 +83,7 @@ SymbolDialog::SymbolDialog(const QString& s, QWidget* parent) range = s; // smufl symbol range int idx = 0; int currentIndex = 0; - for (const ScoreFont& f : ScoreFont::scoreFonts()) { + for (const SymbolFont& f : SymbolFonts::scoreFonts()) { fontList->addItem(f.name()); if (f.name() == "Leland" || f.name() == "Bravura") { currentIndex = idx; diff --git a/src/palette/view/widgets/timesignaturepropertiesdialog.cpp b/src/palette/view/widgets/timesignaturepropertiesdialog.cpp index e5f2cc58f3e58..1cf11da3c9039 100644 --- a/src/palette/view/widgets/timesignaturepropertiesdialog.cpp +++ b/src/palette/view/widgets/timesignaturepropertiesdialog.cpp @@ -31,7 +31,7 @@ #include "engraving/libmscore/chord.h" #include "engraving/libmscore/measure.h" #include "engraving/libmscore/part.h" -#include "engraving/libmscore/scorefont.h" +#include "engraving/infrastructure/symbolfont.h" #include "ui/view/musicalsymbolcodes.h" #include "ui/view/widgetstatestore.h" @@ -125,15 +125,15 @@ TimeSignaturePropertiesDialog::TimeSignaturePropertiesDialog(QWidget* parent) SymId::mensuralProlation11, // tempus inperf., prol. perfecta, reversed }; - ScoreFont* scoreFont = gpaletteScore->scoreFont(); + SymbolFont* symbolFont = gpaletteScore->symbolFont(); otherCombo->clear(); otherCombo->setStyleSheet(QString("QComboBox { font-family: \"%1 Text\"; font-size: %2px; max-height: 30px } ") - .arg(scoreFont->family()).arg(musicalFontSize)); + .arg(symbolFont->family()).arg(musicalFontSize)); int idx = 0; for (SymId prolatio : prolatioList) { - const QString& str = scoreFont->toString(prolatio); + const QString& str = symbolFont->toString(prolatio); if (str.size() > 0) { otherCombo->addItem(str, int(prolatio)); @@ -212,10 +212,10 @@ void TimeSignaturePropertiesDialog::accept() } if (otherButton->isChecked()) { - ScoreFont* scoreFont = m_editedTimeSig->score()->scoreFont(); + SymbolFont* symbolFont = m_editedTimeSig->score()->symbolFont(); SymId symId = (SymId)(otherCombo->itemData(otherCombo->currentIndex()).toInt()); // ...and set numerator to font string for symbol and denominator to empty string - m_editedTimeSig->setNumeratorString(scoreFont->toString(symId)); + m_editedTimeSig->setNumeratorString(symbolFont->toString(symId)); m_editedTimeSig->setDenominatorString(QString()); } diff --git a/src/project/internal/projectmigrator.cpp b/src/project/internal/projectmigrator.cpp index 23ad01d2156ad..96b6e8750eb31 100644 --- a/src/project/internal/projectmigrator.cpp +++ b/src/project/internal/projectmigrator.cpp @@ -21,10 +21,11 @@ */ #include "projectmigrator.h" +#include "engraving/infrastructure/symbolfont.h" + #include "engraving/libmscore/score.h" #include "engraving/libmscore/excerpt.h" #include "engraving/libmscore/part.h" -#include "engraving/libmscore/scorefont.h" #include "engraving/libmscore/undo.h" #include "rw/compat/readstyle.h" @@ -177,7 +178,7 @@ void ProjectMigrator::resetStyleSettings(mu::engraving::MasterScore* score) endBarDistance -= (style->styleMM(mu::engraving::Sid::barWidth) + style->styleMM(mu::engraving::Sid::endBarWidth)) / 2; style->set(mu::engraving::Sid::endBarDistance, endBarDistance / sp); qreal repeatBarlineDotSeparation = style->styleMM(mu::engraving::Sid::repeatBarlineDotSeparation); - qreal dotWidth = score->scoreFont()->width(mu::engraving::SymId::repeatDot, 1.0); + qreal dotWidth = score->symbolFont()->width(mu::engraving::SymId::repeatDot, 1.0); repeatBarlineDotSeparation -= (style->styleMM(mu::engraving::Sid::barWidth) + dotWidth) / 2; style->set(mu::engraving::Sid::repeatBarlineDotSeparation, repeatBarlineDotSeparation / sp); score->resetStyleValue(mu::engraving::Sid::measureSpacing); diff --git a/tools/check_build_without_qt/fontproviderstub.cpp b/tools/check_build_without_qt/fontproviderstub.cpp index 5abc8e7a8e5b3..a39d5b009f012 100644 --- a/tools/check_build_without_qt/fontproviderstub.cpp +++ b/tools/check_build_without_qt/fontproviderstub.cpp @@ -3,7 +3,12 @@ using namespace mu; using namespace mu::draw; -int FontProviderStub::addApplicationFont(const String&, const String&) +int FontProviderStub::addSymbolFont(const String&, const io::path_t&) +{ + return -1; +} + +int FontProviderStub::addTextFont(const io::path_t&) { return -1; } diff --git a/tools/check_build_without_qt/fontproviderstub.h b/tools/check_build_without_qt/fontproviderstub.h index bef7688009ae1..ebba6c523b1e5 100644 --- a/tools/check_build_without_qt/fontproviderstub.h +++ b/tools/check_build_without_qt/fontproviderstub.h @@ -8,7 +8,8 @@ class FontProviderStub : public IFontProvider { public: - int addApplicationFont(const String& family, const String& path) override; + int addSymbolFont(const String& family, const io::path_t& path) override; + int addTextFont(const io::path_t& path) override; void insertSubstitution(const String& familyName, const String& substituteName) override; double lineSpacing(const Font& f) const override;