From 8a55eefbb53e209f8c019906ce5c8e0ec830124f Mon Sep 17 00:00:00 2001 From: Mickey Rose Date: Tue, 26 Jan 2016 21:18:00 +0100 Subject: [PATCH] derive virtual_renderer_common from renderer_common --- include/mapnik/renderer_common.hpp | 16 ++++++++++--- .../render_thunk_extractor.hpp | 17 ++----------- src/agg/process_point_symbolizer.cpp | 1 - src/grid/process_point_symbolizer.cpp | 1 - src/renderer_common.cpp | 24 +++++++++++++++++-- .../render_thunk_extractor.cpp | 20 ++++------------ src/svg/output/svg_renderer.cpp | 1 - 7 files changed, 41 insertions(+), 39 deletions(-) diff --git a/include/mapnik/renderer_common.hpp b/include/mapnik/renderer_common.hpp index 213443899..c9d181b42 100644 --- a/include/mapnik/renderer_common.hpp +++ b/include/mapnik/renderer_common.hpp @@ -42,13 +42,16 @@ namespace mapnik { struct renderer_common : private util::noncopyable { + using detector_ptr = std::shared_ptr; + renderer_common(Map const &m, attributes const& vars, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height, double scale_factor); renderer_common(Map const &m, attributes const& vars, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height, double scale_factor, - std::shared_ptr detector); + detector_ptr detector); renderer_common(Map const &m, request const &req, attributes const& vars, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height, double scale_factor); + ~renderer_common(); unsigned width_; unsigned height_; @@ -60,11 +63,18 @@ struct renderer_common : private util::noncopyable face_manager_freetype font_manager_; box2d query_extent_; view_transform t_; - std::shared_ptr detector_; + detector_ptr detector_; + +protected: + // it's desirable to keep this class implicitly noncopyable to prevent + // inadvertent copying from other places; + // this copy constructor is therefore protected and should only be used + // by virtual_renderer_common + renderer_common(renderer_common const& other); private: renderer_common(Map const &m, unsigned width, unsigned height, double scale_factor, - attributes const& vars, view_transform &&t, std::shared_ptr detector); + attributes const& vars, view_transform && t, detector_ptr detector); }; } diff --git a/include/mapnik/renderer_common/render_thunk_extractor.hpp b/include/mapnik/renderer_common/render_thunk_extractor.hpp index 97e6c83cd..fba63e4a5 100644 --- a/include/mapnik/renderer_common/render_thunk_extractor.hpp +++ b/include/mapnik/renderer_common/render_thunk_extractor.hpp @@ -44,22 +44,9 @@ namespace mapnik { // being able to interpose our own decisions about whether // a collision has occurred or not. -struct virtual_renderer_common : private util::noncopyable +struct virtual_renderer_common : renderer_common { - virtual_renderer_common(renderer_common & common); - ~virtual_renderer_common(); - - unsigned & width_; - unsigned & height_; - double & scale_factor_; - attributes & vars_; - // TODO: dirty hack for cairo renderer, figure out how to remove this - std::shared_ptr & shared_font_library_; - font_library & font_library_; - face_manager_freetype & font_manager_; - box2d & query_extent_; - view_transform & t_; - std::unique_ptr detector_; + explicit virtual_renderer_common(renderer_common const& other); }; // Base class for extracting the bounding boxes associated with placing diff --git a/src/agg/process_point_symbolizer.cpp b/src/agg/process_point_symbolizer.cpp index 8dc40f1af..1da740fe6 100644 --- a/src/agg/process_point_symbolizer.cpp +++ b/src/agg/process_point_symbolizer.cpp @@ -30,7 +30,6 @@ #include #include #include -#include #include #include #include diff --git a/src/grid/process_point_symbolizer.cpp b/src/grid/process_point_symbolizer.cpp index 731291d78..130fc1fc2 100644 --- a/src/grid/process_point_symbolizer.cpp +++ b/src/grid/process_point_symbolizer.cpp @@ -30,7 +30,6 @@ #include #include -#include #include #include #include diff --git a/src/renderer_common.cpp b/src/renderer_common.cpp index 37223e35d..d45e3a03c 100644 --- a/src/renderer_common.cpp +++ b/src/renderer_common.cpp @@ -29,10 +29,24 @@ namespace mapnik { +// copy constructor exclusively for virtual_renderer_common +renderer_common::renderer_common(renderer_common const& other) + : width_(other.width_), + height_(other.height_), + scale_factor_(other.scale_factor_), + vars_(other.vars_), + shared_font_library_(other.shared_font_library_), + font_library_(other.font_library_), + font_manager_(other.font_manager_), + query_extent_(other.query_extent_), + t_(other.t_), + detector_(other.detector_) +{} + renderer_common::renderer_common(Map const& map, unsigned width, unsigned height, double scale_factor, attributes const& vars, view_transform && t, - std::shared_ptr detector) + detector_ptr detector) : width_(width), height_(height), scale_factor_(scale_factor), @@ -57,7 +71,7 @@ renderer_common::renderer_common(Map const &m, attributes const& vars, unsigned renderer_common::renderer_common(Map const &m, attributes const& vars, unsigned offset_x, unsigned offset_y, unsigned width, unsigned height, double scale_factor, - std::shared_ptr detector) + detector_ptr detector) : renderer_common(m, width, height, scale_factor, vars, view_transform(m.width(),m.height(),m.get_current_extent(),offset_x,offset_y), @@ -74,4 +88,10 @@ renderer_common::renderer_common(Map const &m, request const &req, attributes co req.width() + req.buffer_size() ,req.height() + req.buffer_size()))) {} +renderer_common::~renderer_common() +{ + // defined in .cpp to make this destructible elsewhere without + // having to #include +} + } diff --git a/src/renderer_common/render_thunk_extractor.cpp b/src/renderer_common/render_thunk_extractor.cpp index d2f4e29f1..58346694a 100644 --- a/src/renderer_common/render_thunk_extractor.cpp +++ b/src/renderer_common/render_thunk_extractor.cpp @@ -29,23 +29,11 @@ namespace mapnik { -virtual_renderer_common::virtual_renderer_common(renderer_common & common) - : width_(common.width_), - height_(common.height_), - scale_factor_(common.scale_factor_), - vars_(common.vars_), - shared_font_library_(common.shared_font_library_), - font_library_(*shared_font_library_), - font_manager_(common.font_manager_), - query_extent_(common.query_extent_), - t_(common.t_), - detector_(new label_collision_detector4(common.detector_->extent())) -{} - -virtual_renderer_common::~virtual_renderer_common() +virtual_renderer_common::virtual_renderer_common(renderer_common const& other) + : renderer_common(other) { - // defined in .cpp to make this destructible elsewhere without - // having to #include + // replace collision detector with my own so that I don't pollute the original + detector_ = std::make_shared(other.detector_->extent()); } namespace detail { diff --git a/src/svg/output/svg_renderer.cpp b/src/svg/output/svg_renderer.cpp index c110e5e8c..569164645 100644 --- a/src/svg/output/svg_renderer.cpp +++ b/src/svg/output/svg_renderer.cpp @@ -27,7 +27,6 @@ #include #include #include -#include #include #include