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() |