mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
ImageWidget: Always return a bb, even on decoding failure.
(In which case we return a checkerboard pattern). ScreenSaver: Make sure the choose image/folder/document settings report what the code actually does on empty settings...
This commit is contained in:
@@ -303,4 +303,35 @@ function RenderImage:renderSVGImageFileWithMupdf(filename, width, height, zoom)
|
||||
return bb -- pre-multiplied alpha: no is_straight_alpha=true
|
||||
end
|
||||
|
||||
--- Renders a checkerboard pattern (useful as a fallback after a decoding failure)
|
||||
function RenderImage:renderCheckerboard(width, height, bb_type)
|
||||
width = width or 800
|
||||
height = height or 800
|
||||
local bb = Blitbuffer.new(width, height, bb_type or Blitbuffer.TYPE_BB8)
|
||||
local checker_size = bit.rshift(math.min(width, height), 4)
|
||||
local pen_color = Blitbuffer.COLOR_BLACK
|
||||
local row_start
|
||||
for y = 0, height - 1, checker_size do
|
||||
row_start = pen_color
|
||||
for x = 0, width - 1, checker_size do
|
||||
-- BBs are zero-initialized (i.e., black)
|
||||
if pen_color == Blitbuffer.COLOR_WHITE then
|
||||
bb:paintRect(x, y, checker_size, checker_size, Blitbuffer.COLOR_WHITE)
|
||||
-- Alternate pen color every "column"
|
||||
pen_color = Blitbuffer.COLOR_BLACK
|
||||
else
|
||||
pen_color = Blitbuffer.COLOR_WHITE
|
||||
end
|
||||
end
|
||||
-- Alternate initial pen color every "row"
|
||||
if row_start == Blitbuffer.COLOR_WHITE then
|
||||
pen_color = Blitbuffer.COLOR_BLACK
|
||||
else
|
||||
pen_color = Blitbuffer.COLOR_WHITE
|
||||
end
|
||||
end
|
||||
|
||||
return bb
|
||||
end
|
||||
|
||||
return RenderImage
|
||||
|
||||
@@ -3,7 +3,6 @@ local Blitbuffer = require("ffi/blitbuffer")
|
||||
local ButtonDialogTitle = require("ui/widget/buttondialogtitle")
|
||||
local BookStatusWidget = require("ui/widget/bookstatuswidget")
|
||||
local BottomContainer = require("ui/widget/container/bottomcontainer")
|
||||
local DataStorage = require("datastorage")
|
||||
local Device = require("device")
|
||||
local DocSettings = require("docsettings")
|
||||
local DocumentRegistry = require("document/documentregistry")
|
||||
@@ -94,6 +93,7 @@ function Screensaver:_getRandomImage(dir)
|
||||
else
|
||||
return nil
|
||||
end
|
||||
|
||||
return dir .. pics[math.random(i)]
|
||||
end
|
||||
|
||||
@@ -262,7 +262,7 @@ function Screensaver:chooseFolder()
|
||||
}
|
||||
})
|
||||
local screensaver_dir = G_reader_settings:readSetting("screensaver_dir")
|
||||
or DataStorage:getDataDir() .. "/screenshots/"
|
||||
or _("N/A")
|
||||
self.choose_dialog = ButtonDialogTitle:new{
|
||||
title = T(_("Current screensaver image folder:\n%1"), BD.dirpath(screensaver_dir)),
|
||||
buttons = buttons
|
||||
@@ -321,8 +321,9 @@ function Screensaver:chooseFile(document_cover)
|
||||
}
|
||||
})
|
||||
local screensaver_image = G_reader_settings:readSetting("screensaver_image")
|
||||
or DataStorage:getDataDir() .. "/resources/koreader.png"
|
||||
or _("N/A")
|
||||
local screensaver_document_cover = G_reader_settings:readSetting("screensaver_document_cover")
|
||||
or _("N/A")
|
||||
local title = document_cover and T(_("Current screensaver document cover:\n%1"), BD.filepath(screensaver_document_cover))
|
||||
or T(_("Current screensaver image:\n%1"), BD.filepath(screensaver_image))
|
||||
self.choose_dialog = ButtonDialogTitle:new{
|
||||
|
||||
@@ -170,8 +170,22 @@ function ImageWidget:_loadfile()
|
||||
-- and paintTo() must use alphablitFrom() instead of pmulalphablitFrom() (which is
|
||||
-- fine for everything MuPDF renders out)
|
||||
self._bb, self._is_straight_alpha = RenderImage:renderSVGImageFile(self.file, width, height, zoom)
|
||||
|
||||
-- Ensure we always return a BB, even on failure
|
||||
if not self._bb then
|
||||
logger.warn("ImageWidget: Failed to render SVG image file:", self.file)
|
||||
self._bb = RenderImage:renderCheckerboard(width, height, Screen.bb:getType())
|
||||
self._is_straight_alpha = false
|
||||
end
|
||||
else
|
||||
self._bb = RenderImage:renderImageFile(self.file, false, width, height)
|
||||
|
||||
if not self._bb then
|
||||
logger.warn("ImageWidget: Failed to render image file:", self.file)
|
||||
self._bb = RenderImage:renderCheckerboard(width, height, Screen.bb:getType())
|
||||
self._is_straight_alpha = false
|
||||
end
|
||||
|
||||
if scale_for_dpi_here then
|
||||
local bb_w, bb_h = self._bb:getWidth(), self._bb:getHeight()
|
||||
self._bb = RenderImage:scaleBlitBuffer(self._bb, math.floor(bb_w * DPI_SCALE), math.floor(bb_h * DPI_SCALE))
|
||||
|
||||
Reference in New Issue
Block a user