Changeset 715
- Timestamp:
- 07/25/08 19:26:02 (6 months ago)
- Location:
- trunk
- Files:
-
- 3 modified
-
include/mapnik/cairo_renderer.hpp (modified) (2 diffs)
-
include/mapnik/font_engine_freetype.hpp (modified) (7 diffs)
-
src/cairo_renderer.cpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/mapnik/cairo_renderer.hpp
r656 r715 51 51 { 52 52 public: 53 cairo_face_manager(void); 54 cairo_face_ptr get_face(std::string const& name); 53 cairo_face_manager(boost::shared_ptr<freetype_engine> engine, 54 face_manager<freetype_engine> & manager); 55 cairo_face_ptr get_face(face_ptr face); 55 56 56 57 private: 57 typedef std::map< std::string,cairo_face_ptr> cairo_face_cache;58 typedef std::map<face_ptr,cairo_face_ptr> cairo_face_cache; 58 59 boost::shared_ptr<freetype_engine> font_engine_; 59 face_manager<freetype_engine> font_manager_;60 face_manager<freetype_engine> & font_manager_; 60 61 cairo_face_cache cache_; 61 62 }; … … 108 109 Cairo::RefPtr<Cairo::Context> context_; 109 110 CoordTransform t_; 111 boost::shared_ptr<freetype_engine> font_engine_; 112 face_manager<freetype_engine> font_manager_; 110 113 cairo_face_manager face_manager_; 111 114 label_collision_detector4 detector_; -
trunk/include/mapnik/font_engine_freetype.hpp
r713 r715 60 60 namespace mapnik 61 61 { 62 class font_face; 63 64 typedef boost::shared_ptr<font_face> face_ptr; 65 62 66 class MAPNIK_DECL font_glyph : private boost::noncopyable 63 67 { 64 68 public: 65 font_glyph( FT_Faceface, unsigned index)66 : face_(face), index_(index) {}67 68 FT_Faceget_face() const69 font_glyph(face_ptr face, unsigned index) 70 : face_(face), index_(index) {} 71 72 face_ptr get_face() const 69 73 { 70 74 return face_; … … 76 80 } 77 81 private: 78 FT_Faceface_;82 face_ptr face_; 79 83 unsigned index_; 80 84 }; … … 86 90 public: 87 91 font_face(FT_Face face) 88 : face_(face) {}92 : face_(face) {} 89 93 90 94 std::string family_name() const … … 133 137 FT_Face face_; 134 138 }; 135 136 typedef boost::shared_ptr<font_face> face_ptr;137 139 138 140 class MAPNIK_DECL font_face_set : private boost::noncopyable … … 158 160 for (std::vector<face_ptr>::const_iterator face = faces_.begin(); face != faces_.end(); ++face) 159 161 { 160 FT_Face f = (*face)->get_face();161 162 FT_UInt g = (*face)->get_char(c); 162 163 163 if (g) return glyph_ptr(new font_glyph( f, g));164 if (g) return glyph_ptr(new font_glyph(*face, g)); 164 165 } 165 166 … … 180 181 181 182 glyph_ptr glyph = get_glyph(c); 182 FT_Face face = glyph->get_face() ;183 FT_Face face = glyph->get_face()->get_face(); 183 184 184 185 matrix.xx = (FT_Fixed)( 1 * 0x10000L ); … … 442 443 443 444 glyph_ptr glyph = faces_->get_glyph(unsigned(c)); 444 FT_Face face = glyph->get_face() ;445 FT_Face face = glyph->get_face()->get_face(); 445 446 446 447 matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L ); -
trunk/src/cairo_renderer.cpp
r703 r715 141 141 } 142 142 143 void get_string_info(unsigned size, string_info & info)144 {145 face_->set_pixel_sizes(size);146 face_->get_string_info(info);147 }148 149 unsigned get_char(unsigned c) const150 {151 return face_->get_char(c);152 }153 154 143 private: 155 144 class handle … … 176 165 }; 177 166 178 cairo_face_manager::cairo_face_manager(void) 179 : font_engine_(new freetype_engine()), 180 font_manager_(*font_engine_) 181 { 182 } 183 184 cairo_face_ptr cairo_face_manager::get_face(std::string const& name) 185 { 186 cairo_face_cache::iterator itr = cache_.find(name); 167 cairo_face_manager::cairo_face_manager(boost::shared_ptr<freetype_engine> engine, 168 face_manager<freetype_engine> & manager) 169 : font_engine_(engine), 170 font_manager_(manager) 171 { 172 } 173 174 cairo_face_ptr cairo_face_manager::get_face(face_ptr face) 175 { 176 cairo_face_cache::iterator itr = cache_.find(face); 187 177 cairo_face_ptr entry; 188 178 … … 193 183 else 194 184 { 195 face_ptr face = font_manager_.get_face(name); 196 197 if (face) 198 { 199 entry = cairo_face_ptr(new cairo_face(font_engine_, face)); 200 201 cache_.insert(std::make_pair(name, entry)); 202 } 185 entry = cairo_face_ptr(new cairo_face(font_engine_, face)); 186 187 cache_.insert(std::make_pair(face, entry)); 203 188 } 204 189 … … 360 345 } 361 346 362 void set_font_face(cairo_face_ ptr const&face)363 { 364 context_->set_font_face( face->face());347 void set_font_face(cairo_face_manager & manager, face_ptr face) 348 { 349 context_->set_font_face(manager.get_face(face)->face()); 365 350 } 366 351 … … 400 385 } 401 386 402 void add_text(text_symbolizer const& sym, text_path & path, cairo_face_ptr const& face) 387 void add_text(text_symbolizer const& sym, text_path & path, 388 cairo_face_manager & manager, 389 face_set_ptr const& faces) 403 390 { 404 391 unsigned text_size = sym.get_text_size(); … … 415 402 path.vertex(&c, &x, &y, &angle); 416 403 417 Cairo::Matrix matrix; 418 419 matrix.xx = text_size * cos(angle); 420 matrix.xy = text_size * sin(angle); 421 matrix.yx = text_size * -sin(angle); 422 matrix.yy = text_size * cos(angle); 423 matrix.x0 = 0; 424 matrix.y0 = 0; 425 426 set_font_matrix(matrix); 427 glyph_path(face->get_char(c), sx + x, sy - y); 404 glyph_ptr glyph = faces->get_glyph(c); 405 406 if (glyph) 407 { 408 Cairo::Matrix matrix; 409 410 matrix.xx = text_size * cos(angle); 411 matrix.xy = text_size * sin(angle); 412 matrix.yx = text_size * -sin(angle); 413 matrix.yy = text_size * cos(angle); 414 matrix.x0 = 0; 415 matrix.y0 = 0; 416 417 set_font_matrix(matrix); 418 419 set_font_face(manager, glyph->get_face()); 420 421 glyph_path(glyph->get_index(), sx + x, sy - y); 422 } 428 423 } 429 424 … … 444 439 path.vertex(&c, &x, &y, &angle); 445 440 446 Cairo::Matrix matrix; 447 448 matrix.xx = text_size * cos(angle); 449 matrix.xy = text_size * sin(angle); 450 matrix.yx = text_size * -sin(angle); 451 matrix.yy = text_size * cos(angle); 452 matrix.x0 = 0; 453 matrix.y0 = 0; 454 455 set_font_matrix(matrix); 456 show_glyph(face->get_char(c), sx + x, sy - y); 441 glyph_ptr glyph = faces->get_glyph(c); 442 443 if (glyph) 444 { 445 Cairo::Matrix matrix; 446 447 matrix.xx = text_size * cos(angle); 448 matrix.xy = text_size * sin(angle); 449 matrix.yx = text_size * -sin(angle); 450 matrix.yy = text_size * cos(angle); 451 matrix.x0 = 0; 452 matrix.y0 = 0; 453 454 set_font_matrix(matrix); 455 456 set_font_face(manager, glyph->get_face()); 457 458 show_glyph(glyph->get_index(), sx + x, sy - y); 459 } 457 460 } 458 461 } … … 470 473 context_(Cairo::Context::create(surface)), 471 474 t_(m.getWidth(),m.getHeight(),m.getCurrentExtent(),offset_x,offset_y), 475 font_engine_(new freetype_engine()), 476 font_manager_(*font_engine_), 477 face_manager_(font_engine_,font_manager_), 472 478 detector_(Envelope<double>(-64 ,-64, m.getWidth() + 64 ,m.getHeight() + 64)) 473 479 { … … 761 767 if (text.length() > 0 && data) 762 768 { 763 cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 764 765 if (face) 769 face_set_ptr faces; 770 771 if (sym.get_fontset().size() > 0) 772 { 773 faces = font_manager_.get_face_set(sym.get_fontset()); 774 } 775 else 776 { 777 faces = font_manager_.get_face_set(sym.get_face_name()); 778 } 779 780 if (faces->size() > 0) 766 781 { 767 782 cairo_context context(context_); 768 769 context.set_font_face(face);770 771 783 string_info info(text); 772 784 773 face->get_string_info(sym.get_text_size(), info); 785 faces->set_pixel_sizes(sym.get_text_size()); 786 faces->get_string_info(info); 774 787 775 788 placement_finder<label_collision_detector4> finder(detector_); … … 793 806 794 807 context.add_image(shield_x, shield_y, *data); 795 context.add_text(sym, text_placement.placements[ii], face );808 context.add_text(sym, text_placement.placements[ii], face_manager_, faces); 796 809 } 797 810 } … … 932 945 if (text.length() > 0) 933 946 { 934 cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 935 936 if (face) 947 face_set_ptr faces; 948 949 if (sym.get_fontset().size() > 0) 950 { 951 faces = font_manager_.get_face_set(sym.get_fontset()); 952 } 953 else 954 { 955 faces = font_manager_.get_face_set(sym.get_face_name()); 956 } 957 958 if (faces->size() > 0) 937 959 { 938 960 cairo_context context(context_); 939 940 context.set_font_face(face);941 942 961 string_info info(text); 943 962 944 face->get_string_info(sym.get_text_size(), info); 963 faces->set_pixel_sizes(sym.get_text_size()); 964 faces->get_string_info(info); 945 965 946 966 placement_finder<label_collision_detector4> finder(detector_); … … 971 991 for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 972 992 { 973 context.add_text(sym, text_placement.placements[ii], face );993 context.add_text(sym, text_placement.placements[ii], face_manager_, faces); 974 994 } 975 995 }
