diff --git a/djvu.c b/djvu.c index 6d7c9f768..fd90af3ca 100644 --- a/djvu.c +++ b/djvu.c @@ -400,16 +400,9 @@ 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; + 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; - - 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 129a4e2ba..0edb4bca3 100644 --- a/djvureader.lua +++ b/djvureader.lua @@ -22,22 +22,35 @@ 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", - "toggle rendering mode: b&w/colour", - function(DJVUReader) - DJVUReader:toggle_render_mode() - end) + "select djvu page rendering mode", + function(self) + self:select_render_mode() + end) end -------------------------------------------------------- --- toggle rendering mode between colour (0) and b&w (1) -------------------------------------------------------- - -function DJVUReader:toggle_render_mode() - InfoMessage:show("New render_mode = "..self.render_mode, 1) - Debug("toggle_render_mode, render_mode=", self.render_mode) - self.render_mode = 1 - self.render_mode - self:clearCache() - self.doc:cleanCache() +-- 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 (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) + }, + 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() + end self:redrawCurrentPage() end 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) diff --git a/unireader.lua b/unireader.lua index 500edf75d..104d600bf 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:select_render_mode() + render_mode = 0, -- COLOUR -- cached tile size fullwidth = 0, @@ -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 @@ -2000,6 +2001,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 @@ -2260,7 +2262,7 @@ function UniReader:addAllCommands() -- now, perform full screen refresh self.rcount = self.rcountmax self:redrawCurrentPage() - --[[ eink will not refresh if nothing is changeed on the screen + --[[ eink will not refresh if nothing is changed on the screen -- so we fake a change here. fb.bb:invertRect(0, 0, 1, 1) fb:refresh(1)