awtk/scripts/update_res_common.py
2019-07-09 17:31:29 +08:00

564 lines
16 KiB
Python
Executable File

import os
import sys
import copy
import glob
import shutil
import platform
from PIL import Image
###########################
DPI = ''
ACTION = 'all'
ASSET_C = ''
BIN_DIR = ''
ASSETS_ROOT = ''
AWTK_ROOT = ''
INPUT_DIR = ''
OUTPUT_DIR = ''
IMAGEGEN_OPTIONS = ''
###########################
def to_var_name(s):
out = ''
for c in s:
if(c.isalpha() or c.isdigit()):
out += c
else:
out += '_'
return out
def fix_output_file_name(name):
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
def joinPath(root, subdir):
return os.path.normpath(os.path.join(root, subdir))
OS_NAME = platform.system()
def toExe(name):
if OS_NAME == 'Windows':
return joinPath(BIN_DIR, name+'.exe')
else:
return joinPath(BIN_DIR, name)
def buildAll():
os.system('scons')
def removeDir(path):
if os.path.isdir(path):
print('rmdir:' + path)
shutil.rmtree(path)
def prepareOutputDir(name):
fullpath = joinPath(OUTPUT_DIR, name)
if os.path.exists(fullpath):
print(fullpath+" exist.")
else:
os.makedirs(fullpath)
def prepare():
prepareOutputDir('styles')
prepareOutputDir('images')
prepareOutputDir('fonts')
prepareOutputDir('strings')
prepareOutputDir('ui')
prepareOutputDir('scripts')
prepareOutputDir('data')
prepareOutputDir('xml')
def execCmd(cmd):
print(cmd)
os.system(cmd)
def themegen(raw, inc):
execCmd(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
def themegen_bin(raw, bin):
execCmd(toExe('themegen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(INPUT_DIR, bin) + ' bin')
def strgen(raw, inc):
execCmd(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
def strgen_bin(raw, bin):
execCmd(toExe('strgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(INPUT_DIR, bin) + ' bin')
def resgen(raw, inc):
execCmd(toExe('resgen') + ' ' + joinPath(INPUT_DIR, raw) +
' ' + joinPath(OUTPUT_DIR, inc))
def fontgen(raw, text, inc, size):
execCmd(toExe('fontgen') + ' ' + joinPath(INPUT_DIR, raw) + ' ' +
joinPath(INPUT_DIR, text) + ' ' + joinPath(OUTPUT_DIR, inc) + ' ' + str(size))
def imagegen(raw, inc):
execCmd(toExe('imagegen') + ' ' + raw + ' ' + inc + ' ' + IMAGEGEN_OPTIONS)
inc = inc.replace('.data', '.res')
resgen(raw, inc)
def svggen(raw, inc, bin):
execCmd(toExe('bsvggen') + ' ' + raw + ' ' + inc)
execCmd(toExe('bsvggen') + ' ' + raw + ' ' + bin + ' bin')
def xml_to_ui(raw, inc):
execCmd(toExe('xml_to_ui') + ' ' + raw + ' ' + inc)
def xml_to_ui_bin(raw, bin):
execCmd(toExe('xml_to_ui') + ' ' + raw + ' ' + bin + ' bin')
def gen_res_all_style():
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')
inc = inc.replace('.bmp', '.data')
inc = inc.replace('.gif', '.data')
inc = fix_output_file_name(inc)
imagegen(raw, inc)
def gen_res_all_image():
gen_res_png_jpg()
gen_res_svg()
def gen_res_all_ui():
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)
def gen_res_all_data():
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)
def gen_res_all_xml():
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)
def gen_res_all_font():
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)
fontgen('fonts/default_full.ttf', 'fonts/text.txt', 'fonts/default.data', 18)
def gen_res_all_script():
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)
def gen_res_all_string():
print('gen_res_all_string');
strgen('strings/strings.xml', 'strings')
strgen_bin('strings/strings.xml', 'strings')
def gen_gpinyin():
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'))
def gen_res_all():
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()
def writeResult(str):
with open(ASSET_C, "w") as text_file:
text_file.write(str);
def writeResultJSON(str):
with open('assets.js', "w") as text_file:
text_file.write(str);
def genIncludes(files):
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
def gen_add_assets(files):
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', '')
if basename == 'font_default':
result += ' assets_manager_add(rm, font_default);\n'
else:
result += ' assets_manager_add(rm, '+basename+');\n'
return result
def gen_res_c():
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'
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'
global ASSET_C
ASSET_C = ASSET_C.replace('.c', '_web.c');
writeResult(result)
def gen_res_json_one(res_type, files):
result= "\n " + res_type + ': [\n'
for f in files:
uri = f.replace(os.getcwd(), "")[1:]
uri = uri.replace('\\', '/');
filename, extname = os.path.splitext(uri)
basename = os.path.basename(filename)
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';
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};';
global ASSET_C
ASSET_C = ASSET_C.replace('.c', '_web.js');
writeResult(result);
def gen_res():
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')
def dumpArgs():
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)
def updateRes():
global ACTION
if ACTION == 'all':
removeDir(OUTPUT_DIR)
gen_res()
elif ACTION == 'clean':
cleanRes()
elif ACTION == 'web':
gen_res_web_c()
elif ACTION == 'json':
gen_res_json()
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()
def cleanRes():
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("==================================================================")
def showUsage():
global DPI
global ACTION
global IMAGEGEN_OPTIONS
args = ' action[clean|web|json|all|font|image|ui|style|string|script|data|xml] dpi[x1|x2] image_options[rgba|bgra+bgr565]'
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)
else:
ACTION = sys.argv[1]
if len(sys.argv) > 2:
DPI = sys.argv[2]
else:
DPI = 'x1'
if len(sys.argv) > 3:
IMAGEGEN_OPTIONS = sys.argv[3]
else:
IMAGEGEN_OPTIONS = 'bgra+bgr565'
showUsage()