and use text-font-defaults.
* lily/font-select.cc (properties_to_font_size_family): call SCM code.
* scm/paper.scm (paper-set-staff-size): use new function.
* scm/new-font.scm (make-font-tree): new function.
+2004-03-14 Han-Wen Nienhuys <hanwen@xs4all.nl>
+
+ * lily/font-interface.cc (text_font_alist_chain): rename function,
+ and use text-font-defaults.
+
+ * lily/font-select.cc (properties_to_font_size_family): call SCM code.
+
+ * scm/paper.scm (paper-set-staff-size): use new function.
+
+ * scm/new-font.scm (make-font-tree): new function.
+
2004-03-13 Jan Nieuwenhuizen <janneke@gnu.org>
* lily/paper-book.cc (output): Bugfix: no output if no \paper.
Font_metric *fm = 0;
if (smaller)
{
- SCM ac = Font_interface::font_alist_chain (me);
+ SCM ac = Font_interface::text_font_alist_chain (me);
ac = gh_cons (gh_cons (gh_cons
(ly_symbol2scm ("font-size"),
scm_int2num (-2)), SCM_EOL),
SCM bt = me->get_property ("balloon-text");
- SCM chain = Font_interface::font_alist_chain (me);
+ SCM chain = Font_interface::text_font_alist_chain (me);
chain = gh_cons (me->get_property ("balloon-text-props"), chain);
parameters.
*/
String str;
- SCM properties = Font_interface::font_alist_chain (me);
+ SCM properties = Font_interface::text_font_alist_chain (me);
Stencil tm = *unsmob_stencil (Text_item::interpret_markup
(me->get_paper ()->self_scm (), properties, quant_score));
Font_metric *fm = unsmob_metrics (me->get_property ("font"));
if (!fm)
{
- fm = select_font (me->get_paper (), font_alist_chain (me));
+
+ SCM defaults = me->get_paper ()->lookup_variable (ly_symbol2scm ("font-defaults"));
+ SCM chain = me->get_property_alist_chain (defaults);
+
+ fm = select_font (me->get_paper (), chain);
me->set_property ("font", fm->self_scm ());
}
+
return fm;
}
return Font_interface::get_default_font (gr)->self_scm ();
}
+
SCM
-Font_interface::font_alist_chain (Grob *g)
+Font_interface::text_font_alist_chain (Grob *g)
{
- SCM defaults = g->get_paper ()->lookup_variable (ly_symbol2scm ("font-defaults"));
+ SCM defaults = g->get_paper ()->lookup_variable (ly_symbol2scm ("text-font-defaults"));
return g->get_property_alist_chain (defaults);
}
{
return (val == SCM_BOOL_F || field_val == ly_symbol2scm ("*") || field_val == val);
}
+
Font_metric*
get_font_by_design_size (Paper_def* paper, Real requested,
SCM font_vector)
-/*
- We can probably get more efficiency points if we preprocess FONTS
- to make lookup easier.
- */
SCM
properties_to_font_size_family (SCM fonts, SCM alist_chain)
{
- SCM shape = SCM_BOOL_F;
- SCM family = SCM_BOOL_F;
- SCM series = SCM_BOOL_F;
-
- shape = ly_assoc_chain (ly_symbol2scm ("font-shape"), alist_chain);
- family = ly_assoc_chain (ly_symbol2scm ("font-family"), alist_chain);
- series = ly_assoc_chain (ly_symbol2scm ("font-series"), alist_chain);
-
- if (gh_pair_p (shape))
- shape = ly_cdr (shape);
- if (gh_pair_p (family))
- family = ly_cdr (family);
- if (gh_pair_p (series))
- series = ly_cdr (series);
-
+ static SCM proc;
+ if (!proc )
+ proc = scm_c_eval_string ("lookup-font");
- for (SCM s = fonts ; gh_pair_p (s); s = ly_cdr (s))
- {
- SCM qlist = ly_caar (s);
-
- if (!wild_compare (SCM_VECTOR_REF (qlist, 0), series))
- continue;
- if (!wild_compare (SCM_VECTOR_REF (qlist, 1), shape))
- continue;
- if (!wild_compare (SCM_VECTOR_REF (qlist, 2), family))
- continue;
-
- SCM qname = ly_cdar (s);
- return qname;
- }
-
- warning (_f ("cannot find font for: (%s %s %s)",
- ly_symbol2string (series).to_str0 (),
- ly_symbol2string (shape).to_str0 (),
- ly_symbol2string (family).to_str0 ()));
-
- scm_write (scm_list_n (shape, series , family,
- SCM_UNDEFINED), scm_current_error_port ());
- scm_flush (scm_current_error_port ());
-
- return scm_makfrom0str ("cmr10");
+ return scm_call_2 (proc, fonts, alist_chain);
}
LY_DEFINE(ly_grob_alist_chain, "ly:grob-alist-chain",
- 1, 0, 0,
- (SCM g),
- "Get an alist chain for grob @var{g}."
+ 1, 1, 0,
+ (SCM g, SCM global),
+ "Get an alist chain for grob @var{g}, with @var{global} as the "
+ "global default. If unspecified, @code{font-defaults} "
+ "from the paper block is taken. "
)
{
Grob * sc = unsmob_grob (g);
SCM_ASSERT_TYPE (sc, g, SCM_ARG1, __FUNCTION__, "grob");
- SCM defaults = sc->get_paper ()->lookup_variable (ly_symbol2scm ("font-defaults"));
- return sc->get_property_alist_chain (defaults);
+ if (global == SCM_UNDEFINED)
+ global = sc->get_paper ()->lookup_variable (ly_symbol2scm ("font-defaults"));
+
+ return sc->get_property_alist_chain (global);
}
struct Font_interface
{
+ static SCM text_font_alist_chain (Grob*);
static SCM font_alist_chain (Grob*);
static Font_metric * get_default_font (Grob*);
static bool has_interface (Grob*);
else if (gh_symbol_p (type)
&& type == ly_symbol2scm ("trill"))
{
- SCM alist_chain = Font_interface::font_alist_chain (me);
+ SCM alist_chain = Font_interface::text_font_alist_chain (me);
SCM style_alist = scm_list_n (gh_cons (ly_symbol2scm ("font-family"),
ly_symbol2scm ("music")),
SCM_UNDEFINED);
return s;
}
- SCM alist_chain = Font_interface::font_alist_chain (me);
+ SCM alist_chain = Font_interface::text_font_alist_chain (me);
Real staff_space = Staff_symbol_referencer::staff_space (me);
Font_metric *musfont
}
while (flip (&d) != LEFT);
- SCM properties = Font_interface::font_alist_chain (me);
+ SCM properties = Font_interface::text_font_alist_chain (me);
SCM markup = me->get_property ("text");
Stencil text;
if (Text_item::markup_p (markup))
Grob *me = unsmob_grob (p);
String r = to_string (Paper_column::get_rank (me));
- SCM properties = Font_interface::font_alist_chain (me);
+ SCM properties = Font_interface::text_font_alist_chain (me);
SCM scm_mol = Text_item::interpret_markup (me->get_paper ()->self_scm (),
properties,
name. This is better than using find_font directly,
esp. because that triggers mktextfm for non-existent
fonts. */
- SCM fam = gh_cons (ly_symbol2scm ("font-family"), ly_symbol2scm ("braces"));
+ SCM fam = gh_cons (ly_symbol2scm ("font-encoding"), ly_symbol2scm ("braces"));
SCM alist = scm_list_n (fam, SCM_UNDEFINED);
fm = select_font (me->get_paper (), scm_list_n (alist, SCM_UNDEFINED));
Grob * me = unsmob_grob (grob);
SCM t = me->get_property ("text");
- SCM chain = Font_interface::font_alist_chain (me);
+ SCM chain = Font_interface::text_font_alist_chain (me);
return interpret_markup (me->get_paper ()->self_scm (), chain, t);
}
while (flip (&d) != LEFT);
- SCM properties = Font_interface::font_alist_chain (me);
+ SCM properties = Font_interface::text_font_alist_chain (me);
SCM edge_text = me->get_property ("edge-text");
Drul_array<Stencil> edge;
if (gh_pair_p (edge_text))
Stencil
Time_signature::numbered_time_signature (Grob*me,int num, int den)
{
- SCM chain = Font_interface::font_alist_chain (me);
- me->set_property ("font-family", ly_symbol2scm ("number"));
-
-SCM sn =
- Text_item::interpret_markup (me->get_paper ()->self_scm (), chain,
+ SCM number_def = scm_list_1 (gh_cons (ly_symbol2scm ("font-encoding"),
+ ly_symbol2scm ("number")));
+
+ SCM chain = me->get_property_alist_chain (number_def);
+ SCM sn = Text_item::interpret_markup (me->get_paper ()->self_scm (), chain,
scm_makfrom0str (to_string (num).to_str0 ()));
-SCM sd =
- Text_item::interpret_markup (me->get_paper ()->self_scm (), chain,
+ SCM sd = Text_item::interpret_markup (me->get_paper ()->self_scm (), chain,
scm_makfrom0str (to_string (den).to_str0 ()));
Stencil n = *unsmob_stencil (sn);
Paper_def *pap = me->get_paper ();
if (gh_string_p (number) && number_visibility)
{
- SCM properties = Font_interface::font_alist_chain (me);
+ SCM properties = Font_interface::text_font_alist_chain (me);
SCM snum = Text_item::interpret_markup (pap->self_scm (), properties, number);
Stencil num = *unsmob_stencil (snum);
num.align_to (X_AXIS, CENTER);
% Do units first; must be done before any units are specified.
\paper {
- unit = "mm" %% ugh: coupled to LilyPond C++ code.
+ unit = #(ly:unit)
mm = 1.0
in = 25.4
pt = #(/ in 72.27)
cm = #(* 10 mm)
#(define font-defaults
- '((font-family . music)
- (font-shape . upright)
+ '((font-encoding . music))
+ )
+
+ #(define text-font-defaults
+ '((font-encoding . text)
(baseline-skip . 2)
(word-space . 0.6)
- (font-series . medium)
- ))
+ ))
+
\include "engraver-init.ly"
}
"beam.scm"
"clef.scm"
"slur.scm"
- "font.scm"
+; "font.scm"
"new-font.scm"
"define-markup-commands.scm"
-
-
;; As an excercise, do it with records.
;; Should use GOOPS, really.
(display node port))))
)
-(define-public (scale-font-node node factor)
- (cond
- ((font-tree-node? node)
- (hash-for-each (lambda (k v)
- (scale-font-tree v factor)
- (font-tree-children node))))
- (else
- (cons (* factor (car node))
- (cdr node)))))
-
(define-public (lookup-font node alist-chain)
(cond
((font-tree-node? node)
desired-font
(lookup-font (hashq-ref (font-tree-children node)
def) alist-chain)))
-
)
font))
(else node))
)
-
-(define-public paper20-font-tree (make-font-tree-node 'font-encoding 'music))
-
-
-
-(add-font
- paper20-font-tree
- '((font-encoding . number))
- '(10 . #((4.0 . "feta-nummer4")
- (6.0 . "feta-nummer6")
- (8.0 . "feta-nummer8")
- (10.0 . "feta-nummer10")
- (12.0 . "feta-nummer12")
- (16.0 . "feta-nummer16"))))
-
-(add-font
- paper20-font-tree
- '((font-encoding . dynamic))
- '(14.0 . #((6.0 . "feta-din6")
- (8.0 . "feta-din8")
- (10.0 . "feta-din10")
- (12.0 . "feta-din12")
- (14.0 . "feta-din14")
- (17.0 . "feta-din17")
- )))
-
- (use-modules (ice-9 readline))
-
-
-
-(for-each
- (lambda (x)
- (add-font
- paper20-font-tree
- `((font-encoding . text)
- (font-series . ,(vector-ref (car x) 0))
- (font-shape . ,(vector-ref (car x) 1))
- (font-family . ,(vector-ref (car x) 2)))
- (cdr x))
- )
- '(
- (#(roman upright medium) .
- (10.0 . #((6.0 . "cmr6")
- (8.0 . "cmr8")
- (10.0 . "cmr10")
- (17.0 . "cmr17")
- )))
-
-
-
- (#(roman upright bold) .
- (10.0 . #((6.0 . "cmbx6")
- (8.0 . "cmbx8")
- (10.0 . "cmbx10")
- (12.0 . "cmbx12")
- )))
-
- (#(roman italic medium) .
- (10.0 . #((7.0 . "cmti7")
- (10.0 . "cmti10")
- (12.0 . "cmti12")
- )))
- (#(roman italic bold) .
- (10.0 . #((8.0 . "cmbxti8")
- (10.0 . "cmbxti10")
- (14.0 . "cmbxti14")
- )))
+(define-public (make-font-tree factor)
+ (let*
+ ((n (make-font-tree-node 'font-encoding 'music))
+ )
- (#(roman caps medium) .
- (10.0 . #((10.0 . "cmcsc10"))))
-
- (#(roman upright bold-narrow ) .
- (10.0 . #((10.0 . "cmb10")
- )))
-
- (#(sans upright medium) .
- (10.0 . #((8.0 . "cmss8")
- (10.0 . "cmss10")
- (12.0 . "cmss12")
- (17.0 . "cmss17")
- )))
- (#(typewriter upright medium) .
- (10.0 . #((8.0 . "cmtt8")
- (10.0 . "cmtt10")
- (12.0 . "cmtt12")
- )))
- ))
-
-
-
-(add-font
- paper20-font-tree
- '((font-encoding . math))
- '(10.0 . #((10.0 . "msam10"))))
-
-(add-font
- paper20-font-tree
- '((font-encoding . music))
- '(20.0 . #((11.22 . ("feta11" "parmesan11"))
- (12.60 . ("feta13" "parmesan13"))
- (14.14 . ("feta14" "parmesan14"))
- (15.87 . ("feta16" "parmesan16"))
- (17.82 . ("feta18" "parmesan18"))
- (20.0 . ("feta20" "parmesan20"))
- (22.45 . ("feta23" "parmesan23"))
- (25.20 . ("feta26" "parmesan26"))
- )))
-
-(add-font
- paper20-font-tree
- '((font-encoding . braces))
- '(10 . #((10.0 . ("feta-braces00"
- "feta-braces10"
- "feta-braces20"
- "feta-braces30"
- "feta-braces40"
- "feta-braces50"
- "feta-braces60"
- "feta-braces70"
- "feta-braces80"))
- )))
-
-
-(display-font-node paper20-font-tree )
-
-(if #f
- (begin
- (newline)
- (display
- (lookup-font
- paper20-font-tree
- '(((font-encoding . text)
- (font-shape . italic)
- ))))
- (newline)
- ))
-
-
-
-
-
-(define (scale-font-tree root factor)
- "Scale ROOT with FACTOR."
- (cond
- ((and (font-tree-node? node)
- (equal? (font-tree-qualifier node) 'font-encoding))
- (hash-for-each (lambda (k v)
- (if (not (equal? k 'braces))
- (scale-font-node v factor))
- (font-tree-children node))))
- (else
- (scale-font-node node))))
+ (for-each
+ (lambda (x)
+ (add-font n
+ (list (cons 'font-encoding (car x)))
+ (cons (* factor (cadr x))
+ (caddr x))))
+ '((number 10 #((4.0 . "feta-nummer4")
+ (6.0 . "feta-nummer6")
+ (8.0 . "feta-nummer8")
+ (10.0 . "feta-nummer10")
+ (12.0 . "feta-nummer12")
+ (16.0 . "feta-nummer16")))
+ (dynamic 14.0 #((6.0 . "feta-din6")
+ (8.0 . "feta-din8")
+ (10.0 . "feta-din10")
+ (12.0 . "feta-din12")
+ (14.0 . "feta-din14")
+ (17.0 . "feta-din17")
+ ))
+ (math 10 #((10.0 . "msam10")))
+ (music 20.0
+ #((11.22 . ("feta11" "parmesan11"))
+ (12.60 . ("feta13" "parmesan13"))
+ (14.14 . ("feta14" "parmesan14"))
+ (15.87 . ("feta16" "parmesan16"))
+ (17.82 . ("feta18" "parmesan18"))
+ (20.0 . ("feta20" "parmesan20"))
+ (22.45 . ("feta23" "parmesan23"))
+ (25.20 . ("feta26" "parmesan26"))
+ ))
+ (braces 10 #((10.0 . ("feta-braces00"
+ "feta-braces10"
+ "feta-braces20"
+ "feta-braces30"
+ "feta-braces40"
+ "feta-braces50"
+ "feta-braces60"
+ "feta-braces70"
+ "feta-braces80"))
+ ))))
+
+ (for-each
+ (lambda (x)
+ (add-font
+ n
+ `((font-encoding . text)
+ (font-series . ,(vector-ref (car x) 0))
+ (font-shape . ,(vector-ref (car x) 1))
+ (font-family . ,(vector-ref (car x) 2)))
+ (cons (* factor (cadr x))
+ (cddr x))
+ ))
+ '((#(roman upright medium) .
+ (10.0 . #((6.0 . "cmr6")
+ (8.0 . "cmr8")
+ (10.0 . "cmr10")
+ (17.0 . "cmr17")
+ )))
+
+ (#(roman upright bold) .
+ (10.0 . #((6.0 . "cmbx6")
+ (8.0 . "cmbx8")
+ (10.0 . "cmbx10")
+ (12.0 . "cmbx12")
+ )))
+
+ (#(roman italic medium) .
+ (10.0 . #((7.0 . "cmti7")
+ (10.0 . "cmti10")
+ (12.0 . "cmti12")
+ )))
+ (#(roman italic bold) .
+ (10.0 . #((8.0 . "cmbxti8")
+ (10.0 . "cmbxti10")
+ (14.0 . "cmbxti14")
+ )))
+
+ (#(roman caps medium) .
+ (10.0 . #((10.0 . "cmcsc10"))))
-
+ (#(roman upright bold-narrow ) .
+ (10.0 . #((10.0 . "cmb10")
+ )))
+
+ (#(sans upright medium) .
+ (10.0 . #((8.0 . "cmss8")
+ (10.0 . "cmss10")
+ (12.0 . "cmss12")
+ (17.0 . "cmss17")
+ )))
+ (#(typewriter upright medium) .
+ (10.0 . #((8.0 . "cmtt8")
+ (10.0 . "cmtt10")
+ (12.0 . "cmtt12")
+ )))
+ ))
+ n))
(define (tablature-stem-attachment-function style duration)
(cons 0.0 0.5))
-; The TabNoteHead stencil callback.
-; Create a text stencil
-(define-public (tablature-print-function grob)
- (let ((stencil (fontify-text
- (ly:get-default-font grob)
- (ly:grob-property grob 'text)
- )))
- stencil ; return the stencil.
- ))
; The TabNoteHead tablatureFormat callback.
; Compute the text grob-property
(else "")))
)
- (let ((slur (Slur::print grob))
- (text (fontify-text (ly:get-default-font grob) letter)))
+ (let* ((slur (Slur::print grob))
+ (paper (ly:grob-paper grob))
+ (text (interpret-markup
+ paper
+ (ly:grob-alist-chain grob (ly:paper-lookup paper 'text-font-defaults))
+ letter)))
(let ((x (/ (- (cdr (ly:stencil-extent slur 0))
(/ (cdr (ly:stencil-extent text 0)) 2.0)
(let ((props (list (append `((linewidth . ,(ly:paper-get-number
paper 'linewidth))
- (font-family . roman))
- (ly:paper-lookup paper 'font-defaults)))))
+ )
+ (ly:paper-lookup paper 'text-font-defaults)))))
(interpret-markup
paper props
(markup
(pt (eval 'pt m))
(mm (eval 'mm m)))
- (module-define! m 'fonts (scale-font-list (/ sz (* 20 pt))))
+ (module-define! m 'fonts (make-font-tree (/ sz (* 20 pt))))
+
(module-define! m 'staffheight sz)
(module-define! m 'staff-space ss)
(module-define! m 'staffspace ss)