optimize font rendering with fontsets in the case of some fontset fonts not being available on the users system - closes #1182
This commit is contained in:
parent
703d4ab7f2
commit
2b92f04926
1 changed files with 26 additions and 8 deletions
|
@ -98,7 +98,7 @@ private:
|
|||
void parse_metawriter_in_symbolizer(symbolizer_base &sym, xml_node const& pt);
|
||||
|
||||
void parse_fontset(Map & map, xml_node const & fset);
|
||||
void parse_font(font_set & fset, xml_node const& f);
|
||||
bool parse_font(font_set & fset, xml_node const& f);
|
||||
|
||||
void parse_rule(feature_type_style & style, xml_node const & r);
|
||||
|
||||
|
@ -455,44 +455,62 @@ void map_parser::parse_fontset(Map & map, xml_node const& fset)
|
|||
{
|
||||
name = fset.get_attr<std::string>("name");
|
||||
font_set fontset(name);
|
||||
|
||||
xml_node::const_iterator itr = fset.begin();
|
||||
xml_node::const_iterator end = fset.end();
|
||||
|
||||
bool success = false;
|
||||
for (; itr != end; ++itr)
|
||||
{
|
||||
if (itr->is("Font"))
|
||||
{
|
||||
parse_font(fontset, *itr);
|
||||
if (parse_font(fontset, *itr))
|
||||
{
|
||||
success = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// if not at least one face-name is valid
|
||||
if (!success)
|
||||
{
|
||||
throw mapnik::config_error("no valid fonts could be loaded");
|
||||
}
|
||||
|
||||
map.insert_fontset(name, fontset);
|
||||
|
||||
// XXX Hack because map object isn't accessible by text_symbolizer
|
||||
// when it's parsed
|
||||
fontsets_.insert(pair<std::string, font_set>(name, fontset));
|
||||
} catch (const config_error & ex) {
|
||||
}
|
||||
catch (const config_error & ex)
|
||||
{
|
||||
ex.append_context(std::string("in FontSet '") + name + "'", fset);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
|
||||
void map_parser::parse_font(font_set &fset, xml_node const& f)
|
||||
bool map_parser::parse_font(font_set &fset, xml_node const& f)
|
||||
{
|
||||
optional<std::string> face_name = f.get_opt_attr<std::string>("face-name");
|
||||
if (face_name)
|
||||
{
|
||||
if (strict_)
|
||||
face_ptr face = font_manager_.get_face(*face_name);
|
||||
if (face)
|
||||
{
|
||||
ensure_font_face(*face_name);
|
||||
fset.add_face_name(*face_name);
|
||||
return true;
|
||||
}
|
||||
else if (strict_)
|
||||
{
|
||||
throw config_error("Failed to find font face '" +
|
||||
*face_name + "'");
|
||||
}
|
||||
fset.add_face_name(*face_name);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw config_error("Must have 'face-name' set", f);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
void map_parser::parse_layer(Map & map, xml_node const& lay)
|
||||
|
|
Loading…
Reference in a new issue