From 1f511757c5031af0013c3a0535d67fabe030943c Mon Sep 17 00:00:00 2001 From: chrox Date: Sun, 10 Feb 2013 20:52:44 +0800 Subject: [PATCH 1/5] bugfix: calculate current config value or arg at runtime --- frontend/document/koptinterface.lua | 1 + frontend/ui/config.lua | 8 ++++++-- 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index c17743b21..a3d4ebb14 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -28,6 +28,7 @@ KoptOptions = { toggle = {"portrait", "landscape"}, args = {"portrait", "landscape"}, default_arg = Screen:getScreenMode(), + current_func = function() return Screen:getScreenMode() end, event = "SetScreenMode", } } diff --git a/frontend/ui/config.lua b/frontend/ui/config.lua index 32d269459..1c2123025 100644 --- a/frontend/ui/config.lua +++ b/frontend/ui/config.lua @@ -380,7 +380,9 @@ function ConfigOption:init() local current_item = nil if self.options[c].name then if self.options[c].values then - local val = self.config.configurable[self.options[c].name] + -- check if current value is stored in configurable or calculated in runtime + local val = self.options[c].current_func and self.options[c].current_func() + or self.config.configurable[self.options[c].name] local min_diff = math.abs(val - self.options[c].values[1]) local diff = nil for index, val_ in pairs(self.options[c].values) do @@ -395,7 +397,9 @@ function ConfigOption:init() end end elseif self.options[c].args then - local arg = self.config.configurable[self.options[c].name] + -- check if current arg is stored in configurable or calculated in runtime + local arg = self.options[c].current_func and self.options[c].current_func() + or self.config.configurable[self.options[c].name] for idx, arg_ in pairs(self.options[c].args) do if arg_ == arg then current_item = idx From 0137fe7af40638fa3ccee745a6a3aed7287f1a8c Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 11 Feb 2013 00:09:33 +0800 Subject: [PATCH 2/5] add screen mode restoration for each document --- frontend/ui/reader/readermenu.lua | 2 ++ frontend/ui/reader/readerview.lua | 19 +++++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/frontend/ui/reader/readermenu.lua b/frontend/ui/reader/readermenu.lua index 412ff21ba..671e8dce6 100644 --- a/frontend/ui/reader/readermenu.lua +++ b/frontend/ui/reader/readermenu.lua @@ -58,6 +58,8 @@ function ReaderMenu:setUpdateItemTable() table.insert(self.item_table, { text = "Return to file manager", callback = function() + self.ui:handleEvent(Event:new("RestoreScreenMode", + G_reader_settings:readSetting("screen_mode") or "portrait")) UIManager:close(self.menu_container) self.ui:onClose() end diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 4d832ade3..4c3db04c0 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -132,12 +132,21 @@ end function ReaderView:onSetScreenMode(new_mode) if new_mode == "landscape" or new_mode == "portrait" then + self.screen_mode = new_mode Screen:setScreenMode(new_mode) self.ui:handleEvent(Event:new("SetDimensions", Screen:getSize())) end return true end +function ReaderView:onRestoreScreenMode(old_mode) + if old_mode == "landscape" or old_mode == "portrait" then + Screen:setScreenMode(old_mode) + self.ui:handleEvent(Event:new("SetDimensions", Screen:getSize())) + end + return true +end + function ReaderView:onSetDimensions(dimensions) self.dimen = dimensions -- recalculate view @@ -146,15 +155,24 @@ end function ReaderView:onReadSettings(config) self.render_mode = config:readSetting("render_mode") or 0 + self.init_screen_mode = config:readSetting("screen_mode") or "portrait" end function ReaderView:onPageUpdate(new_page_no) self.state.page = new_page_no + if self.init_screen_mode then + self.ui:handleEvent(Event:new("SetScreenMode", self.init_screen_mode)) + self.init_screen_mode = nil + end self:recalculate() end function ReaderView:onPosUpdate(new_pos) self.state.pos = new_pos + if self.init_screen_mode then + self.ui:handleEvent(Event:new("SetScreenMode", self.init_screen_mode)) + self.init_screen_mode = nil + end self:recalculate() end @@ -192,4 +210,5 @@ end function ReaderView:onCloseDocument() self.ui.doc_settings:saveSetting("render_mode", self.render_mode) + self.ui.doc_settings:saveSetting("screen_mode", self.screen_mode) end From 7af80f63f6f40dcc51c4ca8ae6da82c570299554 Mon Sep 17 00:00:00 2001 From: chrox Date: Mon, 11 Feb 2013 00:51:55 +0800 Subject: [PATCH 3/5] check screen mode in koptinterface --- frontend/document/koptinterface.lua | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index a3d4ebb14..b29257b12 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -191,12 +191,13 @@ KoptInterface = {} -- get reflow context function KoptInterface:getKOPTContext(doc, pageno, bbox) local kc = KOPTContext.new() + local screen_size = Screen:getSize() kc:setTrim(doc.configurable.trim_page) kc:setWrap(doc.configurable.text_wrap) kc:setIndent(doc.configurable.detect_indent) kc:setRotate(doc.configurable.screen_rotation) kc:setColumns(doc.configurable.max_columns) - kc:setDeviceDim(doc.screen_size.w, doc.screen_size.h) + kc:setDeviceDim(screen_size.w, screen_size.h) kc:setDeviceDPI(doc.screen_dpi) kc:setStraighten(doc.configurable.auto_straighten) kc:setJustification(doc.configurable.justification) @@ -215,8 +216,9 @@ end function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation) -- check cached page size self.cur_bbox = doc:getPageBBox(pageno) - local bbox = self.cur_bbox - local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + self.screen_mode = Screen:getScreenMode() + local bbox_hash = self.cur_bbox.x0.."|"..self.cur_bbox.y0.."|"..self.cur_bbox.x1.."|"..self.cur_bbox.y1 + local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode local cached = Cache:check(hash) if not cached then local kc = self:getKOPTContext(doc, pageno, self.cur_bbox) @@ -240,8 +242,9 @@ end function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode) doc.render_mode = render_mode self.cur_bbox = doc:getPageBBox(pageno) - local bbox = self.cur_bbox - local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + self.screen_mode = Screen:getScreenMode() + local bbox_hash = self.cur_bbox.x0.."|"..self.cur_bbox.y0.."|"..self.cur_bbox.x1.."|"..self.cur_bbox.y1 + local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode local page_size = self:getPageDimensions(doc, pageno, zoom, rotation) -- this will be the size we actually render local size = page_size @@ -272,13 +275,13 @@ function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode } -- draw to blitbuffer - local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode local page = doc._document:openPage(pageno) local cached = Cache:check(kc_hash) if cached then page:rfdraw(cached.kctx, tile.bb) page:close() - DEBUG("cached hash", hash) + --DEBUG("cached hash", hash) if not Cache:check(hash) then Cache:insert(hash, tile) end @@ -289,7 +292,7 @@ end function KoptInterface:drawPage(doc, target, x, y, rect, pageno, zoom, rotation, render_mode) local tile = self:renderPage(doc, pageno, rect, zoom, rotation, render_mode) - DEBUG("now painting", tile, rect) + --DEBUG("now painting", tile, rect) target:blitFrom(tile.bb, x, y, rect.x - tile.excerpt.x, From 438c828e988c8e3f8e4cdee06938348f7f83a198 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Feb 2013 00:59:28 +0800 Subject: [PATCH 4/5] cleanup: use postInitCallback to restore screen mode --- frontend/ui/reader/readerview.lua | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 4c3db04c0..0ae308d13 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -155,24 +155,20 @@ end function ReaderView:onReadSettings(config) self.render_mode = config:readSetting("render_mode") or 0 - self.init_screen_mode = config:readSetting("screen_mode") or "portrait" + local screen_mode = config:readSetting("screen_mode") + if screen_mode then + table.insert(self.ui.postInitCallback, function() + self:onSetScreenMode(screen_mode) end) + end end function ReaderView:onPageUpdate(new_page_no) self.state.page = new_page_no - if self.init_screen_mode then - self.ui:handleEvent(Event:new("SetScreenMode", self.init_screen_mode)) - self.init_screen_mode = nil - end self:recalculate() end function ReaderView:onPosUpdate(new_pos) self.state.pos = new_pos - if self.init_screen_mode then - self.ui:handleEvent(Event:new("SetScreenMode", self.init_screen_mode)) - self.init_screen_mode = nil - end self:recalculate() end From c53f866a93670f52c9b3c41d46805b4c4c519fa9 Mon Sep 17 00:00:00 2001 From: chrox Date: Tue, 12 Feb 2013 01:15:19 +0800 Subject: [PATCH 5/5] cleanup: use screen size in page hash explicitly --- frontend/document/koptinterface.lua | 25 +++++++++++++------------ 1 file changed, 13 insertions(+), 12 deletions(-) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index b29257b12..8200a08b0 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -189,9 +189,8 @@ KoptOptions = { KoptInterface = {} -- get reflow context -function KoptInterface:getKOPTContext(doc, pageno, bbox) +function KoptInterface:getKOPTContext(doc, pageno, bbox, screen_size) local kc = KOPTContext.new() - local screen_size = Screen:getSize() kc:setTrim(doc.configurable.trim_page) kc:setWrap(doc.configurable.text_wrap) kc:setIndent(doc.configurable.detect_indent) @@ -215,13 +214,14 @@ end -- calculates page dimensions function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation) -- check cached page size - self.cur_bbox = doc:getPageBBox(pageno) - self.screen_mode = Screen:getScreenMode() - local bbox_hash = self.cur_bbox.x0.."|"..self.cur_bbox.y0.."|"..self.cur_bbox.x1.."|"..self.cur_bbox.y1 - local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode + local bbox = doc:getPageBBox(pageno) + local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local screen_size = Screen:getSize() + local screen_size_hash = screen_size.w.."|"..screen_size.h + local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local cached = Cache:check(hash) if not cached then - local kc = self:getKOPTContext(doc, pageno, self.cur_bbox) + local kc = self:getKOPTContext(doc, pageno, bbox, screen_size) local page = doc._document:openPage(pageno) -- reflow page page:reflow(kc, 0) @@ -241,10 +241,11 @@ end function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode) doc.render_mode = render_mode - self.cur_bbox = doc:getPageBBox(pageno) - self.screen_mode = Screen:getScreenMode() - local bbox_hash = self.cur_bbox.x0.."|"..self.cur_bbox.y0.."|"..self.cur_bbox.x1.."|"..self.cur_bbox.y1 - local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode + local bbox = doc:getPageBBox(pageno) + local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1 + local screen_size = Screen:getSize() + local screen_size_hash = screen_size.w.."|"..screen_size.h + local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local page_size = self:getPageDimensions(doc, pageno, zoom, rotation) -- this will be the size we actually render local size = page_size @@ -275,7 +276,7 @@ function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode } -- draw to blitbuffer - local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..self.screen_mode + local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash local page = doc._document:openPage(pageno) local cached = Cache:check(kc_hash) if cached then