*/
#include <math.h>
#include <ctype.h>
+
#include "lookup.hh"
-#include "debug.hh"
+#include "warn.hh"
#include "dimensions.hh"
-
#include "bezier.hh"
#include "paper-def.hh"
#include "string-convert.hh"
#include "scope.hh"
#include "molecule.hh"
-#include "lily-guile.hh"
+
+#include "ly-smobs.icc"
Lookup::Lookup ()
Lookup::Lookup (Lookup const& s)
{
font_name_ = s.font_name_;
- afm_l_ = 0;
+ afm_l_ = 0;
+}
+
+SCM
+Lookup::mark_smob (SCM s)
+{
+ return s;
+}
+
+int
+Lookup::print_smob (SCM s, SCM p, scm_print_state*)
+{
+ scm_puts ("#<Lookup >#", p);
+ return 1;
}
+IMPLEMENT_UNSMOB(Lookup, lookup);
+IMPLEMENT_SIMPLE_SMOBS(Lookup);
+IMPLEMENT_DEFAULT_EQUAL_P(Lookup);
+
+SCM
+Lookup::make_lookup ()
+{
+ Lookup * l = new Lookup;
+ return l->smobbed_self();
+}
Molecule
me->afm_l_ = all_fonts_global_p->find_afm (font_name_);
if (!me->afm_l_)
{
- warning (_f ("Can't find font: `%s'", font_name_));
- warning (_f ("(search path `%s')", global_path.str ().ch_C()));
+ warning (_f ("can't find font: `%s'", font_name_));
+ warning (_f ("(search path: `%s')", global_path.str ().ch_C()));
error (_ ("Aborting"));
}
}
gh_int2scm (cm->code),
SCM_UNDEFINED));
+
at= fontify_atom (afm_l_,at);
return Molecule ( afm_bbox_to_box (cm->charBBox), at);
}
-Molecule
-Lookup::simple_bar (String type, Real h, Paper_def* paper_l) const
-{
- SCM thick = ly_symbol2scm (("barthick_" + type).ch_C());
- Real w = 0.0;
-
- if (paper_l->scope_p_->elem_b (thick))
- {
- w = paper_l->get_realvar (thick);
- }
- else
- {
- programming_error ("No bar thickness set ! ");
- w = 1 PT;
- }
- return filledbox (Box (Interval(0,w), Interval(-h/2, h/2)));
-}
-
-Molecule
-Lookup::bar (String str, Real h, Paper_def *paper_l) const
-{
- if (str == "bracket")
- return staff_bracket (h, paper_l);
- else if (str == "brace")
- {
- Real staffht = paper_l->get_var ("staffheight");
- return staff_brace (h,staffht);
- }
- Real kern = paper_l->get_var ("bar_kern");
- Real thinkern = paper_l->get_var ("bar_thinkern");
- Molecule thin = simple_bar ("thin", h, paper_l);
- Molecule thick = simple_bar ("thick", h, paper_l);
- Molecule colon = afm_find ("dots-repeatcolon", paper_l);
-
- Molecule m;
-
- if (str == "")
- {
- return fill (Box (Interval(0, 0), Interval (-h/2, h/2)));
- }
- if (str == "scorepostbreak")
- {
- return simple_bar ("score", h, paper_l);
- }
- else if (str == "|")
- {
- return thin;
- }
- else if (str == "|.")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- }
- else if (str == ".|")
- {
- m.add_at_edge (X_AXIS, RIGHT, thick, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- }
- else if (str == ":|")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, 0);
- m.add_at_edge (X_AXIS, LEFT, thin, kern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- }
- else if (str == "|:")
- {
- m.add_at_edge (X_AXIS, RIGHT, thick, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ":|:")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, thinkern);
- m.add_at_edge (X_AXIS, LEFT, colon, kern);
- m.add_at_edge (X_AXIS, RIGHT, thick, kern);
- m.add_at_edge (X_AXIS, RIGHT, colon, kern);
- }
- else if (str == ".|.")
- {
- m.add_at_edge (X_AXIS, LEFT, thick, thinkern);
- m.add_at_edge (X_AXIS, RIGHT, thick, kern);
- }
- else if (str == "||")
- {
- m.add_at_edge (X_AXIS, RIGHT, thin, 0);
- m.add_at_edge (X_AXIS, RIGHT, thin, thinkern);
- }
-
- return m;
-}
Molecule
Lookup::beam (Real slope, Real width, Real thick)
Lookup::dashed_slur (Bezier b, Real thick, Real dash)
{
SCM l = SCM_EOL;
- // this is silly, we have array_to_scm
+
for (int i= 4; i -- ;)
{
- l = gh_cons (to_scm (b.control_[i]), l);
+ l = gh_cons (ly_offset2scm (b.control_[i]), l);
}
SCM at = (gh_list (ly_symbol2scm ("dashed-slur"),
Molecule
-Lookup::fill (Box b)
+Lookup::blank (Box b)
{
- Molecule m;
- m.dim_ = b;
- return m;
+ return Molecule (b, SCM_EOL);
}
/*
- TODO: THIS IS UGLY. Since the user has direct access to TeX
- strings, we try some halfbaked attempt to detect TeX trickery.
+ TODO: THIS IS UGLY.
+ Since the user has direct access to TeX marcos,
+ that currently provide the only way to do
+ font selection, accents etc,
+ we try some halfbaked attempt to detect this TeX trickery.
*/
String
sanitise_TeX_string (String text)
}
/**
-
+TODO: move into Text_item. UGH: paper_l argument shoudl be junked.
*/
Molecule
Lookup::text (String style, String text, Paper_def *paper_l)
font_mag = (int)paper_l->get_var ("magnification_" + style);
}
- /*
- UGH.
- */
- SCM l = ly_eval_str (("(style-to-cmr \"" + style + "\")").ch_C());
+ SCM l = scm_assoc (ly_str02scm (style.ch_C()),
+ scm_eval (ly_symbol2scm ("cmr-alist")));
+
if (l != SCM_BOOL_F)
{
style = ly_scm2string (gh_cdr(l)) +to_str ((int)font_h);
}
-
-
Font_metric* metric_l = 0;
if (font_mag)
metric_l = all_fonts_global_p->find_font (style);
- if (output_global_ch == "tex")
- text = sanitise_TeX_string (text);
- else if (output_global_ch == "ps")
- text = sanitise_PS_string (text);
+ int i = text.index_i ("\\n");
+ while (i >=0 )
+ {
+ text = text.left_str (i) + "\n" + text.right_str (text.length_i () - i - 2);
+ i = text.index_i ("\\n");
+ }
- SCM at = (gh_list (ly_symbol2scm ("text"),
- ly_str02scm (text.ch_C()),
- SCM_UNDEFINED));
- at = fontify_atom (metric_l,at);
- return Molecule ( metric_l->text_dimension (text),
- at);
-}
+ Array<String> lines = String_convert::split_arr (text, '\n');
+
+ Real kern = paper_l->get_var ("line_kern");
+ for (int i=0; i < lines.size (); i++)
+ {
+ String str (lines[i]);
+ if (output_global_ch == "tex")
+ str = sanitise_TeX_string (str);
+ else if (output_global_ch == "ps")
+ str = sanitise_PS_string (str);
+ lines[i] = str;
+ }
+ if (!lines.size())
+ return Molecule();
-Molecule
-Lookup::staff_brace (Real y, int staff_size)
-{
- // URG
- Real step = 1.0;
- int minht = 2 * staff_size;
- int maxht = 7 * minht;
- int idx = int (((maxht - step) <? y - minht) / step);
- idx = idx >? 0;
-
- SCM l = ly_eval_str ("(style-to-cmr \"brace\")");
- String nm = "feta-braces";
- if (l != SCM_BOOL_F)
- nm = ly_scm2string (gh_cdr (l));
- nm += to_str (staff_size);
- SCM e =gh_list (ly_symbol2scm ("char"), gh_int2scm (idx), SCM_UNDEFINED);
- SCM at = (e);
+ SCM first = gh_list (ly_symbol2scm ("text"),
+ ly_str02scm (lines[0].ch_C()),
+ SCM_UNDEFINED);
+ first = fontify_atom (metric_l, first);
- at = fontify_atom (all_fonts_global_p->find_font (nm), at);
- Box b ( Interval (-y/2,y/2),
- Interval (0,0));
- return Molecule(b, at);
+
+ Molecule mol (metric_l->text_dimension (lines[0]), first);
+
+ for (i = 1; i < lines.size (); i++)
+ {
+ SCM line = (gh_list (ly_symbol2scm ("text"),
+ ly_str02scm (lines[i].ch_C ()),
+ SCM_UNDEFINED));
+ line = fontify_atom (metric_l, line);
+ mol.add_at_edge (Y_AXIS, DOWN,
+ Molecule (metric_l->text_dimension (lines[i]), line),
+ kern);
+ }
+
+ return mol;
}
-
+
+
/*
Make a smooth curve along the points
back.control_[2] += curvethick * complex_exp (Offset (0, alpha + M_PI/2));
SCM scontrols[8];
- // this is silly, we have array_to_scm
+
for (int i=4; i--;)
- scontrols[ i ] = to_scm (back.control_[i]);
+ scontrols[ i ] = ly_offset2scm(back.control_[i]);
for (int i=4 ; i--;)
- scontrols[i+4] = to_scm (curve.control_[i]);
+ scontrols[i+4] = ly_offset2scm (curve.control_[i]);
/*
Need the weird order b.o. the way PS want its arguments
return Molecule (b, at);
}
-Molecule
-Lookup::staff_bracket (Real height, Paper_def* paper_l)
-{
- SCM at = ( gh_list (ly_symbol2scm ("bracket"),
- gh_double2scm (paper_l->get_var("bracket_arch_angle")),
- gh_double2scm (paper_l->get_var("bracket_arch_width")),
- gh_double2scm (paper_l->get_var("bracket_arch_height")),
- gh_double2scm (paper_l->get_var("bracket_width")),
- gh_double2scm (height),
- gh_double2scm (paper_l->get_var("bracket_arch_thick")),
- gh_double2scm (paper_l->get_var("bracket_thick")),
- SCM_UNDEFINED));
-
- Box b ( Interval (-height/2,height/2), Interval (0,4 PT));
- Molecule m (b, at);
-
- m.translate_axis (- 4. / 3. * m.dim_[X_AXIS].length (), X_AXIS);
- return m;
-}
-
-
Molecule
Lookup::accordion (SCM s, Real staff_space) const
{
if (sym == "Discant")
{
- Molecule r = afm_find("scripts-accDiscant");
+ Molecule r = afm_find("accordion-accDiscant");
m.add_molecule(r);
if (reg.left_str(1) == "F")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 2.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (eflag & 0x02)
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
m.add_molecule(d);
}
if (eflag & 0x04)
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
d.translate_axis(0.8 * staff_space PT, X_AXIS);
m.add_molecule(d);
}
if (eflag & 0x01)
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
d.translate_axis(-0.8 * staff_space PT, X_AXIS);
m.add_molecule(d);
}
if (reg.left_str(2) == "SS")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(0.5 * staff_space PT, Y_AXIS);
d.translate_axis(0.4 * staff_space PT, X_AXIS);
m.add_molecule(d);
}
if (reg.left_str(1) == "S")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(0.5 * staff_space PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
else if (sym == "Freebase")
{
- Molecule r = afm_find("scripts-accFreebase");
+ Molecule r = afm_find("accordion-accFreebase");
m.add_molecule(r);
if (reg.left_str(1) == "F")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (reg == "E")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 0.5 PT, Y_AXIS);
m.add_molecule(d);
}
}
else if (sym == "Bayanbase")
{
- Molecule r = afm_find("scripts-accBayanbase");
+ Molecule r = afm_find("accordion-accBayanbase");
m.add_molecule(r);
if (reg.left_str(1) == "T")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 2.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
/* include 4' reed just for completeness. You don't want to use this. */
if (reg.left_str(1) == "F")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (reg.left_str(2) == "EE")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 0.5 PT, Y_AXIS);
d.translate_axis(0.4 * staff_space PT, X_AXIS);
m.add_molecule(d);
}
if (reg.left_str(1) == "E")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 0.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
else if (sym == "Stdbase")
{
- Molecule r = afm_find("scripts-accStdbase");
+ Molecule r = afm_find("accordion-accStdbase");
m.add_molecule(r);
if (reg.left_str(1) == "T")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 3.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (reg.left_str(1) == "F")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 2.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (reg.left_str(1) == "M")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 2 PT, Y_AXIS);
d.translate_axis(staff_space PT, X_AXIS);
m.add_molecule(d);
}
if (reg.left_str(1) == "E")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 1.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
}
if (reg.left_str(1) == "S")
{
- Molecule d = afm_find("scripts-accDot");
+ Molecule d = afm_find("accordion-accDot");
d.translate_axis(staff_space * 0.5 PT, Y_AXIS);
m.add_molecule(d);
reg = reg.right_str(reg.length_i()-1);
for the rectangle */
else if (sym == "SB")
{
- Molecule r = afm_find("scripts-accSB");
+ Molecule r = afm_find("accordion-accSB");
m.add_molecule(r);
}
else if (sym == "BB")
{
- Molecule r = afm_find("scripts-accBB");
+ Molecule r = afm_find("accordion-accBB");
m.add_molecule(r);
}
else if (sym == "OldEE")
{
- Molecule r = afm_find("scripts-accOldEE");
+ Molecule r = afm_find("accordion-accOldEE");
m.add_molecule(r);
}
else if (sym == "OldEES")
{
- Molecule r = afm_find("scripts-accOldEES");
+ Molecule r = afm_find("accordion-accOldEES");
m.add_molecule(r);
}
return m;