mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
TileCacheItem: add created_ts property. Document: manage a tile_cache_validity_ts and ignore older cached tiles. This timestamps is updated when highlights are written as annotations in, or deleted from, the PDF, so we can get the most current rendered bitmap from MuPDF and avoid highlight ghosts on old tiles. Save this timestamp in doc settings so older cached to disk tiles will also be ignored across re-openings. Bump base for: mupdf.lua: update frontend pboxes with MuPDF adjusted ones.
77 lines
1.9 KiB
Lua
77 lines
1.9 KiB
Lua
local Blitbuffer = require("ffi/blitbuffer")
|
|
local CacheItem = require("cacheitem")
|
|
local Persist = require("persist")
|
|
local logger = require("logger")
|
|
|
|
local TileCacheItem = CacheItem:new{}
|
|
|
|
function TileCacheItem:onFree()
|
|
logger.dbg("TileCacheItem: free blitbuffer", self.bb)
|
|
self.bb:free()
|
|
end
|
|
|
|
--- @note: Perhaps one day we'll be able to teach bitser or string.buffer about custom structs with pointers to buffers,
|
|
--- so we won't have to do the BB tostring/fromstring dance anymore...
|
|
function TileCacheItem:totable()
|
|
local t = {
|
|
size = self.size,
|
|
pageno = self.pageno,
|
|
excerpt = self.excerpt,
|
|
created_ts = self.created_ts,
|
|
persistent = self.persistent,
|
|
bb = {
|
|
w = self.bb.w,
|
|
h = self.bb.h,
|
|
stride = tonumber(self.bb.stride),
|
|
fmt = self.bb:getType(),
|
|
data = Blitbuffer.tostring(self.bb),
|
|
},
|
|
}
|
|
|
|
return t
|
|
end
|
|
|
|
function TileCacheItem:dump(filename)
|
|
logger.dbg("Dumping tile cache to", filename, self.excerpt)
|
|
|
|
local cache_file = Persist:new{
|
|
path = filename,
|
|
codec = "zstd",
|
|
}
|
|
|
|
local ok, size = cache_file:save(self:totable())
|
|
if ok then
|
|
return size
|
|
else
|
|
logger.warn("Failed to dump tile cache")
|
|
return nil
|
|
end
|
|
end
|
|
|
|
function TileCacheItem:fromtable(t)
|
|
self.size = t.size
|
|
self.pageno = t.pageno
|
|
self.excerpt = t.excerpt
|
|
self.created_ts = t.created_ts
|
|
self.persistent = t.persistent
|
|
self.bb = Blitbuffer.fromstring(t.bb.w, t.bb.h, t.bb.fmt, t.bb.data, t.bb.stride)
|
|
end
|
|
|
|
function TileCacheItem:load(filename)
|
|
local cache_file = Persist:new{
|
|
path = filename,
|
|
codec = "zstd",
|
|
}
|
|
|
|
local t = cache_file:load(filename)
|
|
if t then
|
|
self:fromtable(t)
|
|
|
|
logger.dbg("Loaded tile cache from", filename, self)
|
|
else
|
|
logger.warn("Failed to load tile cache from", filename)
|
|
end
|
|
end
|
|
|
|
return TileCacheItem
|