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)