#pragma once #include #include #include #include #include #include // Rasterizes and caches the per-building chip SVGs (REQ-UI-BUILD-ICON). A chip is a // rounded colored background bearing a white line glyph, loaded from a directory with // one file per building named after the building's id (e.g. "belt.svg"). Shared by the // build button bar and the selection panel's card header (REQ-UI-SELECTION-CARD) so the // rasterization is not duplicated. // // A missing icon file is not an error: hasIcon() returns false for it and the caller // falls back (a name caption on a build button, a bare title in the panel header). class BuildingIconCache { public: // iconDir is the directory holding the ".svg" chip files (typically // "/../icons/buildings"). explicit BuildingIconCache(const QString& iconDir); // True if a chip SVG file exists for the given icon name. Loads the file's bytes on // first query and remembers the result (including absence) so repeated calls are // cheap. The name is a building id for the building buttons, but need not be one -- // the Deconstruct button's "deconstruct" chip goes through the same path. bool hasIcon(const std::string& iconName); // The chip rasterized to a transparent sizePx*sizePx pixmap at the device pixel // ratio, cached per (name, size). Returns a null pixmap when the file is missing. QPixmap getChip(const std::string& iconName, int sizePx); // As getChip(), but with the chip background recolored grey and the glyph left // alone, for a build button the player cannot currently afford // (REQ-UI-BUILD-DISABLED). QPixmap getGreyChip(const std::string& iconName, int sizePx); private: // Raw SVG bytes for an icon name, loading and caching them on first access. An // absent file caches an empty QByteArray so it is not retried. const QByteArray& getSvg(const std::string& iconName); // The same SVG with its background fill replaced by grey, cached alongside. const QByteArray& getGreySvg(const std::string& iconName); // Shared rasterize-and-cache step. cacheKey distinguishes the normal and grey // variants of one icon name within the single pixmap cache. QPixmap getPixmap(const std::string& cacheKey, const QByteArray& svg, int sizePx); QString m_iconDir; std::map m_svgByName; std::map m_greySvgByName; std::map, QPixmap> m_pixmapCache; };