summaryrefslogtreecommitdiff
path: root/mf/feta-braces.mf
blob: c948f345fd6e525fa0d221606b96a55f86dc99e9 (about) (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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
% Feta (not the Font-En-Tja) music font -- Staff braces
% This file is part of LilyPond, the GNU music typesetter.
%
% Copyright (C) 1997--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
%                Jan Nieuwenhuizen <janneke@gnu.org>
%
% The LilyPond font is free software: you can redistribute it and/or modify
% it under the terms of the GNU General Public License as published by
% the Free Software Foundation, either version 3 of the License, or
% (at your option) any later version, or under the SIL Open Font License.
%
% LilyPond is distributed in the hope that it will be useful,
% but WITHOUT ANY WARRANTY; without even the implied warranty of
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
% GNU General Public License for more details.
%
% You should have received a copy of the GNU General Public License
% along with LilyPond.  If not, see <http://www.gnu.org/licenses/>.


% We have to reduce the pixel-per-point value to
% support large brace glyphs in case we are using MetaPost
% (which by default sets `hppp' to 49.80244, regardless of
% the used `mag' value)

if known miterlimit:
	bpppix_ := 0.2;		% ten times larger than original

	numeric mm, pt, dd, bp, cm, pc, cc, in;

	mm * bpppix_ = 2.83464;
	pt * bpppix_ = 0.99626;
	dd * bpppix_ = 1.06601;
	bp * bpppix_ = 1;
	cm * bpppix_ = 28.34645;
	pc * bpppix_ = 11.95517;
	cc * bpppix_ = 12.79213;
	in * bpppix_ = 72;

	hppp := pt;
	vppp := pt;
fi;


input feta-autometric;
input feta-macros;

staffsize# := 20 pt#;   %% arbitrary

input feta-params;

%
% We must let the design increase for each font to make sure that mftrace
% doesn't jack up the resolution too highly for the longer braces.
%

fet_beginfont ("feta-braces-" & char (97 + font_count),
	       (font_count + 1) * 20, "fetaBraces");

mode_setup;


save code, braces_per_font;
code := 64;
braces_per_font := 64;

def draw_brace (expr height_sharp, width_sharp, slt_sharp, brace_number) =
	save pendir, height, width, thin, thick, slt, pat;
	save penangle;
	pair pendir;
	path pat;

	height# := height_sharp;
	width# := width_sharp;
	slt# := slt_sharp;

	fet_beginchar ("brace number " & decimal (brace_number),
		       "brace" & decimal (brace_number))
		set_char_box (width#, 0, height# / 2, height# / 2);

		define_pixels (height, width, slt);
		thin = 2 slt;
		thick = .5 width;

		z2 = .5 [z1, z3];
		y3l = y1 + height / 2;
		x3 = x1 + width;
		y1 = 0;
		x1 = -b;
		y0 = y1;
		x0 = x1 - 2/6 thin;

		pendir = unitvector (x3 - x1, y3l / 8 - y1);
		penangle = angle pendir - 90;
		penpos3 (thin, penangle);
		penpos2 (thick, angle (z3 - z1) - 90);
		penpos1 (-2 * (x0 - x1), penangle);

		penlabels (1, 2, 3);
		labels (0);

		pat := z2r
		       .. simple_serif (z3r, z3l, 90)
		       .. z2l
		       .. z1l{dir (angle (z1r - z1l) - 90)}
		       .. z0{down}
		       .. z1r{-dir (angle (z1l - z1r) + 90)}
		       .. cycle;
		pat := subpath (0, 5) of pat
		       -- subpath (6, 7) of pat
		       .. cycle;

		fill pat;
		fill pat yscaled -1;
	fet_endchar;
enddef;


save linethickness;
save increment;
save last_brace_number;
save min_width;
save max_width;
save min_thin;
save max_thin;

linethickness := 0.5 pt#;
increment := 0.5 pt#;
last_brace_number := braces_per_font * 9 - 1;
min_width := 2 pt#;
max_width := 20 pt#;
min_thin := 0.2 pt#;
max_thin := 1.25 pt#;
y := 10 pt#;

for i := 0 step 1 until font_count:
	save number;

	number := braces_per_font * i;

	for j := 0 step 1 until (braces_per_font - 1):
		% message "l: "&decimal l;
		% note: define_pixels (x) multiplies x by hppp,
		% must never get bigger than infinity
		y := y + increment;
		if y > infinity / hppp:
			message "Resolution and/or magnification is too high";
			message "HPPP: "& decimal hppp &" Y: " & decimal y;
			errmessage "please report to <bug-lilypond@gnu.org>";
		fi;

		x := (y / last_brace_number) [min_width, max_width];

		increment := x / 10;
		linethickness := (y / last_brace_number) [min_thin, max_thin];
		if i = font_count:
			draw_brace (y, x, linethickness, number);
		fi;

		number := number + 1;
	endfor;
endfor;

fet_endfont ("feta-braces");