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/cairo_renderer.cpp

    r692 r693  
    751751      typedef coord_transform2<CoordTransform,geometry2d> path_type; 
    752752 
    753       if (feature.exists(sym.get_name())) 
    754       { 
    755          UnicodeString text = feature[sym.get_name()].to_unicode(); 
    756          boost::shared_ptr<ImageData32> const& data = sym.get_image(); 
    757  
    758          if (text.length() > 0 && data) 
    759          { 
    760             cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 
    761  
    762             if (face) 
    763             { 
    764                cairo_context context(context_); 
    765  
    766                context.set_font_face(face); 
    767  
    768                string_info info(text); 
    769  
    770                face->get_string_info(sym.get_text_size(), info); 
    771  
    772                placement_finder<label_collision_detector4> finder(detector_); 
    773  
    774                for (unsigned i = 0; i < feature.num_geometries(); ++i) 
    775                { 
    776                   geometry2d const& geom = feature.get_geometry(i); 
    777  
    778                   if (geom.num_points() > 0) // don't bother with empty geometries 
     753      UnicodeString text = feature[sym.get_name()].to_unicode(); 
     754      boost::shared_ptr<ImageData32> const& data = sym.get_image(); 
     755 
     756      if (text.length() > 0 && data) 
     757      { 
     758         cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 
     759 
     760         if (face) 
     761         { 
     762            cairo_context context(context_); 
     763 
     764            context.set_font_face(face); 
     765 
     766            string_info info(text); 
     767 
     768            face->get_string_info(sym.get_text_size(), info); 
     769 
     770            placement_finder<label_collision_detector4> finder(detector_); 
     771 
     772            for (unsigned i = 0; i < feature.num_geometries(); ++i) 
     773            { 
     774               geometry2d const& geom = feature.get_geometry(i); 
     775 
     776               if (geom.num_points() > 0) // don't bother with empty geometries 
     777               { 
     778                  path_type path(t_, geom, prj_trans); 
     779                  placement text_placement(info, sym); 
     780 
     781                  text_placement.avoid_edges = sym.get_avoid_edges(); 
     782                  finder.find_point_placements<path_type>(text_placement, path); 
     783 
     784                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii) 
    779785                  { 
    780                      path_type path(t_, geom, prj_trans); 
    781                      placement text_placement(info, sym); 
    782  
    783                      text_placement.avoid_edges = sym.get_avoid_edges(); 
    784                      finder.find_point_placements<path_type>(text_placement, path); 
    785  
    786                      for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ ii) 
    787                      { 
    788                         double shield_x = text_placement.placements[ii].starting_x - data->width() / 2; 
    789                         double shield_y = text_placement.placements[ii].starting_y - data->height() / 2; 
    790  
    791                         context.add_image(shield_x, shield_y, *data); 
    792                         context.add_text(sym, text_placement.placements[ii], face); 
    793                      } 
     786                     double shield_x = text_placement.placements[ii].starting_x - data->width() / 2; 
     787                     double shield_y = text_placement.placements[ii].starting_y - data->height() / 2; 
     788 
     789                     context.add_image(shield_x, shield_y, *data); 
     790                     context.add_text(sym, text_placement.placements[ii], face); 
    794791                  } 
    795792               } 
     
    928925      typedef coord_transform2<CoordTransform,geometry2d> path_type; 
    929926 
    930       if (feature.exists(sym.get_name())) 
    931       { 
    932          UnicodeString text = feature[sym.get_name()].to_unicode(); 
    933  
    934          if (text.length() > 0) 
    935          { 
    936             cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 
    937  
    938             if (face) 
    939             { 
    940                cairo_context context(context_); 
    941  
    942                context.set_font_face(face); 
    943  
    944                string_info info(text); 
    945  
    946                face->get_string_info(sym.get_text_size(), info); 
    947  
    948                placement_finder<label_collision_detector4> finder(detector_); 
    949  
    950                for (unsigned i = 0; i < feature.num_geometries(); ++i) 
    951                { 
    952                   geometry2d const& geom = feature.get_geometry(i); 
    953  
    954                   if (geom.num_points() > 0) // don't bother with empty geometries 
     927      UnicodeString text = feature[sym.get_name()].to_unicode(); 
     928 
     929      if (text.length() > 0) 
     930      { 
     931         cairo_face_ptr face = face_manager_.get_face(sym.get_face_name()); 
     932 
     933         if (face) 
     934         { 
     935            cairo_context context(context_); 
     936 
     937            context.set_font_face(face); 
     938 
     939            string_info info(text); 
     940 
     941            face->get_string_info(sym.get_text_size(), info); 
     942 
     943            placement_finder<label_collision_detector4> finder(detector_); 
     944 
     945            for (unsigned i = 0; i < feature.num_geometries(); ++i) 
     946            { 
     947               geometry2d const& geom = feature.get_geometry(i); 
     948 
     949               if (geom.num_points() > 0) // don't bother with empty geometries 
     950               { 
     951                  path_type path(t_, geom, prj_trans); 
     952                  placement text_placement(info, sym); 
     953 
     954                  if (sym.get_label_placement() == POINT_PLACEMENT) 
    955955                  { 
    956                      path_type path(t_, geom, prj_trans); 
    957                      placement text_placement(info, sym); 
    958  
    959                      if (sym.get_label_placement() == POINT_PLACEMENT) 
    960                      { 
    961                         double label_x, label_y, z = 0.0; 
    962  
    963                         geom.label_position(&label_x, &label_y); 
    964                         prj_trans.backward(label_x, label_y, z); 
    965                         t_.forward(&label_x, &label_y); 
    966                         finder.find_point_placement(text_placement, label_x, label_y); 
    967                      } 
    968                      else //LINE_PLACEMENT 
    969                      { 
    970                         finder.find_line_placements<path_type>(text_placement, path); 
    971                      } 
    972  
    973                      for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 
    974                      { 
    975                         context.add_text(sym, text_placement.placements[ii], face); 
    976                      } 
     956                     double label_x, label_y, z = 0.0; 
     957 
     958                     geom.label_position(&label_x, &label_y); 
     959                     prj_trans.backward(label_x, label_y, z); 
     960                     t_.forward(&label_x, &label_y); 
     961                     finder.find_point_placement(text_placement, label_x, label_y); 
    977962                  } 
    978                } 
    979             } 
    980             else 
    981             { 
    982                throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); 
    983             } 
     963                  else //LINE_PLACEMENT 
     964                  { 
     965                     finder.find_line_placements<path_type>(text_placement, path); 
     966                  } 
     967 
     968                  for (unsigned int ii = 0; ii < text_placement.placements.size(); ++ii) 
     969                  { 
     970                     context.add_text(sym, text_placement.placements[ii], face); 
     971                  } 
     972               } 
     973            } 
     974         } 
     975         else 
     976         { 
     977            throw config_error("Unable to find specified font face '" + sym.get_face_name() + "'"); 
    984978         } 
    985979      }