mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
serialize the most recently used blitbuffer/koptcontext
to speedup koreader startup for PDF/DJVU documents especially when reflowing
This commit is contained in:
131
frontend/memutils.lua
Normal file
131
frontend/memutils.lua
Normal file
@@ -0,0 +1,131 @@
|
||||
local ffi = require "ffi"
|
||||
local bit = require "bit"
|
||||
local band = bit.band
|
||||
local bor = bit.bor
|
||||
local rshift = bit.rshift
|
||||
local lshift = bit.lshift
|
||||
|
||||
|
||||
|
||||
|
||||
ffi.cdef[[
|
||||
void * malloc ( size_t size );
|
||||
void free ( void * ptr );
|
||||
void * realloc ( void * ptr, size_t size );
|
||||
]]
|
||||
|
||||
function bzero(dest, nbytes)
|
||||
ffi.fill(dest, nbytes)
|
||||
return dest
|
||||
end
|
||||
|
||||
function bcopy(src, dest, nbytes)
|
||||
ffi.copy(dest, src, nbytes)
|
||||
end
|
||||
|
||||
function bcmp(ptr1, ptr2, nbytes)
|
||||
for i=0,nbytes do
|
||||
if ptr1[i] ~= ptr2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
|
||||
|
||||
function memset(dest, c, len)
|
||||
ffi.fill(dest, len, c)
|
||||
return dest
|
||||
end
|
||||
|
||||
function memcpy(dest, src, nbytes)
|
||||
ffi.copy(dest, src, nbytes)
|
||||
end
|
||||
|
||||
function memcmp(ptr1, ptr2, nbytes)
|
||||
local p1 = ffi.cast("const uint8_t *", ptr1)
|
||||
local p2 = ffi.cast("const uint8_t *", ptr2)
|
||||
|
||||
for i=0,nbytes do
|
||||
if p1[i] ~= p2[i] then return -1 end
|
||||
end
|
||||
|
||||
return 0
|
||||
end
|
||||
|
||||
function memchr(ptr, value, num)
|
||||
local p = ffi.cast("const uint8_t *", ptr)
|
||||
for i=0,num-1 do
|
||||
if p[i] == value then return p+i end
|
||||
end
|
||||
|
||||
return nil
|
||||
end
|
||||
|
||||
function memmove(dst, src, num)
|
||||
local srcptr = ffi.cast("const uint8_t*", src)
|
||||
|
||||
-- If equal, just return
|
||||
if dst == srcptr then return dst end
|
||||
|
||||
|
||||
if srcptr < dst then
|
||||
-- copy from end
|
||||
for i=num-1,0, -1 do
|
||||
dst[i] = srcptr[i];
|
||||
end
|
||||
else
|
||||
-- copy from beginning
|
||||
for i=0,num-1 do
|
||||
dst[i] = srcptr[i];
|
||||
end
|
||||
end
|
||||
return dst
|
||||
end
|
||||
|
||||
local function memreverse(buff, bufflen)
|
||||
local i = 0;
|
||||
local tmp
|
||||
|
||||
while (i < (bufflen)/2) do
|
||||
tmp = buff[i];
|
||||
buff[i] = buff[bufflen-i-1];
|
||||
buff[bufflen-i-1] = tmp;
|
||||
|
||||
i = i + 1;
|
||||
end
|
||||
return buff
|
||||
end
|
||||
|
||||
local function getreverse(src, len)
|
||||
if not len then
|
||||
if type(src) == "string" then
|
||||
len = #src
|
||||
else
|
||||
return nil, "unknown length"
|
||||
end
|
||||
end
|
||||
|
||||
local srcptr = ffi.cast("const uint8_t *", src);
|
||||
local dst = ffi.new("uint8_t[?]", len)
|
||||
|
||||
for i = 0, len-1 do
|
||||
dst[i] = srcptr[len-1-i];
|
||||
end
|
||||
|
||||
return dst, len
|
||||
end
|
||||
|
||||
return {
|
||||
bcmp = bcmp,
|
||||
bcopy = bcopy,
|
||||
bzero = bzero,
|
||||
|
||||
memchr = memchr,
|
||||
memcpy = memcpy,
|
||||
memcmp = memcmp,
|
||||
memmove = memmove,
|
||||
memset = memset,
|
||||
|
||||
memreverse = memreverse,
|
||||
}
|
||||
Reference in New Issue
Block a user