diff --git a/base b/base index e88f45393..7a5ca1003 160000 --- a/base +++ b/base @@ -1 +1 @@ -Subproject commit e88f4539336f042aadc7ae54373b2498521881f8 +Subproject commit 7a5ca100317ad61fdb6ce84f95e20991dc78816e diff --git a/frontend/device/generic/device.lua b/frontend/device/generic/device.lua index d442c3b1a..9c913d3ec 100644 --- a/frontend/device/generic/device.lua +++ b/frontend/device/generic/device.lua @@ -57,6 +57,11 @@ function Device:init() error("screen/framebuffer must be implemented") end + self.screen.isColorEnabled = function() + if G_reader_settings:has("color_rendering") then return G_reader_settings:isTrue("color_rendering") end + return self.screen.color + end + local is_eink = G_reader_settings:readSetting("eink") self.screen.eink = (is_eink == nil) or is_eink diff --git a/frontend/document/credocument.lua b/frontend/document/credocument.lua index 29a9cca0d..772a29310 100644 --- a/frontend/document/credocument.lua +++ b/frontend/document/credocument.lua @@ -239,10 +239,15 @@ function CreDocument:drawCurrentView(target, x, y, rect, pos) self.buffer:free() self.buffer = nil end + local color = Screen:isColorEnabled() if not self.buffer then - self.buffer = Blitbuffer.new(rect.w, rect.h) + -- If we use TYPE_BBRGB32 (and LVColorDrawBuf drawBuf(..., 32) in cre.cpp), + -- we get inverted Red and Blue in the blitbuffer (could be that + -- crengine/src/lvdrawbuf.cpp treats our 32bits not as RGBA). + -- But it is all fine if we use TYPE_BBRGB16. + self.buffer = Blitbuffer.new(rect.w, rect.h, color and Blitbuffer.TYPE_BBRGB16 or nil) end - self._document:drawCurrentPage(self.buffer) + self._document:drawCurrentPage(self.buffer, color) target:blitFrom(self.buffer, x, y, 0, 0, rect.w, rect.h) end diff --git a/frontend/document/djvudocument.lua b/frontend/document/djvudocument.lua index bd7939eed..540478c3b 100644 --- a/frontend/document/djvudocument.lua +++ b/frontend/document/djvudocument.lua @@ -1,6 +1,6 @@ -local KoptOptions = require("ui/data/koptoptions") local Document = require("document/document") local DrawContext = require("ffi/drawcontext") +local KoptOptions = require("ui/data/koptoptions") local DjvuDocument = Document:new{ _document = false, @@ -10,6 +10,7 @@ local DjvuDocument = Document:new{ dc_null = DrawContext.new(), options = KoptOptions, koptinterface = nil, + is_color_capable = false, } -- check DjVu magic string to validate diff --git a/frontend/document/document.lua b/frontend/document/document.lua index b64cf37ed..4758dd609 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -1,12 +1,13 @@ -local TileCacheItem = require("document/tilecacheitem") -local DrawContext = require("ffi/drawcontext") -local Configurable = require("configurable") local Blitbuffer = require("ffi/blitbuffer") -local lfs = require("libs/libkoreader-lfs") +local Cache = require("cache") local CacheItem = require("cacheitem") +local Configurable = require("configurable") +local DrawContext = require("ffi/drawcontext") local Geom = require("ui/geometry") local Math = require("optmath") -local Cache = require("cache") +local Screen = require("device").screen +local TileCacheItem = require("document/tilecacheitem") +local lfs = require("libs/libkoreader-lfs") local logger = require("logger") --[[ @@ -31,6 +32,10 @@ local Document = { -- flag to show that the document is edited and needs to write back to disk is_edited = false, + + -- whether this document can be rendered in color + is_color_capable = true, + } function Document:new(from_o) @@ -298,12 +303,16 @@ function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode) end -- prepare cache item with contained blitbuffer + local bbtype = nil -- use Blitbuffer default greyscale type + if self.is_color_capable and Screen:isColorEnabled() then + bbtype = Blitbuffer.TYPE_BBRGB32 + end tile = TileCacheItem:new{ persistent = true, size = size.w * size.h + 64, -- estimation excerpt = size, pageno = pageno, - bb = Blitbuffer.new(size.w, size.h) + bb = Blitbuffer.new(size.w, size.h, bbtype) } -- create a draw context diff --git a/frontend/document/pdfdocument.lua b/frontend/document/pdfdocument.lua index 112bbf7a9..8113f65e3 100644 --- a/frontend/document/pdfdocument.lua +++ b/frontend/document/pdfdocument.lua @@ -1,8 +1,9 @@ local Cache = require("cache") local CacheItem = require("cacheitem") -local KoptOptions = require("ui/data/koptoptions") local Document = require("document/document") local DrawContext = require("ffi/drawcontext") +local KoptOptions = require("ui/data/koptoptions") +local Screen = require("device").screen local logger = require("logger") local util = require("util") @@ -16,6 +17,7 @@ local PdfDocument = Document:new{ function PdfDocument:init() local pdf = require("ffi/mupdf") + pdf.color = Screen:isColorEnabled() self.koptinterface = require("document/koptinterface") self.configurable:loadDefaults(self.options) local ok diff --git a/frontend/document/picdocument.lua b/frontend/document/picdocument.lua index 17dc51033..c8509fe82 100644 --- a/frontend/document/picdocument.lua +++ b/frontend/document/picdocument.lua @@ -1,5 +1,6 @@ local Document = require("document/document") local DrawContext = require("ffi/drawcontext") +local Screen = require("device").screen local pic = nil local PicDocument = Document:new{ @@ -10,6 +11,7 @@ local PicDocument = Document:new{ function PicDocument:init() if not pic then pic = require("ffi/pic") end + pic.color = Screen:isColorEnabled() local ok ok, self._document = pcall(pic.openDocument, self.file) if not ok then