From b85a39d3f6412f07ad6d12d0ba551b9c8fa209ad Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 27 Apr 2013 16:37:18 +0800 Subject: [PATCH 1/4] add reading position on each page Page position is a fractional number ranging from 0 to 1, indicating the read percentage on certain page. With the position information on each page whenever users change font size, page margin or line spacing or close and reopen the book, the page view will be roughly the same. --- frontend/ui/reader/readerpaging.lua | 67 +++++++++++++++++++++++++++-- 1 file changed, 64 insertions(+), 3 deletions(-) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 3100424fb..5d55c1308 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -125,6 +125,7 @@ function ReaderPaging:initGesListener() end function ReaderPaging:onReadSettings(config) + self.page_positions = config:readSetting("page_positions") or {} self:gotoPage(config:readSetting("last_page") or 1) local soe = config:readSetting("show_overlap_enable") if not soe then @@ -133,10 +134,35 @@ function ReaderPaging:onReadSettings(config) end function ReaderPaging:onCloseDocument() - self.ui.doc_settings:saveSetting("last_page", self.current_page) + self.ui.doc_settings:saveSetting("page_positions", self.page_positions) + self.ui.doc_settings:saveSetting("last_page", self:getTopPage()) self.ui.doc_settings:saveSetting("percent_finished", self.current_page/self.number_of_pages) end +--[[ +Set reading position on certain page +Page position is a fractional number ranging from 0 to 1, indicating the read percentage on +certain page. With the position information on each page whenever users change font size, +page margin or line spacing or close and reopen the book, the reading position will be +roughly the same. +--]] +function ReaderPaging:setPagePosition(page, pos) + DEBUG("set page position", pos) + self.page_positions[page] = pos +end + +--[[ +Get reading position on certain page +--]] +function ReaderPaging:getPagePosition(page) + -- Page number ought to be integer, somehow I notice that with + -- fractional page number the reader runs silently well, but the + -- number won't fit to retrieve page position. + page = math.floor(page) + DEBUG("get page position", self.page_positions[page]) + return self.page_positions[page] or 0 +end + function ReaderPaging:onTapForward() self:onPagingRel(1) return true @@ -257,6 +283,7 @@ function ReaderPaging:onPagingRel(diff) else self:onGotoPageRel(diff) end + self:setPagePosition(self:getTopPage(), self:getTopPosition()) return true end @@ -264,18 +291,52 @@ function ReaderPaging:onPanningRel(diff) if self.view.page_scroll then self:onScrollPanRel(diff) end + self:setPagePosition(self:getTopPage(), self:getTopPosition()) return true end +--[[ +Get read percentage on current page. +--]] +function ReaderPaging:getTopPosition() + if self.view.page_scroll then + local state = self.view.page_states[1] + return (state.visible_area.y - state.page_area.y)/state.page_area.h + else + return 0 + end +end + +--[[ +Get page number of the page drawn at the very top part of the screen. +--]] +function ReaderPaging:getTopPage() + if self.view.page_scroll then + local state = self.view.page_states[1] + return state.page + else + return self.current_page + end +end + function ReaderPaging:onInitScrollPageStates(orig) - DEBUG("init scroll page states") + DEBUG("init scroll page states", orig) if self.view.page_scroll then self.orig_page = self.current_page self.view.page_states = {} local blank_area = Geom:new{} blank_area:setSizeTo(self.view.dimen) while blank_area.h > 0 do - local state = self:getNextPageState(blank_area, Geom:new{}) + local offset = Geom:new{} + -- caculate position in current page + if self.current_page == self.orig_page then + local page_area = self.view:getPageArea( + self.view.state.page, + self.view.state.zoom, + self.view.state.rotation) + offset.y = page_area.h * self:getPagePosition(self.current_page) + end + local state = self:getNextPageState(blank_area, offset) --DEBUG("init new state", state) table.insert(self.view.page_states, state) if blank_area.h > 0 then From 19f227f7b150236ea72df7671e1d0fd7fd234c3e Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 27 Apr 2013 17:48:27 +0800 Subject: [PATCH 2/4] enlarge OCR region --- frontend/ui/reader/readerhighlight.lua | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/frontend/ui/reader/readerhighlight.lua b/frontend/ui/reader/readerhighlight.lua index 76fb3256d..9a068c025 100644 --- a/frontend/ui/reader/readerhighlight.lua +++ b/frontend/ui/reader/readerhighlight.lua @@ -77,11 +77,11 @@ function ReaderHighlight:onHold(arg, ges) else UIManager:scheduleIn(0.1, function() local word_box = self.word_info.box - word_box.x = word_box.x - math.floor(word_box.h * 0.02) - word_box.y = word_box.y - math.floor(word_box.h * 0.02) - word_box.w = word_box.w + math.floor(word_box.h * 0.04) - word_box.h = word_box.h + math.floor(word_box.h * 0.04) - -- local word = self.ui.document:getOCRWord(self.pos.page, word_box) + word_box.x = word_box.x - math.floor(word_box.h * 0.1) + word_box.y = word_box.y - math.floor(word_box.h * 0.1) + word_box.w = word_box.w + math.floor(word_box.h * 0.2) + word_box.h = word_box.h + math.floor(word_box.h * 0.2) + --local word = self.ui.document:getOCRWord(self.pos.page, word_box) DEBUG("OCRed word:", word) self.ui:handleEvent(Event:new("LookupWord", word)) end) From 1a8bd4ca8c68b81a90b653dbfca4bc5846907c5a Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 27 Apr 2013 17:48:59 +0800 Subject: [PATCH 3/4] try to drop cache before OCR --- frontend/document/koptinterface.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index e1af67ef7..2b5cbaa45 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -117,6 +117,7 @@ function KoptInterface:getOCRWord(doc, pageno, rect) if cached then local kc = self:waitForContext(cached.kctx) local fullwidth, fullheight = kc:getPageDim() + --os.execute("echo 3 > /proc/sys/vm/drop_caches") local ok, word = pcall( kc.getOCRWord, kc, self.tessocr_data, From 7b97ce4eebd30f0116387c915f1b95f5132a01a0 Mon Sep 17 00:00:00 2001 From: chrox Date: Sat, 27 Apr 2013 17:50:20 +0800 Subject: [PATCH 4/4] comment revision --- frontend/ui/reader/readerpaging.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 5d55c1308..1b5e7a2f2 100644 --- a/frontend/ui/reader/readerpaging.lua +++ b/frontend/ui/reader/readerpaging.lua @@ -143,8 +143,7 @@ end Set reading position on certain page Page position is a fractional number ranging from 0 to 1, indicating the read percentage on certain page. With the position information on each page whenever users change font size, -page margin or line spacing or close and reopen the book, the reading position will be -roughly the same. +page margin or line spacing or close and reopen the book, the page view will be roughly the same. --]] function ReaderPaging:setPagePosition(page, pos) DEBUG("set page position", pos)