mirror of
https://github.com/koreader/koreader.git
synced 2025-08-10 00:52:38 +00:00
switched font handling to only work with external fonts
now you can use a environment variable, FONTDIR, to point to a font dir. Otherwise, "./fonts" is used by default. Subdirectories are indexed.
This commit is contained in:
6
Makefile
6
Makefile
@@ -12,7 +12,7 @@ FREETYPEDIR=$(MUPDFDIR)/thirdparty/freetype-2.4.8
|
||||
LFSDIR=luafilesystem
|
||||
|
||||
# must point to directory with *.ttf fonts for crengine
|
||||
TTF_FONTS_DIR=/usr/share/fonts/truetype/freefont/
|
||||
TTF_FONTS_DIR=$(MUPDFDIR)/fonts
|
||||
|
||||
# set this to your ARM cross compiler:
|
||||
|
||||
@@ -119,6 +119,7 @@ lfs.o: $(LFSDIR)/src/lfs.c
|
||||
fetchthirdparty:
|
||||
-rm -Rf lua lua-5.1.4
|
||||
-rm -Rf mupdf/thirdparty
|
||||
test -d mupdf && (cd mupdf; git checkout .)
|
||||
git submodule init
|
||||
git submodule update
|
||||
ln -sf kpvcrlib/crengine/cr3gui/data data
|
||||
@@ -128,6 +129,7 @@ fetchthirdparty:
|
||||
cd mupdf/thirdparty/jpeg-*/ && \
|
||||
patch -N -p0 < ../../../kpvcrlib/jpeg_compress_struct_size.patch &&\
|
||||
patch -N -p0 < ../../../kpvcrlib/jpeg_decompress_struct_size.patch
|
||||
cd mupdf && patch -N -p1 < ../mupdf.patch
|
||||
test -f lua-5.1.4.tar.gz || wget http://www.lua.org/ftp/lua-5.1.4.tar.gz
|
||||
tar xvzf lua-5.1.4.tar.gz && ln -s lua-5.1.4 lua
|
||||
|
||||
@@ -158,7 +160,7 @@ $(MUPDFDIR)/cmapdump.host:
|
||||
|
||||
$(MUPDFLIBS) $(THIRDPARTYLIBS): $(MUPDFDIR)/cmapdump.host $(MUPDFDIR)/fontdump.host
|
||||
# build only thirdparty libs, libfitz and pdf utils, which will care for libmupdf.a being built
|
||||
CFLAGS="$(CFLAGS)" make -C mupdf CC="$(CC)" CMAPDUMP=cmapdump.host FONTDUMP=fontdump.host MUPDF= XPS_APPS=
|
||||
CFLAGS="$(CFLAGS) -DNOBUILTINFONT" make -C mupdf CC="$(CC)" CMAPDUMP=cmapdump.host FONTDUMP=fontdump.host MUPDF= XPS_APPS= verbose=1
|
||||
|
||||
$(DJVULIBS):
|
||||
-mkdir $(DJVUDIR)/build
|
||||
|
||||
27
cre.cpp
27
cre.cpp
@@ -391,12 +391,20 @@ static int drawCurrentPage(lua_State *L) {
|
||||
}
|
||||
}
|
||||
|
||||
static int registerFont(lua_State *L) {
|
||||
const char *fontfile = luaL_checkstring(L, 1);
|
||||
if ( !fontMan->RegisterFont(lString8(fontfile)) ) {
|
||||
return luaL_error(L, "cannot register font <%s>", fontfile);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static const struct luaL_Reg cre_func[] = {
|
||||
{"openDocument", openDocument},
|
||||
{"getFontFaces", getFontFaces},
|
||||
{"getGammaIndex", getGammaIndex},
|
||||
{"setGammaIndex", setGammaIndex},
|
||||
{"registerFont", registerFont},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
@@ -437,23 +445,8 @@ int luaopen_cre(lua_State *L) {
|
||||
luaL_register(L, "cre", cre_func);
|
||||
|
||||
|
||||
/* initialize fonts for CREngine */
|
||||
InitFontManager(lString8("./fonts"));
|
||||
|
||||
lString8 fontDir("./fonts");
|
||||
LVContainerRef dir = LVOpenDirectory( LocalToUnicode(fontDir).c_str() );
|
||||
if ( !dir.isNull() )
|
||||
for ( int i=0; i<dir->GetObjectCount(); i++ ) {
|
||||
const LVContainerItemInfo * item = dir->GetObjectInfo(i);
|
||||
lString16 fileName = item->GetName();
|
||||
if ( !item->IsContainer() && fileName.length()>4 && lString16(fileName, fileName.length()-4, 4)==L".ttf" ) {
|
||||
lString8 fn = UnicodeToLocal(fileName);
|
||||
printf("loading font: %s\n", fn.c_str());
|
||||
if ( !fontMan->RegisterFont(fn) ) {
|
||||
printf(" failed\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
/* initialize font manager for CREngine */
|
||||
InitFontManager(lString8());
|
||||
|
||||
#ifdef DEBUG_CRENGINE
|
||||
CRLog::setStdoutLogger();
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
require "font"
|
||||
require "unireader"
|
||||
require "inputbox"
|
||||
require "selectmenu"
|
||||
@@ -13,6 +14,14 @@ CREReader = UniReader:new{
|
||||
function CREReader:init()
|
||||
self:addAllCommands()
|
||||
self:adjustCreReaderCommands()
|
||||
-- we need to initialize the CRE font list
|
||||
local fonts = Font:getFontList()
|
||||
for _k, _v in ipairs(fonts) do
|
||||
local ok, err = pcall(cre.registerFont, Font.fontdir..'/'.._v)
|
||||
if not ok then
|
||||
print(err)
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
-- open a CREngine supported file and its settings store
|
||||
@@ -182,12 +191,12 @@ function CREReader:_drawReadingInfo()
|
||||
fb.bb:paintRect(0, ypos, G_width, 50, 0)
|
||||
|
||||
ypos = ypos + 15
|
||||
local face, fhash = Font:getFaceAndHash(22)
|
||||
local face = Font:getFace("rifont", 22)
|
||||
local cur_section = self:getTocTitleOfCurrentPage()
|
||||
if cur_section ~= "" then
|
||||
cur_section = "Section: "..cur_section
|
||||
end
|
||||
renderUtf8Text(fb.bb, 10, ypos+6, face, fhash,
|
||||
renderUtf8Text(fb.bb, 10, ypos+6, face,
|
||||
"Position: "..load_percent.."%".." "..cur_section, true)
|
||||
|
||||
ypos = ypos + 15
|
||||
|
||||
@@ -122,8 +122,8 @@ function FileChooser:choose(ypos, height)
|
||||
end
|
||||
|
||||
while true do
|
||||
local cface, cfhash= Font:getFaceAndHash(25)
|
||||
local fface, ffhash = Font:getFaceAndHash(16, Font.ffont)
|
||||
local cface = Font:getFace("cfont", 25)
|
||||
local fface = Font:getFace("ffont", 16)
|
||||
|
||||
if pagedirty then
|
||||
fb.bb:paintRect(0, ypos, fb.bb:getWidth(), height, 0)
|
||||
@@ -132,17 +132,17 @@ function FileChooser:choose(ypos, height)
|
||||
local i = (self.page - 1) * perpage + c
|
||||
if i <= #self.dirs then
|
||||
-- resembles display in midnight commander: adds "/" prefix for directories
|
||||
renderUtf8Text(fb.bb, 39, ypos + self.spacing*c, cface, cfhash, "/", true)
|
||||
renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, cfhash, self.dirs[i], true)
|
||||
renderUtf8Text(fb.bb, 39, ypos + self.spacing*c, cface, "/", true)
|
||||
renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, self.dirs[i], true)
|
||||
elseif i <= self.items then
|
||||
renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, cfhash, self.files[i-#self.dirs], true)
|
||||
renderUtf8Text(fb.bb, 50, ypos + self.spacing*c, cface, self.files[i-#self.dirs], true)
|
||||
end
|
||||
end
|
||||
renderUtf8Text(fb.bb, 5, ypos + self.spacing * perpage + 42, fface, ffhash,
|
||||
renderUtf8Text(fb.bb, 5, ypos + self.spacing * perpage + 42, fface,
|
||||
"Page "..self.page.." of "..(math.floor(self.items / perpage)+1), true)
|
||||
local msg = self.exception_message and self.exception_message:match("[^%:]+:%d+: (.*)") or "Path: "..self.path
|
||||
self.exception_message = nil
|
||||
renderUtf8Text(fb.bb, 5, ypos + self.spacing * (perpage+1) + 27, fface, ffhash, msg, true)
|
||||
renderUtf8Text(fb.bb, 5, ypos + self.spacing * (perpage+1) + 27, fface, msg, true)
|
||||
markerdirty = true
|
||||
end
|
||||
if markerdirty then
|
||||
@@ -173,13 +173,13 @@ function FileChooser:choose(ypos, height)
|
||||
elseif ev.code == KEY_FW_DOWN then
|
||||
nextItem()
|
||||
elseif ev.code == KEY_F then -- invoke fontchooser menu
|
||||
fonts_menu = SelectMenu:new{
|
||||
local fonts_menu = SelectMenu:new{
|
||||
menu_title = "Fonts Menu",
|
||||
item_array = Font.fonts,
|
||||
item_array = Font:getFontList(),
|
||||
}
|
||||
local re = fonts_menu:choose(0, height)
|
||||
local re, font = fonts_menu:choose(0, height)
|
||||
if re then
|
||||
Font.cfont = Font.fonts[re]
|
||||
Font.fontmap["cfont"] = font
|
||||
Font:update()
|
||||
end
|
||||
pagedirty = true
|
||||
|
||||
@@ -177,13 +177,13 @@ function FileSearcher:addAllCommands()
|
||||
self.commands:add(KEY_F, nil, "F",
|
||||
"font menu",
|
||||
function(self)
|
||||
fonts_menu = SelectMenu:new{
|
||||
local fonts_menu = SelectMenu:new{
|
||||
menu_title = "Fonts Menu",
|
||||
item_array = Font.fonts,
|
||||
item_array = Font:getFontList(),
|
||||
}
|
||||
local re = fonts_menu:choose(0, G_height)
|
||||
local re, font = fonts_menu:choose(0, G_height)
|
||||
if re then
|
||||
Font.cfont = Font.fonts[re]
|
||||
Font.fontmap["cfont"] = font
|
||||
Font:update()
|
||||
end
|
||||
self.pagedirty = true
|
||||
@@ -227,25 +227,25 @@ function FileSearcher:choose(keywords)
|
||||
end
|
||||
|
||||
while true do
|
||||
local cface, cfhash = Font:getFaceAndHash(22)
|
||||
local tface, tfhash = Font:getFaceAndHash(25, Font.tfont)
|
||||
local fface, ffhash = Font:getFaceAndHash(16, Font.ffont)
|
||||
local cface = Font:getFace("cfont", 22)
|
||||
local tface = Font:getFace("tfont", 25)
|
||||
local fface = Font:getFace("ffont", 16)
|
||||
|
||||
if self.pagedirty then
|
||||
self.markerdirty = true
|
||||
fb.bb:paintRect(0, 0, width, height, 0)
|
||||
|
||||
-- draw menu title
|
||||
renderUtf8Text(fb.bb, 30, 0 + self.title_H, tface, tfhash,
|
||||
renderUtf8Text(fb.bb, 30, 0 + self.title_H, tface,
|
||||
"Search Result for: "..self.keywords, true)
|
||||
|
||||
-- draw results
|
||||
local c
|
||||
if self.items == 0 then -- nothing found
|
||||
y = self.title_H + self.spacing * 2
|
||||
renderUtf8Text(fb.bb, 20, y, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 20, y, cface,
|
||||
"Sorry, no match found.", true)
|
||||
renderUtf8Text(fb.bb, 20, y + self.spacing, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 20, y + self.spacing, cface,
|
||||
"Please try a different keyword.", true)
|
||||
self.markerdirty = false
|
||||
else -- found something, draw it
|
||||
@@ -253,7 +253,7 @@ function FileSearcher:choose(keywords)
|
||||
local i = (self.page - 1) * self.perpage + c
|
||||
if i <= self.items then
|
||||
y = self.title_H + (self.spacing * c)
|
||||
renderUtf8Text(fb.bb, 50, y, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 50, y, cface,
|
||||
self.result[i].name, true)
|
||||
end
|
||||
end
|
||||
@@ -263,7 +263,7 @@ function FileSearcher:choose(keywords)
|
||||
y = self.title_H + (self.spacing * self.perpage) + self.foot_H
|
||||
x = (width / 2) - 50
|
||||
all_page = (math.floor(self.items / self.perpage)+1)
|
||||
renderUtf8Text(fb.bb, x, y, fface, ffhash,
|
||||
renderUtf8Text(fb.bb, x, y, fface,
|
||||
"Page "..self.page.." of "..all_page, true)
|
||||
end
|
||||
|
||||
|
||||
81
font.lua
81
font.lua
@@ -1,23 +1,40 @@
|
||||
|
||||
Font = {
|
||||
-- default font for menu contents
|
||||
cfont = "sans",
|
||||
-- default font for title
|
||||
tfont = "Helvetica-BoldOblique",
|
||||
-- default font for footer
|
||||
ffont = "sans",
|
||||
fontmap = {
|
||||
-- default font for menu contents
|
||||
cfont = "droid/DroidSans.ttf",
|
||||
-- default font for title
|
||||
tfont = "NimbusSanL-BoldItal.cff",
|
||||
-- default font for footer
|
||||
ffont = "droid/DroidSans.ttf",
|
||||
|
||||
-- built in fonts
|
||||
fonts = {"sans", "cjk", "mono",
|
||||
"Courier", "Courier-Bold", "Courier-Oblique", "Courier-BoldOblique",
|
||||
"Helvetica", "Helvetica-Oblique", "Helvetica-BoldOblique",
|
||||
"Times-Roman", "Times-Bold", "Times-Italic", "Times-BoldItalic",},
|
||||
-- default font for reading position info
|
||||
rifont = "droid/DroidSans.ttf",
|
||||
|
||||
-- default font for pagination display
|
||||
pgfont = "droid/DroidSans.ttf",
|
||||
|
||||
-- selectmenu: font for item shortcut
|
||||
scfont = "droid/DroidSansMono.ttf",
|
||||
|
||||
-- help page: font for displaying keys
|
||||
hpkfont = "droid/DroidSansMono.ttf",
|
||||
-- font for displaying help messages
|
||||
hfont = "droid/DroidSans.ttf",
|
||||
|
||||
-- font for displaying input content
|
||||
-- we have to use mono here for better distance controlling
|
||||
infont = "droid/DroidSansMono.ttf",
|
||||
},
|
||||
|
||||
fontdir = os.getenv("FONTDIR") or "./fonts",
|
||||
|
||||
-- face table
|
||||
faces = {},
|
||||
}
|
||||
|
||||
function Font:getFaceAndHash(size, font)
|
||||
|
||||
function Font:getFace(font, size)
|
||||
if not font then
|
||||
-- default to content font
|
||||
font = self.cfont
|
||||
@@ -26,21 +43,45 @@ function Font:getFaceAndHash(size, font)
|
||||
local face = self.faces[font..size]
|
||||
-- build face if not found
|
||||
if not face then
|
||||
for _k,_v in ipairs(self.fonts) do
|
||||
if font == _v then
|
||||
face = freetype.newBuiltinFace(font, size)
|
||||
self.faces[font..size] = face
|
||||
end
|
||||
local realname = self.fontmap[font]
|
||||
if not realname then
|
||||
realname = font
|
||||
end
|
||||
if not face then
|
||||
print("#! Font "..font.." not supported!!")
|
||||
realname = self.fontdir.."/"..realname
|
||||
ok, face = pcall(freetype.newFace, realname, size)
|
||||
if not ok then
|
||||
print("#! Font "..font.." ("..realname..") not supported: "..face)
|
||||
return nil
|
||||
end
|
||||
self.faces[font..size] = face
|
||||
end
|
||||
return face, font..size
|
||||
return { ftface = face, hash = font..size }
|
||||
end
|
||||
|
||||
function Font:_readList(target, dir, effective_dir)
|
||||
for f in lfs.dir(dir) do
|
||||
if lfs.attributes(dir.."/"..f, "mode") == "directory" and f ~= "." and f ~= ".." then
|
||||
self:_readList(target, dir.."/"..f, effective_dir..f.."/")
|
||||
else
|
||||
local file_type = string.lower(string.match(f, ".+%.([^.]+)") or "")
|
||||
if file_type == "ttf" or file_type == "cff" or file_type == "otf" then
|
||||
table.insert(target, effective_dir..f)
|
||||
end
|
||||
end
|
||||
end
|
||||
end
|
||||
|
||||
function Font:getFontList()
|
||||
fontlist = {}
|
||||
self:_readList(fontlist, self.fontdir, "")
|
||||
table.sort(fontlist)
|
||||
return fontlist
|
||||
end
|
||||
|
||||
function Font:update()
|
||||
for _k, _v in ipairs(self.faces) do
|
||||
_v:done()
|
||||
end
|
||||
self.faces = {}
|
||||
clearGlyphCache()
|
||||
end
|
||||
|
||||
44
ft.c
44
ft.c
@@ -56,49 +56,6 @@ static int newFace(lua_State *L) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int newBuiltinFace(lua_State *L) {
|
||||
const char *fontname = luaL_checkstring(L, 1);
|
||||
int pxsize = luaL_optint(L, 2, 16*64);
|
||||
char *fontdata = NULL;
|
||||
|
||||
unsigned int size;
|
||||
/* we use compiled-in font data from mupdf build */
|
||||
if(!strcmp("mono", fontname)) {
|
||||
fontdata = pdf_find_substitute_font(1, 0, 0, 0, &size);
|
||||
} else if(!strcmp("sans", fontname)) {
|
||||
fontdata = pdf_find_substitute_font(0, 0, 0, 0, &size);
|
||||
} else if(!strcmp("cjk", fontname)) {
|
||||
fontdata = pdf_find_substitute_cjk_font(0, 0, &size);
|
||||
} else {
|
||||
fontdata = pdf_find_builtin_font(fontname, &size);
|
||||
}
|
||||
if(fontdata == NULL) {
|
||||
return luaL_error(L, "no such built-in font");
|
||||
}
|
||||
|
||||
FT_Face *face = (FT_Face*) lua_newuserdata(L, sizeof(FT_Face));
|
||||
luaL_getmetatable(L, "ft_face");
|
||||
lua_setmetatable(L, -2);
|
||||
|
||||
FT_Error error = FT_New_Memory_Face(freetypelib, (FT_Byte*)fontdata, size, 0, face);
|
||||
if(error) {
|
||||
return luaL_error(L, "freetype error");
|
||||
}
|
||||
|
||||
error = FT_Set_Pixel_Sizes(*face, 0, pxsize);
|
||||
if(error) {
|
||||
error = FT_Done_Face(*face);
|
||||
return luaL_error(L, "freetype error");
|
||||
}
|
||||
|
||||
if((*face)->charmap == NULL) {
|
||||
//TODO
|
||||
//fprintf(stderr, "no unicode charmap found, to be implemented.\n");
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
static int renderGlyph(lua_State *L) {
|
||||
FT_Face *face = (FT_Face*) luaL_checkudata(L, 1, "ft_face");
|
||||
int ch = luaL_checkint(L, 2);
|
||||
@@ -192,7 +149,6 @@ static const struct luaL_Reg ft_face_meth[] = {
|
||||
|
||||
static const struct luaL_Reg ft_func[] = {
|
||||
{"newFace", newFace},
|
||||
{"newBuiltinFace", newBuiltinFace},
|
||||
{NULL, NULL}
|
||||
};
|
||||
|
||||
|
||||
29
helppage.lua
29
helppage.lua
@@ -15,20 +15,23 @@ HelpPage = {
|
||||
-- state buffer
|
||||
commands = nil,
|
||||
items = 0,
|
||||
page = 1
|
||||
page = 1,
|
||||
|
||||
-- font for displaying keys
|
||||
fsize = 20,
|
||||
face = Font:getFace("hpkfont", 20),
|
||||
|
||||
-- font for displaying help messages
|
||||
hfsize = 20,
|
||||
hface = Font:getFace("hfont", 20),
|
||||
|
||||
-- font for paging display
|
||||
ffsize = 15,
|
||||
fface = Font:getFace("pgfont", 15)
|
||||
}
|
||||
|
||||
-- Other Class vars:
|
||||
|
||||
-- font for displaying keys
|
||||
HelpPage.fsize = 20
|
||||
HelpPage.face, HelpPage.fhash = Font:getFaceAndHash(HelpPage.fsize, "mono")
|
||||
-- font for displaying help messages
|
||||
HelpPage.hfsize = 20
|
||||
HelpPage.hface, HelpPage.hfhash = Font:getFaceAndHash(HelpPage.hfsize, "sans")
|
||||
-- font for paging display
|
||||
HelpPage.ffsize = 15
|
||||
HelpPage.fface, HelpPage.ffhash = Font:getFaceAndHash(HelpPage.ffsize, "sans")
|
||||
|
||||
function HelpPage:show(ypos, height, commands)
|
||||
self.commands = {}
|
||||
@@ -55,17 +58,17 @@ function HelpPage:show(ypos, height, commands)
|
||||
for c = 1, perpage do
|
||||
local i = (self.page - 1) * perpage + c
|
||||
if i <= self.items then
|
||||
local pen_x = renderUtf8Text(fb.bb, 5, ypos + self.spacing*c, self.face, self.fhash, self.commands[i].shortcut, true)
|
||||
local pen_x = renderUtf8Text(fb.bb, 5, ypos + self.spacing*c, self.face, self.commands[i].shortcut, true)
|
||||
max_x = math.max(max_x, pen_x)
|
||||
end
|
||||
end
|
||||
for c = 1, perpage do
|
||||
local i = (self.page - 1) * perpage + c
|
||||
if i <= self.items then
|
||||
renderUtf8Text(fb.bb, max_x + 20, ypos + self.spacing*c, self.hface, self.hfhash, self.commands[i].help, true)
|
||||
renderUtf8Text(fb.bb, max_x + 20, ypos + self.spacing*c, self.hface, self.commands[i].help, true)
|
||||
end
|
||||
end
|
||||
renderUtf8Text(fb.bb, 5, height - math.floor(self.ffsize * 0.4), self.fface, self.ffhash,
|
||||
renderUtf8Text(fb.bb, 5, height - math.floor(self.ffsize * 0.4), self.fface,
|
||||
"Page "..self.page.." of "..math.ceil(self.items / perpage).." - click Back to close this page", true)
|
||||
markerdirty = true
|
||||
end
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
require "font"
|
||||
require "rendertext"
|
||||
require "keys"
|
||||
require "graphics"
|
||||
@@ -21,8 +22,7 @@ InputBox = {
|
||||
|
||||
-- font for displaying input content
|
||||
-- we have to use mono here for better distance controlling
|
||||
face = freetype.newBuiltinFace("mono", 25),
|
||||
fhash = "m25",
|
||||
face = Font:getFace("infont", 25),
|
||||
fheight = 25,
|
||||
fwidth = 15,
|
||||
commands = nil,
|
||||
@@ -34,7 +34,7 @@ function InputBox:refreshText()
|
||||
self.input_slot_w, self.fheight, self.input_bg)
|
||||
-- paint new text
|
||||
renderUtf8Text(fb.bb, self.input_start_x, self.input_start_y,
|
||||
self.face, self.fhash,
|
||||
self.face,
|
||||
self.input_string, 0)
|
||||
end
|
||||
|
||||
@@ -97,7 +97,7 @@ function InputBox:drawBox(ypos, w, h, title)
|
||||
-- draw input slot
|
||||
fb.bb:paintRect(140, ypos + 10, w - 130, h - 20, self.input_bg)
|
||||
-- draw input title
|
||||
renderUtf8Text(fb.bb, 35, self.input_start_y, self.face, self.fhash,
|
||||
renderUtf8Text(fb.bb, 35, self.input_start_y, self.face,
|
||||
title, true)
|
||||
end
|
||||
|
||||
|
||||
@@ -117,9 +117,9 @@ Screen.native_rotation_mode = Screen.cur_rotation_mode
|
||||
|
||||
-- set up reader's setting: font
|
||||
reader_settings = DocSettings:open(".reader")
|
||||
r_cfont = reader_settings:readSetting("cfont")
|
||||
if r_cfont ~=nil then
|
||||
Font.cfont = r_cfont
|
||||
fontmap = reader_settings:readSetting("fontmap")
|
||||
if fontmap ~= nil then
|
||||
Font.fontmap = fontmap
|
||||
end
|
||||
|
||||
-- initialize global settings shared among all readers
|
||||
@@ -157,7 +157,7 @@ end
|
||||
|
||||
|
||||
-- save reader settings
|
||||
reader_settings:savesetting("cfont", Font.cfont)
|
||||
reader_settings:savesetting("fontmap", Font.fontmap)
|
||||
reader_settings:close()
|
||||
|
||||
-- @TODO dirty workaround, find a way to force native system poll
|
||||
|
||||
@@ -13,6 +13,7 @@ function glyphCacheClaim(size)
|
||||
glyphcache[k].age = glyphcache[k].age - 1
|
||||
else
|
||||
glyphcache_current_memsize = glyphcache_current_memsize - glyphcache[k].size
|
||||
glyphcache[k].glyph.bb:free()
|
||||
glyphcache[k] = nil
|
||||
end
|
||||
end
|
||||
@@ -20,10 +21,10 @@ function glyphCacheClaim(size)
|
||||
glyphcache_current_memsize = glyphcache_current_memsize + size
|
||||
return true
|
||||
end
|
||||
function getGlyph(face, facehash, charcode)
|
||||
local hash = glyphCacheHash(facehash, charcode)
|
||||
function getGlyph(face, charcode)
|
||||
local hash = glyphCacheHash(face.hash, charcode)
|
||||
if glyphcache[hash] == nil then
|
||||
local glyph = face:renderGlyph(charcode)
|
||||
local glyph = face.ftface:renderGlyph(charcode)
|
||||
local size = glyph.bb:getWidth() * glyph.bb:getHeight() / 2 + 32
|
||||
glyphCacheClaim(size);
|
||||
glyphcache[hash] = {
|
||||
@@ -43,7 +44,7 @@ function clearGlyphCache()
|
||||
glyphcache = {}
|
||||
end
|
||||
|
||||
function renderUtf8Text(buffer, x, y, face, facehash, text, kerning)
|
||||
function renderUtf8Text(buffer, x, y, face, text, kerning)
|
||||
if text == nil then
|
||||
print("# renderUtf8Text called without text");
|
||||
return
|
||||
@@ -55,9 +56,9 @@ function renderUtf8Text(buffer, x, y, face, facehash, text, kerning)
|
||||
for uchar in string.gfind(text, "([%z\1-\127\194-\244][\128-\191]*)") do
|
||||
if pen_x < buffer:getWidth() then
|
||||
local charcode = util.utf8charcode(uchar)
|
||||
local glyph = getGlyph(face, facehash, charcode)
|
||||
local glyph = getGlyph(face, charcode)
|
||||
if kerning and prevcharcode then
|
||||
local kern = face:getKerning(prevcharcode, charcode)
|
||||
local kern = face.ftface:getKerning(prevcharcode, charcode)
|
||||
pen_x = pen_x + kern
|
||||
buffer:addblitFrom(glyph.bb, x + pen_x + glyph.l, y - glyph.t, 0, 0, glyph.bb:getWidth(), glyph.bb:getHeight())
|
||||
else
|
||||
|
||||
@@ -12,8 +12,7 @@ SelectMenu = {
|
||||
-- font for paging display
|
||||
ffsize = 16,
|
||||
-- font for item shortcut
|
||||
sface = freetype.newBuiltinFace("mono", 22),
|
||||
sfhash = "mono22",
|
||||
sface = Font:getFace("scfont", 22),
|
||||
|
||||
-- title height
|
||||
title_H = 40,
|
||||
@@ -22,7 +21,7 @@ SelectMenu = {
|
||||
-- foot height
|
||||
foot_H = 27,
|
||||
|
||||
menu_title = "None Titled",
|
||||
menu_title = "No Title",
|
||||
no_item_msg = "No items found.",
|
||||
item_array = {},
|
||||
items = 0,
|
||||
@@ -231,9 +230,9 @@ function SelectMenu:choose(ypos, height)
|
||||
self.last_shortcut = 0
|
||||
|
||||
while true do
|
||||
local cface, cfhash = Font:getFaceAndHash(22)
|
||||
local tface, tfhash = Font:getFaceAndHash(25, Font.tfont)
|
||||
local fface, ffhash = Font:getFaceAndHash(16, Font.ffont)
|
||||
local cface = Font:getFace("cfont", 22)
|
||||
local tface = Font:getFace("tfont", 25)
|
||||
local fface = Font:getFace("ffont", 16)
|
||||
|
||||
if self.pagedirty then
|
||||
self.markerdirty = true
|
||||
@@ -243,16 +242,16 @@ function SelectMenu:choose(ypos, height)
|
||||
|
||||
local x = 20
|
||||
local y = ypos + self.title_H
|
||||
renderUtf8Text(fb.bb, x, y, tface, tfhash, self.menu_title, true)
|
||||
renderUtf8Text(fb.bb, x, y, tface, self.menu_title, true)
|
||||
|
||||
-- draw items
|
||||
fb.bb:paintRect(0, ypos + self.title_H + 10, fb.bb:getWidth(), height - self.title_H, 0)
|
||||
if self.items == 0 then
|
||||
y = ypos + self.title_H + (self.spacing * 2)
|
||||
renderUtf8Text(fb.bb, 30, y, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 30, y, cface,
|
||||
"Oops... Bad news for you:", true)
|
||||
y = y + self.spacing
|
||||
renderUtf8Text(fb.bb, 30, y, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 30, y, cface,
|
||||
self.no_item_msg, true)
|
||||
self.markerdirty = false
|
||||
self:clearCommands()
|
||||
@@ -272,16 +271,16 @@ function SelectMenu:choose(ypos, height)
|
||||
if self.item_shortcuts[c] ~= nil and
|
||||
string.len(self.item_shortcuts[c]) == 3 then
|
||||
-- print "Del", "Sym and "Ent"
|
||||
renderUtf8Text(fb.bb, 13, y, fface, ffhash,
|
||||
renderUtf8Text(fb.bb, 13, y, fface,
|
||||
self.item_shortcuts[c], true)
|
||||
else
|
||||
renderUtf8Text(fb.bb, 18, y, self.sface, self.sfhash,
|
||||
renderUtf8Text(fb.bb, 18, y, self.sface,
|
||||
self.item_shortcuts[c], true)
|
||||
end
|
||||
|
||||
self.last_shortcut = c
|
||||
|
||||
renderUtf8Text(fb.bb, 50, y, cface, cfhash,
|
||||
renderUtf8Text(fb.bb, 50, y, cface,
|
||||
self.item_array[i], true)
|
||||
end -- EOF if i <= self.items
|
||||
end -- EOF for
|
||||
@@ -291,7 +290,7 @@ function SelectMenu:choose(ypos, height)
|
||||
y = ypos + self.title_H + (self.spacing * self.perpage)
|
||||
+ self.foot_H + 5
|
||||
x = (fb.bb:getWidth() / 2) - 50
|
||||
renderUtf8Text(fb.bb, x, y, fface, ffhash,
|
||||
renderUtf8Text(fb.bb, x, y, fface,
|
||||
"Page "..self.page.." of "..
|
||||
(math.ceil(self.items / self.perpage)), true)
|
||||
end
|
||||
@@ -339,7 +338,7 @@ function SelectMenu:choose(ypos, height)
|
||||
|
||||
if self.selected_item ~= nil then
|
||||
print("# selected "..self.selected_item)
|
||||
return self.selected_item
|
||||
return self.selected_item, self.item_array[self.selected_item]
|
||||
end
|
||||
end -- EOF if
|
||||
end -- EOF while
|
||||
|
||||
@@ -858,11 +858,11 @@ end
|
||||
function UniReader:_drawReadingInfo()
|
||||
local width, height = G_width, G_height
|
||||
local load_percent = (self.pageno / self.doc:getPages())
|
||||
local face, fhash = Font:getFaceAndHash(22)
|
||||
local face = Font:getFace("cfont", 22)
|
||||
|
||||
-- display memory on top of page
|
||||
fb.bb:paintRect(0, 0, width, 15+6*2, 0)
|
||||
renderUtf8Text(fb.bb, 10, 15+6, face, fhash,
|
||||
renderUtf8Text(fb.bb, 10, 15+6, face,
|
||||
"Memory: "..
|
||||
math.ceil( self.cache_current_memsize / 1024 ).."/"..math.ceil( self.cache_max_memsize / 1024 )..
|
||||
" "..math.ceil( self.doc:getCacheSize() / 1024 ).."/"..math.ceil( self.cache_document_size / 1024 ).." k",
|
||||
@@ -876,7 +876,7 @@ function UniReader:_drawReadingInfo()
|
||||
if cur_section ~= "" then
|
||||
cur_section = "Section: "..cur_section
|
||||
end
|
||||
renderUtf8Text(fb.bb, 10, ypos+6, face, fhash,
|
||||
renderUtf8Text(fb.bb, 10, ypos+6, face,
|
||||
"Page: "..self.pageno.."/"..self.doc:getPages()..
|
||||
" "..cur_section, true)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user