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, 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) diff --git a/frontend/ui/reader/readerpaging.lua b/frontend/ui/reader/readerpaging.lua index 3100424fb..1b5e7a2f2 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,34 @@ 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 page view 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 +282,7 @@ function ReaderPaging:onPagingRel(diff) else self:onGotoPageRel(diff) end + self:setPagePosition(self:getTopPage(), self:getTopPosition()) return true end @@ -264,18 +290,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