Files
ppsspp/Common/UI/IconCache.h
T
Henrik RydgårdandClaude Opus 5.5 937b00af46 IconCache: Expire saved icons after 24 hours
Icons were kept in icon.cache indefinitely, so one that changes on the
server (a RetroAchievements user avatar, keyed by username) never
refreshed. The insertion timestamp was process-relative, so it couldn't
be compared across sessions. Store wall-clock time, and skip entries
older than a day when loading. Bumps the cache version.

Co-Authored-By: Claude Opus 5.5 (1M context) <[email protected]>
2026-09-30 11:29:43 -06:00

81 lines
2.0 KiB
C++

#pragma once
#include <map>
#include <set>
#include <string_view>
#include <mutex>
#include <cstdint>
#include "Common/File/Path.h"
class UIContext;
enum class IconFormat : uint32_t {
PNG,
};
namespace Draw {
class Texture;
}
// TODO: Possibly make this smarter and use instead of ManagedTexture?
struct IconCacheStats {
size_t cachedCount;
size_t textureCount; // number of cached images that are "live" textures
size_t pending;
size_t dataSize;
};
class IconCache {
public:
// NOTE: Don't store the returned texture. Only use it to look up dimensions or other properties,
// instead call BindIconTexture every time you want to use it.
Draw::Texture *BindIconTexture(UIContext *context, std::string_view key);
// It's okay to call these from any thread.
bool MarkPending(std::string_view key); // returns false if already pending or loaded
void CancelPending(std::string_view key);
// Like CancelPending, but MarkPending refuses the key for a while, so a failing download isn't retried every frame.
void MarkFailed(std::string_view key);
bool InsertIcon(std::string_view key, IconFormat format, std::string &&pngData);
bool GetDimensions(std::string_view key, int *width, int *height);
bool Contains(std::string_view key);
void SaveToFile(FILE *file);
bool LoadFromFile(FILE *file);
void FrameUpdate();
void ClearTextures();
void ClearData();
IconCacheStats GetStats();
private:
void Decimate(int64_t maxSize);
struct Entry {
std::string data;
IconFormat format;
Draw::Texture *texture;
double insertedTimeStamp; // Wall-clock (time_now_unix_utc), since it's saved.
double usedTimeStamp;
double uploadFailedTime; // When CreateTexture last failed, or 0.
int width; // From the image header, 0 if unknown.
int height;
};
std::map<std::string, Entry, std::less<>> cache_;
std::set<std::string, std::less<>> pending_;
std::map<std::string, double, std::less<>> failed_; // key -> time of failure
std::mutex lock_;
double lastUpdate_ = 0.0;
double lastDecimate_ = 0.0;
};
extern IconCache g_iconCache;