awtk/scripts/update_res_common.py

564 lines
16 KiB
Python
Raw Normal View History

2018-04-27 10:02:25 +08:00
import os
2019-03-31 11:13:43 +08:00
import sys
2018-11-02 11:51:14 +08:00
import copy
2018-04-27 10:02:25 +08:00
import glob
import shutil
import platform
2019-04-23 17:18:22 +08:00
from PIL import Image
2018-11-02 11:51:14 +08:00
###########################
2019-03-31 11:13:43 +08:00
DPI = ''
ACTION = 'all'
ASSET_C = ''
BIN_DIR = ''
ASSETS_ROOT = ''
AWTK_ROOT = ''
INPUT_DIR = ''
OUTPUT_DIR = ''
IMAGEGEN_OPTIONS = ''
2018-11-02 11:51:14 +08:00
###########################
2018-04-27 10:02:25 +08:00
2019-03-31 11:13:43 +08:00
2019-03-22 12:02:10 +08:00
def to_var_name(s):
2019-03-31 11:13:43 +08:00
out = ''
2019-03-22 12:02:10 +08:00
for c in s:
if(c.isalpha() or c.isdigit()):
2019-03-31 11:13:43 +08:00
out += c
2019-03-22 12:02:10 +08:00
else:
2019-03-31 11:13:43 +08:00
out += '_'
return out
2019-03-22 12:02:10 +08:00
def fix_output_file_name(name):
2019-03-31 11:13:43 +08:00
filename, extname = os.path.splitext(name)
basename = os.path.basename(filename)
dirname = os.path.dirname(filename)
newname = os.path.normpath(os.path.join(
dirname, to_var_name(basename) + extname))
return newname
2019-03-22 12:02:10 +08:00
2018-04-27 10:02:25 +08:00
def joinPath(root, subdir):
2019-03-31 11:13:43 +08:00
return os.path.normpath(os.path.join(root, subdir))
OS_NAME = platform.system()
2018-04-27 10:02:25 +08:00
2018-04-29 18:06:40 +08:00
def toExe(name):
2019-03-31 11:13:43 +08:00
if OS_NAME == 'Windows':
return joinPath(BIN_DIR, name+'.exe')
else:
return joinPath(BIN_DIR, name)
2018-04-27 10:02:25 +08:00
def buildAll():
2019-03-31 11:13:43 +08:00
os.system('scons')
2018-04-27 10:02:25 +08:00
def removeDir(path):
2019-03-31 11:13:43 +08:00
if os.path.isdir(path):
print('rmdir:' + path)
shutil.rmtree(path)
2018-04-27 10:02:25 +08:00
2018-11-02 11:51:14 +08:00
def prepareOutputDir(name):
2019-03-31 11:13:43 +08:00
fullpath = joinPath(OUTPUT_DIR, name)
if os.path.exists(fullpath):
print(fullpath+" exist.")
else:
os.makedirs(fullpath)
2018-11-02 11:51:14 +08:00
2018-04-27 10:02:25 +08:00
def prepare():
2019-03-31 11:13:43 +08:00
prepareOutputDir('styles')
prepareOutputDir('images')
prepareOutputDir('fonts')
prepareOutputDir('strings')
prepareOutputDir('ui')
prepareOutputDir('scripts')
prepareOutputDir('data')
prepareOutputDir('xml')
2018-04-27 10:02:25 +08:00
2018-11-02 11:51:14 +08:00
def execCmd(cmd):
2019-03-31 11:13:43 +08:00
print(cmd)
os.system(cmd)
2018-04-27 10:02:25 +08:00
2018-11-02 11:51:14 +08:00
def themegen(raw, inc):
2019-03-31 11:13:43 +08:00
execCmd(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
def themegen_bin(raw, bin):
2019-03-31 11:13:43 +08:00
execCmd(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(INPUT_DIR, bin) + ' bin')
2018-05-04 14:52:15 +08:00
def strgen(raw, inc):
2019-03-31 11:13:43 +08:00
execCmd(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
2018-05-04 14:52:15 +08:00
def strgen_bin(raw, bin):
2019-03-31 11:13:43 +08:00
execCmd(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(INPUT_DIR, bin) + ' bin')
2018-05-04 14:52:15 +08:00
2018-04-27 10:02:25 +08:00
def resgen(raw, inc):
2019-03-31 11:13:43 +08:00
execCmd(toExe('resgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
2018-04-27 10:02:25 +08:00
def fontgen(raw, text, inc, size):
2019-03-31 11:13:43 +08:00
execCmd(toExe('fontgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' +
joinPath(INPUT_DIR, text) + ' ' + joinPath(OUTPUT_DIR, inc) + ' ' + str(size))
2018-04-27 10:02:25 +08:00
def imagegen(raw, inc):
2019-03-31 11:13:43 +08:00
execCmd(toExe('imagegen') + ' ' + raw + ' ' + inc + ' ' + IMAGEGEN_OPTIONS)
inc = inc.replace('.data', '.res')
resgen(raw, inc)
2018-04-27 10:02:25 +08:00
2018-11-20 16:25:28 +08:00
def svggen(raw, inc, bin):
2019-03-31 11:13:43 +08:00
execCmd(toExe('bsvggen') + ' ' + raw + ' ' + inc)
execCmd(toExe('bsvggen') + ' ' + raw + ' ' + bin + ' bin')
2018-11-20 16:25:28 +08:00
2018-04-27 10:02:25 +08:00
def xml_to_ui(raw, inc):
2019-03-31 11:13:43 +08:00
execCmd(toExe('xml_to_ui') + ' ' + raw + ' ' + inc)
2018-04-27 10:02:25 +08:00
def xml_to_ui_bin(raw, bin):
2019-03-31 11:13:43 +08:00
execCmd(toExe('xml_to_ui') + ' ' + raw + ' ' + bin + ' bin')
2018-11-02 11:51:14 +08:00
def gen_res_all_style():
2019-03-31 11:13:43 +08:00
for f in glob.glob(joinPath(INPUT_DIR, 'styles/*.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)
inc = fix_output_file_name(inc)
themegen(raw, inc)
bin = bin.replace('.xml', '.bin')
themegen_bin(raw, bin)
def gen_res_svg():
for f in glob.glob(joinPath(INPUT_DIR, 'images/svg/*.svg')):
inc = copy.copy(f)
bin = copy.copy(f)
raw = copy.copy(f)
basename = os.path.basename(inc)
inc = joinPath(OUTPUT_DIR, 'images/'+basename)
inc = inc.replace('.svg', '.bsvg')
inc = fix_output_file_name(inc)
bin = bin.replace('.svg', '.bsvg')
svggen(raw, inc, bin)
def gen_res_png_jpg():
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')
2019-07-09 17:31:29 +08:00
inc = inc.replace('.bmp', '.data')
2019-03-31 11:13:43 +08:00
inc = inc.replace('.gif', '.data')
inc = fix_output_file_name(inc)
imagegen(raw, inc)
def gen_res_all_image():
2018-11-20 16:25:28 +08:00
gen_res_png_jpg()
2018-11-21 09:34:23 +08:00
gen_res_svg()
2018-11-20 16:25:28 +08:00
2019-03-31 11:13:43 +08:00
2018-11-02 11:51:14 +08:00
def gen_res_all_ui():
2019-03-31 11:13:43 +08:00
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)
inc = fix_output_file_name(inc)
xml_to_ui(raw, inc)
bin = bin.replace('.xml', '.bin')
xml_to_ui_bin(raw, bin)
2018-04-27 10:02:25 +08:00
2019-03-15 17:44:48 +08:00
def gen_res_all_data():
2019-03-31 11:13:43 +08:00
for f in glob.glob(joinPath(INPUT_DIR, 'data/*.*')):
inc = copy.copy(f)
raw = copy.copy(f)
_, extname = os.path.splitext(inc)
uextname = extname.replace('.', '_')
inc = inc.replace(extname, uextname+'.data')
inc = inc.replace(INPUT_DIR, OUTPUT_DIR)
inc = fix_output_file_name(inc)
resgen(raw, inc)
2019-03-15 17:44:48 +08:00
def gen_res_all_xml():
2019-03-31 11:13:43 +08:00
for f in glob.glob(joinPath(INPUT_DIR, 'xml/*.xml')):
inc = copy.copy(f)
raw = copy.copy(f)
inc = inc.replace('.xml', '.data')
inc = inc.replace(INPUT_DIR, OUTPUT_DIR)
inc = fix_output_file_name(inc)
resgen(raw, inc)
2019-03-15 17:44:48 +08:00
2018-11-02 11:51:14 +08:00
def gen_res_all_font():
2019-03-31 11:13:43 +08:00
for f in glob.glob(joinPath(INPUT_DIR, 'fonts/*.ttf')):
res = copy.copy(f)
raw = copy.copy(f)
res = res.replace(INPUT_DIR, '.')
res = res.replace('.ttf', '.res')
raw = raw.replace(INPUT_DIR, '.')
resgen(raw, res)
2019-05-29 17:24:46 +08:00
fontgen('fonts/default_full.ttf', 'fonts/text.txt', 'fonts/default.data', 18)
2019-03-31 11:13:43 +08:00
2018-07-05 15:22:04 +08:00
2019-02-07 17:27:19 +08:00
def gen_res_all_script():
2019-03-31 11:13:43 +08:00
for f in glob.glob(joinPath(INPUT_DIR, 'scripts/*.js')):
res = copy.copy(f)
raw = copy.copy(f)
res = res.replace(INPUT_DIR, '.')
res = res.replace('.js', '.res')
raw = raw.replace(INPUT_DIR, '.')
raw = fix_output_file_name(raw)
resgen(raw, res)
2019-02-07 17:27:19 +08:00
2018-11-02 11:51:14 +08:00
def gen_res_all_string():
print('gen_res_all_string');
2019-03-31 11:13:43 +08:00
strgen('strings/strings.xml', 'strings')
strgen_bin('strings/strings.xml', 'strings')
2018-07-05 15:22:04 +08:00
2018-07-22 14:22:09 +08:00
def gen_gpinyin():
2019-03-31 11:13:43 +08:00
execCmd(toExe('resgen') + ' ' + joinPath('3rd', 'gpinyin/data/gpinyin.dat') +
' ' + joinPath('3rd', 'gpinyin/src/gpinyin.inc'))
execCmd(toExe('resgen') + ' ' + joinPath('tools', 'word_gen/words.bin') +
' ' + joinPath('src', 'input_methods/suggest_words.inc'))
execCmd(toExe('resgen') + ' ' + joinPath('tools',
'word_gen/words.bin') + ' ' + joinPath('tests', 'suggest_test.inc'))
2018-11-02 11:51:14 +08:00
def gen_res_all():
2019-03-31 11:13:43 +08:00
gen_res_all_string()
gen_res_all_font()
gen_res_all_script()
gen_res_all_image()
gen_res_all_ui()
gen_res_all_style()
gen_res_all_data()
gen_res_all_xml()
2018-04-27 10:02:25 +08:00
def writeResult(str):
2019-04-23 16:00:02 +08:00
with open(ASSET_C, "w") as text_file:
text_file.write(str);
2019-03-31 11:13:43 +08:00
2019-04-07 18:31:16 +08:00
def writeResultJSON(str):
2019-04-23 16:00:02 +08:00
with open('assets.js', "w") as text_file:
text_file.write(str);
2018-04-27 10:02:25 +08:00
2018-06-08 19:19:06 +08:00
def genIncludes(files):
2019-03-31 11:13:43 +08:00
str1 = ""
for f in files:
incf = copy.copy(f)
incf = incf.replace(os.path.dirname(ASSETS_ROOT), ".")
incf = incf.replace('\\', '/')
incf = incf.replace('./', '')
str1 += '#include "'+incf+'"\n'
return str1
2018-06-08 19:19:06 +08:00
2018-11-21 09:34:23 +08:00
def gen_add_assets(files):
2019-03-31 11:13:43 +08:00
result = ""
for f in files:
incf = copy.copy(f)
basename = incf.replace(OUTPUT_DIR, '.')
basename = basename.replace('\\', '/')
basename = basename.replace('/fonts/', '/font/')
basename = basename.replace('/images/', '/image/')
basename = basename.replace('/styles/', '/style/')
basename = basename.replace('./', '')
basename = basename.replace('/', '_')
basename = basename.replace('.data', '')
basename = basename.replace('.bsvg', '')
2019-04-03 09:28:49 +08:00
if basename == 'font_default':
result += ' assets_manager_add(rm, font_default);\n'
else:
result += ' assets_manager_add(rm, '+basename+');\n'
2019-03-31 11:13:43 +08:00
return result
2018-11-21 09:34:23 +08:00
2018-06-08 19:19:06 +08:00
def gen_res_c():
2019-03-31 11:13:43 +08:00
result = '#include "awtk.h"\n'
result += '#include "base/assets_manager.h"\n'
result += '#ifndef WITH_FS_RES\n'
files = glob.glob(joinPath(OUTPUT_DIR, 'strings/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'styles/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'ui/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'xml/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'data/*.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_VGCANVAS\n"
files = glob.glob(joinPath(OUTPUT_DIR, 'images/*.bsvg'))
result += genIncludes(files)
result += '#endif/*WITH_VGCANVAS*/\n'
result += "#if defined(WITH_STB_FONT) || defined(WITH_FT_FONT)\n"
files = glob.glob(joinPath(OUTPUT_DIR, 'fonts/default.res'))
result += genIncludes(files)
result += "#else/*WITH_STB_FONT or WITH_FT_FONT*/\n"
files = glob.glob(joinPath(OUTPUT_DIR, 'fonts/*.data'))
result += genIncludes(files)
result += '#endif/*WITH_STB_FONT or WITH_FT_FONT*/\n'
result += '#endif/*WITH_FS_RES*/\n'
result += '\n'
result += 'ret_t assets_init(void) {\n'
result += ' assets_manager_t* rm = assets_manager();\n\n'
result += ''
result += '#ifdef WITH_FS_RES\n'
result += ' assets_manager_preload(rm, ASSET_TYPE_FONT, "default");\n'
result += ' assets_manager_preload(rm, ASSET_TYPE_STYLE, "default");\n'
2019-03-31 11:13:43 +08:00
result += '#else\n'
files = glob.glob(joinPath(OUTPUT_DIR, '**/*.data'))
result += gen_add_assets(files)
result += "#ifdef WITH_VGCANVAS\n"
files = glob.glob(joinPath(OUTPUT_DIR, 'images/*.bsvg'))
result += gen_add_assets(files)
result += '#endif/*WITH_VGCANVAS*/\n'
result += '#endif\n'
result += '\n'
result += ' tk_init_assets();\n'
result += ' return RET_OK;\n'
result += '}\n'
writeResult(result)
def gen_res_web_c():
result = '#include "awtk.h"\n'
result += '#include "base/assets_manager.h"\n'
files = glob.glob(joinPath(OUTPUT_DIR, 'images/*.bsvg')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'strings/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'styles/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'ui/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'xml/*.data')) \
+ glob.glob(joinPath(OUTPUT_DIR, 'data/*.data'))
result += genIncludes(files)
result += '\n'
result += 'ret_t assets_init(void) {\n'
result += ' assets_manager_t* rm = assets_manager();\n\n'
result += ''
result += gen_add_assets(files)
result += '\n'
result += ' tk_init_assets();\n'
result += ' return RET_OK;\n'
result += '}\n'
2019-04-14 19:14:16 +08:00
global ASSET_C
ASSET_C = ASSET_C.replace('.c', '_web.c');
2019-03-31 11:13:43 +08:00
writeResult(result)
2018-04-27 10:02:25 +08:00
2019-04-07 18:31:16 +08:00
def gen_res_json_one(res_type, files):
result= "\n " + res_type + ': [\n'
for f in files:
2019-04-15 11:29:36 +08:00
uri = f.replace(os.getcwd(), "")[1:]
2019-04-23 17:39:50 +08:00
uri = uri.replace('\\', '/');
2019-04-07 18:31:16 +08:00
filename, extname = os.path.splitext(uri)
basename = os.path.basename(filename)
2019-04-07 19:19:50 +08:00
result = result + ' {name:"' + basename + '\", uri:"' + uri;
if res_type == 'image' and extname != '.svg' and extname != '.bsvg':
img = Image.open(f)
w, h = img.size
result = result + '", w:' + str(w) + ', h:' + str(h)+ '},\n';
else:
result = result + '"},\n';
2019-04-07 18:31:16 +08:00
result = result + ' ],'
return result;
def gen_res_json():
result = 'const g_awtk_assets = {';
result = result + gen_res_json_one("image", glob.glob(joinPath(INPUT_DIR, 'images/*/*.*')));
result = result + gen_res_json_one("ui", glob.glob(joinPath(INPUT_DIR, 'ui/*.bin')));
result = result + gen_res_json_one("style", glob.glob(joinPath(INPUT_DIR, 'styles/*.bin')));
result = result + gen_res_json_one("string", glob.glob(joinPath(INPUT_DIR, 'strings/*.bin')));
result = result + gen_res_json_one("xml", glob.glob(joinPath(INPUT_DIR, 'xml/*.xml')));
result = result + gen_res_json_one("data", glob.glob(joinPath(INPUT_DIR, 'data/*.*')));
result = result + gen_res_json_one("script", glob.glob(joinPath(INPUT_DIR, 'scripts/*.*')));
result = result + gen_res_json_one("font", glob.glob(joinPath(INPUT_DIR, 'fonts/*.ttf')));
result = result + '\n};';
2019-04-14 19:14:16 +08:00
global ASSET_C
ASSET_C = ASSET_C.replace('.c', '_web.js');
writeResult(result);
2019-04-03 09:28:49 +08:00
2018-11-02 11:51:14 +08:00
def gen_res():
2019-03-31 11:13:43 +08:00
prepare()
gen_res_all()
gen_res_c()
def init(awtk_root, assets_root, asset_c):
global DPI
global ASSET_C
global BIN_DIR
global ASSETS_ROOT
global AWTK_ROOT
global INPUT_DIR
global OUTPUT_DIR
global IMAGEGEN_OPTIONS
ASSET_C = asset_c
AWTK_ROOT = awtk_root
ASSETS_ROOT = assets_root
BIN_DIR = joinPath(AWTK_ROOT, 'bin')
INPUT_DIR = joinPath(ASSETS_ROOT, 'raw')
OUTPUT_DIR = joinPath(ASSETS_ROOT, 'inc')
2018-11-02 11:51:14 +08:00
def dumpArgs():
2019-03-31 11:13:43 +08:00
print('ASSETS_ROOT='+ASSETS_ROOT)
print('AWTK_ROOT='+AWTK_ROOT)
print('INPUT_DIR='+INPUT_DIR)
print('OUTPUT_DIR='+OUTPUT_DIR)
print('ASSET_C='+ASSET_C)
print('DPI='+DPI)
print('IMAGEGEN_OPTIONS='+IMAGEGEN_OPTIONS)
print('BIN_DIR='+BIN_DIR)
2018-11-02 11:51:14 +08:00
def updateRes():
2019-03-31 11:13:43 +08:00
global ACTION
if ACTION == 'all':
removeDir(OUTPUT_DIR)
gen_res()
elif ACTION == 'clean':
cleanRes()
elif ACTION == 'web':
gen_res_web_c()
2019-04-07 18:31:16 +08:00
elif ACTION == 'json':
gen_res_json()
2019-03-31 11:13:43 +08:00
elif ACTION == 'string':
prepare()
gen_res_all_string()
gen_res_c()
elif ACTION == "font":
prepare()
gen_res_all_font()
gen_res_c()
elif ACTION == "script":
prepare()
gen_res_all_script()
gen_res_c()
elif ACTION == 'image':
prepare()
gen_res_all_image()
gen_res_c()
elif ACTION == 'ui':
prepare()
gen_res_all_ui()
gen_res_c()
elif ACTION == 'style':
prepare()
gen_res_all_style()
gen_res_c()
elif ACTION == 'data':
prepare()
gen_res_all_data()
gen_res_c()
elif ACTION == 'xml':
prepare()
gen_res_all_xml()
gen_res_c()
elif ACTION == 'pinyin':
prepare()
gen_gpinyin()
gen_res_c()
dumpArgs()
2018-11-02 11:51:14 +08:00
2018-11-07 18:17:00 +08:00
def cleanRes():
2019-03-31 11:13:43 +08:00
print("==================================================================")
resFiles = glob.glob(joinPath(INPUT_DIR, '*/*.bin')) + \
glob.glob(joinPath(INPUT_DIR, '*/*/*.bin'))
for f in resFiles:
print("remove: " + f)
os.remove(f)
resFiles = glob.glob(joinPath(INPUT_DIR, '*/*.bin')) + \
glob.glob(joinPath(INPUT_DIR, '*/*/*.bsvg'))
for f in resFiles:
print("remove: " + f)
os.remove(f)
removeDir(OUTPUT_DIR)
print("==================================================================")
2018-11-07 18:17:00 +08:00
2018-11-02 11:51:14 +08:00
2019-03-31 11:13:43 +08:00
def showUsage():
global DPI
global ACTION
global IMAGEGEN_OPTIONS
2019-04-07 18:31:16 +08:00
args = ' action[clean|web|json|all|font|image|ui|style|string|script|data|xml] dpi[x1|x2] image_options[rgba|bgra+bgr565]'
2019-03-31 11:13:43 +08:00
if len(sys.argv) == 1:
print('=========================================================')
print('Usage: '+sys.argv[0] + args)
print('Example:')
print(sys.argv[0] + ' all')
print(sys.argv[0] + ' clean')
print(sys.argv[0] + ' style')
print(sys.argv[0] + ' all x1 bgra+bgr565')
print('=========================================================')
sys.exit(0)
2018-11-02 11:51:14 +08:00
else:
2019-03-31 11:13:43 +08:00
ACTION = sys.argv[1]
if len(sys.argv) > 2:
DPI = sys.argv[2]
else:
DPI = 'x1'
2018-11-02 11:51:14 +08:00
2019-03-31 11:13:43 +08:00
if len(sys.argv) > 3:
IMAGEGEN_OPTIONS = sys.argv[3]
else:
IMAGEGEN_OPTIONS = 'bgra+bgr565'
2018-11-02 11:51:14 +08:00
2019-03-31 11:13:43 +08:00
showUsage()