From d7495919844e3ec12cfcf74903f8fdb6206f2991 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Sat, 27 Oct 2018 00:34:13 -0700 Subject: [PATCH] decouple device from pdfdocument, font & bgr checking --- frontend/document/pdfdocument.lua | 13 ++------- frontend/runtimectl.lua | 42 ++++++++++++++++++++++++++++ frontend/ui/font.lua | 29 ++++++++++--------- frontend/ui/renderimage.lua | 8 ------ frontend/ui/widget/htmlboxwidget.lua | 6 ---- reader.lua | 10 +++---- 6 files changed, 64 insertions(+), 44 deletions(-) diff --git a/frontend/document/pdfdocument.lua b/frontend/document/pdfdocument.lua index e8f2b0697..2169e82d2 100644 --- a/frontend/document/pdfdocument.lua +++ b/frontend/document/pdfdocument.lua @@ -1,14 +1,13 @@ local Cache = require("cache") local CacheItem = require("cacheitem") -local Device = require("device") local Document = require("document/document") local DrawContext = require("ffi/drawcontext") local logger = require("logger") local util = require("util") local ffi = require("ffi") local C = ffi.C -local Screen = Device.screen local pdf = nil +local Runtimectl = require("runtimectl") local PdfDocument = Document:new{ @@ -30,12 +29,6 @@ function PdfDocument:init() -- and :postRenderPage() when mupdf is called without kopt involved. pdf.color = false self:updateColorRendering() - if pdf.bgr == nil then - pdf.bgr = false - if Device:hasBGRFrameBuffer() then - pdf.bgr = true - end - end self.koptinterface = require("document/koptinterface") self.koptinterface:setDefaultConfigurable(self.configurable) local ok @@ -44,8 +37,8 @@ function PdfDocument:init() error(self._document) -- will contain error message end -- no-op on PDF - self._document:layoutDocument(Screen:getWidth(), Screen:getHeight(), - Screen:scaleBySize(self.epub_font_size)) + self._document:layoutDocument(Runtimectl:getRenderWidth(), Runtimectl:getRenderHeight(), + Runtimectl:scaleByRenderSize(self.epub_font_size)) self.is_open = true self.info.has_pages = true self.info.configurable = true diff --git a/frontend/runtimectl.lua b/frontend/runtimectl.lua index 2d6b168da..d9a9a1153 100644 --- a/frontend/runtimectl.lua +++ b/frontend/runtimectl.lua @@ -1,8 +1,26 @@ +local Mupdf = require("ffi/mupdf") + local Runtimectl = { should_restrict_JIT = false, is_color_rendering_enabled = false, + is_bgr = false, } +function Runtimectl:setDevice(device) + self.isAndroid = device.isAndroid + self.isKindle = device.isKindle + + if self.isAndroid() then + self:restrictJIT() + end + + -- NOTE: Kobo's fb is BGR, not RGB. Handle the conversion in MuPDF if needed. + if device:hasBGRFrameBuffer() then + self.is_bgr = true + Mupdf.bgr = true + end +end + --[[ Disable jit on some modules on android to make koreader on Android more stable. @@ -22,4 +40,28 @@ function Runtimectl:setColorRenderingEnabled(val) self.is_color_rendering_enabled = val end +function Runtimectl:getExternalFontDir() + if self.isAndroid() then + return ANDROID_FONT_DIR + else + return os.getenv("EXT_FONT_DIR") + end +end + +function Runtimectl:getRenderWidth() + return self.screen:getWidth() +end + +function Runtimectl:getRenderHeight() + return self.screen:getHeight() +end + +function Runtimectl:getRenderDPI() + return self.screen:getDPI() +end + +function Runtimectl:scaleByRenderSize(px) + return self.screen:scaleBySize(px) +end + return Runtimectl diff --git a/frontend/ui/font.lua b/frontend/ui/font.lua index e056bba03..62dad4739 100644 --- a/frontend/ui/font.lua +++ b/frontend/ui/font.lua @@ -2,11 +2,10 @@ Font module. ]] -local Device = require("device") local Freetype = require("ffi/freetype") local lfs = require("libs/libkoreader-lfs") local logger = require("logger") -local Screen = Device.screen +local Runtimectl = require("runtimectl") local Font = { fontmap = { @@ -86,8 +85,17 @@ local Font = { -- face table faces = {}, + + -- set by self.setScreen + screen = nil, } +--- Sets the screen object that will be used by font module for font size scaling +-- NOTE: this call is required for using KOReader UI framework +function Font:setScreen(screen) + self.screen = screen +end + --- Gets font face object. -- @string font -- @int size optional size @@ -99,7 +107,7 @@ function Font:getFace(font, size) if not size then size = self.sizemap[font] end -- original size before scaling by screen DPI local orig_size = size - size = Screen:scaleBySize(size) + size = self.screen:scaleBySize(size) local hash = font..size local face_obj = self.faces[hash] @@ -188,9 +196,8 @@ local kindle_fonts_blacklist = { } local function isInFontsBlacklist(f) - if Device:isKindle() then - return kindle_fonts_blacklist[f] - end + -- write test for this + return Runtimectl.isKindle() and kindle_fonts_blacklist[f] end function Font:_readList(target, dir) @@ -214,19 +221,11 @@ function Font:_readList(target, dir) end end -function Font:_getExternalFontDir() - if Device:isAndroid() then - return ANDROID_FONT_DIR - else - return os.getenv("EXT_FONT_DIR") - end -end - function Font:getFontList() local fontlist = {} self:_readList(fontlist, self.fontdir) -- multiple paths should be joined with semicolon - for dir in string.gmatch(self:_getExternalFontDir() or "", "([^;]+)") do + for dir in string.gmatch(Runtimectl:getExternalFontDir() or "", "([^;]+)") do self:_readList(fontlist, dir) end table.sort(fontlist) diff --git a/frontend/ui/renderimage.lua b/frontend/ui/renderimage.lua index ed237ad52..ed3cb181d 100644 --- a/frontend/ui/renderimage.lua +++ b/frontend/ui/renderimage.lua @@ -3,7 +3,6 @@ Image rendering module. ]] local ffi = require("ffi") -local Device = require("device") local logger = require("logger") -- Will be loaded when needed @@ -67,13 +66,6 @@ end -- @treturn BlitBuffer function RenderImage:renderImageDataWithMupdf(data, size, width, height) if not Mupdf then Mupdf = require("ffi/mupdf") end - -- NOTE: Kobo's fb is BGR, not RGB. Handle the conversion in MuPDF if needed. - if Mupdf.bgr == nil then - Mupdf.bgr = false - if Device:hasBGRFrameBuffer() then - Mupdf.bgr = true - end - end local ok, image = pcall(Mupdf.renderImage, data, size, width, height) logger.dbg("Mupdf.renderImage", ok, image) if not ok then diff --git a/frontend/ui/widget/htmlboxwidget.lua b/frontend/ui/widget/htmlboxwidget.lua index 691b8bb50..9cf94887a 100644 --- a/frontend/ui/widget/htmlboxwidget.lua +++ b/frontend/ui/widget/htmlboxwidget.lua @@ -35,12 +35,6 @@ function HtmlBoxWidget:init() }, } end - if Mupdf.bgr == nil then - Mupdf.bgr = false - if Device:hasBGRFrameBuffer() then - Mupdf.bgr = true - end - end end function HtmlBoxWidget:setContent(body, css, default_font_size) diff --git a/reader.lua b/reader.lua index 4e50b659d..4164824df 100755 --- a/reader.lua +++ b/reader.lua @@ -19,7 +19,6 @@ local DataStorage = require("datastorage") pcall(dofile, DataStorage:getDataDir() .. "/defaults.persistent.lua") require("setupkoenv") -Runtimectl = require("runtimectl") io.stdout:write(" [*] Version: ", require("version"):getCurrentRevision(), "\n\n") io.stdout:flush() @@ -36,10 +35,12 @@ if lang_locale then end -- setup various runtime control +local Runtimectl = require("runtimectl") local Device = require("device") -if Device:isAndroid() then - Runtimectl:restrictJIT() -end +Runtimectl:setDevice(Device) + +local Font = require("ui/font") +Font:setScreen(Device.screen) if G_reader_settings:has("color_rendering") then Runtimectl:setColorRenderingEnabled(G_reader_settings:isTrue("color_rendering")) @@ -113,7 +114,6 @@ while argidx <= #ARGV do end local ConfirmBox = require("ui/widget/confirmbox") -local Font = require("ui/font") local QuickStart = require("ui/quickstart") local UIManager = require("ui/uimanager") local lfs = require("libs/libkoreader-lfs")