2 font-interface.cc -- implement Font_interface
4 source file of the GNU LilyPond music typesetter
6 (c) 2000 Han-Wen Nienhuys <hanwen@cs.uu.nl>
10 #include "all-font-metrics.hh"
11 #include "font-metric.hh"
12 #include "font-interface.hh"
14 #include "paper-def.hh"
19 Font_interface::font_alist_chain (Grob
*me
)
21 SCM defaults
= gh_cdr (scm_assoc (ly_symbol2scm ("font-defaults"),
22 me
->paper_l ()->style_sheet_
));
24 SCM ch
= gh_list (me
->mutable_property_alist_
,
25 me
->immutable_property_alist_
,
33 todo: split up this func, reuse in text_item?
36 Font_interface::get_default_font (Grob
*me
)
38 Font_metric
* fm
= unsmob_metrics (me
->get_grob_property ("font"));
42 fm
= get_font (me
, font_alist_chain (me
));
43 me
->set_grob_property ("font", fm
->self_scm ());
49 ly_font_interface_get_default_font (SCM grob
)
51 Grob
* gr
= unsmob_grob (grob
);
55 warning ("ly_font_interface_get_default_font (): invalid argument");
59 return Font_interface::get_default_font (gr
)->self_scm ();
63 Font_interface::get_font (Grob
*me
, SCM chain
)
66 SCM ss
= me
->paper_l ()->style_sheet_
;
68 SCM proc
= gh_cdr (scm_assoc (ly_symbol2scm ("properties-to-font"),
71 SCM fonts
= gh_cdr (scm_assoc (ly_symbol2scm ("fonts"), ss
));
73 assert (gh_procedure_p (proc
));
74 SCM font_name
= gh_call2 (proc
, fonts
, chain
);
76 Font_metric
*fm
= me
->paper_l ()->find_font (font_name
, 1.0);
81 Font_interface::add_style (Grob
* me
, SCM style
, SCM chain
)
83 assert (gh_symbol_p (style
));
85 SCM sheet
= me
->paper_l ()->style_sheet_
;
87 SCM style_alist
= gh_cdr (scm_assoc (ly_symbol2scm ("style-alist"), sheet
));
88 SCM entry
= scm_assoc (style
, style_alist
);
89 if (gh_pair_p (entry
))
91 chain
= gh_cons (gh_cdr (entry
), chain
);
100 MIDI output to wtk1-fugue2.midi...
116 static SCM name_sym
, shape_sym
, family_sym
, series_sym
, rel_sz_sym
, pt_sz_sym
, wild_sym
;
122 name_sym
= scm_permanent_object (ly_symbol2scm ("font-name"));
123 shape_sym
= scm_permanent_object (ly_symbol2scm ("font-shape"));
124 family_sym
= scm_permanent_object (ly_symbol2scm ("font-family"));
125 series_sym
= scm_permanent_object (ly_symbol2scm ("font-series"));
126 rel_sz_sym
= scm_permanent_object (ly_symbol2scm ("font-relative-size"));
127 pt_sz_sym
= scm_permanent_object (ly_symbol2scm ("font-point-size"));
128 wild_sym
= scm_permanent_object (ly_symbol2scm ("*"));
130 scm_make_gsubr ("ly-get-default-font", 1 , 0, 0, (Scheme_function_unknown
) ly_font_interface_get_default_font
);
135 Font_interface::wild_compare(SCM field_val
, SCM val
)
137 return (val
== SCM_BOOL_F
|| field_val
== wild_sym
|| field_val
== val
);
140 ADD_SCM_INIT_FUNC(Font_interface_syms
,init_syms
);
143 MAKE_SCHEME_CALLBACK(Font_interface
,properties_to_font_name
,2);
145 Font_interface::properties_to_font_name (SCM fonts
, SCM alist_chain
)
147 SCM name
= ly_assoc_chain (name_sym
, alist_chain
);
149 SCM shape
= SCM_BOOL_F
;
150 SCM family
= SCM_BOOL_F
;
151 SCM series
= SCM_BOOL_F
;
154 SCM point_sz
= ly_assoc_chain (pt_sz_sym
, alist_chain
);
155 SCM rel_sz
= SCM_BOOL_F
;
157 if (!gh_pair_p (name
))
159 shape
= ly_assoc_chain (shape_sym
, alist_chain
);
160 family
= ly_assoc_chain (family_sym
, alist_chain
);
161 series
= ly_assoc_chain (series_sym
, alist_chain
);
163 if (gh_pair_p (shape
))
164 shape
= gh_cdr (shape
);
165 if (gh_pair_p (family
))
166 family
= gh_cdr (family
);
167 if (gh_pair_p (series
))
168 series
= gh_cdr (series
);
171 name
= gh_cdr (name
);
174 if (gh_pair_p (point_sz
))
175 point_sz
= gh_cdr (point_sz
);
178 rel_sz
= ly_assoc_chain (rel_sz_sym
, alist_chain
);
179 if (gh_pair_p (rel_sz
))
180 rel_sz
= gh_cdr (rel_sz
);
183 for (SCM s
= fonts
; gh_pair_p (s
); s
= gh_cdr (s
))
185 SCM qlist
= gh_caar (s
);
187 if (name
!= SCM_BOOL_F
)
189 if (!wild_compare(scm_list_ref (qlist
, gh_int2scm (4)), name
))
194 if (!wild_compare(scm_list_ref (qlist
, gh_int2scm (1)), series
))
196 if (!wild_compare(scm_list_ref (qlist
, gh_int2scm (2)), shape
))
198 if (!wild_compare(scm_list_ref (qlist
, gh_int2scm (3)), family
))
202 if (point_sz
!= SCM_BOOL_F
)
204 // This if statement will always be true since name must
205 // be SCM_BOOL_F here, right? /MB
206 if (!wild_compare(scm_list_ref (qlist
, gh_int2scm (4)), name
))
211 if (!wild_compare(gh_car (qlist
), rel_sz
))
216 SCM qname
= gh_cdar (s
);
220 warning (_("couldn't find any font satisfying ") );
221 scm_write (gh_list (name
, point_sz
, shape
, series
, family
, rel_sz
, SCM_UNDEFINED
), scm_current_error_port ());
222 scm_flush(scm_current_error_port ());
224 return ly_str02scm ("cmr10");