CRe: use getDocumentRenderingHash() to detect rendering changes

Instead of just relying on document full height
and number of pages.
reviewable/pr7211/r4
poire-z 3 years ago
parent fbdff1c672
commit 7779e2d8e7

@ -41,8 +41,7 @@ local band = bit.band
--]] --]]
local ReaderRolling = InputContainer:new{ local ReaderRolling = InputContainer:new{
pan_rate = 30, -- default 30 ops, will be adjusted in readerui pan_rate = 30, -- default 30 ops, will be adjusted in readerui
old_doc_height = nil, rendering_hash = 0,
old_page = nil,
current_pos = 0, current_pos = 0,
inverse_reading_order = nil, inverse_reading_order = nil,
-- only used for page view mode -- only used for page view mode
@ -119,9 +118,8 @@ function ReaderRolling:init()
end end
table.insert(self.ui.postInitCallback, function() table.insert(self.ui.postInitCallback, function()
self.rendering_hash = self.ui.document:getDocumentRenderingHash()
self.ui.document:_readMetadata() self.ui.document:_readMetadata()
self.old_doc_height = self.ui.document.info.doc_height
self.old_page = self.ui.document.info.number_of_pages
end) end)
table.insert(self.ui.postReaderCallback, function() table.insert(self.ui.postReaderCallback, function()
self:updatePos() self:updatePos()
@ -497,7 +495,7 @@ end
function ReaderRolling:getLastPercent() function ReaderRolling:getLastPercent()
if self.view.view_mode == "page" then if self.view.view_mode == "page" then
return self.current_page / self.old_page return self.current_page / self.ui.document.info.number_of_pages
else else
--- @fixme the calculated percent is not accurate in "scroll" mode. --- @fixme the calculated percent is not accurate in "scroll" mode.
return self.ui.document:getPosFromXPointer( return self.ui.document:getPosFromXPointer(
@ -816,7 +814,6 @@ function ReaderRolling:onPanning(args, _)
end end
function ReaderRolling:onZoom() function ReaderRolling:onZoom()
--- @todo Re-read doc_height info after font or lineheight changes. 05.06 2012 (houqp)
self:updatePos() self:updatePos()
end end
@ -849,24 +846,23 @@ function ReaderRolling:updatePos()
-- document closed since we were scheduleIn'ed -- document closed since we were scheduleIn'ed
return return
end end
-- reread document height -- Check if the document has been re-rendered
self.ui.document:_readMetadata() local new_rendering_hash = self.ui.document:getDocumentRenderingHash()
-- update self.current_pos if the height of document has been changed. if new_rendering_hash ~= self.rendering_hash then
local new_height = self.ui.document.info.doc_height logger.dbg("rendering hash changed:", self.rendering_hash, ">", new_rendering_hash)
local new_page = self.ui.document.info.number_of_pages self.rendering_hash = new_rendering_hash
if self.old_doc_height ~= new_height or self.old_page ~= new_page then -- A few things like page numbers may have changed
self.ui.document:_readMetadata() -- get updated document height and nb of pages
if self.hide_nonlinear_flows then if self.hide_nonlinear_flows then
self.ui.document:cacheFlows() self.ui.document:cacheFlows()
end end
self:_gotoXPointer(self.xpointer) self:_gotoXPointer(self.xpointer)
self.old_doc_height = new_height
self.old_page = new_page
self.ui:handleEvent(Event:new("UpdateToc")) self.ui:handleEvent(Event:new("UpdateToc"))
end end
self:updateTopStatusBarMarkers() self:updateTopStatusBarMarkers()
UIManager:setDirty(self.view.dialog, "partial") UIManager:setDirty(self.view.dialog, "partial")
-- Allow for the new rendering to be shown before possibly showing -- Allow for the new rendering to be shown before possibly showing
-- the "Styles have changes..." ConfirmBox so the user can decide -- the "Styles have changed..." ConfirmBox so the user can decide
-- if it is really needed -- if it is really needed
UIManager:scheduleIn(0.1, function () UIManager:scheduleIn(0.1, function ()
self:onCheckDomStyleCoherence() self:onCheckDomStyleCoherence()
@ -877,9 +873,8 @@ end
switching screen mode should not change current page number switching screen mode should not change current page number
--]] --]]
function ReaderRolling:onChangeViewMode() function ReaderRolling:onChangeViewMode()
self.rendering_hash = self.ui.document:getDocumentRenderingHash()
self.ui.document:_readMetadata() self.ui.document:_readMetadata()
self.old_doc_height = self.ui.document.info.doc_height
self.old_page = self.ui.document.info.number_of_pages
self.ui:handleEvent(Event:new("UpdateToc")) self.ui:handleEvent(Event:new("UpdateToc"))
if self.xpointer then if self.xpointer then
self:_gotoXPointer(self.xpointer) self:_gotoXPointer(self.xpointer)

@ -270,6 +270,13 @@ function CreDocument:render()
logger.dbg("CreDocument: rendering done.") logger.dbg("CreDocument: rendering done.")
end end
function CreDocument:getDocumentRenderingHash()
if self.been_rendered then
return self._document:getDocumentRenderingHash()
end
return 0
end
function CreDocument:_readMetadata() function CreDocument:_readMetadata()
Document._readMetadata(self) -- will grab/update self.info.number_of_pages Document._readMetadata(self) -- will grab/update self.info.number_of_pages
if self.been_rendered then if self.been_rendered then

Loading…
Cancel
Save