Merge pull request #771 from chrox/kopt-bbox-fix

set manual cropping if bbox exists in koptinterface
This commit is contained in:
{Qingping,Dave} Hou
2013-02-25 21:00:21 -08:00
4 changed files with 50 additions and 26 deletions

View File

@@ -245,7 +245,7 @@ end
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
--DEBUG("hinting page", pageno)
DEBUG("hinting page", pageno)
self:renderPage(pageno, nil, zoom, rotation, gamma, render_mode)
end
end

View File

@@ -14,7 +14,7 @@ KoptOptions = {
name_text = "Screen Mode",
toggle = {"portrait", "landscape"},
args = {"portrait", "landscape"},
default_arg = Screen:getScreenMode(),
default_arg = "portrait",
current_func = function() return Screen:getScreenMode() end,
event = "SetScreenMode",
}
@@ -51,8 +51,8 @@ KoptOptions = {
name = "page_margin",
name_text = "Page Margin",
toggle = {"small", "medium", "large"},
values = {0.02, 0.06, 0.10},
default_value = 0.06,
values = {0.06, 0.10, 0.14},
default_value = 0.10,
},
{
name = "line_spacing",
@@ -92,11 +92,11 @@ KoptOptions = {
options = {
{
name = "font_size",
item_text = {"Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa"},
item_text = {"Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa","Aa"},
item_align_center = 1.0,
spacing = Screen:getWidth()*0.03,
item_font_size = {20,24,28,32,36,38,40,42,46,50},
values = {0.2, 0.3, 0.4, 0.6, 0.8, 1.0, 1.2, 1.6, 2.2, 2.8},
spacing = 15,
item_font_size = {20,24,28,32,34,36,38,40,42,44,46},
values = {0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 2.0, 4.0},
default_value = 1.0,
},
}
@@ -186,8 +186,9 @@ KoptOptions = {
KoptInterface = {}
-- get reflow context
function KoptInterface:getKOPTContext(doc, pageno, bbox, screen_size)
function KoptInterface:getKOPTContext(doc, pageno, bbox)
local kc = KOPTContext.new()
local screen_size = Screen:getSize()
kc:setTrim(doc.configurable.trim_page)
kc:setWrap(doc.configurable.text_wrap)
kc:setIndent(doc.configurable.detect_indent)
@@ -208,17 +209,34 @@ function KoptInterface:getKOPTContext(doc, pageno, bbox, screen_size)
return kc
end
-- calculates page dimensions
function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation)
-- check cached page size
local bbox = doc:getPageBBox(pageno)
local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1
function KoptInterface:setTrimPage(doc, pageno)
local page_dimens = doc:getNativePageDimensions(pageno)
--DEBUG("original page dimens", page_dimens)
local orig_bbox = doc:getUsedBBox(pageno)
--DEBUG("original bbox", orig_bbox)
if orig_bbox.x1 - orig_bbox.x0 < page_dimens.w
or orig_bbox.y1 - orig_bbox.y0 < page_dimens.h then
doc.configurable.trim_page = 0
--DEBUG("Set manual crop in koptengine")
end
end
function KoptInterface:getContextHash(doc, pageno, bbox)
local screen_size = Screen:getSize()
local screen_size_hash = screen_size.w.."|"..screen_size.h
local hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1
return doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
end
-- calculates page dimensions
function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation)
self:setTrimPage(doc, pageno)
local bbox = doc:getPageBBox(pageno)
local context_hash = self:getContextHash(doc, pageno, bbox)
local hash = "kctx|"..context_hash
local cached = Cache:check(hash)
if not cached then
local kc = self:getKOPTContext(doc, pageno, bbox, screen_size)
local kc = self:getKOPTContext(doc, pageno, bbox)
local page = doc._document:openPage(pageno)
-- reflow page
page:reflow(kc, 0)
@@ -237,12 +255,11 @@ function KoptInterface:getPageDimensions(doc, pageno, zoom, rotation)
end
function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode)
self:setTrimPage(doc, pageno)
doc.render_mode = render_mode
local bbox = doc:getPageBBox(pageno)
local bbox_hash = bbox.x0.."|"..bbox.y0.."|"..bbox.x1.."|"..bbox.y1
local screen_size = Screen:getSize()
local screen_size_hash = screen_size.w.."|"..screen_size.h
local hash = "renderpg|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
local context_hash = self:getContextHash(doc, pageno, bbox)
local hash = "renderpg|"..context_hash
local page_size = self:getPageDimensions(doc, pageno, zoom, rotation)
-- this will be the size we actually render
local size = page_size
@@ -273,7 +290,7 @@ function KoptInterface:renderPage(doc, pageno, rect, zoom, rotation, render_mode
}
-- draw to blitbuffer
local kc_hash = "kctx|"..doc.file.."|"..pageno.."|"..doc.configurable:hash("|").."|"..bbox_hash.."|"..screen_size_hash
local kc_hash = "kctx|"..context_hash
local page = doc._document:openPage(pageno)
local cached = Cache:check(kc_hash)
if cached then

View File

@@ -180,7 +180,7 @@ function ConfigOption:init()
local default_option_height = 50
local default_option_padding = 15
local vertical_group = VerticalGroup:new{}
table.insert(vertical_group, VerticalSpan:new{ width = default_option_padding })
table.insert(vertical_group, VerticalSpan:new{ width = default_option_padding * Screen:getDPI()/167 })
for c = 1, #self.options do
if self.options[c].show ~= false then
local name_align = self.options[c].name_align_right and self.options[c].name_align_right or 0.33
@@ -189,9 +189,10 @@ function ConfigOption:init()
local name_font_size = self.options[c].name_font_size and self.options[c].name_font_size or default_name_font_size
local item_font_face = self.options[c].item_font_face and self.options[c].item_font_face or "cfont"
local item_font_size = self.options[c].item_font_size and self.options[c].item_font_size or default_item_font_size
local option_height = self.options[c].height and self.options[c].height or default_option_height
local items_spacing = HorizontalSpan:new{ width = self.options[c].spacing and self.options[c].spacing or default_items_spacing}
local option_height = (self.options[c].height and self.options[c].height or default_option_height) * Screen:getDPI()/167
local items_spacing = HorizontalSpan:new{
width = (self.options[c].spacing and self.options[c].spacing or default_items_spacing) * Screen:getDPI()/167
}
local horizontal_group = HorizontalGroup:new{}
if self.options[c].name_text then
local option_name_container = RightContainer:new{

View File

@@ -55,7 +55,9 @@ function ReaderCropping:onPageCrop(mode)
self.ui:handleEvent(Event:new("CloseConfig"))
-- backup original view dimen
self.orig_view_dimen = Geom:new{w = self.view.dimen.w, h = self.view.dimen.h}
DEBUG("backup view dimen", self.orig_view_dimen)
-- backup original view bgcolor
self.orig_view_bgcolor = self.view.outer_page_color
self.view.outer_page_color = 7 -- gray bgcolor
-- backup original zoom mode as cropping use "page" zoom mode
self.orig_zoom_mode = self.view.zoom_mode
-- backup original reflow mode as cropping use non-reflow mode
@@ -105,7 +107,11 @@ function ReaderCropping:onCancelPageCrop()
end
function ReaderCropping:exitPageCrop(confirmed)
-- restore view bgcolor
self.view.outer_page_color = self.orig_view_bgcolor
-- restore view dimens
self.ui:handleEvent(Event:new("RestoreDimensions", self.orig_view_dimen))
-- restore reflow mode
self.document.configurable.text_wrap = self.orig_reflow_mode
self.view:recalculate()
-- Exiting should have the same look and feel with entering.