Changeset 715 for trunk

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

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

Location:
trunk
Files:
3 modified

Legend:

Unmodified
Added
Removed
  • trunk/include/mapnik/cairo_renderer.hpp

    r656 r715  
    5151   { 
    5252     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); 
    5556 
    5657     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; 
    5859      boost::shared_ptr<freetype_engine> font_engine_; 
    59       face_manager<freetype_engine> font_manager_; 
     60      face_manager<freetype_engine> & font_manager_; 
    6061      cairo_face_cache cache_; 
    6162   }; 
     
    108109      Cairo::RefPtr<Cairo::Context> context_; 
    109110      CoordTransform t_; 
     111      boost::shared_ptr<freetype_engine> font_engine_; 
     112      face_manager<freetype_engine> font_manager_; 
    110113      cairo_face_manager face_manager_; 
    111114      label_collision_detector4 detector_; 
  • trunk/include/mapnik/font_engine_freetype.hpp

    r713 r715  
    6060namespace mapnik 
    6161{ 
     62    class font_face; 
     63        
     64    typedef boost::shared_ptr<font_face> face_ptr; 
     65 
    6266    class MAPNIK_DECL font_glyph : private boost::noncopyable 
    6367    { 
    6468    public: 
    65         font_glyph(FT_Face face, unsigned index) 
    66             : face_(face), index_(index) {} 
    67  
    68         FT_Face get_face() const 
     69        font_glyph(face_ptr face, unsigned index) 
     70           : face_(face), index_(index) {} 
     71 
     72        face_ptr get_face() const 
    6973        { 
    7074            return face_; 
     
    7680        } 
    7781    private: 
    78         FT_Face face_; 
     82        face_ptr face_; 
    7983        unsigned index_; 
    8084    }; 
     
    8690    public: 
    8791        font_face(FT_Face face) 
    88             : face_(face) {} 
     92           : face_(face) {} 
    8993         
    9094        std::string  family_name() const 
     
    133137        FT_Face face_; 
    134138    }; 
    135      
    136     typedef boost::shared_ptr<font_face> face_ptr; 
    137139 
    138140    class MAPNIK_DECL font_face_set : private boost::noncopyable 
     
    158160            for (std::vector<face_ptr>::const_iterator face = faces_.begin(); face != faces_.end(); ++face) 
    159161            { 
    160                FT_Face f = (*face)->get_face(); 
    161162               FT_UInt g = (*face)->get_char(c); 
    162163 
    163                if (g) return glyph_ptr(new font_glyph(f, g)); 
     164               if (g) return glyph_ptr(new font_glyph(*face, g)); 
    164165            } 
    165166 
     
    180181 
    181182            glyph_ptr glyph = get_glyph(c); 
    182             FT_Face face = glyph->get_face(); 
     183            FT_Face face = glyph->get_face()->get_face(); 
    183184 
    184185            matrix.xx = (FT_Fixed)( 1 * 0x10000L );  
     
    442443                 
    443444                glyph_ptr glyph = faces_->get_glyph(unsigned(c)); 
    444                 FT_Face face = glyph->get_face(); 
     445                FT_Face face = glyph->get_face()->get_face(); 
    445446 
    446447                matrix.xx = (FT_Fixed)( cos( angle ) * 0x10000L );  
  • 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               }