mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
add gamma correction for pdf/djvu reader
This commit is contained in:
@@ -72,19 +72,19 @@ function DjvuDocument:getPageDimensions(pageno, zoom, rotation)
|
||||
end
|
||||
end
|
||||
|
||||
function DjvuDocument:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
function DjvuDocument:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
if self.configurable.text_wrap == 1 then
|
||||
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode)
|
||||
else
|
||||
return Document.renderPage(self, pageno, rect, zoom, rotation, render_mode)
|
||||
return Document.renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
|
||||
function DjvuDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
function DjvuDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
|
||||
if self.configurable.text_wrap == 1 then
|
||||
self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
else
|
||||
Document.drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
Document.drawPage(self, target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@ Document = {
|
||||
date = ""
|
||||
},
|
||||
|
||||
GAMMA_NO_GAMMA = 1.0,
|
||||
|
||||
-- override bbox from orignal page's getUsedBBox
|
||||
bbox = {},
|
||||
|
||||
@@ -182,8 +184,8 @@ function Document:getToc()
|
||||
return self._document:getToc()
|
||||
end
|
||||
|
||||
function Document:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
local hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode
|
||||
function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
local hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
|
||||
local page_size = self:getPageDimensions(pageno, zoom, rotation)
|
||||
-- this will be the size we actually render
|
||||
local size = page_size
|
||||
@@ -198,7 +200,7 @@ function Document:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
return
|
||||
end
|
||||
-- only render required part
|
||||
hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode.."|"..tostring(rect)
|
||||
hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode.."|"..tostring(rect)
|
||||
size = rect
|
||||
end
|
||||
|
||||
@@ -223,6 +225,11 @@ function Document:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
dc:setOffset(0, page_size.h)
|
||||
end
|
||||
dc:setZoom(zoom)
|
||||
|
||||
if gamma ~= self.GAMMA_NO_GAMMA then
|
||||
--DEBUG("gamma correction: ", gamma)
|
||||
dc:setGamma(gamma)
|
||||
end
|
||||
|
||||
-- render
|
||||
local page = self._document:openPage(pageno)
|
||||
@@ -235,10 +242,11 @@ end
|
||||
|
||||
-- a hint for the cache engine to paint a full page to the cache
|
||||
-- TODO: this should trigger a background operation
|
||||
function Document:hintPage(pageno, zoom, rotation, render_mode)
|
||||
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode
|
||||
function Document:hintPage(pageno, zoom, rotation, gamma, render_mode)
|
||||
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
|
||||
if not Cache:check(hash_full_page) then
|
||||
self:renderPage(pageno, nil, zoom, rotation, render_mode)
|
||||
--DEBUG("hinting page", pageno)
|
||||
self:renderPage(pageno, nil, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
|
||||
@@ -250,15 +258,15 @@ Draw page content to blitbuffer.
|
||||
@target: target blitbuffer
|
||||
@rect: visible_area inside document page
|
||||
--]]
|
||||
function Document:drawPage(target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode
|
||||
function Document:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
|
||||
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
|
||||
local hash_excerpt = hash_full_page.."|"..tostring(rect)
|
||||
local tile = Cache:check(hash_full_page)
|
||||
if not tile then
|
||||
tile = Cache:check(hash_excerpt)
|
||||
if not tile then
|
||||
DEBUG("rendering")
|
||||
tile = self:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
tile = self:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
DEBUG("now painting", tile, rect)
|
||||
|
||||
@@ -104,6 +104,8 @@ KoptOptions = {
|
||||
item_align_center = 0.8,
|
||||
values = {2.0, 1.5, 1.0, 0.5, 0.2},
|
||||
default_value = 1.0,
|
||||
event = "GammaUpdate",
|
||||
args = {0.5, 0.8, 1.0, 2.0, 4.0},
|
||||
}
|
||||
}
|
||||
},
|
||||
|
||||
@@ -68,19 +68,19 @@ function PdfDocument:getPageDimensions(pageno, zoom, rotation)
|
||||
end
|
||||
end
|
||||
|
||||
function PdfDocument:renderPage(pageno, rect, zoom, rotation, render_mode)
|
||||
function PdfDocument:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
if self.configurable.text_wrap == 1 then
|
||||
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode)
|
||||
else
|
||||
return Document.renderPage(self, pageno, rect, zoom, rotation, render_mode)
|
||||
return Document.renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
|
||||
function PdfDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
function PdfDocument:drawPage(target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
|
||||
if self.configurable.text_wrap == 1 then
|
||||
self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
else
|
||||
Document.drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
|
||||
Document.drawPage(self, target, x, y, rect, pageno, zoom, rotation, gamma, render_mode)
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ ReaderView = WidgetContainer:new{
|
||||
pos = 0,
|
||||
zoom = 1.0,
|
||||
rotation = 0,
|
||||
gamma = 1.0,
|
||||
offset = {},
|
||||
bbox = nil,
|
||||
},
|
||||
@@ -50,6 +51,7 @@ function ReaderView:paintTo(bb, x, y)
|
||||
self.state.page,
|
||||
self.state.zoom,
|
||||
self.state.rotation,
|
||||
self.state.gamma,
|
||||
self.render_mode)
|
||||
UIManager:scheduleIn(0, function() self.ui:handleEvent(Event:new("HintPage")) end)
|
||||
else
|
||||
@@ -160,6 +162,7 @@ function ReaderView:onReadSettings(config)
|
||||
table.insert(self.ui.postInitCallback, function()
|
||||
self:onSetScreenMode(screen_mode) end)
|
||||
end
|
||||
self.state.gamma = config:readSetting("gamma") or 1.0
|
||||
end
|
||||
|
||||
function ReaderView:onPageUpdate(new_page_no)
|
||||
@@ -186,12 +189,17 @@ function ReaderView:onRotationUpdate(rotation)
|
||||
self:recalculate()
|
||||
end
|
||||
|
||||
function ReaderView:onGammaUpdate(gamma)
|
||||
self.state.gamma = gamma
|
||||
end
|
||||
|
||||
function ReaderView:onHintPage()
|
||||
if self.state.page < self.ui.document.info.number_of_pages then
|
||||
self.ui.document:hintPage(
|
||||
self.state.page+1,
|
||||
self.state.zoom,
|
||||
self.state.rotation,
|
||||
self.state.gamma,
|
||||
self.render_mode)
|
||||
end
|
||||
return true
|
||||
@@ -207,4 +215,5 @@ end
|
||||
function ReaderView:onCloseDocument()
|
||||
self.ui.doc_settings:saveSetting("render_mode", self.render_mode)
|
||||
self.ui.doc_settings:saveSetting("screen_mode", self.screen_mode)
|
||||
self.ui.doc_settings:saveSetting("gamma", self.state.gamma)
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user