Merge pull request #31 from houqp/master

four fixes & one new feature
pull/2/merge
Dobrica Pavlinušić 12 years ago
commit 7f620c6374

2
.gitignore vendored

@ -4,7 +4,9 @@ lua-*
lsqlite3* lsqlite3*
sqlite-amalgamation* sqlite-amalgamation*
mupdf/ mupdf/
djvulibre/
luafilesystem/ luafilesystem/
.reader.kpdfview.lua
kpdfview kpdfview

@ -60,7 +60,7 @@ THIRDPARTYLIBS := $(MUPDFLIBDIR)/libfreetype.a \
LUALIB := $(LUADIR)/src/liblua.a LUALIB := $(LUADIR)/src/liblua.a
kpdfview: kpdfview.o einkfb.o pdf.o blitbuffer.o input.o util.o ft.o lfs.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) $(DJVULIBS) djvu.o kpdfview: kpdfview.o einkfb.o pdf.o blitbuffer.o input.o util.o ft.o lfs.o $(MUPDFLIBS) $(THIRDPARTYLIBS) $(LUALIB) $(DJVULIBS) djvu.o
$(CC) -lm -ldl $(EMU_LDFLAGS) -lstdc++ \ $(CC) -lm -ldl -lpthread $(EMU_LDFLAGS) -lstdc++ \
kpdfview.o \ kpdfview.o \
einkfb.o \ einkfb.o \
pdf.o \ pdf.o \

