2012-02-18 14:03:21 +01:00
|
|
|
/*****************************************************************************
|
|
|
|
*
|
|
|
|
* This file is part of Mapnik (c++ mapping toolkit)
|
|
|
|
*
|
2014-11-20 15:25:50 +01:00
|
|
|
* Copyright (C) 2014 Artem Pavlenko
|
2012-02-18 14:03:21 +01:00
|
|
|
*
|
|
|
|
* 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
|
|
|
|
*
|
|
|
|
*****************************************************************************/
|
|
|
|
|
|
|
|
// mapnik
|
2013-11-08 05:09:22 +01:00
|
|
|
#include <mapnik/text/symbolizer_helpers.hpp>
|
2012-02-12 03:55:13 +01:00
|
|
|
#include <mapnik/label_collision_detector.hpp>
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
#include <mapnik/font_engine_freetype.hpp>
|
2014-07-28 13:10:34 +02:00
|
|
|
#include <mapnik/text/text_layout.hpp>
|
2014-09-30 21:50:08 +02:00
|
|
|
#include <mapnik/feature.hpp>
|
|
|
|
#include <mapnik/marker.hpp>
|
|
|
|
#include <mapnik/marker_cache.hpp>
|
2012-08-22 22:27:44 +02:00
|
|
|
#include <mapnik/geom_util.hpp>
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
#include <mapnik/parse_path.hpp>
|
|
|
|
#include <mapnik/debug.hpp>
|
2013-11-28 07:50:15 +01:00
|
|
|
#include <mapnik/symbolizer.hpp>
|
|
|
|
#include <mapnik/value_types.hpp>
|
2014-08-06 14:10:24 +02:00
|
|
|
#include <mapnik/text/placement_finder_impl.hpp>
|
2013-11-28 07:50:15 +01:00
|
|
|
#include <mapnik/text/placements/base.hpp>
|
|
|
|
#include <mapnik/text/placements/dummy.hpp>
|
|
|
|
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
//agg
|
2012-03-07 13:48:51 +01:00
|
|
|
#include "agg_conv_clip_polyline.h"
|
2012-01-29 04:49:02 +01:00
|
|
|
|
|
|
|
namespace mapnik {
|
|
|
|
|
2014-01-09 14:42:32 +01:00
|
|
|
base_symbolizer_helper::base_symbolizer_helper(
|
2014-05-11 22:08:24 +02:00
|
|
|
symbolizer_base const& sym,
|
|
|
|
feature_impl const& feature,
|
|
|
|
attributes const& vars,
|
|
|
|
proj_transform const& prj_trans,
|
2014-01-09 14:42:32 +01:00
|
|
|
unsigned width, unsigned height, double scale_factor,
|
2014-08-28 11:17:15 +02:00
|
|
|
view_transform const& t,
|
2014-05-11 22:08:24 +02:00
|
|
|
box2d<double> const& query_extent)
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
: sym_(sym),
|
|
|
|
feature_(feature),
|
2014-05-11 22:08:24 +02:00
|
|
|
vars_(vars),
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
prj_trans_(prj_trans),
|
|
|
|
t_(t),
|
|
|
|
dims_(0, 0, width, height),
|
|
|
|
query_extent_(query_extent),
|
2014-01-09 14:42:32 +01:00
|
|
|
scale_factor_(scale_factor),
|
2014-12-20 04:05:54 +01:00
|
|
|
info_ptr_(mapnik::get<text_placements_ptr>(sym_, keys::text_placements_)->get_placement_info(scale_factor,feature_,vars_)),
|
2014-10-13 01:07:26 +02:00
|
|
|
text_props_(evaluate_text_properties(info_ptr_->properties,feature_,vars_))
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
initialize_geometries();
|
2014-07-15 17:31:43 +02:00
|
|
|
if (!geometries_to_process_.size()) return; // FIXME - bad practise
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
initialize_points();
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
|
|
|
|
2012-01-31 12:52:43 +01:00
|
|
|
struct largest_bbox_first
|
|
|
|
{
|
|
|
|
bool operator() (geometry_type const* g0, geometry_type const* g1) const
|
|
|
|
{
|
|
|
|
box2d<double> b0 = g0->envelope();
|
|
|
|
box2d<double> b1 = g1->envelope();
|
|
|
|
return b0.width()*b0.height() > b1.width()*b1.height();
|
|
|
|
}
|
|
|
|
};
|
2012-01-29 04:49:02 +01:00
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
void base_symbolizer_helper::initialize_geometries() const
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2014-10-10 13:38:06 +02:00
|
|
|
bool largest_box_only = text_props_->largest_bbox_only;
|
|
|
|
double minimum_path_length = text_props_->minimum_path_length;
|
2013-11-28 07:50:15 +01:00
|
|
|
for ( auto const& geom : feature_.paths())
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
|
|
|
// don't bother with empty geometries
|
2012-07-19 17:36:44 +02:00
|
|
|
if (geom.size() == 0) continue;
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
mapnik::geometry_type::types type = geom.type();
|
2013-09-03 13:15:31 +02:00
|
|
|
if (type == geometry_type::types::Polygon)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2013-11-28 07:50:15 +01:00
|
|
|
if (minimum_path_length > 0)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2012-01-31 12:52:43 +01:00
|
|
|
box2d<double> gbox = t_.forward(geom.envelope(), prj_trans_);
|
2013-11-28 07:50:15 +01:00
|
|
|
if (gbox.width() < minimum_path_length)
|
2012-01-31 12:52:43 +01:00
|
|
|
{
|
|
|
|
continue;
|
|
|
|
}
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
// TODO - calculate length here as well
|
|
|
|
geometries_to_process_.push_back(const_cast<geometry_type*>(&geom));
|
|
|
|
}
|
2012-02-02 02:53:35 +01:00
|
|
|
|
2012-01-31 12:52:43 +01:00
|
|
|
if (largest_box_only)
|
|
|
|
{
|
|
|
|
geometries_to_process_.sort(largest_bbox_first());
|
|
|
|
geo_itr_ = geometries_to_process_.begin();
|
|
|
|
geometries_to_process_.erase(++geo_itr_,geometries_to_process_.end());
|
|
|
|
}
|
2012-01-29 04:49:02 +01:00
|
|
|
geo_itr_ = geometries_to_process_.begin();
|
|
|
|
}
|
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
void base_symbolizer_helper::initialize_points() const
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2014-10-10 13:38:06 +02:00
|
|
|
label_placement_enum how_placed = text_props_->label_placement;
|
2012-03-06 03:00:45 +01:00
|
|
|
if (how_placed == LINE_PLACEMENT)
|
|
|
|
{
|
2012-01-29 04:49:02 +01:00
|
|
|
point_placement_ = false;
|
|
|
|
return;
|
2012-03-06 03:00:45 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-01-29 04:49:02 +01:00
|
|
|
point_placement_ = true;
|
|
|
|
}
|
|
|
|
|
|
|
|
double label_x=0.0;
|
|
|
|
double label_y=0.0;
|
|
|
|
double z=0.0;
|
|
|
|
|
2014-07-08 18:02:22 +02:00
|
|
|
for (auto * geom_ptr : geometries_to_process_)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2014-07-08 18:02:22 +02:00
|
|
|
geometry_type const& geom = *geom_ptr;
|
2012-01-29 04:49:02 +01:00
|
|
|
if (how_placed == VERTEX_PLACEMENT)
|
|
|
|
{
|
|
|
|
geom.rewind(0);
|
2014-07-08 18:02:22 +02:00
|
|
|
for(unsigned i = 0; i < geom.size(); ++i)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
|
|
|
geom.vertex(&label_x, &label_y);
|
|
|
|
prj_trans_.backward(label_x, label_y, z);
|
|
|
|
t_.forward(&label_x, &label_y);
|
2014-10-12 22:38:18 +02:00
|
|
|
points_.emplace_back(label_x, label_y);
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
2012-03-06 03:00:45 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-08-21 21:51:39 +02:00
|
|
|
// https://github.com/mapnik/mapnik/issues/1423
|
|
|
|
bool success = false;
|
|
|
|
// https://github.com/mapnik/mapnik/issues/1350
|
2013-09-03 13:15:31 +02:00
|
|
|
if (geom.type() == geometry_type::types::LineString)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2012-08-21 21:51:39 +02:00
|
|
|
success = label::middle_point(geom, label_x,label_y);
|
2012-07-31 03:29:26 +02:00
|
|
|
}
|
|
|
|
else if (how_placed == POINT_PLACEMENT)
|
|
|
|
{
|
2012-08-21 21:51:39 +02:00
|
|
|
success = label::centroid(geom, label_x, label_y);
|
2012-03-06 03:00:45 +01:00
|
|
|
}
|
|
|
|
else if (how_placed == INTERIOR_PLACEMENT)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2012-08-21 21:51:39 +02:00
|
|
|
success = label::interior_position(geom, label_x, label_y);
|
2012-03-06 03:00:45 +01:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-04-10 00:51:04 +02:00
|
|
|
MAPNIK_LOG_ERROR(symbolizer_helpers) << "ERROR: Unknown placement type in initialize_points()";
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
2012-08-21 21:51:39 +02:00
|
|
|
if (success)
|
|
|
|
{
|
|
|
|
prj_trans_.backward(label_x, label_y, z);
|
|
|
|
t_.forward(&label_x, &label_y);
|
2014-10-12 22:38:18 +02:00
|
|
|
points_.emplace_back(label_x, label_y);
|
2012-08-21 21:51:39 +02:00
|
|
|
}
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
point_itr_ = points_.begin();
|
|
|
|
}
|
|
|
|
|
2014-01-09 14:42:32 +01:00
|
|
|
template <typename FaceManagerT, typename DetectorT>
|
|
|
|
text_symbolizer_helper::text_symbolizer_helper(
|
2014-05-11 22:08:24 +02:00
|
|
|
text_symbolizer const& sym,
|
|
|
|
feature_impl const& feature,
|
|
|
|
attributes const& vars,
|
|
|
|
proj_transform const& prj_trans,
|
2014-01-09 14:42:32 +01:00
|
|
|
unsigned width, unsigned height, double scale_factor,
|
2014-08-28 11:17:15 +02:00
|
|
|
view_transform const& t, FaceManagerT & font_manager,
|
2014-08-06 15:54:38 +02:00
|
|
|
DetectorT &detector, box2d<double> const& query_extent,
|
|
|
|
agg::trans_affine const& affine_trans)
|
2014-05-11 22:08:24 +02:00
|
|
|
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
|
2014-10-13 01:07:26 +02:00
|
|
|
finder_(feature, vars, detector, dims_, *info_ptr_, font_manager, scale_factor),
|
2014-08-06 14:10:24 +02:00
|
|
|
adapter_(finder_,false),
|
2014-08-06 15:54:38 +02:00
|
|
|
converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
|
2014-01-09 14:42:32 +01:00
|
|
|
{
|
2014-08-06 14:10:24 +02:00
|
|
|
|
|
|
|
// setup vertex converter
|
2014-10-17 21:45:15 +02:00
|
|
|
value_bool clip = mapnik::get<value_bool, keys::clip>(sym_, feature_, vars_);
|
|
|
|
value_double simplify_tolerance = mapnik::get<value_double, keys::simplify_tolerance>(sym_, feature_, vars_);
|
|
|
|
value_double smooth = mapnik::get<value_double, keys::smooth>(sym_, feature_, vars_);
|
2014-08-06 14:10:24 +02:00
|
|
|
|
|
|
|
if (clip) converter_.template set<clip_line_tag>(); //optional clip (default: true)
|
|
|
|
converter_.template set<transform_tag>(); //always transform
|
|
|
|
converter_.template set<affine_transform_tag>();
|
|
|
|
if (simplify_tolerance > 0.0) converter_.template set<simplify_tag>(); // optional simplify converter
|
|
|
|
if (smooth > 0.0) converter_.template set<smooth_tag>(); // optional smooth converter
|
|
|
|
|
2014-01-09 14:42:32 +01:00
|
|
|
if (geometries_to_process_.size()) finder_.next_position();
|
|
|
|
}
|
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
placements_list const& text_symbolizer_helper::get() const
|
2014-01-09 14:42:32 +01:00
|
|
|
{
|
|
|
|
if (point_placement_)
|
|
|
|
{
|
|
|
|
while (next_point_placement());
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2014-10-09 20:40:30 +02:00
|
|
|
while (next_line_placement());
|
2014-01-09 14:42:32 +01:00
|
|
|
}
|
|
|
|
return finder_.placements();
|
|
|
|
}
|
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
bool text_symbolizer_helper::next_line_placement() const
|
2014-01-09 14:42:32 +01:00
|
|
|
{
|
|
|
|
while (!geometries_to_process_.empty())
|
|
|
|
{
|
|
|
|
if (geo_itr_ == geometries_to_process_.end())
|
|
|
|
{
|
|
|
|
//Just processed the last geometry. Try next placement.
|
|
|
|
if (!finder_.next_position()) return false; //No more placements
|
|
|
|
//Start again from begin of list
|
|
|
|
geo_itr_ = geometries_to_process_.begin();
|
|
|
|
continue; //Reexecute size check
|
|
|
|
}
|
|
|
|
|
2014-08-06 14:10:24 +02:00
|
|
|
converter_.apply(**geo_itr_);
|
|
|
|
if (adapter_.status())
|
2014-01-09 14:42:32 +01:00
|
|
|
{
|
|
|
|
//Found a placement
|
|
|
|
geo_itr_ = geometries_to_process_.erase(geo_itr_);
|
|
|
|
return true;
|
|
|
|
}
|
2014-08-06 14:10:24 +02:00
|
|
|
// No placement for this geometry. Keep it in geometries_to_process_ for next try.
|
2014-01-09 14:42:32 +01:00
|
|
|
++geo_itr_;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
bool text_symbolizer_helper::next_point_placement() const
|
2014-01-09 14:42:32 +01:00
|
|
|
{
|
|
|
|
while (!points_.empty())
|
|
|
|
{
|
|
|
|
if (point_itr_ == points_.end())
|
|
|
|
{
|
|
|
|
//Just processed the last point. Try next placement.
|
|
|
|
if (!finder_.next_position()) return false; //No more placements
|
|
|
|
//Start again from begin of list
|
|
|
|
point_itr_ = points_.begin();
|
|
|
|
continue; //Reexecute size check
|
|
|
|
}
|
|
|
|
if (finder_.find_point_placement(*point_itr_))
|
|
|
|
{
|
|
|
|
//Found a placement
|
|
|
|
point_itr_ = points_.erase(point_itr_);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
//No placement for this point. Keep it in points_ for next try.
|
|
|
|
point_itr_++;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2012-01-29 04:49:02 +01:00
|
|
|
template <typename FaceManagerT, typename DetectorT>
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
text_symbolizer_helper::text_symbolizer_helper(
|
2014-05-11 22:08:24 +02:00
|
|
|
shield_symbolizer const& sym,
|
|
|
|
feature_impl const& feature,
|
|
|
|
attributes const& vars,
|
|
|
|
proj_transform const& prj_trans,
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
unsigned width, unsigned height, double scale_factor,
|
2014-08-28 11:17:15 +02:00
|
|
|
view_transform const& t, FaceManagerT & font_manager,
|
2014-08-06 15:54:38 +02:00
|
|
|
DetectorT & detector, box2d<double> const& query_extent, agg::trans_affine const& affine_trans)
|
2014-05-11 22:08:24 +02:00
|
|
|
: base_symbolizer_helper(sym, feature, vars, prj_trans, width, height, scale_factor, t, query_extent),
|
2014-10-13 01:07:26 +02:00
|
|
|
finder_(feature, vars, detector, dims_, *info_ptr_, font_manager, scale_factor),
|
2014-08-06 14:10:24 +02:00
|
|
|
adapter_(finder_,true),
|
2014-08-06 15:54:38 +02:00
|
|
|
converter_(query_extent_, adapter_, sym_, t, prj_trans, affine_trans, feature, vars, scale_factor)
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2014-08-06 15:54:38 +02:00
|
|
|
// setup vertex converter
|
2014-10-17 21:45:15 +02:00
|
|
|
value_bool clip = mapnik::get<value_bool, keys::clip>(sym_, feature_, vars_);
|
|
|
|
value_double simplify_tolerance = mapnik::get<value_double, keys::simplify_tolerance>(sym_, feature_, vars_);
|
|
|
|
value_double smooth = mapnik::get<value_double, keys::smooth>(sym_, feature_, vars_);
|
2014-08-06 14:10:24 +02:00
|
|
|
|
|
|
|
if (clip) converter_.template set<clip_line_tag>(); //optional clip (default: true)
|
|
|
|
converter_.template set<transform_tag>(); //always transform
|
|
|
|
converter_.template set<affine_transform_tag>();
|
|
|
|
if (simplify_tolerance > 0.0) converter_.template set<simplify_tag>(); // optional simplify converter
|
|
|
|
if (smooth > 0.0) converter_.template set<smooth_tag>(); // optional smooth converter
|
2014-01-09 14:42:32 +01:00
|
|
|
if (geometries_to_process_.size())
|
|
|
|
{
|
|
|
|
init_marker();
|
|
|
|
finder_.next_position();
|
|
|
|
}
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
|
|
|
|
|
|
|
|
2014-10-10 08:00:39 +02:00
|
|
|
void text_symbolizer_helper::init_marker() const
|
2012-01-29 04:49:02 +01:00
|
|
|
{
|
2014-10-17 21:45:15 +02:00
|
|
|
std::string filename = mapnik::get<std::string,keys::file>(sym_, feature_, vars_);
|
2014-05-11 22:08:24 +02:00
|
|
|
if (filename.empty()) return;
|
|
|
|
boost::optional<mapnik::marker_ptr> marker = marker_cache::instance().find(filename, true);
|
|
|
|
if (!marker) return;
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
agg::trans_affine trans;
|
2013-11-28 07:50:15 +01:00
|
|
|
auto image_transform = get_optional<transform_type>(sym_, keys::image_transform);
|
2014-05-11 22:08:24 +02:00
|
|
|
if (image_transform) evaluate_transform(trans, feature_, vars_, *image_transform);
|
|
|
|
double width = (*marker)->width();
|
|
|
|
double height = (*marker)->height();
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
double px0 = - 0.5 * width;
|
|
|
|
double py0 = - 0.5 * height;
|
|
|
|
double px1 = 0.5 * width;
|
|
|
|
double py1 = 0.5 * height;
|
2012-01-29 04:49:02 +01:00
|
|
|
double px2 = px1;
|
|
|
|
double py2 = py0;
|
|
|
|
double px3 = px0;
|
|
|
|
double py3 = py1;
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
trans.transform(&px0, &py0);
|
|
|
|
trans.transform(&px1, &py1);
|
|
|
|
trans.transform(&px2, &py2);
|
|
|
|
trans.transform(&px3, &py3);
|
|
|
|
box2d<double> bbox(px0, py0, px1, py1);
|
|
|
|
bbox.expand_to_include(px2, py2);
|
|
|
|
bbox.expand_to_include(px3, py3);
|
2014-10-17 21:45:15 +02:00
|
|
|
value_bool unlock_image = mapnik::get<value_bool, keys::unlock_image>(sym_, feature_, vars_);
|
|
|
|
value_double shield_dx = mapnik::get<value_double, keys::shield_dx>(sym_, feature_, vars_);
|
|
|
|
value_double shield_dy = mapnik::get<value_double, keys::shield_dy>(sym_, feature_, vars_);
|
2013-11-28 07:50:15 +01:00
|
|
|
pixel_position marker_displacement;
|
|
|
|
marker_displacement.set(shield_dx,shield_dy);
|
2014-05-11 22:08:24 +02:00
|
|
|
finder_.set_marker(std::make_shared<marker_info>(*marker, trans), bbox, unlock_image, marker_displacement);
|
2012-01-29 04:49:02 +01:00
|
|
|
}
|
|
|
|
|
2014-01-09 14:42:32 +01:00
|
|
|
|
2014-05-11 22:08:24 +02:00
|
|
|
template text_symbolizer_helper::text_symbolizer_helper(
|
|
|
|
text_symbolizer const& sym,
|
|
|
|
feature_impl const& feature,
|
|
|
|
attributes const& vars,
|
|
|
|
proj_transform const& prj_trans,
|
2013-11-28 07:50:15 +01:00
|
|
|
unsigned width,
|
|
|
|
unsigned height,
|
|
|
|
double scale_factor,
|
2014-08-28 11:17:15 +02:00
|
|
|
view_transform const& t,
|
2014-10-02 03:54:11 +02:00
|
|
|
face_manager_freetype & font_manager,
|
2013-11-28 07:50:15 +01:00
|
|
|
label_collision_detector4 &detector,
|
2014-08-06 15:54:38 +02:00
|
|
|
box2d<double> const& query_extent,
|
|
|
|
agg::trans_affine const&);
|
Improved support for international text
- Implementation by @herm for GSOC 2012 (http://mapnik.org/news/2012/10/06/gsoc2012-status9/)
- C++11 port, improvements, optimizations by @artemp
- Testing and integration with master by @springmeyer
- Thank you to all the support from @behdad along the way
- Thanks for help testing @toton6868, @stephankn, @nirvn, @mfrasca, @simonsonc and many others
Refs: #2073,#2070,#2038,#2037,#1953,#1820,#1819,#1714,#1634,#1547,#1532,#1319,#1208,#1154,#1146
2013-11-22 09:06:32 +01:00
|
|
|
|
2014-05-11 22:08:24 +02:00
|
|
|
template text_symbolizer_helper::text_symbolizer_helper(
|
|
|
|
shield_symbolizer const& sym,
|
|
|
|
feature_impl const& feature,
|
|
|
|
attributes const& vars,
|
|
|
|
proj_transform const& prj_trans,
|
2013-11-28 07:50:15 +01:00
|
|
|
unsigned width,
|
|
|
|
unsigned height,
|
|
|
|
double scale_factor,
|
2014-08-28 11:17:15 +02:00
|
|
|
view_transform const& t,
|
2014-10-02 03:54:11 +02:00
|
|
|
face_manager_freetype & font_manager,
|
2013-11-28 07:50:15 +01:00
|
|
|
label_collision_detector4 &detector,
|
2014-08-06 15:54:38 +02:00
|
|
|
box2d<double> const& query_extent,
|
|
|
|
agg::trans_affine const&);
|
2012-01-29 04:49:02 +01:00
|
|
|
} //namespace
|