soimy / msdf-bmfont-xml

Generate BMFont texture and spec XML using msdfgen
https://soimy.github.io/msdf-bmfont-xml/
MIT License
315 stars 46 forks source link

How to pack all available glyphs in font? #86

Open jakerdy opened 1 year ago

jakerdy commented 1 year ago

Hi, it will be great if there is a way to extract all glyphs defined in font. Using original msdf-atlas-gen you could specify charset via ranges, like

[0x00, 0xFFFF]

An you get all glyphs from this range (if they are present) packed. But it seems there is no way to do in using msdf-bmfont.

soimy commented 1 year ago

Range is currently not possible via charset option, sorry. You have to find a way to generate all the character string by yourself.

jakerdy commented 1 year ago

Okay.

After googling some time, i find here one cool and automatic way to do this. Works on linux (which is not perfect but vm is enuogh), and maybe somewhere else, where you have utility fc-query.

You should create bash script (lets call it fdump.sh):

#!/bin/bash -

Usage() { echo "$0 FontFile"; exit 1; }
SayError() { local error=$1; shift; echo "$0: $@"; exit "$error"; }

[ "$#" -ne 1 ] && Usage

width=70
fontfile="$1"

[ -f "$fontfile" ] || SayError 4 'File not found'

list=$(fc-query --format='%{charset}\n' "$fontfile")

for    range in $list
do     IFS=- read start end <<<"$range"
       if    [ "$end" ]
       then
             start=$((16#$start))
         end=$((16#$end))
         for((i=start;i<=end;i++)); do
         printf -v char '\\U%x' "$i"
         printf '%b' "$char"
         done
       else
         printf '%b' "\\U$start"
       fi
done | grep -oP '.{'"$width"'}'

Don't forget to make in executable: chmod +x fdump.sh

And run in on your font:

./fdump.sh MyFont.ttf > MyFont_charset.txt

As a result you will get file with all defined glyphs in your font:

image