@ -35,7 +35,6 @@ longopts = {
function openFile(filename) function openFile(filename)
local file_type = string.lower(string.match(filename, ".+%.(.+)")) local file_type = string.lower(string.match(filename, ".+%.(.+)"))
if file_type == "djvu" then if file_type == "djvu" then
print "haha"
if DJVUReader:open(filename) then if DJVUReader:open(filename) then
page_num = DJVUReader.settings:readsetting("last_page") or 1 page_num = DJVUReader.settings:readsetting("last_page") or 1
DJVUReader:goto(tonumber(page_num)) DJVUReader:goto(tonumber(page_num))

@ -63,6 +63,7 @@ UniReader = {
cache_current_memsize = 0, cache_current_memsize = 0,
cache = {}, cache = {},
jump_stack = {}, jump_stack = {},
toc = nil,
} }
function UniReader:new(o) function UniReader:new(o)
@ -98,10 +99,15 @@ end
function UniReader:loadSettings(filename) function UniReader:loadSettings(filename)
if self.doc ~= nil then if self.doc ~= nil then
self.settings = DocSettings:open(filename) self.settings = DocSettings:open(filename)
local gamma = self.settings:readsetting("gamma") local gamma = self.settings:readsetting("gamma")
if gamma then if gamma then
self.globalgamma = gamma self.globalgamma = gamma
end end
local jumpstack = self.settings:readsetting("jumpstack")
self.jump_stack = jumpstack or {}
return true return true
end end
return false return false
@ -197,17 +203,21 @@ function UniReader:setzoom(page)
self.offset_x = (width - (self.globalzoom * pwidth)) / 2 self.offset_x = (width - (self.globalzoom * pwidth)) / 2
self.offset_y = 0 self.offset_y = 0
end end
self.pan_by_page = false
elseif self.globalzoommode == self.ZOOM_FIT_TO_PAGE_WIDTH elseif self.globalzoommode == self.ZOOM_FIT_TO_PAGE_WIDTH
or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH then or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH then
self.globalzoom = width / pwidth self.globalzoom = width / pwidth
self.offset_x = 0 self.offset_x = 0
self.offset_y = (height - (self.globalzoom * pheight)) / 2 self.offset_y = (height - (self.globalzoom * pheight)) / 2
self.pan_by_page = false
elseif self.globalzoommode == self.ZOOM_FIT_TO_PAGE_HEIGHT elseif self.globalzoommode == self.ZOOM_FIT_TO_PAGE_HEIGHT
or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HEIGHT then or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HEIGHT then
self.globalzoom = height / pheight self.globalzoom = height / pheight
self.offset_x = (width - (self.globalzoom * pwidth)) / 2 self.offset_x = (width - (self.globalzoom * pwidth)) / 2
self.offset_y = 0 self.offset_y = 0
self.pan_by_page = false
end end
if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT then if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT then
if (x1 - x0) < pwidth then if (x1 - x0) < pwidth then
self.globalzoom = width / (x1 - x0) self.globalzoom = width / (x1 - x0)
@ -243,7 +253,10 @@ function UniReader:setzoom(page)
self.pan_y = self.offset_y self.pan_y = self.offset_y
self.pan_by_page = true self.pan_by_page = true
end end
dc:setZoom(self.globalzoom) dc:setZoom(self.globalzoom)
self.globalzoom_orig = self.globalzoom
dc:setRotate(self.globalrotate); dc:setRotate(self.globalrotate);
dc:setOffset(self.offset_x, self.offset_y) dc:setOffset(self.offset_x, self.offset_y)
self.fullwidth, self.fullheight = page:getSize(dc) self.fullwidth, self.fullheight = page:getSize(dc)
@ -287,46 +300,74 @@ function UniReader:show(no)
self.slot_visible = slot; self.slot_visible = slot;
end end
function UniReader:add_jump(pageno) --[[
@ pageno is the page you want to add to jump_stack
--]]
function UniReader:add_jump(pageno, notes)
local jump_item = nil local jump_item = nil
-- add current page to jump_stack if no in local notes_to_add = notes
if not notes_to_add then
-- no notes given, auto generate from TOC entry
notes_to_add = self:getTOCTitleByPage(self.pageno)
if notes_to_add ~= "" then
notes_to_add = "in "..notes_to_add
end
end
-- move pageno page to jump_stack top if already in
for _t,_v in ipairs(self.jump_stack) do for _t,_v in ipairs(self.jump_stack) do
if _v.page == pageno then if _v.page == pageno then
jump_item = _v jump_item = _v
table.remove(self.jump_stack, _t) table.remove(self.jump_stack, _t)
elseif _v.page == no then -- if original notes is not empty, probably defined by users,
-- the page we jumped to should not be show in stack -- we use the original notes to overwrite auto generated notes
table.remove(self.jump_stack, _t) -- from TOC entry
if jump_item.notes ~= "" then
notes_to_add = jump_item.notes
end
jump_item.notes = notes or notes_to_add
break
end end
end end
-- create a new one if not found -- create a new one if page not found in stack
if not jump_item then if not jump_item then
jump_item = { jump_item = {
page = pageno, page = pageno,
datetime = os.date("%Y-%m-%d %H:%M:%S"), datetime = os.date("%Y-%m-%d %H:%M:%S"),
notes = notes_to_add,
} }
end end
-- insert at the start
-- insert item at the start
table.insert(self.jump_stack, 1, jump_item) table.insert(self.jump_stack, 1, jump_item)
if #self.jump_stack > 10 then if #self.jump_stack > 10 then
-- remove the last element to keep the size less than 10 -- remove the last element to keep the size less than 10
table.remove(self.jump_stack) table.remove(self.jump_stack)
end end
end end
function UniReader:del_jump(pageno)
for _t,_v in ipairs(self.jump_stack) do
if _v.page == pageno then
table.remove(self.jump_stack, _t)
end
end
end
-- change current page and cache next page after rendering -- change current page and cache next page after rendering
function UniReader:goto(no) function UniReader:goto(no)
if no < 1 or no > self.doc:getPages() then if no < 1 or no > self.doc:getPages() then
return return
end end
-- for jump_stack -- for jump_stack, distinguish jump from normal page turn
if self.pageno and math.abs(self.pageno - no) > 1 then if self.pageno and math.abs(self.pageno - no) > 1 then
self:add_jump(self.pageno) self:add_jump(self.pageno)
end end
self.pageno = no self.pageno = no
self:show(no) self:show(no)
if no < self.doc:getPages() then if no < self.doc:getPages() then
if self.globalzoommode ~= self.ZOOM_BY_VALUE then if self.globalzoommode ~= self.ZOOM_BY_VALUE then
-- pre-cache next page -- pre-cache next page
@ -366,13 +407,38 @@ function UniReader:setrotate(rotate)
self:goto(self.pageno) self:goto(self.pageno)
end end
function UniReader:cleanUpTOCTitle(title)
return title:gsub("\13", "")
end
function UniReader:fillTOC()
self.toc = self.doc:getTOC()
end
function UniReader:getTOCTitleByPage(pageno)
if not self.toc then
-- build toc when needed.
self:fillTOC()
end
for _k,_v in ipairs(self.toc) do
if _v.page >= pageno then
return self:cleanUpTOCTitle(_v.title)
end
end
return ""
end
function UniReader:showTOC() function UniReader:showTOC()
toc = self.doc:getTOC() if not self.toc then
-- build toc when needed.
self:fillTOC()
end
local menu_items = {} local menu_items = {}
-- build menu items -- build menu items
for _k,_v in ipairs(toc) do for _k,_v in ipairs(self.toc) do
table.insert(menu_items, table.insert(menu_items,
(" "):rep(_v.depth-1).._v.title) (" "):rep(_v.depth-1)..self:cleanUpTOCTitle(_v.title))
end end
toc_menu = SelectMenu:new{ toc_menu = SelectMenu:new{
menu_title = "Table of Contents", menu_title = "Table of Contents",
@ -381,7 +447,7 @@ function UniReader:showTOC()
} }
item_no = toc_menu:choose(0, fb.bb:getHeight()) item_no = toc_menu:choose(0, fb.bb:getHeight())
if item_no then if item_no then
self:goto(toc[item_no].page) self:goto(self.toc[item_no].page)
else else
self:goto(self.pageno) self:goto(self.pageno)
end end
@ -391,7 +457,7 @@ function UniReader:showJumpStack()
local menu_items = {} local menu_items = {}
for _k,_v in ipairs(self.jump_stack) do for _k,_v in ipairs(self.jump_stack) do
table.insert(menu_items, table.insert(menu_items,
_v.datetime.." -> Page ".._v.page) _v.datetime.." -> Page ".._v.page.." ".._v.notes)
end end
jump_menu = SelectMenu:new{ jump_menu = SelectMenu:new{
menu_title = "Jump Keeper (current page: "..self.pageno..")", menu_title = "Jump Keeper (current page: "..self.pageno..")",
@ -580,13 +646,16 @@ function UniReader:inputloop()
end end
end end
-- do clean up stuff
self:clearcache() self:clearcache()
self.toc = nil
if self.doc ~= nil then if self.doc ~= nil then
self.doc:close() self.doc:close()
end end
if self.settings ~= nil then if self.settings ~= nil then
self.settings:savesetting("last_page", self.pageno) self.settings:savesetting("last_page", self.pageno)
self.settings:savesetting("gamma", self.globalgamma) self.settings:savesetting("gamma", self.globalgamma)
self.settings:savesetting("jumpstack", self.jump_stack)
self.settings:close() self.settings:close()
end end

Loading…
Cancel
Save