| 45 | } |
| 46 | |
| 47 | void SdCardFontSystem::ensureLoaded(GfxRenderer& renderer) { |
| 48 | // If the web server (or another task) installed/deleted fonts, re-discover. |
| 49 | // Track whether we just re-discovered so we can force a reload below even |
| 50 | // when the wanted family/size still maps to the same point size — the file |
| 51 | // contents on disk may have changed (e.g. user re-uploaded a new build). |
| 52 | const bool registryWasDirty = registryDirty_.exchange(false, std::memory_order_acquire); |
| 53 | if (registryWasDirty) { |
| 54 | LOG_DBG("SDFS", "Registry dirty — re-discovering fonts"); |
| 55 | registry_.discover(); |
| 56 | } |
| 57 | |
| 58 | const char* wantedFamily = SETTINGS.sdFontFamilyName; |
| 59 | const std::string& currentFamily = manager_.currentFamilyName(); |
| 60 | const uint8_t sizeEnum = fontSizeEnumFromSettings(); |
| 61 | |
| 62 | if (wantedFamily[0] == '\0') { |
| 63 | if (!currentFamily.empty()) { |
| 64 | manager_.unloadAll(renderer); |
| 65 | } |
| 66 | return; |
| 67 | } |
| 68 | |
| 69 | // Reload if family changed OR if the user-selected size maps to a |
| 70 | // different file than what's currently loaded OR if the registry was |
| 71 | // just rediscovered (file may have been replaced on disk). |
| 72 | bool familyMatches = (currentFamily == wantedFamily); |
| 73 | if (familyMatches) { |
| 74 | const auto* family = registry_.findFamily(wantedFamily); |
| 75 | if (!family) { |
| 76 | LOG_DBG("SDFS", "SD font family disappeared: %s (clearing)", wantedFamily); |
| 77 | manager_.unloadAll(renderer); |
| 78 | SETTINGS.sdFontFamilyName[0] = '\0'; |
| 79 | return; |
| 80 | } |
| 81 | const auto* selected = family->findClosestReaderSize(sizeEnum); |
| 82 | const uint8_t wantedPt = selected ? selected->pointSize : 0; |
| 83 | if (!registryWasDirty && wantedPt == manager_.currentPointSize()) return; |
| 84 | LOG_DBG("SDFS", "Reloading %s: size %u -> %u (enum %u)%s", wantedFamily, manager_.currentPointSize(), wantedPt, |
| 85 | sizeEnum, registryWasDirty ? " [registry dirty]" : ""); |
| 86 | } |
| 87 | |
| 88 | if (!currentFamily.empty()) { |
| 89 | manager_.unloadAll(renderer); |
| 90 | } |
| 91 | |
| 92 | const auto* family = registry_.findFamily(wantedFamily); |
| 93 | if (family) { |
| 94 | if (manager_.loadFamily(*family, renderer, sizeEnum)) { |
| 95 | LOG_DBG("SDFS", "Loaded SD font family: %s", wantedFamily); |
| 96 | } else { |
| 97 | LOG_ERR("SDFS", "Failed to load SD font family: %s (clearing)", wantedFamily); |
| 98 | SETTINGS.sdFontFamilyName[0] = '\0'; |
| 99 | } |
| 100 | } else { |
| 101 | LOG_DBG("SDFS", "SD font family not found: %s (clearing)", wantedFamily); |
| 102 | SETTINGS.sdFontFamilyName[0] = '\0'; |
| 103 | } |
| 104 | } |
no test coverage detected