Show
Ignore:
Timestamp:
04/12/08 11:22:27 (9 months ago)
Author:
tom
Message:

Revert previous fix for #89 and add a new improved fix that enhances the
value class to have a proper null type and do comparisions SQL style so
that null is neither equal nor not equal to other things.

Files:
1 modified

Legend:

Unmodified
Added
Removed
  • trunk/src/agg_renderer.cpp

    r692 r693  
    457457   { 
    458458      typedef  coord_transform2<CoordTransform,geometry2d> path_type; 
    459       if (feature.exists(sym.get_name())) 
    460       { 
    461          UnicodeString text = feature[sym.get_name()].to_unicode(); 
    462          boost::shared_ptr<ImageData32> const& data = sym.get_image(); 
    463          if (text.length() > 0 && data) 
    464          { 
    465             face_ptr face = font_manager_.get_face(sym.get_face_name()); 
    466             if (face) 
     459      UnicodeString text = feature[sym.get_name()].to_unicode(); 
     460      boost::shared_ptr<ImageData32> const& data = sym.get_image(); 
     461      if (text.length() > 0 && data) 
     462      { 
     463         face_ptr face = font_manager_.get_face(sym.get_face_name()); 
     464         if (face) 
     465         { 
     466            text_renderer<mapnik::Image32> ren(pixmap_,face); 
     467            ren.set_pixel_size(sym.get_text_size()); 
     468            ren.set_fill(sym.get_fill()); 
     469             
     470            string_info info(text); 
     471            face->get_string_info(info); 
     472             
     473            placement_finder<label_collision_detector4> finder(detector_); 
     474             
     475            unsigned num_geom = feature.num_geometries(); 
     476            for (unsigned i=0;i<num_geom;++i) 
    467477            { 
    468                text_renderer<mapnik::Image32> ren(pixmap_,face); 
    469                ren.set_pixel_size(sym.get_text_size()); 
    470                ren.set_fill(sym.get_fill()); 
    471              
    472                string_info info(text); 
    473                face->get_string_info(info); 
    474              
    475                placement_finder<label_collision_detector4> finder(detector_); 
    476              
    477                unsigned num_geom = feature.num_geometries(); 
    478                for (unsigned i=0;i<num_geom;++i) 
    479                { 
    480                   geometry2d const& geom = feature.get_geometry(i); 
    481                   if (geom.num_points() > 0) // don't bother with empty geometries 
    482                   { 
    483                      path_type path(t_,geom,prj_trans); 
    484                      placement text_placement(info, sym); 
    485                      text_placement.avoid_edges = sym.get_avoid_edges(); 
    486                      finder.find_point_placements<path_type>(text_placement,path); 
     478               geometry2d const& geom = feature.get_geometry(i); 
     479               if (geom.num_points() > 0) // don't bother with empty geometries  
     480               {     
     481                  path_type path(t_,geom,prj_trans); 
     482                  placement text_placement(info, sym); 
     483                  text_placement.avoid_edges = sym.get_avoid_edges(); 
     484                  finder.find_point_placements<path_type>(text_placement,path); 
    487485                   
    488                      for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii) 
    489                      { 
    490                         int w = data->width(); 
    491                         int h = data->height(); 
     486                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii) 
     487                  {  
     488                     int w = data->width(); 
     489                     int h = data->height(); 
    492490                      
    493                         double x = text_placement.placements[ii].starting_x; 
    494                         double y = text_placement.placements[ii].starting_y; 
     491                     double x = text_placement.placements[ii].starting_x; 
     492                     double y = text_placement.placements[ii].starting_y; 
    495493                      
    496                         int px=int(x - (w/2)); 
    497                         int py=int(y - (h/2)); 
     494                     int px=int(x - (w/2)); 
     495                     int py=int(y - (h/2)); 
    498496                      
    499                         pixmap_.set_rectangle_alpha(px,py,*data); 
     497                     pixmap_.set_rectangle_alpha(px,py,*data); 
    500498                      
    501                         Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]); 
     499                     Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]); 
    502500                         
    503                         ren.render(x,y); 
    504                      } 
     501                     ren.render(x,y); 
    505502                  } 
    506503               } 
     
    669666   { 
    670667      typedef  coord_transform2<CoordTransform,geometry2d> path_type; 
    671  
    672       if (feature.exists(sym.get_name())) 
    673       { 
    674          UnicodeString text = feature[sym.get_name()].to_unicode(); 
    675          if ( text.length() > 0 ) 
    676          { 
    677             Color const& fill  = sym.get_fill(); 
    678             face_ptr face = font_manager_.get_face(sym.get_face_name()); 
    679             if (face) 
     668       
     669      UnicodeString text = feature[sym.get_name()].to_unicode(); 
     670      if ( text.length() > 0 ) 
     671      { 
     672         Color const& fill  = sym.get_fill(); 
     673         face_ptr face = font_manager_.get_face(sym.get_face_name()); 
     674         if (face) 
     675         { 
     676            text_renderer<mapnik::Image32> ren(pixmap_,face); 
     677            ren.set_pixel_size(sym.get_text_size()); 
     678            ren.set_fill(fill); 
     679            ren.set_halo_fill(sym.get_halo_fill()); 
     680            ren.set_halo_radius(sym.get_halo_radius()); 
     681            
     682            placement_finder<label_collision_detector4> finder(detector_); 
     683            
     684            string_info info(text); 
     685            face->get_string_info(info); 
     686            unsigned num_geom = feature.num_geometries(); 
     687            for (unsigned i=0;i<num_geom;++i) 
    680688            { 
    681                text_renderer<mapnik::Image32> ren(pixmap_,face); 
    682                ren.set_pixel_size(sym.get_text_size()); 
    683                ren.set_fill(fill); 
    684                ren.set_halo_fill(sym.get_halo_fill()); 
    685                ren.set_halo_radius(sym.get_halo_radius()); 
    686             
    687                placement_finder<label_collision_detector4> finder(detector_); 
    688             
    689                string_info info(text); 
    690                face->get_string_info(info); 
    691                unsigned num_geom = feature.num_geometries(); 
    692                for (unsigned i=0;i<num_geom;++i) 
     689               geometry2d const& geom = feature.get_geometry(i); 
     690               if (geom.num_points() > 0) // don't bother with empty geometries  
    693691               { 
    694                   geometry2d const& geom = feature.get_geometry(i); 
    695                   if (geom.num_points() > 0) // don't bother with empty geometries 
     692                  path_type path(t_,geom,prj_trans); 
     693                  placement text_placement(info,sym);   
     694                  if (sym.get_label_placement() == POINT_PLACEMENT)  
    696695                  { 
    697                      path_type path(t_,geom,prj_trans); 
    698                      placement text_placement(info,sym); 
    699                      if (sym.get_label_placement() == POINT_PLACEMENT) 
    700                      { 
    701                         double label_x, label_y, z=0.0; 
    702                         geom.label_position(&label_x, &label_y); 
    703                         prj_trans.backward(label_x,label_y, z); 
    704                         t_.forward(&label_x,&label_y); 
    705                         finder.find_point_placement(text_placement,label_x,label_y); 
    706                      } 
    707                      else //LINE_PLACEMENT 
    708                      { 
    709                         finder.find_line_placements<path_type>(text_placement,path); 
    710                      } 
     696                     double label_x, label_y, z=0.0; 
     697                     geom.label_position(&label_x, &label_y); 
     698                     prj_trans.backward(label_x,label_y, z); 
     699                     t_.forward(&label_x,&label_y); 
     700                     finder.find_point_placement(text_placement,label_x,label_y); 
     701                  } 
     702                  else //LINE_PLACEMENT 
     703                  { 
     704                     finder.find_line_placements<path_type>(text_placement,path); 
     705                  } 
    711706                   
    712                      for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 
    713                      { 
    714                         double x = text_placement.placements[ii].starting_x; 
    715                         double y = text_placement.placements[ii].starting_y; 
    716                         Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]); 
    717                         ren.render(x,y); 
    718                      } 
     707                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 
     708                  { 
     709                     double x = text_placement.placements[ii].starting_x; 
     710                     double y = text_placement.placements[ii].starting_y; 
     711                     Envelope<double> dim = ren.prepare_glyphs(&text_placement.placements[ii]); 
     712                     ren.render(x,y); 
    719713                  } 
    720714               } 
    721             } 
    722             else 
    723             { 
    724                throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); 
    725             } 
     715            }   
     716         } 
     717         else 
     718         { 
     719            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); 
    726720         } 
    727721      }