mirror of
https://github.com/koreader/koreader.git
synced 2025-12-13 20:36:53 +01:00
Merge pull request #1969 from Hzj-jie/screen-saver
Update ImageWidget to support more stretch settings, and enable screensaver on kobo
This commit is contained in:
@@ -178,8 +178,6 @@ KOBO_LIGHT_ON_START = -2 -- -1, -2 or 0-100. -1 leaves light as it
|
||||
-- sets light on start/wake up
|
||||
KOBO_SYNC_BRIGHTNESS_WITH_NICKEL = true -- Save brightness set in KOreader
|
||||
-- with nickel's 'Kobo eReader.conf'
|
||||
KOBO_SCREEN_SAVER = "" -- image or directory with pictures or "-"
|
||||
KOBO_SCREEN_SAVER_LAST_BOOK = true -- get screensaver from last book if possible
|
||||
|
||||
-- Network proxy settings
|
||||
-- proxy url should be a string in the format of "http://localhost:3128"
|
||||
|
||||
@@ -15,6 +15,8 @@ local Kobo = Generic:new{
|
||||
touch_mirrored_x = true,
|
||||
-- enforce protrait mode on Kobos:
|
||||
isAlwaysPortrait = yes,
|
||||
-- the internal storage mount point users can write to
|
||||
internal_storage_mount_point = "/mnt/onboard/"
|
||||
}
|
||||
|
||||
-- TODO: hasKeys for some devices?
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
local DocumentRegistry = require("document/documentregistry")
|
||||
local UIManager = require("ui/uimanager")
|
||||
local Screen = require("device").screen
|
||||
local Device = require("device")
|
||||
local Screen = Device.screen
|
||||
local DocSettings = require("docsettings")
|
||||
local DEBUG = require("dbg")
|
||||
local _ = require("gettext")
|
||||
@@ -8,15 +9,59 @@ local _ = require("gettext")
|
||||
local Screensaver = {
|
||||
}
|
||||
|
||||
local function createWidgetFromImage(image_widget)
|
||||
if image_widget then
|
||||
local AlphaContainer = require("ui/widget/container/alphacontainer")
|
||||
local CenterContainer = require("ui/widget/container/centercontainer")
|
||||
return AlphaContainer:new{
|
||||
alpha = 1,
|
||||
height = Screen:getHeight(),
|
||||
width = Screen:getWidth(),
|
||||
CenterContainer:new{
|
||||
dimen = Screen:getSize(),
|
||||
image_widget,
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
|
||||
local function createWidgetFromFile(file)
|
||||
if lfs.attributes(file, "mode") == "file" then
|
||||
local ImageWidget = require("ui/widget/imagewidget")
|
||||
return createWidgetFromImage(
|
||||
ImageWidget:new{
|
||||
file = file,
|
||||
height = Screen:getHeight(),
|
||||
width = Screen:getWidth(),
|
||||
autostretch = true,
|
||||
})
|
||||
end
|
||||
end
|
||||
|
||||
local function getRandomImage(dir)
|
||||
if string.sub(dir, string.len(dir)) ~= "/" then
|
||||
dir = dir .. "/"
|
||||
end
|
||||
local pics = {}
|
||||
local i = 0
|
||||
math.randomseed(os.time())
|
||||
for entry in lfs.dir(dir) do
|
||||
if lfs.attributes(dir .. entry, "mode") == "file" then
|
||||
local extension =
|
||||
string.lower(string.match(entry, ".+%.([^.]+)") or "")
|
||||
if extension == "jpg"
|
||||
or extension == "jpeg"
|
||||
or extension == "png" then
|
||||
i = i + 1
|
||||
pics[i] = entry
|
||||
end
|
||||
end
|
||||
end
|
||||
return createWidgetFromFile(dir .. pics[math.random(i)])
|
||||
end
|
||||
|
||||
function Screensaver:getCoverImage(file)
|
||||
local ImageWidget = require("ui/widget/imagewidget")
|
||||
local CenterContainer = require("ui/widget/container/centercontainer")
|
||||
local FrameContainer = require("ui/widget/container/framecontainer")
|
||||
local AlphaContainer = require("ui/widget/container/alphacontainer")
|
||||
local image_height
|
||||
local image_width
|
||||
local screen_height = Screen:getHeight()
|
||||
local screen_width = Screen:getWidth()
|
||||
local doc = DocumentRegistry:openDocument(file)
|
||||
if doc then
|
||||
local image = doc:getCoverPageImage()
|
||||
@@ -25,68 +70,13 @@ function Screensaver:getCoverImage(file)
|
||||
local data = DocSettings:open(lastfile)
|
||||
local proportional_cover = data:readSetting("proportional_screensaver")
|
||||
if image then
|
||||
if proportional_cover then
|
||||
image_height = image:getHeight()
|
||||
image_width = image:getWidth()
|
||||
local image_ratio = image_width / image_height
|
||||
if image_ratio < 1 then
|
||||
image_height = screen_height
|
||||
image_width = image_height * image_ratio
|
||||
else
|
||||
image_width = screen_width
|
||||
image_height = image_width / image_ratio
|
||||
end
|
||||
else
|
||||
image_height = screen_height
|
||||
image_width = screen_width
|
||||
end
|
||||
local image_widget = ImageWidget:new{
|
||||
return createWidgetFromImage(
|
||||
ImageWidget:new{
|
||||
image = image,
|
||||
width = image_width,
|
||||
height = image_height,
|
||||
}
|
||||
return AlphaContainer:new{
|
||||
alpha = 1,
|
||||
height = screen_height,
|
||||
width = screen_width,
|
||||
CenterContainer:new{
|
||||
dimen = Screen:getSize(),
|
||||
FrameContainer:new{
|
||||
bordersize = 0,
|
||||
padding = 0,
|
||||
height = screen_height,
|
||||
width = screen_width,
|
||||
image_widget
|
||||
}
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Screensaver:getRandomImage(dir)
|
||||
local ImageWidget = require("ui/widget/imagewidget")
|
||||
local pics = {}
|
||||
local i = 0
|
||||
math.randomseed(os.time())
|
||||
for entry in lfs.dir(dir) do
|
||||
if lfs.attributes(dir .. entry, "mode") == "file" then
|
||||
local extension = string.lower(string.match(entry, ".+%.([^.]+)") or "")
|
||||
if extension == "jpg" or extension == "jpeg" or extension == "png" then
|
||||
i = i + 1
|
||||
pics[i] = entry
|
||||
end
|
||||
end
|
||||
end
|
||||
local image = pics[math.random(i)]
|
||||
if image then
|
||||
image = dir .. image
|
||||
if lfs.attributes(image, "mode") == "file" then
|
||||
return ImageWidget:new{
|
||||
file = image,
|
||||
width = Screen:getWidth(),
|
||||
height = Screen:getHeight(),
|
||||
}
|
||||
width = Screen:getWidth(),
|
||||
autostretch = proportional_cover,
|
||||
})
|
||||
end
|
||||
end
|
||||
end
|
||||
@@ -95,7 +85,9 @@ function Screensaver:show()
|
||||
DEBUG("show screensaver")
|
||||
local InfoMessage = require("ui/widget/infomessage")
|
||||
-- first check book cover image
|
||||
if KOBO_SCREEN_SAVER_LAST_BOOK then
|
||||
screen_saver_last_book =
|
||||
G_reader_settings:readSetting("use_lastfile_as_screensaver")
|
||||
if screen_saver_last_book == nil or screen_saver_last_book then
|
||||
local lastfile = G_reader_settings:readSetting("lastfile")
|
||||
if lastfile then
|
||||
local data = DocSettings:open(lastfile)
|
||||
@@ -107,20 +99,19 @@ function Screensaver:show()
|
||||
end
|
||||
-- then screensaver directory or file image
|
||||
if not self.suspend_msg then
|
||||
if type(KOBO_SCREEN_SAVER) == "string" then
|
||||
local file = KOBO_SCREEN_SAVER
|
||||
if lfs.attributes(file, "mode") == "directory" then
|
||||
if string.sub(file,string.len(file)) ~= "/" then
|
||||
file = file .. "/"
|
||||
local screen_saver_folder =
|
||||
G_reader_settings:readSetting("screensaver_folder")
|
||||
if screen_saver_folder == nil
|
||||
and Device.internal_storage_mount_point ~= nil then
|
||||
screen_saver_folder =
|
||||
Device.internal_storage_mount_point .. "screensaver"
|
||||
end
|
||||
self.suspend_msg = self:getRandomImage(file)
|
||||
elseif lfs.attributes(file, "mode") == "file" then
|
||||
local ImageWidget = require("ui/widget/imagewidget")
|
||||
self.suspend_msg = ImageWidget:new{
|
||||
file = file,
|
||||
width = Screen:getWidth(),
|
||||
height = Screen:getHeight(),
|
||||
}
|
||||
if screen_saver_folder then
|
||||
local file = screen_saver_folder
|
||||
if lfs.attributes(file, "mode") == "directory" then
|
||||
self.suspend_msg = getRandomImage(file)
|
||||
else
|
||||
self.suspend_msg = createWidgetFromFile(file)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
@@ -39,6 +39,14 @@ local ImageWidget = Widget:new{
|
||||
autoscale = false,
|
||||
-- when alpha is set to true, alpha values from the image will be honored
|
||||
alpha = false,
|
||||
-- when autostretch is set to true, image will be stretched to best fit the
|
||||
-- widget size. i.e. either fit the width or fit the height according to the
|
||||
-- original image size.
|
||||
autostretch = false,
|
||||
-- when overflow is set to true, image will be stretched to fit the widget
|
||||
-- size vertically and horizontally, without impact original aspect ratio.
|
||||
-- But overflow part will be ignored.
|
||||
overflow = false,
|
||||
_bb = nil
|
||||
}
|
||||
|
||||
@@ -79,15 +87,35 @@ function ImageWidget:_render()
|
||||
error("cannot render image")
|
||||
end
|
||||
local native_w, native_h = self._bb:getWidth(), self._bb:getHeight()
|
||||
local scaled_w, scaled_h = self.width, self.height
|
||||
local w, h
|
||||
if self.autoscale then
|
||||
local dpi_scale = Screen:getDPI() / 167
|
||||
-- rounding off to power of 2 to avoid alias with pow(2, floor(log(x)/log(2))
|
||||
local scale = math.pow(2, math.max(0, math.floor(math.log(dpi_scale)/0.69)))
|
||||
scaled_w, scaled_h = scale * native_w, scale * native_h
|
||||
w, h = scale * native_w, scale * native_h
|
||||
elseif self.width and self.height then
|
||||
if self.autostretch then
|
||||
local ratio = native_w / self.width / native_h * self.height
|
||||
if ratio < 1 then
|
||||
h = self.height
|
||||
w = self.width * ratio
|
||||
else
|
||||
h = self.height * ratio
|
||||
w = self.width
|
||||
end
|
||||
if (scaled_w and scaled_w ~= native_w) or (scaled_h and scaled_h ~= native_h) then
|
||||
self._bb = self._bb:scale(scaled_w or native_w, scaled_h or native_h)
|
||||
elseif self.overflow then
|
||||
local ratio = native_w / self.width / native_h * self.height
|
||||
if ratio < 1 then
|
||||
h = self.height / ratio
|
||||
w = self.width
|
||||
else
|
||||
h = self.height
|
||||
w = self.width / ratio
|
||||
end
|
||||
end
|
||||
end
|
||||
if (w and w ~= native_w) or (h and h ~= native_h) then
|
||||
self._bb = self._bb:scale(w or native_w, h or native_h)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
Reference in New Issue
Block a user