From 6d84094f775d9bc329f27bda66b7bb4ed2c08738 Mon Sep 17 00:00:00 2001 From: Mickey Rose Date: Wed, 27 Jan 2016 22:07:04 +0100 Subject: [PATCH] move render_markers_symbolizer to separate .cpp --- Makefile | 4 +- include/mapnik/marker_helpers.hpp | 50 +----------- .../render_markers_symbolizer.hpp | 76 +++++++++++++++++++ src/agg/process_markers_symbolizer.cpp | 3 +- src/build.py | 1 + src/cairo/process_markers_symbolizer.cpp | 2 +- src/grid/process_markers_symbolizer.cpp | 2 +- .../render_markers_symbolizer.cpp | 70 +++++++++++------ .../render_thunk_extractor.cpp | 3 +- 9 files changed, 129 insertions(+), 82 deletions(-) create mode 100644 include/mapnik/renderer_common/render_markers_symbolizer.hpp rename include/mapnik/renderer_common/process_markers_symbolizer.hpp => src/renderer_common/render_markers_symbolizer.cpp (86%) diff --git a/Makefile b/Makefile index a0a209126..89efe1fb1 100755 --- a/Makefile +++ b/Makefile @@ -41,6 +41,7 @@ src/json/libmapnik-json.a: $(PYTHON) scons/scons.py -j1 \ --config=cache --implicit-cache --max-drift=1 \ src/renderer_common/render_group_symbolizer.os \ + src/renderer_common/render_markers_symbolizer.os \ src/renderer_common/render_thunk_extractor.os \ src/json/libmapnik-json.a \ src/wkt/libmapnik-wkt.a \ @@ -48,9 +49,6 @@ src/json/libmapnik-json.a: src/expression_grammar.os \ src/transform_expression_grammar.os \ src/image_filter_grammar.os \ - src/agg/process_markers_symbolizer.os \ - src/grid/process_markers_symbolizer.os \ - src/cairo/process_markers_symbolizer.os \ mapnik: src/json/libmapnik-json.a # then install the rest with -j$(JOBS) diff --git a/include/mapnik/marker_helpers.hpp b/include/mapnik/marker_helpers.hpp index 8615bb28e..49c011a3b 100644 --- a/include/mapnik/marker_helpers.hpp +++ b/include/mapnik/marker_helpers.hpp @@ -35,6 +35,7 @@ #include #include #include +#include // agg #include "agg_trans_affine.h" @@ -48,55 +49,6 @@ struct clip_poly_tag; using svg_attribute_type = agg::pod_bvector; -struct markers_dispatch_params -{ - // placement - markers_placement_params placement_params; - marker_placement_enum placement_method; - value_bool ignore_placement; - // rendering - bool snap_to_pixels; - double scale_factor; - value_double opacity; - - markers_dispatch_params(box2d const& size, - agg::trans_affine const& tr, - symbolizer_base const& sym, - feature_impl const& feature, - attributes const& vars, - double scale = 1.0, - bool snap = false) - : placement_params{ - .size = size, - .tr = tr, - .spacing = get(sym, feature, vars), - .max_error = get(sym, feature, vars), - .allow_overlap = get(sym, feature, vars), - .avoid_edges = get(sym, feature, vars), - .direction = get(sym, feature, vars)} - , placement_method(get(sym, feature, vars)) - , ignore_placement(get(sym, feature, vars)) - , snap_to_pixels(snap) - , scale_factor(scale) - , opacity(get(sym, feature, vars)) - { - placement_params.spacing *= scale; - } -}; - -struct markers_renderer_context : util::noncopyable -{ - virtual void render_marker(image_rgba8 const& src, - markers_dispatch_params const& params, - agg::trans_affine const& marker_tr) = 0; - - virtual void render_marker(svg_path_ptr const& src, - svg_path_adapter & path, - svg_attribute_type const& attrs, - markers_dispatch_params const& params, - agg::trans_affine const& marker_tr) = 0; -}; - template struct vector_markers_dispatch : util::noncopyable { diff --git a/include/mapnik/renderer_common/render_markers_symbolizer.hpp b/include/mapnik/renderer_common/render_markers_symbolizer.hpp new file mode 100644 index 000000000..42639fbb6 --- /dev/null +++ b/include/mapnik/renderer_common/render_markers_symbolizer.hpp @@ -0,0 +1,76 @@ +/***************************************************************************** + * + * This file is part of Mapnik (c++ mapping toolkit) + * + * Copyright (C) 2016 Artem Pavlenko + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * + *****************************************************************************/ + +#ifndef MAPNIK_RENDERER_COMMON_RENDER_MARKERS_SYMBOLIZER_HPP +#define MAPNIK_RENDERER_COMMON_RENDER_MARKERS_SYMBOLIZER_HPP + +#include +#include +#include +#include + +namespace mapnik { + +struct markers_dispatch_params +{ + // placement + markers_placement_params placement_params; + marker_placement_enum placement_method; + value_bool ignore_placement; + // rendering + bool snap_to_pixels; + double scale_factor; + value_double opacity; + + markers_dispatch_params(box2d const& size, + agg::trans_affine const& tr, + symbolizer_base const& sym, + feature_impl const& feature, + attributes const& vars, + double scale_factor = 1.0, + bool snap_to_pixels = false); +}; + +struct markers_renderer_context : util::noncopyable +{ + virtual void render_marker(image_rgba8 const& src, + markers_dispatch_params const& params, + agg::trans_affine const& marker_tr) = 0; + + virtual void render_marker(svg_path_ptr const& src, + svg_path_adapter & path, + svg_attribute_type const& attrs, + markers_dispatch_params const& params, + agg::trans_affine const& marker_tr) = 0; +}; + +MAPNIK_DECL +void render_markers_symbolizer(markers_symbolizer const& sym, + mapnik::feature_impl & feature, + proj_transform const& prj_trans, + renderer_common const& common, + box2d const& clip_box, + markers_renderer_context & renderer_context); + +} // namespace mapnik + +#endif // MAPNIK_RENDERER_COMMON_RENDER_MARKERS_SYMBOLIZER_HPP diff --git a/src/agg/process_markers_symbolizer.cpp b/src/agg/process_markers_symbolizer.cpp index 1c408352d..fb20b6e8b 100644 --- a/src/agg/process_markers_symbolizer.cpp +++ b/src/agg/process_markers_symbolizer.cpp @@ -38,8 +38,9 @@ #include #include #include -#include #include +#include + // agg #include "agg_basics.h" #include "agg_renderer_base.h" diff --git a/src/build.py b/src/build.py index 1cefbf560..06df953a3 100644 --- a/src/build.py +++ b/src/build.py @@ -254,6 +254,7 @@ source = Split( color_factory.cpp renderer_common.cpp renderer_common/render_group_symbolizer.cpp + renderer_common/render_markers_symbolizer.cpp renderer_common/render_pattern.cpp renderer_common/render_thunk_extractor.cpp math.cpp diff --git a/src/cairo/process_markers_symbolizer.cpp b/src/cairo/process_markers_symbolizer.cpp index 0fabc22ef..0001b4efc 100644 --- a/src/cairo/process_markers_symbolizer.cpp +++ b/src/cairo/process_markers_symbolizer.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include // agg #include "agg/include/agg_array.h" // for pod_bvector diff --git a/src/grid/process_markers_symbolizer.cpp b/src/grid/process_markers_symbolizer.cpp index 6d644ffd6..c7e551e2d 100644 --- a/src/grid/process_markers_symbolizer.cpp +++ b/src/grid/process_markers_symbolizer.cpp @@ -63,7 +63,7 @@ porting notes --> #include #include #include -#include +#include // agg #include "agg_basics.h" diff --git a/include/mapnik/renderer_common/process_markers_symbolizer.hpp b/src/renderer_common/render_markers_symbolizer.cpp similarity index 86% rename from include/mapnik/renderer_common/process_markers_symbolizer.hpp rename to src/renderer_common/render_markers_symbolizer.cpp index 53d4c4123..7864d3bef 100644 --- a/include/mapnik/renderer_common/process_markers_symbolizer.hpp +++ b/src/renderer_common/render_markers_symbolizer.cpp @@ -2,7 +2,7 @@ * * This file is part of Mapnik (c++ mapping toolkit) * - * Copyright (C) 2015 Artem Pavlenko + * Copyright (C) 2016 Artem Pavlenko * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public @@ -20,23 +20,24 @@ * *****************************************************************************/ -#ifndef MAPNIK_RENDERER_COMMON_PROCESS_MARKERS_SYMBOLIZER_HPP -#define MAPNIK_RENDERER_COMMON_PROCESS_MARKERS_SYMBOLIZER_HPP - #include #include #include #include #include #include +#include +#include namespace mapnik { -template +namespace detail { + +template struct render_marker_symbolizer_visitor { - using vector_dispatch_type = VD; - using raster_dispatch_type = RD; + using vector_dispatch_type = vector_markers_dispatch; + using raster_dispatch_type = raster_markers_dispatch; using vertex_converter_type = vertex_converter const& clip_box, - ContextType const& renderer_context) + ContextType & renderer_context) : filename_(filename), sym_(sym), feature_(feature), @@ -242,38 +243,57 @@ struct render_marker_symbolizer_visitor proj_transform const& prj_trans_; RendererType const& common_; box2d const& clip_box_; - ContextType const& renderer_context_; + ContextType & renderer_context_; }; -template +} // namespace detail + +markers_dispatch_params::markers_dispatch_params(box2d const& size, + agg::trans_affine const& tr, + symbolizer_base const& sym, + feature_impl const& feature, + attributes const& vars, + double scale, + bool snap) + : placement_params{ + .size = size, + .tr = tr, + .spacing = get(sym, feature, vars), + .max_error = get(sym, feature, vars), + .allow_overlap = get(sym, feature, vars), + .avoid_edges = get(sym, feature, vars), + .direction = get(sym, feature, vars)} + , placement_method(get(sym, feature, vars)) + , ignore_placement(get(sym, feature, vars)) + , snap_to_pixels(snap) + , scale_factor(scale) + , opacity(get(sym, feature, vars)) +{ + placement_params.spacing *= scale; +} + void render_markers_symbolizer(markers_symbolizer const& sym, mapnik::feature_impl & feature, proj_transform const& prj_trans, - RendererType const& common, + renderer_common const& common, box2d const& clip_box, markers_renderer_context & renderer_context) { using Detector = decltype(*common.detector_); - using VD = vector_markers_dispatch; - using RD = raster_markers_dispatch; - using ContextType = markers_renderer_context & ; + using RendererType = renderer_common; + using ContextType = markers_renderer_context; + using VisitorType = detail::render_marker_symbolizer_visitor; - using namespace mapnik::svg; std::string filename = get(sym, keys::file, feature, common.vars_, "shape://ellipse"); if (!filename.empty()) { - std::shared_ptr mark = mapnik::marker_cache::instance().find(filename, true); - render_marker_symbolizer_visitor visitor(filename, - sym, - feature, - prj_trans, - common, - clip_box, - renderer_context); + auto mark = mapnik::marker_cache::instance().find(filename, true); + VisitorType visitor(filename, sym, feature, prj_trans, common, clip_box, + renderer_context); util::apply_visitor(visitor, *mark); } } } // namespace mapnik - -#endif // MAPNIK_RENDERER_COMMON_PROCESS_MARKERS_SYMBOLIZER_HPP diff --git a/src/renderer_common/render_thunk_extractor.cpp b/src/renderer_common/render_thunk_extractor.cpp index a760409f3..96208e577 100644 --- a/src/renderer_common/render_thunk_extractor.cpp +++ b/src/renderer_common/render_thunk_extractor.cpp @@ -23,8 +23,7 @@ // mapnik #include #include -#include -#include +#include #include namespace mapnik {