From a99a0a94891bb3305ffaf9551d694dd3ee5c345b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sat, 21 Apr 2012 12:14:35 +0800 Subject: [PATCH 1/2] fix bug in highlight engine only goto next view when the word is in next view. same for previous view --- djvureader.lua | 12 +++++ unireader.lua | 118 +++++++++++++++++++++++++++++-------------------- 2 files changed, 82 insertions(+), 48 deletions(-) diff --git a/djvureader.lua b/djvureader.lua index f9142c366..6bb7a89cd 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -45,6 +45,18 @@ function DJVUReader:zoomedRectCoordTransform(x0, y0, x1, y1) (y1 - y0) * self.globalzoom end +-- make sure at least part of the box can be seen in next/previous view +-- @FIXME only works in FIT_TO_CONTENT_WIDTH mode 21.04 2012 (houqp) +-- @TODO use zoomedRectCoordTransform in unireader, no need to overwrite +-- it in here. +function DJVUReader:_isBoxInNextView(box) + return self.cur_full_height - (box.y0 * self.globalzoom) > -self.offset_y + G_height +end + +function DJVUReader:_isBoxInPrevView(box) + return self.cur_full_height - (box.y1 * self.globalzoom) < -self.offset_y +end + -- y axel in djvulibre starts from bottom function DJVUReader:_isEntireWordInScreenHeightRange(w) return (w ~= nil) and diff --git a/unireader.lua b/unireader.lua index 72fad45e5..81cef0f3f 100644 --- a/unireader.lua +++ b/unireader.lua @@ -27,7 +27,7 @@ UniReader = { -- zoom state: globalzoom = 1.0, globalzoom_orig = 1.0, - globalzoommode = -1, -- ZOOM_FIT_TO_PAGE + globalzoom_mode = -1, -- ZOOM_FIT_TO_PAGE globalrotate = 0, @@ -174,6 +174,16 @@ function UniReader:getRectInScreen(x0, y0, x1, y1) return x, y, w, h end +-- make sure at least part of the box can be seen in next/previous view +-- @FIXME only works in FIT_TO_CONTENT_WIDTH mode 21.04 2012 (houqp) +function UniReader:_isBoxInNextView(box) + return box.y1 * self.globalzoom > -self.offset_y + G_height +end + +function UniReader:_isBoxInPrevView(box) + return box.y0 * self.globalzoom < -self.offset_y +end + -- make sure the whole word/line can be seen in screen -- @TODO when not in FIT_TO_CONTENT_WIDTH mode, -- self.offset_{x,y} might be negative. 12.04 2012 (houqp) @@ -218,6 +228,18 @@ function UniReader:_isWordInScreenRange(w) (not is_entire_word_out_of_screen_width) end +function UniReader:_isWordInNextView(w) + return self:_isBoxInNextView(w) +end + +function UniReader:_isLineInNextView(l) + return self:_isBoxInNextView(l) +end + +function UniReader:_isLineInPrevView(l) + return self:_isBoxInPrevView(l) +end + function UniReader:toggleTextHighLight(word_list) for _,text_item in ipairs(word_list) do for _,line_item in ipairs(text_item) do @@ -540,7 +562,7 @@ function UniReader:startHighLightMode() self.cursor:clear() if w.new ~= 0 - and not self:_isEntireLineInScreenHeightRange(t[l.new]) + and self:_isLineInPrevView(t[l.new]) and self:_isEntireWordInScreenWidthRange(t[l.new][w.new]) then -- word is in previous view local pageno = self:prevView() @@ -569,7 +591,7 @@ function UniReader:startHighLightMode() if tmp_w == 0 then tmp_w = 1 end - if not self:_isEntireLineInScreenHeightRange(t[l.new]) + if self:_isLineInNextView(t[l.new]) and self:_isEntireWordInScreenWidthRange(t[l.new][tmp_w]) then local pageno = self:nextView() self:goto(pageno) @@ -595,7 +617,7 @@ function UniReader:startHighLightMode() if tmp_w == 0 then tmp_w = 1 end - if not self:_isEntireLineInScreenHeightRange(t[l.new]) + if self:_isLineInPrevView(t[l.new]) and self:_isEntireWordInScreenWidthRange(t[l.new][tmp_w]) then -- goto next view of current page local pageno = self:prevView() @@ -621,7 +643,7 @@ function UniReader:startHighLightMode() if w.cur == 0 then tmp_w = 1 end - if not self:_isEntireLineInScreenHeightRange(t[l.new]) + if self:_isLineInNextView(t[l.new]) and self:_isEntireWordInScreenWidthRange(t[l.new][tmp_w]) then -- goto next view of current page local pageno = self:nextView() @@ -693,7 +715,7 @@ function UniReader:startHighLightMode() end if w.new ~= 0 and - not self:_isEntireLineInScreenHeightRange(t[l.new]) then + self:_isLineInPrevView(t[l.new]) then -- word out of left and right sides of current view should -- not trigger pan by page if self:_isEntireWordInScreenWidthRange(t[l.new][w.new]) then @@ -730,7 +752,7 @@ function UniReader:startHighLightMode() is_meet_end = true end - if not self:_isEntireLineInScreenHeightRange(t[l.new]) then + if self:_isLineInNextView(t[l.new]) then if self:_isEntireWordInScreenWidthRange(t[l.new][w.new]) then local pageno = self:nextView() self:goto(pageno) @@ -959,7 +981,7 @@ function UniReader:loadSettings(filename) self.bbox = bbox self.globalzoom = self.settings:readSetting("globalzoom") or 1.0 - self.globalzoommode = self.settings:readSetting("globalzoommode") or -1 + self.globalzoom_mode = self.settings:readSetting("globalzoom_mode") or -1 self:loadSpecialSettings() return true @@ -1173,8 +1195,8 @@ function UniReader:setzoom(page, preCache) debug("page::getUsedBBox", x0, y0, x1, y1 ) - if self.globalzoommode == self.ZOOM_FIT_TO_PAGE - or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT then + if self.globalzoom_mode == self.ZOOM_FIT_TO_PAGE + or self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT then self.globalzoom = width / pwidth self.offset_x = 0 self.offset_y = (height - (self.globalzoom * pheight)) / 2 @@ -1184,21 +1206,21 @@ function UniReader:setzoom(page, preCache) 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 + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_PAGE_WIDTH + or self.globalzoom_mode == 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 + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_PAGE_HEIGHT + or self.globalzoom_mode == 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 self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT then if (x1 - x0) < pwidth then self.globalzoom = width / (x1 - x0) if height / (y1 - y0) < self.globalzoom then @@ -1207,7 +1229,7 @@ function UniReader:setzoom(page, preCache) end self.offset_x = -1 * x0 * self.globalzoom self.offset_y = -1 * y0 * self.globalzoom - elseif self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH then + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH then if (x1 - x0) < pwidth then self.globalzoom = width / (x1 - x0) end @@ -1215,8 +1237,8 @@ function UniReader:setzoom(page, preCache) self.offset_y = -1 * y0 * self.globalzoom self.content_top = self.offset_y -- enable pan mode in ZOOM_FIT_TO_CONTENT_WIDTH - self.globalzoommode = self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN - elseif self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + self.globalzoom_mode = self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then if self.content_top == -2012 then -- We must handle previous page turn as a special cases, -- because we want to arrive at the bottom of previous page. @@ -1228,16 +1250,16 @@ function UniReader:setzoom(page, preCache) self.content_top = -1 * y0 * self.globalzoom self.offset_y = fb.bb:getHeight() - self.fullheight end - elseif self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HEIGHT then + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HEIGHT then if (y1 - y0) < pheight then self.globalzoom = height / (y1 - y0) end self.offset_x = -1 * x0 * self.globalzoom self.offset_y = -1 * y0 * self.globalzoom - elseif self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH - or self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH_MARGIN then + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH + or self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH_MARGIN then local margin = self.pan_margin - if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH then margin = 0 end + if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH then margin = 0 end local pg_margin = 0 -- margin scaled to page size if margin > 0 then pg_margin = margin * 2 / self.globalzoom end self.globalzoom = width / (x1 - x0 + pg_margin) @@ -1246,7 +1268,7 @@ function UniReader:setzoom(page, preCache) self.offset_y = -1 * y0 * self.globalzoom * 2 + margin self.globalzoom = width / (x1 - x0 + pg_margin) * 2 debug("column mode offset:", self.offset_x, self.offset_y, " zoom:", self.globalzoom); - self.globalzoommode = self.ZOOM_BY_VALUE -- enable pan mode + self.globalzoom_mode = self.ZOOM_BY_VALUE -- enable pan mode self.pan_x = self.offset_x self.pan_y = self.offset_y self.pan_by_page = true @@ -1297,11 +1319,11 @@ function UniReader:show(no) self.dest_x = (width - (bb:getWidth() - offset_x)) / 2 end if bb:getHeight() - offset_y < height and - self.globalzoommode ~= self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + self.globalzoom_mode ~= self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then -- we can't fill the whole output height and not in -- ZOOM_FIT_TO_CONTENT_WIDTH_PAN mode, center the content self.dest_y = (height - (bb:getHeight() - offset_y)) / 2 - elseif self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN and + elseif self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN and self.offset_y > 0 then -- if we are in ZOOM_FIT_TO_CONTENT_WIDTH_PAN mode and turning to -- the top of the page, we might leave an empty space between the @@ -1447,10 +1469,10 @@ end function UniReader:nextView() local pageno = self.pageno - if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then if self.offset_y <= self.min_offset_y then -- hit content bottom, turn to next page - self.globalzoommode = self.ZOOM_FIT_TO_CONTENT_WIDTH + self.globalzoom_mode = self.ZOOM_FIT_TO_CONTENT_WIDTH pageno = pageno + 1 else -- goto next view of current page @@ -1474,7 +1496,7 @@ end function UniReader:prevView() local pageno = self.pageno - if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then if self.offset_y >= self.content_top then -- hit content top, turn to previous page -- set self.content_top with magic num to signal self:setZoom @@ -1507,9 +1529,9 @@ function UniReader:modifyGamma(factor) end -- adjust zoom state and trigger re-rendering -function UniReader:setGlobalZoomMode(newzoommode) - if self.globalzoommode ~= newzoommode then - self.globalzoommode = newzoommode +function UniReader:setglobalzoom_mode(newzoommode) + if self.globalzoom_mode ~= newzoommode then + self.globalzoom_mode = newzoommode self:redrawCurrentPage() end end @@ -1517,7 +1539,7 @@ end -- adjust zoom state and trigger re-rendering function UniReader:setGlobalZoom(zoom) if self.globalzoom ~= zoom then - self.globalzoommode = self.ZOOM_BY_VALUE + self.globalzoom_mode = self.ZOOM_BY_VALUE self.globalzoom = zoom self:redrawCurrentPage() end @@ -1796,7 +1818,7 @@ function UniReader:inputLoop() self.settings:saveSetting("bookmarks", self.bookmarks) self.settings:saveSetting("bbox", self.bbox) self.settings:saveSetting("globalzoom", self.globalzoom) - self.settings:saveSetting("globalzoommode", self.globalzoommode) + self.settings:saveSetting("globalzoom_mode", self.globalzoom_mode) self.settings:saveSetting("highlight", self.highlight) self:saveSpecialSettings() self.settings:close() @@ -1886,42 +1908,42 @@ function UniReader:addAllCommands() self.commands:add(KEY_A,nil,"A", "zoom to fit page", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_PAGE) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_PAGE) end) self.commands:add(KEY_A,MOD_SHIFT,"A", "zoom to fit content", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_CONTENT) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_CONTENT) end) self.commands:add(KEY_S,nil,"S", "zoom to fit page width", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_PAGE_WIDTH) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_PAGE_WIDTH) end) self.commands:add(KEY_S,MOD_SHIFT,"S", "zoom to fit content width", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_CONTENT_WIDTH) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_CONTENT_WIDTH) end) self.commands:add(KEY_D,nil,"D", "zoom to fit page height", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_PAGE_HEIGHT) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_PAGE_HEIGHT) end) self.commands:add(KEY_D,MOD_SHIFT,"D", "zoom to fit content height", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_CONTENT_HEIGHT) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_CONTENT_HEIGHT) end) self.commands:add(KEY_F,nil,"F", "zoom to fit margin 2-column mode", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_CONTENT_HALF_WIDTH_MARGIN) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_CONTENT_HALF_WIDTH_MARGIN) end) self.commands:add(KEY_F,MOD_SHIFT,"F", "zoom to fit content 2-column mode", function(unireader) - unireader:setGlobalZoomMode(unireader.ZOOM_FIT_TO_CONTENT_HALF_WIDTH) + unireader:setglobalzoom_mode(unireader.ZOOM_FIT_TO_CONTENT_HALF_WIDTH) end) self.commands:add(KEY_G,nil,"G", "open 'go to page' input box", @@ -1978,8 +2000,8 @@ function UniReader:addAllCommands() "rotate screen 90° clockwise", function(unireader) unireader:screenRotate("clockwise") - if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then - self:setGlobalZoomMode(self.ZOOM_FIT_TO_CONTENT_WIDTH) + if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + self:setglobalzoom_mode(self.ZOOM_FIT_TO_CONTENT_WIDTH) else self:redrawCurrentPage() end @@ -1993,8 +2015,8 @@ function UniReader:addAllCommands() "rotate screen 90° counterclockwise", function(unireader) unireader:screenRotate("anticlockwise") - if self.globalzoommode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then - self:setGlobalZoomMode(self.ZOOM_FIT_TO_CONTENT_WIDTH) + if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_WIDTH_PAN then + self:setglobalzoom_mode(self.ZOOM_FIT_TO_CONTENT_WIDTH) else self:redrawCurrentPage() end @@ -2024,7 +2046,7 @@ function UniReader:addAllCommands() unireader.bbox[unireader:oddEven(unireader.pageno)] = bbox unireader.bbox.enabled = true debug("bbox", unireader.pageno, unireader.bbox) - unireader.globalzoommode = unireader.ZOOM_FIT_TO_CONTENT -- use bbox + unireader.globalzoom_mode = unireader.ZOOM_FIT_TO_CONTENT -- use bbox showInfoMsgWithDelay("Manual crop setting saved.", 2000, 1) end) self.commands:add(KEY_Z,MOD_SHIFT,"Z", @@ -2057,9 +2079,9 @@ function UniReader:addAllCommands() "pan the active view; use Shift or Alt for smaller steps", function(unireader,keydef) if keydef.keycode ~= KEY_FW_PRESS then - unireader.globalzoommode = unireader.ZOOM_BY_VALUE + unireader.globalzoom_mode = unireader.ZOOM_BY_VALUE end - if unireader.globalzoommode == unireader.ZOOM_BY_VALUE then + if unireader.globalzoom_mode == unireader.ZOOM_BY_VALUE then local x local y if keydef.modifier==MOD_SHIFT then -- shift always moves in small steps From 5e6d4cfdb3d58f03b615720801360704765abe2b Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sat, 21 Apr 2012 16:08:25 +0800 Subject: [PATCH 2/2] fix message for gamma settings in crereader's help page --- crereader.lua | 21 +++++++++------------ 1 file changed, 9 insertions(+), 12 deletions(-) diff --git a/crereader.lua b/crereader.lua index d686056b4..8b0f14a4f 100644 --- a/crereader.lua +++ b/crereader.lua @@ -428,18 +428,15 @@ function CREReader:adjustCreReaderCommands() end end ) - self.commands:add(KEY_VPLUS, nil, "vol+", - "increase gamma", - function(self) - cre.setGammaIndex(self.gamma_index + 1) - self.gamma_index = cre.getGammaIndex() - self:redrawCurrentPage() - end - ) - self.commands:add(KEY_VMINUS, nil, "vol-", - "decrease gamma", - function(self) - cre.setGammaIndex(self.gamma_index - 1) + self.commands:addGroup("vol-/+", + {Keydef:new(KEY_VPLUS,nil), Keydef:new(KEY_VMINUS,nil)}, + "decrease/increase gamma", + function(self, keydef) + local delta = 1 + if keydef.keycode == KEY_VMINUS then + delta = -1 + end + cre.setGammaIndex(self.gamma_index+delta) self.gamma_index = cre.getGammaIndex() self:redrawCurrentPage() end