From 824e9d139e71d5aeac3cee37cd4d3eaf39334886 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Tue, 28 Aug 2012 23:48:56 +0100 Subject: [PATCH 01/10] Move render_mode support out of unireader.lua into djvureader.lua as it is djvu-specific. Also added support for all other rendering modes handled by djvulibre. Also made the message print a human-readable description of the mode rather than just the number. --- djvu.c | 8 +------- djvureader.lua | 40 ++++++++++++++++++++++++++++++++++++++++ unireader.lua | 21 +++------------------ 3 files changed, 44 insertions(+), 25 deletions(-) diff --git a/djvu.c b/djvu.c index 6d7c9f768..313530c1b 100644 --- a/djvu.c +++ b/djvu.c @@ -401,15 +401,9 @@ static int drawPage(lua_State *L) { DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext"); BlitBuffer *bb = (BlitBuffer*) luaL_checkudata(L, 3, "blitbuffer"); int render_mode = (int) luaL_checkint(L, 6); - ddjvu_render_mode_t djvu_render_mode; + ddjvu_render_mode_t djvu_render_mode = render_mode; unsigned char adjusted_low[16], adjusted_high[16]; int i, adjust_pixels = 0; - - if (render_mode) - djvu_render_mode = DDJVU_RENDER_BLACK; - else - djvu_render_mode = DDJVU_RENDER_COLOR; - ddjvu_format_t *pixelformat; ddjvu_rect_t pagerect, renderrect; uint8_t *imagebuffer = NULL; diff --git a/djvureader.lua b/djvureader.lua index 034b58c3d..a9fd1e4e2 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -21,8 +21,48 @@ end function DJVUReader:adjustDjvuReaderCommand() self.commands:del(KEY_J, MOD_SHIFT, "J") self.commands:del(KEY_K, MOD_SHIFT, "K") + self.commands:add(KEY_R, nil, "R", + "colour/b&w/colouronly/maskonly/backg/foreg", + function(self) + self:cycle_render_mode() + end) end +-- cycle through all rendering modes supported by djvulibre: +-- 0 (color page or stencil) +-- 1 (stencil or color page) +-- 2 (color page or fail) +-- 3 (stencil or fail) +-- 4 (color background layer) +-- 5 (color foreground layer) +-- Note that if the values in the definition of ddjvu_render_mode_t in djvulibre/libdjvu/ddjvuapi.h change, +-- then we should update our values here also. This is a bit risky, but these values never change, so it should be ok :) +function DJVUReader:cycle_render_mode() + self.render_mode = (self.render_mode + 1)%6 + Debug("cycle_render_mode, render_mode=", self.render_mode) + self:clearCache() + self.doc:cleanCache() + local render_mode_name + if self.render_mode == 0 then + render_mode_name = "COLOUR" + elseif self.render_mode == 1 then + render_mode_name = "BLACK & WHITE" + elseif self.render_mode == 2 then + render_mode_name = "COLOUR ONLY" + elseif self.render_mode == 3 then + render_mode_name = "MASK ONLY" + elseif self.render_mode == 4 then + render_mode_name = "COLOUR BACKGROUND" + elseif self.render_mode == 5 then + render_mode_name = "COLOUR FOREGROUND" + else + render_mode_name = "UNKNOWN" + end + showInfoMsgWithDelay("("..self.render_mode..") "..render_mode_name, 1000, 1) + self:redrawCurrentPage() +end + + ---------------------------------------------------- -- highlight support diff --git a/unireader.lua b/unireader.lua index e0f8bb23c..cd1e953fd 100644 --- a/unireader.lua +++ b/unireader.lua @@ -34,9 +34,9 @@ UniReader = { -- gamma setting: globalgamma = 1.0, -- GAMMA_NO_GAMMA - -- rendering mode toggle (used in djvu.c:drawPage()) - -- if set to 1 render in BLACK & WHITE, otherwise COLOR - render_mode = 1, + -- DjVu page rendering mode (used in djvu.c:drawPage()) + -- See comments in djvureader.lua:DJVUReader:cycle_render_mode() + render_mode = 0, -- COLOUR -- cached tile size fullwidth = 0, @@ -1576,16 +1576,6 @@ function UniReader:modifyGamma(factor) self:redrawCurrentPage() end --- toggle rendering mode between colour (0) and b&w (1) -function UniReader:toggle_render_mode() - Debug("toggle_render_mode, render_mode=", self.render_mode) - self.render_mode = 1 - self.render_mode - self:clearCache() - self.doc:cleanCache() - showInfoMsgWithDelay("New render_mode = "..self.render_mode, 1000, 1) - self:redrawCurrentPage() -end - -- adjust zoom state and trigger re-rendering function UniReader:setglobalzoom_mode(newzoommode) if self.globalzoom_mode ~= newzoommode then @@ -2217,11 +2207,6 @@ function UniReader:addAllCommands() self:redrawCurrentPage() end end) - self.commands:add(KEY_R, nil, "R", - "toggle rendering mode: b&w/colour", - function(unireader) - unireader:toggle_render_mode() - end) self.commands:add(KEY_R, MOD_SHIFT, "R", "manual full screen refresh", function(unireader) From 2d5a936480e384aff1fa00fae2dc209273e760b0 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 10:02:31 +0100 Subject: [PATCH 02/10] Remove the local variable render_mode from drawPage() (although it would be optimized away by gcc anyway). --- djvu.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/djvu.c b/djvu.c index 313530c1b..fd90af3ca 100644 --- a/djvu.c +++ b/djvu.c @@ -400,8 +400,7 @@ static int drawPage(lua_State *L) { DjvuPage *page = (DjvuPage*) luaL_checkudata(L, 1, "djvupage"); DrawContext *dc = (DrawContext*) luaL_checkudata(L, 2, "drawcontext"); BlitBuffer *bb = (BlitBuffer*) luaL_checkudata(L, 3, "blitbuffer"); - int render_mode = (int) luaL_checkint(L, 6); - ddjvu_render_mode_t djvu_render_mode = render_mode; + ddjvu_render_mode_t djvu_render_mode = (int) luaL_checkint(L, 6); unsigned char adjusted_low[16], adjusted_high[16]; int i, adjust_pixels = 0; ddjvu_format_t *pixelformat; From 7000f349c0b540c56f324493085f2070c40566fd Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 10:33:42 +0100 Subject: [PATCH 03/10] Allow renaming the whole file, including "extension". --- filechooser.lua | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/filechooser.lua b/filechooser.lua index bea01335b..baf6fea51 100644 --- a/filechooser.lua +++ b/filechooser.lua @@ -403,11 +403,9 @@ function FileChooser:addAllCommands() local oldname = self:FullFileName() if oldname then local name_we = self.files[self.perpage*(self.page-1)+self.current - #self.dirs] - local ext = string.lower(string.match(oldname, ".+%.([^.]+)") or "") - name_we = string.sub(name_we,1,-2-string.len(ext)) local newname = InputBox:input(0, 0, "New filename:", name_we) if newname then - newname = self.path.."/"..newname..'.'..ext + newname = self.path.."/"..newname os.rename(oldname, newname) os.rename(DocToHistory(oldname), DocToHistory(newname)) self:setPath(self.path) From 32333ca1d641593145dbc712fe652fe95eb2ec32 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 10:48:33 +0100 Subject: [PATCH 04/10] Make the function cycle_render_mode() slightly more readable. --- djvureader.lua | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/djvureader.lua b/djvureader.lua index a9fd1e4e2..b0186a66e 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -39,10 +39,10 @@ end -- then we should update our values here also. This is a bit risky, but these values never change, so it should be ok :) function DJVUReader:cycle_render_mode() self.render_mode = (self.render_mode + 1)%6 - Debug("cycle_render_mode, render_mode=", self.render_mode) + Debug("cycle_render_mode(), render_mode=", self.render_mode) self:clearCache() self.doc:cleanCache() - local render_mode_name + local render_mode_name = "UNKNOWN" if self.render_mode == 0 then render_mode_name = "COLOUR" elseif self.render_mode == 1 then @@ -55,15 +55,11 @@ function DJVUReader:cycle_render_mode() render_mode_name = "COLOUR BACKGROUND" elseif self.render_mode == 5 then render_mode_name = "COLOUR FOREGROUND" - else - render_mode_name = "UNKNOWN" end showInfoMsgWithDelay("("..self.render_mode..") "..render_mode_name, 1000, 1) self:redrawCurrentPage() end - - ---------------------------------------------------- -- highlight support ---------------------------------------------------- From 3fd33805c58e94caccc30c7ffdbee5e3d31f4980 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 11:37:38 +0100 Subject: [PATCH 05/10] Save/restore the setting of render_mode. --- unireader.lua | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unireader.lua b/unireader.lua index 1d5e713c6..b20b80cb8 100644 --- a/unireader.lua +++ b/unireader.lua @@ -1015,6 +1015,7 @@ function UniReader:loadSettings(filename) self.globalzoom = self.settings:readSetting("globalzoom") or 1.0 self.globalzoom_mode = self.settings:readSetting("globalzoom_mode") or -1 + self.render_mode = self.settings:readSetting("render_mode") or 0 self:loadSpecialSettings() return true @@ -1994,6 +1995,7 @@ function UniReader:inputLoop() self.settings:saveSetting("globalzoom", self.globalzoom) self.settings:saveSetting("globalzoom_mode", self.globalzoom_mode) self.settings:saveSetting("highlight", self.highlight) + self.settings:saveSetting("render_mode", self.render_mode) self:saveSpecialSettings() self.settings:close() end From b0b0b85ca15d6ab4d4cf1608335eb0d6ec056122 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 11:39:17 +0100 Subject: [PATCH 06/10] Re-implement the interface for setting DjVu page rendering mode as a menu. Thanks to NuPogodi for showing how to do this. --- djvureader.lua | 54 ++++++++++++++++++++++---------------------------- 1 file changed, 24 insertions(+), 30 deletions(-) diff --git a/djvureader.lua b/djvureader.lua index b0186a66e..23e02a136 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -24,40 +24,34 @@ function DJVUReader:adjustDjvuReaderCommand() self.commands:add(KEY_R, nil, "R", "colour/b&w/colouronly/maskonly/backg/foreg", function(self) - self:cycle_render_mode() + self:select_render_mode() end) end --- cycle through all rendering modes supported by djvulibre: --- 0 (color page or stencil) --- 1 (stencil or color page) --- 2 (color page or fail) --- 3 (stencil or fail) --- 4 (color background layer) --- 5 (color foreground layer) --- Note that if the values in the definition of ddjvu_render_mode_t in djvulibre/libdjvu/ddjvuapi.h change, --- then we should update our values here also. This is a bit risky, but these values never change, so it should be ok :) -function DJVUReader:cycle_render_mode() - self.render_mode = (self.render_mode + 1)%6 - Debug("cycle_render_mode(), render_mode=", self.render_mode) - self:clearCache() - self.doc:cleanCache() - local render_mode_name = "UNKNOWN" - if self.render_mode == 0 then - render_mode_name = "COLOUR" - elseif self.render_mode == 1 then - render_mode_name = "BLACK & WHITE" - elseif self.render_mode == 2 then - render_mode_name = "COLOUR ONLY" - elseif self.render_mode == 3 then - render_mode_name = "MASK ONLY" - elseif self.render_mode == 4 then - render_mode_name = "COLOUR BACKGROUND" - elseif self.render_mode == 5 then - render_mode_name = "COLOUR FOREGROUND" +-- select the rendering mode from those supported by djvulibre. +-- Note that if the values in the definition of ddjvu_render_mode_t in djvulibre/libdjvu/ddjvuapi.h change, +-- then we should update our values here also. This is a bit risky, but these values never change, so it should be ok :) +function DJVUReader:select_render_mode() + local mode_menu = SelectMenu:new{ + menu_title = "Select DjVu page rendering mode", + item_array = { + "COLOUR (works for both colour and b&w pages)", -- 0 (colour page or stencil) + "BLACK & WHITE (for b&w pages only, much faster)", -- 1 (stencil or colour page) + "COLOUR ONLY (slightly faster than COLOUR)", -- 2 (colour page or fail) + "MASK ONLY", -- 3 (stencil or fail) + "COLOUR BACKGROUND (show only background)", -- 4 (colour background layer) + "COLOUR FOREGROUND (show only foreground)" -- 5 (colour foreground layer) + }, + current_entry = self.render_mode, + } + local mode = mode_menu:choose(0, fb.bb:getHeight()) + if mode then + self.render_mode = mode - 1 + Debug("select_render_mode(), render_mode=", self.render_mode) + self:clearCache() + self.doc:cleanCache() + self:redrawCurrentPage() end - showInfoMsgWithDelay("("..self.render_mode..") "..render_mode_name, 1000, 1) - self:redrawCurrentPage() end ---------------------------------------------------- From c6a1d22bc9c46604ce5645575ca12a441565eef1 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Wed, 29 Aug 2012 12:09:41 +0100 Subject: [PATCH 07/10] Redraw the page even if the user did not select any rendering mode, otherwise nothing is displayed (except menu). --- djvureader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djvureader.lua b/djvureader.lua index 23e02a136..d886b3f94 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -50,8 +50,8 @@ function DJVUReader:select_render_mode() Debug("select_render_mode(), render_mode=", self.render_mode) self:clearCache() self.doc:cleanCache() - self:redrawCurrentPage() end + self:redrawCurrentPage() end ---------------------------------------------------- From 9a22a022bf06c39dcbaa73664c7ef167200e62ad Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Thu, 30 Aug 2012 13:38:18 +0100 Subject: [PATCH 08/10] Tidy up the help text on the 'R' command. --- djvureader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/djvureader.lua b/djvureader.lua index d886b3f94..c7eb153a5 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -22,7 +22,7 @@ function DJVUReader:adjustDjvuReaderCommand() self.commands:del(KEY_J, MOD_SHIFT, "J") self.commands:del(KEY_K, MOD_SHIFT, "K") self.commands:add(KEY_R, nil, "R", - "colour/b&w/colouronly/maskonly/backg/foreg", + "select djvu page rendering mode", function(self) self:select_render_mode() end) From 60b87b4b95a9f46d962abaa58d9eb2c7d2f6d965 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Thu, 30 Aug 2012 16:11:37 +0100 Subject: [PATCH 09/10] Update the name of the function cycle_render_mode() -> select_render_mode() in the comment. --- unireader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unireader.lua b/unireader.lua index bbc775d39..3365b3d37 100644 --- a/unireader.lua +++ b/unireader.lua @@ -35,7 +35,7 @@ UniReader = { globalgamma = 1.0, -- GAMMA_NO_GAMMA -- DjVu page rendering mode (used in djvu.c:drawPage()) - -- See comments in djvureader.lua:DJVUReader:cycle_render_mode() + -- See comments in djvureader.lua:DJVUReader:select_render_mode() render_mode = 0, -- COLOUR -- cached tile size From b2e0ecb7b0d3956ced550cbbef316dc46f0d1709 Mon Sep 17 00:00:00 2001 From: Tigran Aivazian Date: Sat, 1 Sep 2012 22:21:29 +0100 Subject: [PATCH 10/10] Add description of MASK ONLY djvu page rendering mode. --- djvureader.lua | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/djvureader.lua b/djvureader.lua index c7eb153a5..0edb4bca3 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -38,7 +38,7 @@ function DJVUReader:select_render_mode() "COLOUR (works for both colour and b&w pages)", -- 0 (colour page or stencil) "BLACK & WHITE (for b&w pages only, much faster)", -- 1 (stencil or colour page) "COLOUR ONLY (slightly faster than COLOUR)", -- 2 (colour page or fail) - "MASK ONLY", -- 3 (stencil or fail) + "MASK ONLY (for b&w pages only)", -- 3 (stencil or fail) "COLOUR BACKGROUND (show only background)", -- 4 (colour background layer) "COLOUR FOREGROUND (show only foreground)" -- 5 (colour foreground layer) }, @@ -71,4 +71,3 @@ function DJVUReader:invertTextYAxel(pageno, text_table) end return text_table end -