/*
This file is part of LilyPond, the GNU music typesetter.
- Copyright (C) 2004--2012 Han-Wen Nienhuys <hanwen@xs4all.nl>
+ Copyright (C) 2004--2015 Han-Wen Nienhuys <hanwen@xs4all.nl>
LilyPond is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
#define PANGO_ENABLE_BACKEND
#include <pango/pangoft2.h>
-#include <freetype/ftxf86.h>
+#include "freetype.hh"
+#include FT_XFREE86_H
#include <map>
#include <cstdio>
#include "file-name.hh"
#include "international.hh"
#include "lookup.hh" // debugging
+#include "ly-module.hh"
#include "main.hh"
#include "string-convert.hh"
#include "warn.hh"
#include "all-font-metrics.hh"
#include "program-option.hh"
+#include "open-type-font.hh"
#if HAVE_PANGO_FT2
#include "stencil.hh"
+Preinit_Pango_font::Preinit_Pango_font ()
+{
+ physical_font_tab_ = SCM_EOL;
+}
+
Pango_font::Pango_font (PangoFT2FontMap *fontmap,
PangoFontDescription const *description,
Real output_scale)
{
- // This line looks stupid, but if we don't initialize physical_font_tab_ before
- // we allocate memory in scm_c_make_hash_table, then that could trigger a garbage
- // collection.
- physical_font_tab_ = SCM_EOL;
physical_font_tab_ = scm_c_make_hash_table (11);
PangoDirection pango_dir = PANGO_DIRECTION_LTR;
context_ = pango_context_new ();
}
void
-Pango_font::register_font_file (string filename,
- string ps_name,
+Pango_font::register_font_file (const string &filename,
+ const string &ps_name,
int face_index)
{
scm_hash_set_x (physical_font_tab_,
b.scale (scale_);
- char const *ps_name_str0 = FT_Get_Postscript_Name (ftface);
+ const string ps_name_str0 = get_postscript_name (ftface);
FcPattern *fcpat = fcfont->font_pattern;
FcChar8 *file_name_as_ptr = 0;
char_id = scm_from_uint32 (pg);
}
else
- char_id = scm_from_locale_string (glyph_name);
+ char_id = scm_from_utf8_string (glyph_name);
PangoRectangle logical_sub_rect;
PangoRectangle ink_sub_rect;
Real size = pango_font_description_get_size (descr)
/ (Real (PANGO_SCALE));
- if (!ps_name_str0)
+ if (ps_name_str0.empty ())
warning (_f ("no PostScript font name for font `%s'", file_name));
string ps_name;
- if (!ps_name_str0
+ if (ps_name_str0.empty ()
&& file_name != ""
&& (file_name.find (".otf") != NPOS
|| file_name.find (".cff") != NPOS))
name = String_convert::to_lower (name);
ps_name = initial + name;
}
- else if (ps_name_str0)
+ else if (!ps_name_str0.empty ())
ps_name = ps_name_str0;
if (ps_name.length ())
Stencil
Pango_font::text_stencil (Output_def * /* state */,
- string str, bool music_string) const
+ const string &str,
+ bool music_string,
+ const string &features_str) const
{
/*
The text assigned to a PangoLayout is automatically divided
Bidirectional Algorithm, if necessary.
*/
PangoLayout *layout = pango_layout_new (context_);
+
+ if (!features_str.empty())
+ {
+#if HAVE_PANGO_FT2_WITH_OTF_FEATURE
+ PangoAttrList *list = pango_attr_list_new();
+ PangoAttribute *features_attr = pango_attr_font_features_new(features_str.c_str());
+ pango_attr_list_insert(list, features_attr);
+ pango_layout_set_attributes(layout, list);
+ pango_attr_list_unref(list);
+#else
+ warning (_f ("OpenType font feature `%s' cannot be used"
+ " since this binary is configured without feature support.",
+ features_str.c_str ()));
+#endif
+ }
+
pango_layout_set_text (layout, str.c_str (), -1);
GSList *lines = pango_layout_get_lines (layout);
variable that is bound to a *named* procedure, i.e. not a
lambda expression.
*/
- if (utf8_string != SCM_BOOL_F
- && scm_procedure_name (SCM_VARIABLE_REF (utf8_string)) != SCM_BOOL_F)
+ if (scm_is_true (utf8_string)
+ && scm_is_true (scm_procedure_name (SCM_VARIABLE_REF (utf8_string))))
has_utf8_string = true;
}