mirror of
https://github.com/hrydgard/ppsspp.git
synced 2026-10-14 15:00:30 +02:00
Any 200 response went into the cache, and one that didn't decode (a captive portal's HTML, or a PNG over the 256x128 limit) was marked bad, saved to icon.cache and never downloaded again. Remove it and mark it failed, so MarkPending allows another download after the retry delay. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
78 lines
1.8 KiB
C++
78 lines
1.8 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;
|
|
double usedTimeStamp;
|
|
};
|
|
|
|
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;
|