diff --git a/frontend/apps/reader/modules/readertypeset.lua b/frontend/apps/reader/modules/readertypeset.lua index 102d20564..384cf4159 100644 --- a/frontend/apps/reader/modules/readertypeset.lua +++ b/frontend/apps/reader/modules/readertypeset.lua @@ -96,6 +96,14 @@ function ReaderTypeset:onReadSettings(config) self.smooth_scaling = (global == nil or global == 0) and 0 or 1 end self:toggleImageScaling(self.smooth_scaling) + + -- default to automagic nightmode-friendly handling of images + self.nightmode_images = config:readSetting("nightmode_images") + if self.nightmode_images == nil then + local global = G_reader_settings:readSetting("copt_nightmode_images") + self.nightmode_images = (global == nil or global == 1) and 1 or 0 + end + self:toggleNightmodeImages(self.nightmode_images) end function ReaderTypeset:onSaveSettings() @@ -105,6 +113,7 @@ function ReaderTypeset:onSaveSettings() self.ui.doc_settings:saveSetting("embedded_fonts", self.embedded_fonts) self.ui.doc_settings:saveSetting("render_dpi", self.render_dpi) self.ui.doc_settings:saveSetting("smooth_scaling", self.smooth_scaling) + self.ui.doc_settings:saveSetting("nightmode_images", self.nightmode_images) end function ReaderTypeset:onToggleEmbeddedStyleSheet(toggle) @@ -122,6 +131,11 @@ function ReaderTypeset:onToggleImageScaling(toggle) return true end +function ReaderTypeset:onToggleNightmodeImages(toggle) + self:toggleNightmodeImages(toggle) + return true +end + -- June 2018: epub.css has been cleaned to be more conforming to HTML specs -- and to not include class name based styles (with conditional compatiblity -- styles for previously opened documents). It should be usable on all @@ -286,6 +300,17 @@ function ReaderTypeset:toggleImageScaling(toggle) self.ui:handleEvent(Event:new("UpdatePos")) end +function ReaderTypeset:toggleNightmodeImages(toggle) + if toggle and (toggle == true or toggle == 1) then + self.nightmode_images = true + self.ui.document:setNightmodeImages(true) + else + self.nightmode_images = false + self.ui.document:setNightmodeImages(false) + end + self.ui:handleEvent(Event:new("UpdatePos")) +end + function ReaderTypeset:toggleFloatingPunctuation(toggle) -- for some reason the toggle value read from history files may stay boolean -- and there seems no more elegant way to convert boolean values to numbers diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index cb0d21841..01030535a 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -23,6 +23,7 @@ local CreDocument = Document:new{ _loaded = false, _view_mode = nil, _smooth_scaling = false, + _nightmode_images = true, line_space_percent = 100, default_font = "Noto Serif", @@ -378,7 +379,7 @@ function CreDocument:drawCurrentView(target, x, y, rect, pos) -- local start_clock = os.clock() self._drawn_images_count, self._drawn_images_surface_ratio = - self._document:drawCurrentPage(self.buffer, self.render_color, Screen.night_mode, self._smooth_scaling, Screen.sw_dithering) + self._document:drawCurrentPage(self.buffer, self.render_color, Screen.night_mode and self._nightmode_images, self._smooth_scaling, Screen.sw_dithering) -- print(string.format("CreDocument:drawCurrentView: Rendering took %9.3f ms", (os.clock() - start_clock) * 1000)) -- start_clock = os.clock() @@ -736,6 +737,11 @@ function CreDocument:setImageScaling(toggle) self._smooth_scaling = toggle end +function CreDocument:setNightmodeImages(toggle) + logger.dbg("CreDocument: set nightmode images", toggle) + self._nightmode_images = toggle +end + function CreDocument:setFloatingPunctuation(enabled) -- FIXME: occasional segmentation fault when toggling floating punctuation logger.dbg("CreDocument: set floating punctuation", enabled) diff --git a/frontend/ui/data/creoptions.lua b/frontend/ui/data/creoptions.lua index 3ef12cbbc..f0f74a3e9 100644 --- a/frontend/ui/data/creoptions.lua +++ b/frontend/ui/data/creoptions.lua @@ -427,6 +427,19 @@ Note that your selected font size is not affected by this setting.]]), help_text = _([[- 'fast' uses a fast but inaccurate scaling algorithm when scaling images. - 'best' switches to a more costly but vastly more pleasing and accurate algorithm.]]), }, + { + name = "nightmode_images", + name_text = S.NIGHTMODE_IMAGES, + toggle = {S.ON, S.OFF}, + values = {1, 0}, + default_value = 1, + args = {true, false}, + default_arg = nil, + event = "ToggleNightmodeImages", + show_func = function() return Device.screen.night_mode end, + name_text_hold_callback = optionsutil.showValues, + help_text = _([[Disable the automagic inversion of images when nightmode is enabled. Useful if your book contains mainly inlined mathematical content or scene break art.]]), + }, }, }, } diff --git a/frontend/ui/data/strings.lua b/frontend/ui/data/strings.lua index ac0c7f68f..1bcd29238 100644 --- a/frontend/ui/data/strings.lua +++ b/frontend/ui/data/strings.lua @@ -40,6 +40,7 @@ S.FORCED_OCR = _("Forced OCR") S.HW_DITHERING = _("Dithering") S.INVERSE_READING_ORDER = _("Inverse Order") S.IMAGE_SCALING = _("Image Scaling") +S.NIGHTMODE_IMAGES = _("Invert Images") S.ON = _("on") S.OFF = _("off") diff --git a/frontend/ui/widget/configdialog.lua b/frontend/ui/widget/configdialog.lua index 0d407772e..1381fde70 100644 --- a/frontend/ui/widget/configdialog.lua +++ b/frontend/ui/widget/configdialog.lua @@ -196,7 +196,12 @@ function ConfigOption:init() for c = 1, #self.options do -- Ignore names of options that won't be shown local show_default = not self.options[c].advanced or show_advanced - if self.options[c].show ~= false and show_default then + local show = self.options[c].show + -- Prefer show_func over show if there's one + if self.options[c].show_func then + show = self.options[c].show_func() + end + if show ~= false and show_default then local name_font_face = self.options[c].name_font_face and self.options[c].name_font_face or "cfont" local name_font_size = self.options[c].name_font_size and self.options[c].name_font_size or default_name_font_size local text = self.options[c].name_text @@ -225,7 +230,12 @@ function ConfigOption:init() for c = 1, #self.options do local show_default = not self.options[c].advanced or show_advanced - if self.options[c].show ~= false and show_default then + local show = self.options[c].show + -- Prefer show_func over show if there's one + if self.options[c].show_func then + show = self.options[c].show_func() + end + if show ~= false and show_default then local name_align = self.options[c].name_align_right and self.options[c].name_align_right or default_name_align_right local item_align = self.options[c].item_align_center and self.options[c].item_align_center or default_item_align_center local name_font_face = self.options[c].name_font_face and self.options[c].name_font_face or "cfont" @@ -574,7 +584,7 @@ function ConfigOption:init() table.insert(self.config.layout, #self.config.layout,self:_itemGroupToLayoutLine(option_items_group)) table.insert(horizontal_group, option_items_container) table.insert(vertical_group, horizontal_group) - end -- if self.options[c].show ~= false + end -- if show ~= false end -- for c = 1, #self.options table.insert(vertical_group, VerticalSpan:new{ width = default_option_vpadding })