diff --git a/include/mapnik/font_engine_freetype.hpp b/include/mapnik/font_engine_freetype.hpp index 5754e6471d..fcdbb97405 100644 --- a/include/mapnik/font_engine_freetype.hpp +++ b/include/mapnik/font_engine_freetype.hpp @@ -119,7 +119,13 @@ class font_face : boost::noncopyable { if (! FT_Set_Pixel_Sizes( face_, 0, size )) return true; + return false; + } + bool set_character_sizes(float size) + { + if ( !FT_Set_Char_Size(face_,0,(FT_F26Dot6)(size * (1<<6)),0,0)) + return true; return false; } @@ -184,6 +190,14 @@ class MAPNIK_DECL font_face_set : private boost::noncopyable (*face)->set_pixel_sizes(size); } } + + void set_character_sizes(float size) + { + for (std::vector::iterator face = faces_.begin(); face != faces_.end(); ++face) + { + (*face)->set_character_sizes(size); + } + } private: std::vector faces_; std::map dimension_cache_; @@ -198,7 +212,7 @@ class stroker : boost::noncopyable void init(double radius) { - FT_Stroker_Set(s_, (FT_Fixed) radius * (1<<6), + FT_Stroker_Set(s_, (FT_Fixed) (radius * (1<<6)), FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0); @@ -332,11 +346,17 @@ struct text_renderer : private boost::noncopyable halo_radius_(0.0), opacity_(1.0) {} + void set_pixel_size(unsigned size) { faces_->set_pixel_sizes(size); } - + + void set_character_size(float size) + { + faces_->set_character_sizes(size); + } + void set_fill(mapnik::color const& fill) { fill_=fill; diff --git a/include/mapnik/shield_symbolizer.hpp b/include/mapnik/shield_symbolizer.hpp index b8b3bfe473..847bff663f 100644 --- a/include/mapnik/shield_symbolizer.hpp +++ b/include/mapnik/shield_symbolizer.hpp @@ -38,11 +38,11 @@ struct MAPNIK_DECL shield_symbolizer : public text_symbolizer, { shield_symbolizer(expression_ptr name, std::string const& face_name, - unsigned size, + float size, color const& fill, path_expression_ptr file); shield_symbolizer(expression_ptr name, - unsigned size, + float size, color const& fill, path_expression_ptr file); diff --git a/include/mapnik/text_placements.hpp b/include/mapnik/text_placements.hpp index 47c0886360..383bbcb33d 100644 --- a/include/mapnik/text_placements.hpp +++ b/include/mapnik/text_placements.hpp @@ -112,7 +112,7 @@ class text_placement_info : boost::noncopyable /* NOTE: Values are public and non-virtual to avoid any performance problems. */ position displacement; - unsigned text_size; + float text_size; horizontal_alignment_e halign; justify_alignment_e jalign; vertical_alignment_e valign; @@ -127,9 +127,9 @@ class text_placements text_size_(10), halign_(H_MIDDLE), jalign_(J_MIDDLE), valign_(V_MIDDLE) {} virtual text_placement_info_ptr get_placement_info() const =0; - virtual void set_default_text_size(unsigned size) { text_size_ = size; } - unsigned get_default_text_size() const { return text_size_; } - + virtual void set_default_text_size(float size) { text_size_ = size; } + float get_default_text_size() const { return text_size_; } + virtual void set_default_displacement(position const& displacement) { displacement_ = displacement;} position const& get_default_displacement() { return displacement_; } @@ -144,7 +144,7 @@ class text_placements virtual ~text_placements() {} protected: - unsigned text_size_; + float text_size_; position displacement_; horizontal_alignment_e halign_; justify_alignment_e jalign_; diff --git a/include/mapnik/text_symbolizer.hpp b/include/mapnik/text_symbolizer.hpp index e4d57d8ed7..5ad9f7f449 100644 --- a/include/mapnik/text_symbolizer.hpp +++ b/include/mapnik/text_symbolizer.hpp @@ -44,10 +44,10 @@ namespace mapnik struct MAPNIK_DECL text_symbolizer : public symbolizer_base { text_symbolizer(expression_ptr name, std::string const& face_name, - unsigned size, color const& fill, + float size, color const& fill, text_placements_ptr placements = boost::make_shared() ); - text_symbolizer(expression_ptr name, unsigned size, color const& fill, + text_symbolizer(expression_ptr name, float size, color const& fill, text_placements_ptr placements = boost::make_shared() ); text_symbolizer(text_symbolizer const& rhs); @@ -80,8 +80,8 @@ struct MAPNIK_DECL text_symbolizer : public symbolizer_base void set_force_odd_labels(bool force); double get_max_char_angle_delta() const; // maximum change in angle between adjacent characters void set_max_char_angle_delta(double angle); - unsigned get_text_size() const; - void set_text_size(unsigned size); + float get_text_size() const; + void set_text_size(float size); std::string const& get_face_name() const; void set_face_name(std::string face_name); font_set const& get_fontset() const; diff --git a/src/agg/process_glyph_symbolizer.cpp b/src/agg/process_glyph_symbolizer.cpp index 276db2668e..4a82cdb4ba 100644 --- a/src/agg/process_glyph_symbolizer.cpp +++ b/src/agg/process_glyph_symbolizer.cpp @@ -59,9 +59,9 @@ void agg_renderer::process(glyph_symbolizer const& sym, } // set font size - unsigned size = sym.eval_size(feature); - ren.set_pixel_size(size * scale_factor_); - faces->set_pixel_sizes(size * scale_factor_); + float size = sym.eval_size(feature); + ren.set_character_size(size * scale_factor_); + faces->set_character_sizes(size * scale_factor_); // Get and render text path // diff --git a/src/agg/process_shield_symbolizer.cpp b/src/agg/process_shield_symbolizer.cpp index 94a9caeec3..7d2c02741a 100644 --- a/src/agg/process_shield_symbolizer.cpp +++ b/src/agg/process_shield_symbolizer.cpp @@ -129,7 +129,7 @@ void agg_renderer::process(shield_symbolizer const& sym, { text_renderer ren(pixmap_, faces, *strk); - ren.set_pixel_size(sym.get_text_size() * scale_factor_); + ren.set_character_size(sym.get_text_size() * scale_factor_); ren.set_fill(sym.get_fill()); ren.set_halo_fill(sym.get_halo_fill()); ren.set_halo_radius(sym.get_halo_radius() * scale_factor_); diff --git a/src/agg/process_text_symbolizer.cpp b/src/agg/process_text_symbolizer.cpp index c45e05c46c..f58d732891 100644 --- a/src/agg/process_text_symbolizer.cpp +++ b/src/agg/process_text_symbolizer.cpp @@ -103,12 +103,13 @@ void agg_renderer::process(text_symbolizer const& sym, throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); } text_renderer ren(pixmap_, faces, *strk); - ren.set_pixel_size(placement_options->text_size * scale_factor_); + + ren.set_character_size(placement_options->text_size * scale_factor_); ren.set_fill(fill); ren.set_halo_fill(sym.get_halo_fill()); ren.set_halo_radius(sym.get_halo_radius() * scale_factor_); ren.set_opacity(sym.get_text_opacity()); - + box2d dims(0,0,width_,height_); placement_finder finder(*detector_,dims); diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index 3939d49a65..668c8ebbda 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -1138,7 +1138,7 @@ void cairo_renderer_base::process(shield_symbolizer const& sym, placement_finder finder(detector_); - faces->set_pixel_sizes(placement_options->text_size); + faces->set_character_sizes(placement_options->text_size); faces->get_string_info(info); int w = (*marker)->width(); @@ -1466,7 +1466,7 @@ void cairo_renderer_base::process(glyph_symbolizer const& sym, // set font size unsigned size = sym.eval_size(feature); - faces->set_pixel_sizes(size); + faces->set_character_sizes(size); // Get and render text path // @@ -1563,7 +1563,7 @@ void cairo_renderer_base::process(text_symbolizer const& sym, cairo_context context(context_); string_info info(text); - faces->set_pixel_sizes(placement_options->text_size); + faces->set_character_sizes(placement_options->text_size); faces->get_string_info(info); placement_finder finder(detector_); diff --git a/src/glyph_symbolizer.cpp b/src/glyph_symbolizer.cpp index b94bb7766a..8ef41c638f 100644 --- a/src/glyph_symbolizer.cpp +++ b/src/glyph_symbolizer.cpp @@ -97,7 +97,7 @@ unsigned glyph_symbolizer::eval_size(Feature const& feature) const #ifdef MAPNIK_DEBUG std::clog << "size_result=" << result.to_string() << "\n"; #endif - unsigned size = static_cast(result.to_int()); + float size = static_cast(result.to_double()); #ifdef MAPNIK_DEBUG std::clog << "size=" << size << "\n"; #endif diff --git a/src/grid/process_shield_symbolizer.cpp b/src/grid/process_shield_symbolizer.cpp index 182412f229..d0f61cd672 100644 --- a/src/grid/process_shield_symbolizer.cpp +++ b/src/grid/process_shield_symbolizer.cpp @@ -110,7 +110,7 @@ void grid_renderer::process(shield_symbolizer const& sym, { text_renderer ren(pixmap_, faces, *strk); - ren.set_pixel_size(sym.get_text_size() * scale_factor_ * (1.0/pixmap_.get_resolution())); + ren.set_character_size(sym.get_text_size() * scale_factor_ * (1.0/pixmap_.get_resolution())); ren.set_fill(sym.get_fill()); ren.set_halo_fill(sym.get_halo_fill()); ren.set_halo_radius(sym.get_halo_radius() * scale_factor_); diff --git a/src/grid/process_text_symbolizer.cpp b/src/grid/process_text_symbolizer.cpp index 6e3c1b5dc3..e88aed6c59 100644 --- a/src/grid/process_text_symbolizer.cpp +++ b/src/grid/process_text_symbolizer.cpp @@ -77,7 +77,7 @@ void grid_renderer::process(text_symbolizer const& sym, throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); } text_renderer ren(pixmap_, faces, *strk); - ren.set_pixel_size(placement_options->text_size * (scale_factor_ * (1.0/pixmap_.get_resolution()))); + ren.set_character_size(placement_options->text_size * (scale_factor_ * (1.0/pixmap_.get_resolution()))); ren.set_fill(fill); ren.set_halo_fill(sym.get_halo_fill()); ren.set_halo_radius(sym.get_halo_radius() * scale_factor_); diff --git a/src/load_map.cpp b/src/load_map.cpp index 381ac4bdb6..9b25dec5fe 100644 --- a/src/load_map.cpp +++ b/src/load_map.cpp @@ -1244,10 +1244,10 @@ void map_parser::parse_text_symbolizer( rule & rule, ptree const & sym ) optional fontset_name = get_opt_attr(sym, "fontset-name"); - unsigned size = get_attr(sym, "size", 10U); - + float size = get_attr(sym, "size", 10.0f); + color c = get_attr(sym, "fill", color(0,0,0)); - + text_symbolizer text_symbol = text_symbolizer(parse_expression(name, "utf8"), size, c, placement_finder); optional orientation = get_opt_attr(sym, "orientation"); @@ -1486,7 +1486,7 @@ void map_parser::parse_shield_symbolizer( rule & rule, ptree const & sym ) optional fontset_name = get_opt_attr(sym, "fontset-name"); - unsigned size = get_attr(sym, "size", 10U); + float size = get_attr(sym, "size", 10.0f); color fill = get_attr(sym, "fill", color(0,0,0)); std::string image_file = get_attr(sym, "file"); diff --git a/src/shield_symbolizer.cpp b/src/shield_symbolizer.cpp index 6ef85788e7..fcf54a73ee 100644 --- a/src/shield_symbolizer.cpp +++ b/src/shield_symbolizer.cpp @@ -37,7 +37,7 @@ namespace mapnik shield_symbolizer::shield_symbolizer( expression_ptr name, std::string const& face_name, - unsigned size, + float size, color const& fill, path_expression_ptr file) : text_symbolizer(name, face_name, size, fill), @@ -50,7 +50,7 @@ shield_symbolizer::shield_symbolizer( shield_symbolizer::shield_symbolizer( expression_ptr name, - unsigned size, + float size, color const& fill, path_expression_ptr file) : text_symbolizer(name, size, fill), diff --git a/src/text_symbolizer.cpp b/src/text_symbolizer.cpp index 8b2fcf21c3..a328c8f584 100644 --- a/src/text_symbolizer.cpp +++ b/src/text_symbolizer.cpp @@ -87,7 +87,7 @@ IMPLEMENT_ENUM( text_transform_e, text_transform_strings ) text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_name, - unsigned size, color const& fill, + float size, color const& fill, text_placements_ptr placements) : symbolizer_base(), name_(name), @@ -120,7 +120,7 @@ text_symbolizer::text_symbolizer(expression_ptr name, std::string const& face_na set_text_size(size); } -text_symbolizer::text_symbolizer(expression_ptr name, unsigned size, color const& fill, +text_symbolizer::text_symbolizer(expression_ptr name, float size, color const& fill, text_placements_ptr placements) : symbolizer_base(), name_(name), @@ -378,12 +378,12 @@ void text_symbolizer::set_max_char_angle_delta(double angle) max_char_angle_delta_ = angle; } -void text_symbolizer::set_text_size(unsigned size) +void text_symbolizer::set_text_size(float size) { placement_options_->set_default_text_size(size); } -unsigned text_symbolizer::get_text_size() const +float text_symbolizer::get_text_size() const { return placement_options_->get_default_text_size(); }