awtk/update_res.py
2018-06-24 18:27:27 +08:00

215 lines
6.4 KiB
Python
Executable File

#!/usr/bin/python
import os
import glob
import shutil
import platform
import copy
def joinPath(root, subdir):
return os.path.normpath(os.path.join(root, subdir))
DPI='x1'
CWD=os.getcwd()
BIN_DIR=joinPath(CWD, 'bin')
APP_DIR=joinPath(CWD, 'demos')
INPUT_DIR=joinPath(APP_DIR, 'res/raw')
OUTPUT_DIR=joinPath(APP_DIR, 'res/inc')
RESOURCE_C=joinPath(APP_DIR, 'resource.c')
OS_NAME=platform.system()
def toTarget(name):
if OS_NAME == 'Windows':
return 'bin\\'+name+'.exe'
else:
return 'bin/'+name;
def toExe(name):
if OS_NAME == 'Windows':
return joinPath(BIN_DIR, name+'.exe')
else:
return joinPath(BIN_DIR, name)
def buildTools():
os.system('scons '+toTarget('resgen'))
os.system('scons '+toTarget('themegen'))
os.system('scons '+toTarget('imagegen'))
os.system('scons '+toTarget('xml_to_ui'))
def buildAll():
os.system('scons')
def removeDir(path):
if os.path.isdir(path):
print('rmdir:' + path);
shutil.rmtree(path)
def prepare():
removeDir(OUTPUT_DIR)
os.makedirs(joinPath(OUTPUT_DIR, 'theme'));
os.makedirs(joinPath(OUTPUT_DIR, 'images'));
os.makedirs(joinPath(OUTPUT_DIR, 'fonts'));
os.makedirs(joinPath(OUTPUT_DIR, 'strings'));
os.makedirs(joinPath(OUTPUT_DIR, 'ui'));
def themegen(raw, inc):
print(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(OUTPUT_DIR, inc))
os.system(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(OUTPUT_DIR, inc))
def themegen_bin(raw, bin):
print(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(INPUT_DIR, bin) + ' bin')
os.system(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(INPUT_DIR, bin) + ' bin')
def strgen(raw, inc):
print(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(OUTPUT_DIR, inc))
os.system(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(OUTPUT_DIR, inc))
def strgen_bin(raw, bin):
print(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(INPUT_DIR, bin) + ' bin')
os.system(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(INPUT_DIR, bin) + ' bin')
def resgen(raw, inc):
os.system(toExe('resgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(OUTPUT_DIR, inc))
def fontgen(raw, text, inc, size):
os.system(toExe('fontgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' + joinPath(INPUT_DIR, text) +' ' + joinPath(OUTPUT_DIR, inc) + ' ' + str(size))
def imagegen(raw, inc):
print(toExe('imagegen') + ' ' + raw + ' ' + inc)
os.system(toExe('imagegen') + ' ' + raw + ' ' + inc)
inc=inc.replace('.data', '.res')
resgen(raw, inc)
def xml_to_ui(raw, inc):
os.system(toExe('xml_to_ui') + ' ' + raw + ' ' + inc)
def xml_to_ui_bin(raw, bin):
os.system(toExe('xml_to_ui') + ' ' + raw + ' ' + bin + ' bin')
def gen_all():
strgen('strings/strings.xml', 'strings');
strgen_bin('strings/strings.xml', 'strings');
resgen('fonts/default.ttf', 'fonts/default.res');
resgen('fonts/default.mini.ttf', 'fonts/default.mini.res');
fontgen('fonts/default.ttf', 'fonts/text.txt', 'fonts/default.data', 20);
for f in glob.glob(joinPath(INPUT_DIR, 'theme/*.xml')):
inc=copy.copy(f);
raw=copy.copy(f);
bin=copy.copy(f);
inc=inc.replace('.xml', '.data')
inc=inc.replace(INPUT_DIR, OUTPUT_DIR)
themegen(raw, inc)
bin=bin.replace('.xml', '.bin')
themegen_bin(raw, bin)
for f in glob.glob(joinPath(INPUT_DIR, 'images/'+DPI+'/*.*')):
inc=copy.copy(f);
raw=copy.copy(f);
basename=os.path.basename(inc);
inc=joinPath(OUTPUT_DIR, 'images/'+basename);
inc=inc.replace('.png', '.data')
inc=inc.replace('.jpg', '.data')
imagegen(raw, inc)
for f in glob.glob(joinPath(INPUT_DIR, 'ui/*.xml')):
inc=copy.copy(f);
raw=copy.copy(f);
bin=copy.copy(f);
inc=inc.replace('.xml', '.data')
inc=inc.replace(INPUT_DIR, OUTPUT_DIR)
xml_to_ui(raw, inc)
bin=bin.replace('.xml', '.bin')
xml_to_ui_bin(raw, bin)
def writeResult(str):
fd = os.open(RESOURCE_C, os.O_RDWR|os.O_CREAT|os.O_TRUNC)
os.write(fd, str)
os.close(fd)
def genIncludes(files):
str1 = ""
for f in files:
incf = copy.copy(f);
incf=incf.replace(APP_DIR, ".");
incf=incf.replace('\\', '/');
incf=incf.replace('./', '');
str1 += '#include "'+incf+'"\n'
return str1
def gen_res_c():
result = '#include "tk.h"\n'
result += '#include "base/resource_manager.h"\n'
result += '#ifndef WITH_FS_RES\n'
files=glob.glob(joinPath(OUTPUT_DIR, 'strings/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'theme/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'ui/*.data'))
result += genIncludes(files);
result += "#ifdef WITH_STB_IMAGE\n"
files=glob.glob(joinPath(OUTPUT_DIR, 'images/*.res'))
result += genIncludes(files)
result += "#else\n"
files=glob.glob(joinPath(OUTPUT_DIR, 'images/*.data'))
result += genIncludes(files)
result += '#endif/*WITH_STB_IMAGE*/\n'
result += "#ifdef WITH_STB_FONT\n"
result += "#ifdef WITH_MINI_FONT\n"
files=glob.glob(joinPath(OUTPUT_DIR, 'fonts/default.mini.res'))
result += genIncludes(files)
result += "#else/*WITH_MINI_FONT*/\n"
files=glob.glob(joinPath(OUTPUT_DIR, 'fonts/default.res'))
result += genIncludes(files)
result += '#endif/*WITH_MINI_FONT*/\n'
result += "#else/*WITH_STB_FONT*/\n"
files=glob.glob(joinPath(OUTPUT_DIR, 'fonts/*.data'))
result += genIncludes(files)
result += '#endif/*WITH_STB_FONT*/\n'
result += '#endif/*WITH_FS_RES*/\n'
result += '\n';
result += 'ret_t resource_init(void) {\n'
result += ' resource_manager_t* rm = resource_manager();\n\n'
result += ''
result += '#ifdef WITH_FS_RES\n'
result += ' resource_manager_load(rm, RESOURCE_TYPE_THEME, "default");\n'
result += ' resource_manager_load(rm, RESOURCE_TYPE_FONT, "default");\n'
result += '#else\n'
files=glob.glob(joinPath(OUTPUT_DIR, '**/*.data'))
for f in files:
incf = copy.copy(f);
basename = incf.replace(OUTPUT_DIR, '.');
basename = basename.replace('\\', '/');
basename = basename.replace('./', '');
basename = basename.replace('/', '_');
basename = basename.replace('fonts', 'font');
basename = basename.replace('images', 'image');
basename = basename.replace('.data', '');
result += ' resource_manager_add(rm, '+basename+');\n'
result += '#endif\n'
result += '\n'
result += ' tk_init_resources();\n'
result += ' return RET_OK;\n'
result += '}\n'
writeResult(result);
def run():
buildTools()
prepare()
gen_all()
gen_res_c()
buildAll()
run()