Show
Ignore:
Timestamp:
07/25/08 19:26:02 (6 months ago)
Author:
tom
Message:

Make the cairo renderer build again, with font fallback support now.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/cairo_renderer.cpp

    r703 r715  
    141141         } 
    142142 
    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) const 
    150          { 
    151             return face_->get_char(c); 
    152          } 
    153  
    154143      private: 
    155144         class handle 
     
    176165   }; 
    177166 
    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); 
    187177      cairo_face_ptr entry; 
    188178 
     
    193183      else 
    194184      { 
    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)); 
    203188      } 
    204189 
     
    360345         } 
    361346 
    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()); 
    365350         } 
    366351 
     
    400385         } 
    401386 
    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) 
    403390         { 
    404391            unsigned text_size = sym.get_text_size(); 
     
    415402               path.vertex(&c, &x, &y, &angle); 
    416403 
    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               } 
    428423            } 
    429424 
     
    444439               path.vertex(&c, &x, &y, &angle); 
    445440 
    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               } 
    457460            } 
    458461         } 
     
    470473        context_(Cairo::Context::create(surface)), 
    471474        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_), 
    472478        detector_(Envelope<double>(-64 ,-64, m.getWidth() + 64 ,m.getHeight() + 64)) 
    473479   { 
     
    761767      if (text.length() > 0 && data) 
    762768      { 
    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) 
    766781         { 
    767782            cairo_context context(context_); 
    768  
    769             context.set_font_face(face); 
    770  
    771783            string_info info(text); 
    772784 
    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); 
    774787 
    775788            placement_finder<label_collision_detector4> finder(detector_); 
     
    793806 
    794807                     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); 
    796809                  } 
    797810               } 
     
    932945      if (text.length() > 0) 
    933946      { 
    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) 
    937959         { 
    938960            cairo_context context(context_); 
    939  
    940             context.set_font_face(face); 
    941  
    942961            string_info info(text); 
    943962 
    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); 
    945965 
    946966            placement_finder<label_collision_detector4> finder(detector_); 
     
    971991                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 
    972992                  { 
    973                      context.add_text(sym, text_placement.placements[ii], face); 
     993                     context.add_text(sym, text_placement.placements[ii], face_manager_, faces); 
    974994                  } 
    975995               }