From f4c6c6ab1cf7414c30cd3416a12f63ee8e978138 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Wed, 25 Apr 2012 14:08:33 +0800 Subject: [PATCH 1/9] fix helppage in crereader for font size & line space setting --- crereader.lua | 50 +++++++++++++++++++++++--------------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/crereader.lua b/crereader.lua index 8b0f14a4f..458095732 100644 --- a/crereader.lua +++ b/crereader.lua @@ -310,39 +310,35 @@ function CREReader:adjustCreReaderCommands() self.commands:del(KEY_N, MOD_SHIFT, "N") -- show highlights -- overwrite commands - self.commands:add({KEY_PGFWD, KEY_LPGFWD}, MOD_SHIFT, ">", - "increase font size", + + self.commands:addGroup(MOD_SHIFT.."< >",{ + Keydef:new(KEY_PGBCK,MOD_SHIFT),Keydef:new(KEY_PGFWD,MOD_SHIFT), + Keydef:new(KEY_LPGBCK,MOD_SHIFT),Keydef:new(KEY_LPGFWD,MOD_SHIFT)}, + "increase/decrease font size", function(self) - self.doc:zoomFont(1) - self:redrawCurrentPage() - end - ) - self.commands:add({KEY_PGBCK, KEY_LPGBCK}, MOD_SHIFT, "<", - "decrease font size", - function(self) - self.doc:zoomFont(-1) - self:redrawCurrentPage() - end - ) - self.commands:add({KEY_PGFWD, KEY_LPGFWD}, MOD_ALT, ">", - "increase line spacing", - function(self) - self.line_space_percent = self.line_space_percent + 10 - if self.line_space_percent > 200 then - self.line_space_percent = 200 + local delta = 1 + if keydef.keycode == KEY_PGBCK or keydef.keycode == KEY_LPGBCK then + delta = -1 end - InfoMessage:show("line spacing "..self.line_space_percent.."%", 0) - debug("line spacing set to", self.line_space_percent) - self.doc:setDefaultInterlineSpace(self.line_space_percent) + self.doc:zoomFont(delta) self:redrawCurrentPage() end ) - self.commands:add({KEY_PGBCK, KEY_LPGBCK}, MOD_ALT, "<", - "decrease line spacing", + self.commands:addGroup(MOD_ALT.."< >",{ + Keydef:new(KEY_PGBCK,MOD_ALT),Keydef:new(KEY_PGFWD,MOD_ALT), + Keydef:new(KEY_LPGBCK,MOD_ALT),Keydef:new(KEY_LPGFWD,MOD_ALT)}, + "increase/decrease line spacing", function(self) - self.line_space_percent = self.line_space_percent - 10 - if self.line_space_percent < 100 then - self.line_space_percent = 100 + if keydef.keycode == KEY_PGBCK or keydef.keycode == KEY_LPGBCK then + self.line_space_percent = self.line_space_percent - 10 + if self.line_space_percent < 100 then + self.line_space_percent = 100 + end + else + self.line_space_percent = self.line_space_percent + 10 + if self.line_space_percent > 200 then + self.line_space_percent = 200 + end end InfoMessage:show("line spacing "..self.line_space_percent.."%", 0) debug("line spacing set to", self.line_space_percent) From cb77807a9382ea627f479f692f4d6ef3ef167922 Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Wed, 25 Apr 2012 14:13:21 +0800 Subject: [PATCH 2/9] add notification for going into screensaver --- commands.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/commands.lua b/commands.lua index 2168fb57d..83e2381cf 100644 --- a/commands.lua +++ b/commands.lua @@ -166,6 +166,7 @@ function Commands:new(obj) "toggle screen saver", function() Screen:saveCurrentBB() + InfoMessage:show("Going into screensaver... ", 0) Screen.kpv_rotation_mode = Screen.cur_rotation_mode fb:setOrientation(Screen.native_rotation_mode) util.sleep(1) From 6c33d809661c19ffd555d6b7ed6fbfd31d3c1aff Mon Sep 17 00:00:00 2001 From: Qingping Hou Date: Thu, 26 Apr 2012 15:15:34 +0800 Subject: [PATCH 3/9] add paintCircle and RoundedCornerBorder --- blitbuffer.c | 183 ++++++++++++++++++++++++++++++++++++++++++++++++++- graphics.lua | 35 ++++++++-- 2 files changed, 210 insertions(+), 8 deletions(-) diff --git a/blitbuffer.c b/blitbuffer.c index 6c6ab70cf..cf4c8c107 100644 --- a/blitbuffer.c +++ b/blitbuffer.c @@ -20,6 +20,20 @@ #include #include "blitbuffer.h" + +inline int setPixel(BlitBuffer *bb, int x, int y, int c) { + uint8_t *dstptr = (uint8_t*)(bb->data) + (y * bb->pitch) + (x / 2); + + if(x % 2 == 0) { + *dstptr &= 0x0F; + *dstptr |= c << 4; + } else { + *dstptr &= 0xF0; + *dstptr |= c; + } + return 0; +} + int newBlitBufferNative(lua_State *L, int w, int h, BlitBuffer **newBuffer) { BlitBuffer *bb = (BlitBuffer*) lua_newuserdata(L, sizeof(BlitBuffer)); luaL_getmetatable(L, "blitbuffer"); @@ -78,7 +92,6 @@ static int blitFullToBuffer(lua_State *L) { } memcpy(dst->data, src->data, src->pitch * src->h); - return 0; } @@ -485,6 +498,172 @@ static int dimRect(lua_State *L) { return 0; } +/* + * @r: radius + * @c: color of the line to draw + * @w: width of the line to draw + */ +static int paintCircle(lua_State *L) { + BlitBuffer *dst = (BlitBuffer*) luaL_checkudata(L, 1, "blitbuffer"); + int center_x = luaL_checkint(L, 2); + int center_y = luaL_checkint(L, 3); + int r = luaL_checkint(L, 4); + int c = luaL_optint(L, 5, 15); + int w = luaL_optint(L, 6, r); + + if( (center_x + r > dst->h) || (center_x - r < 0) || + (center_y + r > dst->w) || (center_y - r < 0) || + (r == 0)) { + return 0; + } + if(w > r) { + w = r; + } + + + int tmp_y; + /* for outer circle */ + int x = 0, y = r; + float delta = 5/4 - r; + /* for inter circle */ + int r2 = r - w; + int x2 = 0, y2 = r2; + float delta2 = 5/4 - r; + + /* draw two axles */ + for(tmp_y = r; tmp_y > r2; tmp_y--) { + setPixel(dst, center_x+0, center_y+tmp_y, c); + setPixel(dst, center_x-0, center_y-tmp_y, c); + setPixel(dst, center_x+tmp_y, center_y+0, c); + setPixel(dst, center_x-tmp_y, center_y-0, c); + } + + while(x < y) { + /* decrease y if we are out of circle */ + x++; + if (delta > 0) { + y--; + delta = delta + 2*x - 2*y + 2; + } else { + delta = delta + 2*x + 1; + } + + /* inner circle finished drawing, increase y linearly for filling */ + if(x2 > y2) { + y2++; + x2++; + } else { + x2++; + if (delta2 > 0) { + y2--; + delta2 = delta2 + 2*x2 - 2*y2 + 2; + } else { + delta2 = delta2 + 2*x2 + 1; + } + } + + for(tmp_y = y; tmp_y > y2; tmp_y--) { + setPixel(dst, center_x+x, center_y+tmp_y, c); + setPixel(dst, center_x+tmp_y, center_y+x, c); + + setPixel(dst, center_x+tmp_y, center_y-x, c); + setPixel(dst, center_x+x, center_y-tmp_y, c); + + setPixel(dst, center_x-x, center_y-tmp_y, c); + setPixel(dst, center_x-tmp_y, center_y-x, c); + + setPixel(dst, center_x-tmp_y, center_y+x, c); + setPixel(dst, center_x-x, center_y+tmp_y, c); + } + } + if(r == w) { + setPixel(dst, center_x, center_y, c); + } + return 0; +} + +static int paintRoundedCorner(lua_State *L) { + BlitBuffer *dst = (BlitBuffer*) luaL_checkudata(L, 1, "blitbuffer"); + int off_x = luaL_checkint(L, 2); + int off_y = luaL_checkint(L, 3); + int w = luaL_checkint(L, 4); + int h = luaL_checkint(L, 5); + int bw = luaL_checkint(L, 6); + int r = luaL_checkint(L, 7); + int c = luaL_optint(L, 8, 15); + + if((2*r > h) || (2*r > w) || (r == 0)) { + return 0; + } + if(r > h) { + r = h; + } + if(r > w) { + r = w; + } + if(bw > r) { + bw = r; + } + + + int tmp_y; + /* for outer circle */ + int x = 0, y = r; + float delta = 5/4 - r; + /* for inter circle */ + int r2 = r - bw; + int x2 = 0, y2 = r2; + float delta2 = 5/4 - r; + + /* draw two axles */ + /*for(tmp_y = r; tmp_y > r2; tmp_y--) {*/ + /*setPixel(dst, (w-r)+off_x+0, (h-r)+off_y+tmp_y-1, c);*/ + /*setPixel(dst, (w-r)+off_x-0, (r)+off_y-tmp_y, c);*/ + /*setPixel(dst, (w-r)+off_x+tmp_y, (h-r)+off_y+0, c);*/ + /*setPixel(dst, (r)+off_x-tmp_y, (h-r)+off_y-0-1, c);*/ + /*}*/ + + while(x < y) { + /* decrease y if we are out of circle */ + x++; + if (delta > 0) { + y--; + delta = delta + 2*x - 2*y + 2; + } else { + delta = delta + 2*x + 1; + } + + /* inner circle finished drawing, increase y linearly for filling */ + if(x2 > y2) { + y2++; + x2++; + } else { + x2++; + if (delta2 > 0) { + y2--; + delta2 = delta2 + 2*x2 - 2*y2 + 2; + } else { + delta2 = delta2 + 2*x2 + 1; + } + } + + for(tmp_y = y; tmp_y > y2; tmp_y--) { + setPixel(dst, (w-r)+off_x+x-1, (h-r)+off_y+tmp_y-1, c); + setPixel(dst, (w-r)+off_x+tmp_y-1, (h-r)+off_y+x-1, c); + + setPixel(dst, (w-r)+off_x+tmp_y-1, (r)+off_y-x, c); + setPixel(dst, (w-r)+off_x+x-1, (r)+off_y-tmp_y, c); + + setPixel(dst, (r)+off_x-x, (r)+off_y-tmp_y, c); + setPixel(dst, (r)+off_x-tmp_y, (r)+off_y-x, c); + + setPixel(dst, (r)+off_x-tmp_y, (h-r)+off_y+x-1, c); + setPixel(dst, (r)+off_x-x, (h-r)+off_y+tmp_y-1, c); + } + } + return 0; +} + static const struct luaL_Reg blitbuffer_func[] = { {"new", newBlitBuffer}, {NULL, NULL} @@ -497,6 +676,8 @@ static const struct luaL_Reg blitbuffer_meth[] = { {"addblitFrom", addblitToBuffer}, {"blitFullFrom", blitFullToBuffer}, {"paintRect", paintRect}, + {"paintCircle", paintCircle}, + {"paintRoundedCorner", paintRoundedCorner}, {"invertRect", invertRect}, {"dimRect", dimRect}, {"free", freeBlitBuffer}, diff --git a/graphics.lua b/graphics.lua index 267cb9469..562bdd995 100644 --- a/graphics.lua +++ b/graphics.lua @@ -1,12 +1,33 @@ +--[[ +Draw a border -blitbuffer.paintBorder = function (bb, x, y, w, h, bw, c) - bb:paintRect(x, y, w, bw, c) - bb:paintRect(x, y+h-bw, w, bw, c) - bb:paintRect(x, y+bw, bw, h - 2*bw, c) - bb:paintRect(x+w-bw, y+bw, bw, h - 2*bw, c) +@x: start position in x axis +@y: start position in y axis +@w: width of the border +@h: height of the border +@bw: line width of the border +@c: color for loading bar +@r: radius of for border's corner (nil or 0 means right corner border) +--]] +function blitbuffer.paintBorder(bb, x, y, w, h, bw, c, r) + if not r or r == 0 then + bb:paintRect(x, y, w, bw, c) + bb:paintRect(x, y+h-bw, w, bw, c) + bb:paintRect(x, y+bw, bw, h - 2*bw, c) + bb:paintRect(x+w-bw, y+bw, bw, h - 2*bw, c) + else + if h < 2*r then h = 2 * r end + if w < 2*r then w = 2 * r end + bb:paintRoundedCorner(x, y, w, h, bw, r, c) + bb:paintRect(r+x, y, w-2*r, bw, c) + bb:paintRect(r+x, y+h-bw, w-2*r, bw, c) + bb:paintRect(x, r+y, bw, h-2*r, c) + bb:paintRect(x+w-bw, r+y, bw, h-2*r, c) + end end + --[[ Draw a progress bar according to following args: @@ -19,8 +40,8 @@ Draw a progress bar according to following args: @load_percent: progress in percent @c: color for loading bar --]] -blitbuffer.progressBar = function (bb, x, y, w, h, - load_m_w, load_m_h, load_percent, c) +function blitbuffer.progressBar(bb, x, y, w, h, + load_m_w, load_m_h, load_percent, c) if load_m_h*2 > h then load_m_h = h/2 end From ac092133197b7164ae07844a20ea8474e74efa03 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 14:05:51 +0200 Subject: [PATCH 4/9] show Redrawing with InfoMessage on font change --- crereader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crereader.lua b/crereader.lua index 458095732..336970d0b 100644 --- a/crereader.lua +++ b/crereader.lua @@ -373,12 +373,12 @@ function CREReader:adjustCreReaderCommands() local item_no = fonts_menu:choose(0, G_height) debug(face_list[item_no]) + Screen:restoreFromSavedBB() if item_no then self.doc:setFontFace(face_list[item_no]) self.font_face = face_list[item_no] InfoMessage:show("Redrawing with "..face_list[item_no], 0) end - Screen:restoreFromSavedBB() self:redrawCurrentPage() end ) From 17a590cf5ae91f771dd2653a1ccce578651c1724 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 14:09:09 +0200 Subject: [PATCH 5/9] show increase/decrease font size InfoMessage --- crereader.lua | 3 +++ 1 file changed, 3 insertions(+) diff --git a/crereader.lua b/crereader.lua index 336970d0b..4ea3a0990 100644 --- a/crereader.lua +++ b/crereader.lua @@ -317,9 +317,12 @@ function CREReader:adjustCreReaderCommands() "increase/decrease font size", function(self) local delta = 1 + local change = "increase" if keydef.keycode == KEY_PGBCK or keydef.keycode == KEY_LPGBCK then delta = -1 + change = "decrease" end + InfoMessage:show(change.." font size", 0) self.doc:zoomFont(delta) self:redrawCurrentPage() end From 5492025a38d3ebedb24716959f581b9b2695c7c3 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 14:13:32 +0200 Subject: [PATCH 6/9] pan_margin is really in screen pixels I don't know what I was thinking when implementing this code. If I modify it with global zoom, it keeps moving, as we zoom in on multiple key presses --- unireader.lua | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/unireader.lua b/unireader.lua index 81cef0f3f..80f2d25eb 100644 --- a/unireader.lua +++ b/unireader.lua @@ -54,7 +54,7 @@ UniReader = { pan_by_page = false, -- using shift_[xy] or width/height pan_x = 0, -- top-left offset of page when pan activated pan_y = 0, - pan_margin = 20, -- horizontal margin for two-column zoom + pan_margin = 5, -- horizontal margin for two-column zoom (in pixels) pan_overlap_vertical = 30, show_overlap = 0, @@ -1260,13 +1260,11 @@ function UniReader:setzoom(page, preCache) or self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH_MARGIN then local margin = self.pan_margin if self.globalzoom_mode == self.ZOOM_FIT_TO_CONTENT_HALF_WIDTH then margin = 0 end - local pg_margin = 0 -- margin scaled to page size - if margin > 0 then pg_margin = margin * 2 / self.globalzoom end - self.globalzoom = width / (x1 - x0 + pg_margin) + self.globalzoom = width / (x1 - x0 + margin) self.offset_x = -1 * x0 * self.globalzoom * 2 + margin - self.globalzoom = height / (y1 - y0 + pg_margin) + self.globalzoom = height / (y1 - y0 + margin) self.offset_y = -1 * y0 * self.globalzoom * 2 + margin - self.globalzoom = width / (x1 - x0 + pg_margin) * 2 + self.globalzoom = width / (x1 - x0 + margin) * 2 debug("column mode offset:", self.offset_x, self.offset_y, " zoom:", self.globalzoom); self.globalzoom_mode = self.ZOOM_BY_VALUE -- enable pan mode self.pan_x = self.offset_x From 8c013061541512258d19803eab2915d90b8eda2d Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 15:38:35 +0200 Subject: [PATCH 7/9] invoke Screen:restoreFromSavedBB only if font changed --- crereader.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crereader.lua b/crereader.lua index 4ea3a0990..4aaad0c39 100644 --- a/crereader.lua +++ b/crereader.lua @@ -376,8 +376,8 @@ function CREReader:adjustCreReaderCommands() local item_no = fonts_menu:choose(0, G_height) debug(face_list[item_no]) - Screen:restoreFromSavedBB() if item_no then + Screen:restoreFromSavedBB() self.doc:setFontFace(face_list[item_no]) self.font_face = face_list[item_no] InfoMessage:show("Redrawing with "..face_list[item_no], 0) From 37289fb18d1ceb895f248f58d29d8c151494a197 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 22:16:36 +0200 Subject: [PATCH 8/9] invert page bbox on X #35 --- unireader.lua | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/unireader.lua b/unireader.lua index 80f2d25eb..b0356f865 100644 --- a/unireader.lua +++ b/unireader.lua @@ -40,6 +40,7 @@ UniReader = { -- size of current page for current zoom level in pixels cur_full_width = 0, cur_full_height = 0, + cur_bbox = {}, -- current page bbox offset_x = 0, offset_y = 0, dest_x = 0, -- real offset_x when it's smaller than screen, so it's centered @@ -1280,6 +1281,15 @@ function UniReader:setzoom(page, preCache) if not preCache then -- save current page fullsize self.cur_full_width = self.fullwidth self.cur_full_height = self.fullheight + + self.cur_bbox = { + ["x0"] = x0, + ["y0"] = y0, + ["x1"] = x1, + ["y1"] = y1, + } + debug("cur_bbox", self.cur_bbox) + end self.min_offset_x = fb.bb:getWidth() - self.fullwidth self.min_offset_y = fb.bb:getHeight() - self.fullheight @@ -2065,6 +2075,29 @@ function UniReader:addAllCommands() end debug("bbox override", unireader.bbox.enabled); end) + self.commands:add(KEY_X,nil,"X", + "invert page bbox", + function(unireader) + local bbox = unireader.cur_bbox + debug("bbox", bbox) + local x,y = unireader:screenOffset() + x = x + bbox["x0"] * self.globalzoom + y = y + bbox["y0"] * self.globalzoom + local w = ( bbox["x1"] - bbox["x0"] ) * self.globalzoom + local h = ( bbox["y1"] - bbox["y0"] ) * self.globalzoom + debug("inxertRect",x,y,w,h) + if x < 0 then + w = w + x -- x is negative! + x = 0 + end + if y < 0 then + h = h + y + y = 0 + end + debug("inxertRect",x,y,w,h) + fb.bb:invertRect( x,y, w,h ) + fb:refresh(0) + end) self.commands:add(KEY_MENU,nil,"Menu", "toggle info box", function(unireader) From 44be8231156593712c547d048c3aea9e5e732f84 Mon Sep 17 00:00:00 2001 From: Dobrica Pavlinusic Date: Thu, 26 Apr 2012 22:27:00 +0200 Subject: [PATCH 9/9] use getRectInScreen --- unireader.lua | 15 +-------------- 1 file changed, 1 insertion(+), 14 deletions(-) diff --git a/unireader.lua b/unireader.lua index b0356f865..8b6b4bfb8 100644 --- a/unireader.lua +++ b/unireader.lua @@ -2080,20 +2080,7 @@ function UniReader:addAllCommands() function(unireader) local bbox = unireader.cur_bbox debug("bbox", bbox) - local x,y = unireader:screenOffset() - x = x + bbox["x0"] * self.globalzoom - y = y + bbox["y0"] * self.globalzoom - local w = ( bbox["x1"] - bbox["x0"] ) * self.globalzoom - local h = ( bbox["y1"] - bbox["y0"] ) * self.globalzoom - debug("inxertRect",x,y,w,h) - if x < 0 then - w = w + x -- x is negative! - x = 0 - end - if y < 0 then - h = h + y - y = 0 - end + x,y,w,h = unireader:getRectInScreen( bbox["x0"], bbox["y0"], bbox["x1"], bbox["y1"] ) debug("inxertRect",x,y,w,h) fb.bb:invertRect( x,y, w,h ) fb:refresh(0)