Spaces:
Sleeping
Sleeping
import fontforge # noqa | |
import os | |
import sys | |
from tqdm import tqdm | |
import multiprocessing as mp | |
import argparse | |
def convert_mp(opts): | |
"""Useing multiprocessing to convert all fonts to sfd files""" | |
charset_th = open(f"{opts.data_path}/char_set/{opts.language}.txt", 'r').read() | |
charset = charset_th | |
if opts.ref_nshot == 52: | |
charset_eng = open(f"{opts.data_path}/char_set/eng.txt", 'r').read() | |
charset = charset_th + charset_eng | |
charset_lenw = len(str(len(charset))) | |
fonts_file_path = os.path.join(opts.ttf_path, opts.language) # opts.ttf_path,opts.language, | |
sfd_path = os.path.join(opts.sfd_path, opts.language) | |
print(os.path.join(fonts_file_path, opts.split)) | |
for root, dirs, files in os.walk(os.path.join(fonts_file_path, opts.split)): | |
ttf_fnames = files | |
print(ttf_fnames) | |
font_num = len(ttf_fnames) | |
process_num = mp.cpu_count() - 1 | |
font_num_per_process = font_num // process_num + 1 | |
def process(process_id, font_num_p_process): | |
for i in tqdm(range(process_id * font_num_p_process, (process_id + 1) * font_num_p_process)): | |
if i >= font_num: | |
break | |
font_id = ttf_fnames[i].split('.')[0] | |
split = opts.split | |
font_name = ttf_fnames[i] | |
font_file_path = os.path.join(fonts_file_path, split, font_name) | |
try: | |
cur_font = fontforge.open(font_file_path) | |
except Exception as e: | |
print('Cannot open ', font_name) | |
print(e) | |
continue | |
target_dir = os.path.join(sfd_path, split, "{}".format(font_id)) | |
if not os.path.exists(target_dir): | |
os.makedirs(target_dir) | |
for char_id, char in enumerate(charset): | |
try: | |
char_description = open(os.path.join(target_dir, '{}_{num:0{width}}.txt'.format(font_id, num=char_id, width=charset_lenw)), 'w') | |
if char in charset_th: | |
char = 'uni' + char.encode("unicode_escape")[2:].decode("utf-8") | |
cur_font.selection.select(char) | |
cur_font.copy() | |
new_font_for_char = fontforge.font() | |
# new_font_for_char.ascent = 750 | |
# new_font_for_char.descent = 250 | |
# new_font_for_char.em = new_font_for_char.ascent + new_font_for_char.descent | |
char = 'A' | |
new_font_for_char.selection.select(char) | |
new_font_for_char.paste() | |
new_font_for_char.fontname = "{}_".format(font_id) + font_name | |
new_font_for_char.save(os.path.join(target_dir, '{}_{num:0{width}}.sfd'.format(font_id, num=char_id, width=charset_lenw))) | |
char_description.write(str(ord(char)) + '\n') | |
char_description.write(str(new_font_for_char[char].width) + '\n') | |
char_description.write(str(new_font_for_char[char].vwidth) + '\n') | |
char_description.write('{num:0{width}}'.format(num=char_id, width=charset_lenw) + '\n') | |
char_description.write('{}'.format(font_id)) | |
# print('{}_{num:0{width}}.sfd'.format(font_id, num=char_id, width=charset_lenw)) | |
char_description.close() | |
except Exception as e: | |
print("Found Error:", font_id, font_name ,char_id, char) | |
print(e) | |
cur_font.close() | |
processes = [mp.Process(target=process, args=(pid, font_num_per_process)) for pid in range(process_num)] | |
for p in processes: | |
p.start() | |
for p in processes: | |
p.join() | |
def main(): | |
parser = argparse.ArgumentParser(description="Convert ttf fonts to sfd fonts") | |
parser.add_argument("--language", type=str, default='eng', choices=['eng', 'chn', 'tha']) | |
parser.add_argument("--data_path", type=str, default='./Font_Dataset', help="Path to Dataset") | |
parser.add_argument("--ttf_path", type=str, default='../data/font_ttfs') | |
parser.add_argument('--sfd_path', type=str, default='../data/font_sfds') | |
parser.add_argument('--split', type=str, default='train') | |
opts = parser.parse_args() | |
convert_mp(opts) | |
if __name__ == "__main__": | |
main() |