Пример #1
0
void text_layout::evaluate_properties(feature_impl const& feature, attributes const& attrs)
{
    // dx,dy
    double dx = util::apply_visitor(extract_value<value_double>(feature,attrs), properties_.dx);
    double dy = util::apply_visitor(extract_value<value_double>(feature,attrs), properties_.dy);
    displacement_ = evaluate_displacement(dx,dy, properties_.dir);
    std::string wrap_str = util::apply_visitor(extract_value<std::string>(feature,attrs), properties_.wrap_char);
    if (!wrap_str.empty()) wrap_char_ = wrap_str[0];
    wrap_width_ = util::apply_visitor(extract_value<value_double>(feature,attrs), properties_.wrap_width);

    double angle = util::apply_visitor(extract_value<value_double>(feature,attrs), properties_.orientation);
    orientation_.init(angle * M_PI/ 180.0);

    wrap_before_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), properties_.wrap_before);
    repeat_wrap_char_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), properties_.repeat_wrap_char);
    rotate_displacement_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), properties_.rotate_displacement);

    valign_ = util::apply_visitor(extract_value<vertical_alignment_enum>(feature,attrs),properties_.valign);
    halign_ = util::apply_visitor(extract_value<horizontal_alignment_enum>(feature,attrs),properties_.halign);
    jalign_ = util::apply_visitor(extract_value<justify_alignment_enum>(feature,attrs),properties_.jalign);

}
Пример #2
0
text_layout::text_layout(face_manager_freetype & font_manager,
                         feature_impl const& feature,
                         attributes const& attrs,
                         double scale_factor,
                         text_symbolizer_properties const& properties,
                         text_layout_properties const& layout_defaults,
                         formatting::node_ptr tree)
    : font_manager_(font_manager),
      scale_factor_(scale_factor),
      itemizer_(),
      width_map_(),
      width_(0.0),
      height_(0.0),
      glyphs_count_(0),
      lines_(),
      layout_properties_(layout_defaults),
      properties_(properties),
      format_(std::make_unique<detail::evaluated_format_properties>())
    {
        double dx = util::apply_visitor(extract_value<value_double>(feature,attrs), layout_properties_.dx);
        double dy = util::apply_visitor(extract_value<value_double>(feature,attrs), layout_properties_.dy);
        displacement_ = evaluate_displacement(dx,dy, layout_properties_.dir);
        std::string wrap_str = util::apply_visitor(extract_value<std::string>(feature,attrs), layout_properties_.wrap_char);
        if (!wrap_str.empty()) wrap_char_ = wrap_str[0];
        wrap_width_ = util::apply_visitor(extract_value<value_double>(feature,attrs), layout_properties_.wrap_width);
        double angle = util::apply_visitor(extract_value<value_double>(feature,attrs), layout_properties_.orientation);
        orientation_.init(angle * M_PI/ 180.0);
        wrap_before_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), layout_properties_.wrap_before);
        repeat_wrap_char_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), layout_properties_.repeat_wrap_char);
        rotate_displacement_ = util::apply_visitor(extract_value<value_bool>(feature,attrs), layout_properties_.rotate_displacement);
        valign_ = util::apply_visitor(extract_value<vertical_alignment_enum>(feature,attrs),layout_properties_.valign);
        halign_ = util::apply_visitor(extract_value<horizontal_alignment_enum>(feature,attrs),layout_properties_.halign);
        jalign_ = util::apply_visitor(extract_value<justify_alignment_enum>(feature,attrs),layout_properties_.jalign);

        // Takes a feature and produces formatted text as output.
        if (tree)
        {
            format_properties const& format_defaults = properties_.format_defaults;
            format_->text_size = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.text_size);
            format_->character_spacing = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.character_spacing);
            format_->line_spacing = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.line_spacing);
            format_->text_opacity = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.text_opacity);
            format_->halo_opacity = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.halo_opacity);
            format_->halo_radius = util::apply_visitor(extract_value<value_double>(feature,attrs), format_defaults.halo_radius);
            format_->fill = util::apply_visitor(extract_value<color>(feature,attrs), format_defaults.fill);
            format_->halo_fill = util::apply_visitor(extract_value<color>(feature,attrs), format_defaults.halo_fill);
            format_->text_transform = util::apply_visitor(extract_value<text_transform_enum>(feature,attrs), format_defaults.text_transform);
            format_->face_name = format_defaults.face_name;
            format_->fontset = format_defaults.fontset;
            format_->ff_settings = util::apply_visitor(extract_value<font_feature_settings>(feature,attrs), format_defaults.ff_settings);
            // Turn off ligatures if character_spacing > 0.
            if (format_->character_spacing > .0 && format_->ff_settings.count() == 0)
            {
                format_->ff_settings.append(font_feature_liga_off);
            }
            tree->apply(format_, feature, attrs, *this);
        }
        else
        {
            MAPNIK_LOG_WARN(text_properties) << "text_symbolizer_properties can't produce text: No formatting tree!";
        }
    }