From 9efdefb22fa377bee120f98e695c2ee87857017a Mon Sep 17 00:00:00 2001 From: chrox Date: Wed, 20 Feb 2013 14:32:51 +0800 Subject: [PATCH] add gamma correction for pdf/djvu reader --- frontend/document/djvudocument.lua | 8 ++++---- frontend/document/document.lua | 26 +++++++++++++++++--------- frontend/document/koptinterface.lua | 2 ++ frontend/document/pdfdocument.lua | 8 ++++---- frontend/ui/reader/readerview.lua | 9 +++++++++ 5 files changed, 36 insertions(+), 17 deletions(-) diff --git a/frontend/document/djvudocument.lua b/frontend/document/djvudocument.lua index 960244289..3dbb1161e 100644 --- a/frontend/document/djvudocument.lua +++ b/frontend/document/djvudocument.lua @@ -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 diff --git a/frontend/document/document.lua b/frontend/document/document.lua index 05a98dd0a..e21005a1a 100644 --- a/frontend/document/document.lua +++ b/frontend/document/document.lua @@ -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) diff --git a/frontend/document/koptinterface.lua b/frontend/document/koptinterface.lua index d76238f78..85f072c4e 100644 --- a/frontend/document/koptinterface.lua +++ b/frontend/document/koptinterface.lua @@ -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}, } } }, diff --git a/frontend/document/pdfdocument.lua b/frontend/document/pdfdocument.lua index a0dbecd88..96c661c7a 100644 --- a/frontend/document/pdfdocument.lua +++ b/frontend/document/pdfdocument.lua @@ -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 diff --git a/frontend/ui/reader/readerview.lua b/frontend/ui/reader/readerview.lua index 0ae308d13..397d1bf75 100644 --- a/frontend/ui/reader/readerview.lua +++ b/frontend/ui/reader/readerview.lua @@ -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