From ee018dc589f76b01c67f39cdac3346743d02d09b Mon Sep 17 00:00:00 2001 From: Matt Amos Date: Thu, 5 Dec 2013 18:39:09 +0000 Subject: [PATCH] Factor common fields out of cairo renderer. This involved making the freetype engine stack allocated and accessible via a `shared_ptr` because `FT_Face` elements stored in it are referenced from cairo structures which persist beyond the lifetime of the `cairo_renderer` object. Hopefully this can be resolved in a future commit. --- include/mapnik/cairo_renderer.hpp | 12 +-- include/mapnik/renderer_common.hpp | 4 +- src/cairo_context.cpp | 24 +++++ src/cairo_renderer.cpp | 149 ++++++++++------------------- src/renderer_common.cpp | 3 +- 5 files changed, 83 insertions(+), 109 deletions(-) diff --git a/include/mapnik/cairo_renderer.hpp b/include/mapnik/cairo_renderer.hpp index e95233c80..f839c340b 100644 --- a/include/mapnik/cairo_renderer.hpp +++ b/include/mapnik/cairo_renderer.hpp @@ -37,6 +37,7 @@ #include #include #include // for CoordTransform +#include // cairo #include @@ -128,7 +129,7 @@ public: inline double scale_factor() const { - return scale_factor_; + return common_.scale_factor_; } void render_marker(pixel_position const& pos, @@ -140,15 +141,8 @@ public: protected: Map const& m_; cairo_context context_; - unsigned width_; - unsigned height_; - double scale_factor_; - CoordTransform t_; - std::shared_ptr font_engine_; - face_manager font_manager_; + renderer_common common_; cairo_face_manager face_manager_; - std::shared_ptr detector_; - box2d query_extent_; void setup(Map const& m); }; diff --git a/include/mapnik/renderer_common.hpp b/include/mapnik/renderer_common.hpp index 9eac7dafc..ecf90d007 100644 --- a/include/mapnik/renderer_common.hpp +++ b/include/mapnik/renderer_common.hpp @@ -50,7 +50,9 @@ struct renderer_common unsigned width_; unsigned height_; double scale_factor_; - freetype_engine font_engine_; + // TODO: dirty hack for cairo renderer, figure out how to remove this + std::shared_ptr shared_font_engine_; + freetype_engine &font_engine_; face_manager font_manager_; box2d query_extent_; CoordTransform t_; diff --git a/src/cairo_context.cpp b/src/cairo_context.cpp index 61ee817fe..d30f54861 100644 --- a/src/cairo_context.cpp +++ b/src/cairo_context.cpp @@ -499,4 +499,28 @@ void cairo_context::add_text(glyph_positions_ptr path, } } + +cairo_face_manager::cairo_face_manager(std::shared_ptr font_engine) + : font_engine_(font_engine) +{ +} + +cairo_face_ptr cairo_face_manager::get_face(face_ptr face) +{ + cairo_face_cache::iterator itr = cache_.find(face); + cairo_face_ptr entry; + + if (itr != cache_.end()) + { + entry = itr->second; + } + else + { + entry = std::make_shared(font_engine_, face); + cache_.insert(std::make_pair(face, entry)); + } + + return entry; +} + } diff --git a/src/cairo_renderer.cpp b/src/cairo_renderer.cpp index 74c0b07bc..e334713d3 100644 --- a/src/cairo_renderer.cpp +++ b/src/cairo_renderer.cpp @@ -94,31 +94,6 @@ struct cairo_save_restore cairo_context & context_; }; - -cairo_face_manager::cairo_face_manager(std::shared_ptr engine) - : font_engine_(engine) -{ -} - -cairo_face_ptr cairo_face_manager::get_face(face_ptr face) -{ - cairo_face_cache::iterator itr = cache_.find(face); - cairo_face_ptr entry; - - if (itr != cache_.end()) - { - entry = itr->second; - } - else - { - entry = std::make_shared(font_engine_, face); - cache_.insert(std::make_pair(face, entry)); - } - - return entry; -} - - cairo_renderer_base::cairo_renderer_base(Map const& m, cairo_ptr const& cairo, double scale_factor, @@ -126,16 +101,8 @@ cairo_renderer_base::cairo_renderer_base(Map const& m, unsigned offset_y) : m_(m), context_(cairo), - width_(m.width()), - height_(m.height()), - scale_factor_(scale_factor), - t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y), - font_engine_(std::make_shared()), - font_manager_(*font_engine_), - face_manager_(font_engine_), - detector_(std::make_shared( - box2d(-m.buffer_size(), -m.buffer_size(), - m.width() + m.buffer_size(), m.height() + m.buffer_size()))) + common_(m, offset_x, offset_y, m.width(), m.height(), scale_factor), + face_manager_(common_.shared_font_engine_) { setup(m); } @@ -148,16 +115,8 @@ cairo_renderer_base::cairo_renderer_base(Map const& m, unsigned offset_y) : m_(m), context_(cairo), - width_(req.width()), - height_(req.height()), - scale_factor_(scale_factor), - t_(req.width(),req.height(),req.extent(),offset_x,offset_y), - font_engine_(std::make_shared()), - font_manager_(*font_engine_), - face_manager_(font_engine_), - detector_(std::make_shared( - box2d(-m.buffer_size(), -m.buffer_size(), - m.width() + m.buffer_size(), m.height() + m.buffer_size()))) + common_(req, offset_x, offset_y, req.width(), req.height(), scale_factor), + face_manager_(common_.shared_font_engine_) { setup(m); } @@ -170,14 +129,8 @@ cairo_renderer_base::cairo_renderer_base(Map const& m, unsigned offset_y) : m_(m), context_(cairo), - width_(m.width()), - height_(m.height()), - scale_factor_(scale_factor), - t_(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y), - font_engine_(std::make_shared()), - font_manager_(*font_engine_), - face_manager_(font_engine_), - detector_(detector) + common_(m, offset_x, offset_y, m.width(), m.height(), scale_factor, detector), + face_manager_(common_.shared_font_engine_) { MAPNIK_LOG_DEBUG(cairo_renderer) << "cairo_renderer_base: Scale=" << m.scale(); } @@ -236,8 +189,8 @@ void cairo_renderer_base::setup(Map const& map) if ( w > 0 && h > 0) { // repeat background-image both vertically and horizontally - unsigned x_steps = unsigned(std::ceil(width_/double(w))); - unsigned y_steps = unsigned(std::ceil(height_/double(h))); + unsigned x_steps = unsigned(std::ceil(common_.width_/double(w))); + unsigned y_steps = unsigned(std::ceil(common_.height_/double(h))); for (unsigned x=0;x