mirror of https://github.com/stenzek/duckstation
				
				
				
			ImguiManager: Only rasterize font awesome glyphs which we need
							parent
							
								
									f9bd2db2dc
								
							
						
					
					
						commit
						ea8d779962
					
				@ -0,0 +1,80 @@
 | 
			
		||||
import sys
 | 
			
		||||
import os
 | 
			
		||||
import glob
 | 
			
		||||
import re
 | 
			
		||||
 | 
			
		||||
#src_file = "src/duckstation-qt/qttranslations.cpp"
 | 
			
		||||
src_dir = os.path.join(os.path.dirname(__file__), "..", "src")
 | 
			
		||||
fa_file = os.path.join(os.path.dirname(__file__), "..", "dep", "imgui", "include", "IconsFontAwesome5.h")
 | 
			
		||||
dst_file = os.path.join(os.path.dirname(__file__), "..", "src", "frontend-common", "imgui_manager.cpp")
 | 
			
		||||
 | 
			
		||||
all_source_files = glob.glob(os.path.join(src_dir, "**", "*.cpp"), recursive=True) + \
 | 
			
		||||
    glob.glob(os.path.join(src_dir, "**", "*.h"), recursive=True) + \
 | 
			
		||||
    glob.glob(os.path.join(src_dir, "**", "*.inl"), recursive=True)
 | 
			
		||||
 | 
			
		||||
tokens = set()
 | 
			
		||||
for filename in all_source_files:
 | 
			
		||||
    data = None
 | 
			
		||||
    with open(filename, "r") as f:
 | 
			
		||||
        try:
 | 
			
		||||
            data = f.read()
 | 
			
		||||
        except:
 | 
			
		||||
            continue
 | 
			
		||||
    
 | 
			
		||||
    tokens = tokens.union(set(re.findall("(ICON_FA_[a-zA-Z0-9_]+)", data)))
 | 
			
		||||
 | 
			
		||||
print("{} tokens found.".format(len(tokens)))
 | 
			
		||||
if len(tokens) == 0:
 | 
			
		||||
    sys.exit(0)
 | 
			
		||||
 | 
			
		||||
u8_encodings = {}
 | 
			
		||||
with open(fa_file, "r") as f:
 | 
			
		||||
    for line in f.readlines():
 | 
			
		||||
        match = re.match("#define (ICON_FA_[^ ]+) \"([^\"]+)\"", line)
 | 
			
		||||
        if match is None:
 | 
			
		||||
            continue
 | 
			
		||||
        u8_encodings[match[1]] = bytes.fromhex(match[2].replace("\\x", ""))
 | 
			
		||||
 | 
			
		||||
out_pattern = "(static constexpr ImWchar range_fa\[\] = \{)[0-9A-Z_a-z, \n]+(\};)"
 | 
			
		||||
 | 
			
		||||
codepoints = list()
 | 
			
		||||
for token in tokens:
 | 
			
		||||
    u8_bytes = u8_encodings[token]
 | 
			
		||||
    u8 = str(u8_bytes, "utf-8")
 | 
			
		||||
    u16 = u8.encode("utf-16le")
 | 
			
		||||
    if len(u16) > 2:
 | 
			
		||||
        raise ValueError("{} too long".format(u8_bytes))
 | 
			
		||||
 | 
			
		||||
    codepoint = int.from_bytes(u16, byteorder="little", signed=False)
 | 
			
		||||
    codepoints.append(codepoint)
 | 
			
		||||
codepoints.sort()
 | 
			
		||||
codepoints.append(0) # null terminator
 | 
			
		||||
 | 
			
		||||
startc = None
 | 
			
		||||
endc = None
 | 
			
		||||
pairs = []
 | 
			
		||||
for codepoint in codepoints:
 | 
			
		||||
    if endc is not None and (endc + 1) != codepoint:
 | 
			
		||||
        if startc is not None:
 | 
			
		||||
            pairs.append(startc)
 | 
			
		||||
            pairs.append(endc)
 | 
			
		||||
        startc = codepoint
 | 
			
		||||
        endc = codepoint
 | 
			
		||||
    else:
 | 
			
		||||
        endc = codepoint
 | 
			
		||||
if startc is not None:
 | 
			
		||||
    pairs.append(startc)
 | 
			
		||||
    pairs.append(endc)
 | 
			
		||||
 | 
			
		||||
pairs_str = ",".join(list(map(lambda x: "0x{:x}".format(x), pairs)))
 | 
			
		||||
 | 
			
		||||
with open(dst_file, "r") as f:
 | 
			
		||||
    original = f.read()
 | 
			
		||||
    updated = re.sub(out_pattern, "\\1 " + pairs_str + " \\2", original)
 | 
			
		||||
    if original != updated:
 | 
			
		||||
        with open(dst_file, "w") as f:
 | 
			
		||||
            f.write(updated)
 | 
			
		||||
            print("Updated {}".format(dst_file))
 | 
			
		||||
    else:
 | 
			
		||||
        print("Skipping updating {}".format(dst_file))
 | 
			
		||||
 | 
			
		||||
					Loading…
					
					
				
		Reference in New Issue