aboutsummaryrefslogtreecommitdiff
path: root/font_api/tools/make_font_textures.sh
blob: 4a3191c8ba7e82383252c1838161730754c9753f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
#!/bin/bash

# This program generates a bitmap font for font_api mod for Minetest game.
# (c) Andrzej Pieńkowski <pienkowski.andrzej@gmail.com>
# (c) Pierre-Yves Rollo <dev@pyrollo.com>
# License: GPL

usage() {
	echo "Usage: $0 fontfile fontname fontsize"
	echo "fontfile: A TTF font file to use to create textures."
	echo "fontname: The font name to be used in font_api (should be simple, with no spaces)."
	echo "fontsize: Font height to be rendered."
}

if [ $# -ne 3 ] 
then
	usage
	exit 1
fi

fontfile=$1
fontname=$2
fontsize=$3

if [ ! -r "$fontfile" ]
then
	echo "$fontfile not readable."
	exit 1
fi

# check imagemagick
hash convert &>/dev/null
if [ $? -eq 1 ]; then
	echo -e "Error: This program requires convert from ImageMagick! Please install it by typing 'sudo apt-get install imagemagick' in terminal."
	abort=1
fi

# check ttx
hash ttx &>/dev/null
if [ $? -eq 1 ]; then
	echo -e "Error: This program requires ttx from FontTools! Please install it by typing 'sudo apt-get install fonttools' in terminal."
	abort=1
fi

if [ $abort ]
then
	exit 1
fi

generate() {
	for i in $(seq $((0x$1)) $((0x$2)))
	do
		if echo "$codepoints" | grep -qi $(printf "0x%x" $i)
		then
		    hex=$(printf "%04x" $i)
		    echo -e "Generating textures/font_${fontname}_$hex.png file for \"\\U$hex\" char."
            if [[ "$hex" == "005c" ]] # Backslash char
            then
    			convert -background none -fill black -font "$fontfile" -pointsize $fontsize label:"\\\\" -colorspace gray -channel alpha -threshold 50% textures/font_${fontname}_$hex.png
            else
    			convert -background none -fill black -font "$fontfile" -pointsize $fontsize label:"$(echo -en "\\U$hex")" -colorspace gray -channel alpha -threshold 50% textures/font_${fontname}_$hex.png
            fi
 		fi
	done
}

mkdir textures

# Reads all available code points in the font.
codepoints=$(ttx -o - "$fontfile" | grep "<map code=" | cut -d \" -f 2)

# Mandatory chars
generate 0020 007f

# generate space and null characters
if [ ! -f "textures/font_${fontname}_0030.png" ]; then
	echo "Error: Something wrong happened! Font was not generated!"
	exit 1
else
	size=$(identify textures/font_${fontname}_0030.png | cut -d " " -f 3)
	if ! [[ $fontHeight =~ $re ]] ; then
		echo "Error: Something wrong happened! Generated files might be broken!"
		exit 1
	else
        w=$(expr $(echo $size | cut -d x -f 1) - 1)
        h=$(expr $(echo $size | cut -d x -f 2) - 1)
        # Space char
		convert -size $size xc:transparent -colorspace gray textures/font_${fontname}_0020.png
        # Null char		
        convert -size $size xc:transparent -colorspace gray -stroke black -fill transparent -strokewidth 1 -draw "rectangle 0,0 $w,$h" textures/font_${fontname}_0000.png
	fi
fi

# Optional Unicode pages (see https://en.wikipedia.org/wiki/Unicode) :

# 00a0-00ff Latin-1 Supplement (full)
generate 00a0 00ff
# 0100-017f Latin Extended-A (full)
generate 0100 017f
# 0370-03ff Greek (full)
generate 0370 03ff
# 0400-04ff Cyrilic (full)
generate 0400 04ff
# 2000-206f General Punctuation (Limited to Dashes)
generate 2010 2015
# 2000-206f General Punctuation (Limited to Quotes)
generate 2018 201F
# 20a0-20cf Currency Symbols (Limited to Euro symbol)
generate 20ac 20ac