2#include <unordered_map>
5#include <boost/unordered_map.hpp>
15class BasicTextureCache :
public TextureCache
23 static std::pair<int, int> dims_to_inds(
Geom::IntPoint const &dims) {
return { dim_to_ind(dims.
x()), dim_to_ind(dims.
y()) }; }
24 static Geom::IntPoint inds_to_maxdims(std::pair<int, int>
const &inds) {
return { ind_to_maxdim(inds.first), ind_to_maxdim(inds.second) }; }
33 boost::unordered_map<std::pair<int, int>, Bucket>
buckets;
47 if (!b.unused.empty()) {
48 tex = std::move(b.unused.back());
50 glBindTexture(GL_TEXTURE_2D, tex.id());
52 tex = Texture(inds_to_maxdims(indexes));
57 if (b.used > b.high_use_count) {
59 b.high_use_count = b.used;
66 void finish(Texture tex)
override
68 auto indexes = dims_to_inds(tex.size());
75 b.unused.emplace_back(std::move(tex));
80 if (expiration_timer >= expiration_timeout) {
84 int max_unused = b.high_use_count - b.used;
85 assert(max_unused >= 0);
86 if (b.unused.size() > max_unused) {
87 b.unused.resize(max_unused);
89 b.high_use_count = b.used;
99 return std::make_unique<BasicTextureCache>();
Two-dimensional point with integer coordinates.
constexpr IntCoord x() const noexcept
constexpr IntCoord y() const noexcept
static std::unique_ptr< TextureCache > create()
int constexpr floorlog2(T x)
Returns floor(log_2(x)), assuming x >= 1.
Helper class to stream background task notifications as a series of messages.
std::vector< Bucket > buckets
static int constexpr expiration_timeout
static int constexpr min_dimension
std::vector< Texture > unused
Geom::IntPoint dimensions(const Cairo::RefPtr< Cairo::ImageSurface > &surface)