add gamma correction for pdf/djvu reader

pull/2/merge
chrox 11 years ago
parent df7f7714e4
commit 9efdefb22f

@ -72,19 +72,19 @@ function DjvuDocument:getPageDimensions(pageno, zoom, rotation)
end end
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 if self.configurable.text_wrap == 1 then
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode) return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode)
else else
return Document.renderPage(self, pageno, rect, zoom, rotation, render_mode) return Document.renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
end end
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 if self.configurable.text_wrap == 1 then
self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode) self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
else 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
end end

@ -56,6 +56,8 @@ Document = {
date = "" date = ""
}, },
GAMMA_NO_GAMMA = 1.0,
-- override bbox from orignal page's getUsedBBox -- override bbox from orignal page's getUsedBBox
bbox = {}, bbox = {},
@ -182,8 +184,8 @@ function Document:getToc()
return self._document:getToc() return self._document:getToc()
end end
function Document:renderPage(pageno, rect, zoom, rotation, render_mode) function Document:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
local hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode local hash = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
local page_size = self:getPageDimensions(pageno, zoom, rotation) local page_size = self:getPageDimensions(pageno, zoom, rotation)
-- this will be the size we actually render -- this will be the size we actually render
local size = page_size local size = page_size
@ -198,7 +200,7 @@ function Document:renderPage(pageno, rect, zoom, rotation, render_mode)
return return
end end
-- only render required part -- 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 size = rect
end end
@ -223,6 +225,11 @@ function Document:renderPage(pageno, rect, zoom, rotation, render_mode)
dc:setOffset(0, page_size.h) dc:setOffset(0, page_size.h)
end end
dc:setZoom(zoom) dc:setZoom(zoom)
if gamma ~= self.GAMMA_NO_GAMMA then
--DEBUG("gamma correction: ", gamma)
dc:setGamma(gamma)
end
-- render -- render
local page = self._document:openPage(pageno) 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 -- a hint for the cache engine to paint a full page to the cache
-- TODO: this should trigger a background operation -- TODO: this should trigger a background operation
function Document:hintPage(pageno, zoom, rotation, render_mode) function Document:hintPage(pageno, zoom, rotation, gamma, render_mode)
local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..render_mode local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
if not Cache:check(hash_full_page) then 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
end end
@ -250,15 +258,15 @@ Draw page content to blitbuffer.
@target: target blitbuffer @target: target blitbuffer
@rect: visible_area inside document page @rect: visible_area inside document page
--]] --]]
function Document:drawPage(target, x, y, rect, 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.."|"..render_mode local hash_full_page = "renderpg|"..self.file.."|"..pageno.."|"..zoom.."|"..rotation.."|"..gamma.."|"..render_mode
local hash_excerpt = hash_full_page.."|"..tostring(rect) local hash_excerpt = hash_full_page.."|"..tostring(rect)
local tile = Cache:check(hash_full_page) local tile = Cache:check(hash_full_page)
if not tile then if not tile then
tile = Cache:check(hash_excerpt) tile = Cache:check(hash_excerpt)
if not tile then if not tile then
DEBUG("rendering") DEBUG("rendering")
tile = self:renderPage(pageno, rect, zoom, rotation, render_mode) tile = self:renderPage(pageno, rect, zoom, rotation, gamma, render_mode)
end end
end end
DEBUG("now painting", tile, rect) DEBUG("now painting", tile, rect)

@ -104,6 +104,8 @@ KoptOptions = {
item_align_center = 0.8, item_align_center = 0.8,
values = {2.0, 1.5, 1.0, 0.5, 0.2}, values = {2.0, 1.5, 1.0, 0.5, 0.2},
default_value = 1.0, 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
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 if self.configurable.text_wrap == 1 then
return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode) return self.koptinterface:renderPage(self, pageno, rect, zoom, rotation, render_mode)
else else
return Document.renderPage(self, pageno, rect, zoom, rotation, render_mode) return Document.renderPage(self, pageno, rect, zoom, rotation, gamma, render_mode)
end end
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 if self.configurable.text_wrap == 1 then
self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode) self.koptinterface:drawPage(self, target, x, y, rect, pageno, zoom, rotation, render_mode)
else 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
end end

@ -7,6 +7,7 @@ ReaderView = WidgetContainer:new{
pos = 0, pos = 0,
zoom = 1.0, zoom = 1.0,
rotation = 0, rotation = 0,
gamma = 1.0,
offset = {}, offset = {},
bbox = nil, bbox = nil,
}, },
@ -50,6 +51,7 @@ function ReaderView:paintTo(bb, x, y)
self.state.page, self.state.page,
self.state.zoom, self.state.zoom,
self.state.rotation, self.state.rotation,
self.state.gamma,
self.render_mode) self.render_mode)
UIManager:scheduleIn(0, function() self.ui:handleEvent(Event:new("HintPage")) end) UIManager:scheduleIn(0, function() self.ui:handleEvent(Event:new("HintPage")) end)
else else
@ -160,6 +162,7 @@ function ReaderView:onReadSettings(config)
table.insert(self.ui.postInitCallback, function() table.insert(self.ui.postInitCallback, function()
self:onSetScreenMode(screen_mode) end) self:onSetScreenMode(screen_mode) end)
end end
self.state.gamma = config:readSetting("gamma") or 1.0
end end
function ReaderView:onPageUpdate(new_page_no) function ReaderView:onPageUpdate(new_page_no)
@ -186,12 +189,17 @@ function ReaderView:onRotationUpdate(rotation)
self:recalculate() self:recalculate()
end end
function ReaderView:onGammaUpdate(gamma)
self.state.gamma = gamma
end
function ReaderView:onHintPage() function ReaderView:onHintPage()
if self.state.page < self.ui.document.info.number_of_pages then if self.state.page < self.ui.document.info.number_of_pages then
self.ui.document:hintPage( self.ui.document:hintPage(
self.state.page+1, self.state.page+1,
self.state.zoom, self.state.zoom,
self.state.rotation, self.state.rotation,
self.state.gamma,
self.render_mode) self.render_mode)
end end
return true return true
@ -207,4 +215,5 @@ end
function ReaderView:onCloseDocument() function ReaderView:onCloseDocument()
self.ui.doc_settings:saveSetting("render_mode", self.render_mode) 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("screen_mode", self.screen_mode)
self.ui.doc_settings:saveSetting("gamma", self.state.gamma)
end end

Loading…
Cancel
Save