00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef CAIRO_RENDERER_HPP
00026 #define CAIRO_RENDERER_HPP
00027
00028
00029 #include <mapnik/config.hpp>
00030 #include <mapnik/feature_style_processor.hpp>
00031 #include <mapnik/font_engine_freetype.hpp>
00032 #include <mapnik/label_collision_detector.hpp>
00033 #include <mapnik/placement_finder.hpp>
00034 #include <mapnik/map.hpp>
00035
00036
00037 #include <cairomm/context.h>
00038 #include <cairomm/surface.h>
00039
00040
00041 #include <boost/utility.hpp>
00042 #include <boost/scoped_ptr.hpp>
00043
00044 namespace mapnik {
00045
00046 class cairo_face;
00047
00048 typedef boost::shared_ptr<cairo_face> cairo_face_ptr;
00049
00050 class cairo_face_manager : private boost::noncopyable
00051 {
00052 public:
00053 cairo_face_manager(boost::shared_ptr<freetype_engine> engine,
00054 face_manager<freetype_engine> & manager);
00055 cairo_face_ptr get_face(face_ptr face);
00056
00057 private:
00058 typedef std::map<face_ptr,cairo_face_ptr> cairo_face_cache;
00059 boost::shared_ptr<freetype_engine> font_engine_;
00060 face_manager<freetype_engine> & font_manager_;
00061 cairo_face_cache cache_;
00062 };
00063
00064 template <typename T>
00065 class MAPNIK_DECL cairo_renderer : public feature_style_processor<cairo_renderer<T> >,
00066 private boost::noncopyable
00067 {
00068
00069 public:
00070 cairo_renderer(Map const& m, Cairo::RefPtr<Cairo::Surface> const& surface, unsigned offset_x=0, unsigned offset_y=0);
00071 ~cairo_renderer();
00072 void start_map_processing(Map const& map);
00073 void end_map_processing(Map const& map);
00074 void start_layer_processing(Layer const& lay);
00075 void end_layer_processing(Layer const& lay);
00076 void process(point_symbolizer const& sym,
00077 Feature const& feature,
00078 proj_transform const& prj_trans);
00079 void process(line_symbolizer const& sym,
00080 Feature const& feature,
00081 proj_transform const& prj_trans);
00082 void process(line_pattern_symbolizer const& sym,
00083 Feature const& feature,
00084 proj_transform const& prj_trans);
00085 void process(polygon_symbolizer const& sym,
00086 Feature const& feature,
00087 proj_transform const& prj_trans);
00088 void process(polygon_pattern_symbolizer const& sym,
00089 Feature const& feature,
00090 proj_transform const& prj_trans);
00091 void process(raster_symbolizer const& sym,
00092 Feature const& feature,
00093 proj_transform const& prj_trans);
00094 void process(shield_symbolizer const& sym,
00095 Feature const& feature,
00096 proj_transform const& prj_trans);
00097 void process(text_symbolizer const& sym,
00098 Feature const& feature,
00099 proj_transform const& prj_trans);
00100 void process(building_symbolizer const& sym,
00101 Feature const& feature,
00102 proj_transform const& prj_trans);
00103 void process(markers_symbolizer const& sym,
00104 Feature const& feature,
00105 proj_transform const& prj_trans);
00106 private:
00107 Map const& m_;
00108 Cairo::RefPtr<Cairo::Surface> surface_;
00109 Cairo::RefPtr<Cairo::Context> context_;
00110 CoordTransform t_;
00111 boost::shared_ptr<freetype_engine> font_engine_;
00112 face_manager<freetype_engine> font_manager_;
00113 cairo_face_manager face_manager_;
00114 label_collision_detector4 detector_;
00115 };
00116 }
00117
00118 #endif //CAIRO_RENDERER_HPP