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*
sqlite-amalgamation*
mupdf/
djvulibre/
luafilesystem/
.reader.kpdfview.lua
kpdfview

@ -60,7 +60,7 @@ THIRDPARTYLIBS := $(MUPDFLIBDIR)/libfreetype.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
$(CC) -lm -ldl $(EMU_LDFLAGS) -lstdc++ \
$(CC) -lm -ldl -lpthread $(EMU_LDFLAGS) -lstdc++ \
kpdfview.o \
einkfb.o \
pdf.o \

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

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

Loading…
Cancel
Save