Changeset 715 for trunk/src/cairo_renderer.cpp
- Timestamp:
- 07/25/08 19:26:02 (6 months ago)
- Files:
-
- 1 modified
-
trunk/src/cairo_renderer.cpp (modified) (12 diffs)
Legend:
- Unmodified
- Added
- Removed
-
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 }
