parent
e4ad657991
commit
7754f37772
13 changed files with 339 additions and 10 deletions
|
@ -81,6 +81,9 @@ private:
|
||||||
bool collision(box2d<double> const& box) const;
|
bool collision(box2d<double> const& box) const;
|
||||||
/** Adds marker to glyph_positions and to collision detector. Returns false if there is a collision. */
|
/** Adds marker to glyph_positions and to collision detector. Returns false if there is a collision. */
|
||||||
bool add_marker(glyph_positions_ptr glyphs, pixel_position const& pos) const;
|
bool add_marker(glyph_positions_ptr glyphs, pixel_position const& pos) const;
|
||||||
|
/** Maps upright==auto, left_only and right_only to left,right to simplify processing.
|
||||||
|
angle = angle of at start of line (to estimate best option for upright==auto) */
|
||||||
|
text_upright_e simplify_upright(text_upright_e upright, double angle) const;
|
||||||
box2d<double> get_bbox(glyph_info const& glyph, pixel_position const& pos, rotation const& rot);
|
box2d<double> get_bbox(glyph_info const& glyph, pixel_position const& pos, rotation const& rot);
|
||||||
Feature const& feature_;
|
Feature const& feature_;
|
||||||
DetectorType &detector_;
|
DetectorType &detector_;
|
||||||
|
|
|
@ -126,6 +126,8 @@ enum text_upright
|
||||||
UPRIGHT_AUTO,
|
UPRIGHT_AUTO,
|
||||||
UPRIGHT_LEFT,
|
UPRIGHT_LEFT,
|
||||||
UPRIGHT_RIGHT,
|
UPRIGHT_RIGHT,
|
||||||
|
UPRIGHT_LEFT_ONLY,
|
||||||
|
UPRIGHT_RIGHT_ONLY,
|
||||||
text_upright_MAX
|
text_upright_MAX
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -323,9 +323,29 @@ bool placement_finder::find_line_placements(T & path, bool points)
|
||||||
return success;
|
return success;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
text_upright_e placement_finder::simplify_upright(text_upright_e upright, double angle) const
|
||||||
|
{
|
||||||
|
if (upright == UPRIGHT_AUTO)
|
||||||
|
{
|
||||||
|
return (fabs(normalize_angle(angle)) > 0.5*M_PI) ? UPRIGHT_LEFT : UPRIGHT_RIGHT;
|
||||||
|
}
|
||||||
|
if (upright == UPRIGHT_LEFT_ONLY)
|
||||||
|
{
|
||||||
|
return UPRIGHT_LEFT;
|
||||||
|
}
|
||||||
|
if (upright == UPRIGHT_RIGHT_ONLY)
|
||||||
|
{
|
||||||
|
return UPRIGHT_RIGHT;
|
||||||
|
}
|
||||||
|
return upright;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e orientation)
|
bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e orientation)
|
||||||
{
|
{
|
||||||
|
/********************************************************************************
|
||||||
|
* IMPORTANT NOTE: See note about coordinate systems in find_point_placement()! *
|
||||||
|
********************************************************************************/
|
||||||
vertex_cache::scoped_state s(pp);
|
vertex_cache::scoped_state s(pp);
|
||||||
|
|
||||||
glyph_positions_ptr glyphs = boost::make_shared<glyph_positions>();
|
glyph_positions_ptr glyphs = boost::make_shared<glyph_positions>();
|
||||||
|
@ -334,12 +354,8 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
|
||||||
unsigned upside_down_glyph_count = 0;
|
unsigned upside_down_glyph_count = 0;
|
||||||
|
|
||||||
|
|
||||||
/* IMPORTANT NOTE: See note about coordinate systems in find_point_placement()! */
|
text_upright_e real_orientation = simplify_upright(orientation, pp.angle());
|
||||||
text_upright_e real_orientation = orientation;
|
|
||||||
if (orientation == UPRIGHT_AUTO)
|
|
||||||
{
|
|
||||||
real_orientation = (fabs(normalize_angle(pp.angle())) > 0.5*M_PI) ? UPRIGHT_LEFT : UPRIGHT_RIGHT;
|
|
||||||
}
|
|
||||||
double sign = (real_orientation == UPRIGHT_LEFT) ? -1 : 1;
|
double sign = (real_orientation == UPRIGHT_LEFT) ? -1 : 1;
|
||||||
double offset = alignment_offset().y + info_->properties.displacement.y * scale_factor_ + sign * layout_.height()/2.;
|
double offset = alignment_offset().y + info_->properties.displacement.y * scale_factor_ + sign * layout_.height()/2.;
|
||||||
|
|
||||||
|
@ -404,12 +420,20 @@ bool placement_finder::single_line_placement(vertex_cache &pp, text_upright_e or
|
||||||
//See comment above
|
//See comment above
|
||||||
offset -= sign * (*line_itr)->height()/2;
|
offset -= sign * (*line_itr)->height()/2;
|
||||||
}
|
}
|
||||||
if (orientation == UPRIGHT_AUTO && (upside_down_glyph_count > layout_.get_text().length()/2))
|
if (upside_down_glyph_count > layout_.get_text().length()/2)
|
||||||
|
{
|
||||||
|
if (orientation == UPRIGHT_AUTO)
|
||||||
{
|
{
|
||||||
//Try again with oposite orientation
|
//Try again with oposite orientation
|
||||||
s.restore();
|
s.restore();
|
||||||
return single_line_placement(pp, real_orientation == UPRIGHT_RIGHT ? UPRIGHT_LEFT : UPRIGHT_RIGHT);
|
return single_line_placement(pp, real_orientation == UPRIGHT_RIGHT ? UPRIGHT_LEFT : UPRIGHT_RIGHT);
|
||||||
}
|
}
|
||||||
|
//upright==left_only or right_only and more than 50% of characters upside down => no placement
|
||||||
|
if (orientation == UPRIGHT_LEFT_ONLY || orientation == UPRIGHT_RIGHT_ONLY)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
BOOST_FOREACH(box2d<double> bbox, bboxes)
|
BOOST_FOREACH(box2d<double> bbox, bboxes)
|
||||||
{
|
{
|
||||||
detector_.insert(bbox, layout_.get_text());
|
detector_.insert(bbox, layout_.get_text());
|
||||||
|
|
|
@ -89,6 +89,8 @@ static const char * text_upright_strings[] = {
|
||||||
"auto",
|
"auto",
|
||||||
"left",
|
"left",
|
||||||
"right",
|
"right",
|
||||||
|
"left_only",
|
||||||
|
"right_only",
|
||||||
""
|
""
|
||||||
};
|
};
|
||||||
IMPLEMENT_ENUM(text_upright_e, text_upright_strings)
|
IMPLEMENT_ENUM(text_upright_e, text_upright_strings)
|
||||||
|
|
39
tests/visual_tests/data/bug1532.osm
Normal file
39
tests/visual_tests/data/bug1532.osm
Normal file
|
@ -0,0 +1,39 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<osm version='0.6' upload='true' generator='JOSM'>
|
||||||
|
<node id='-106' action='modify' visible='true' lat='0.2614258628766519' lon='0.28436221472838974'>
|
||||||
|
<tag k='type' v='point' />
|
||||||
|
<tag k='wrap' v='no' />
|
||||||
|
</node>
|
||||||
|
<node id='-77' action='modify' visible='true' lat='0.22426115456321344' lon='0.7876650822675934' />
|
||||||
|
<node id='-76' action='modify' visible='true' lat='0.22552097681732494' lon='0.48404558019763577' />
|
||||||
|
<node id='-67' action='modify' visible='true' lat='0.3218970105980799' lon='0.7870351662881953' />
|
||||||
|
<node id='-66' action='modify' visible='true' lat='0.32315682259650147' lon='0.48341566421823756' />
|
||||||
|
<node id='-63' action='modify' visible='true' lat='0.2589062249349994' lon='0.1306627157552161'>
|
||||||
|
<tag k='type' v='point' />
|
||||||
|
<tag k='wrap' v='yes' />
|
||||||
|
</node>
|
||||||
|
<node id='-59' action='modify' visible='true' lat='0.38992738501365903' lon='0.012688551274111854' />
|
||||||
|
<node id='-57' action='modify' visible='true' lat='0.38808843986576325' lon='0.9063673051214256' />
|
||||||
|
<node id='-55' action='modify' visible='true' lat='0.1488697450798257' lon='0.9058750417159153' />
|
||||||
|
<node id='-54' action='modify' visible='true' lat='0.15070872632895005' lon='0.01219628786860134' />
|
||||||
|
<way id='-75' action='modify' visible='true'>
|
||||||
|
<nd ref='-76' />
|
||||||
|
<nd ref='-77' />
|
||||||
|
<tag k='type' v='line' />
|
||||||
|
<tag k='wrap' v='no' />
|
||||||
|
</way>
|
||||||
|
<way id='-68' action='modify' visible='true'>
|
||||||
|
<nd ref='-66' />
|
||||||
|
<nd ref='-67' />
|
||||||
|
<tag k='type' v='line' />
|
||||||
|
<tag k='wrap' v='yes' />
|
||||||
|
</way>
|
||||||
|
<way id='-56' action='modify' visible='true'>
|
||||||
|
<nd ref='-54' />
|
||||||
|
<nd ref='-55' />
|
||||||
|
<nd ref='-57' />
|
||||||
|
<nd ref='-59' />
|
||||||
|
<nd ref='-54' />
|
||||||
|
<tag k='type' v='boundary' />
|
||||||
|
</way>
|
||||||
|
</osm>
|
63
tests/visual_tests/data/bug1533.osm
Normal file
63
tests/visual_tests/data/bug1533.osm
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
<?xml version='1.0' encoding='UTF-8'?>
|
||||||
|
<osm version='0.6' upload='true' generator='JOSM'>
|
||||||
|
<node id='-374' action='modify' visible='true' lat='0.0686724638310369' lon='0.7038862570076257' />
|
||||||
|
<node id='-373' action='modify' visible='true' lat='0.06993229486822683' lon='0.6673511302025271' />
|
||||||
|
<node id='-367' action='modify' visible='true' lat='0.06363313935634328' lon='0.2843622147283897' />
|
||||||
|
<node id='-366' action='modify' visible='true' lat='0.06363313935634328' lon='0.250346751840884' />
|
||||||
|
<node id='-206' action='modify' visible='true' lat='-0.11453565911646134' lon='0.5480995047469907' />
|
||||||
|
<node id='-205' action='modify' visible='true' lat='0.18888875585009277' lon='0.5371560278163559' />
|
||||||
|
<node id='-181' action='modify' visible='true' lat='-0.11957497643332685' lon='0.3855811820622415' />
|
||||||
|
<node id='-180' action='modify' visible='true' lat='0.18384945467557984' lon='0.3746377051316065' />
|
||||||
|
<node id='-163' action='modify' visible='true' lat='0.06685200044593859' lon='0.8763046610034405' />
|
||||||
|
<node id='-162' action='modify' visible='true' lat='0.23679008943647523' lon='0.6246954179627523' />
|
||||||
|
<node id='-133' action='modify' visible='true' lat='0.24126789205602248' lon='0.30353263048300844' />
|
||||||
|
<node id='-132' action='modify' visible='true' lat='0.03717753224242952' lon='0.07873666907188823' />
|
||||||
|
<node id='-77' action='modify' visible='true' lat='0.3099287889371784' lon='0.8179010492787097' />
|
||||||
|
<node id='-76' action='modify' visible='true' lat='0.3111886023894954' lon='0.514281547208752' />
|
||||||
|
<node id='-67' action='modify' visible='true' lat='0.3105586956821123' lon='0.3750701157617382' />
|
||||||
|
<node id='-66' action='modify' visible='true' lat='0.3118185090592599' lon='0.07145061369178042' />
|
||||||
|
<node id='-59' action='modify' visible='true' lat='0.38970517055516746' lon='0.012910078084524709' />
|
||||||
|
<node id='-57' action='modify' visible='true' lat='0.3883099615915542' lon='0.9065895247230221' />
|
||||||
|
<node id='-55' action='modify' visible='true' lat='-0.21121932961473797' lon='0.9056535149055025' />
|
||||||
|
<node id='-54' action='modify' visible='true' lat='-0.20982409791135584' lon='0.011974068267005027' />
|
||||||
|
<way id='-372' action='modify' visible='true'>
|
||||||
|
<nd ref='-374' />
|
||||||
|
<nd ref='-373' />
|
||||||
|
</way>
|
||||||
|
<way id='-368' action='modify' visible='true'>
|
||||||
|
<nd ref='-366' />
|
||||||
|
<nd ref='-367' />
|
||||||
|
</way>
|
||||||
|
<way id='-204' action='modify' visible='true'>
|
||||||
|
<nd ref='-206' />
|
||||||
|
<nd ref='-205' />
|
||||||
|
</way>
|
||||||
|
<way id='-179' action='modify' visible='true'>
|
||||||
|
<nd ref='-180' />
|
||||||
|
<nd ref='-181' />
|
||||||
|
</way>
|
||||||
|
<way id='-161' action='modify' visible='true'>
|
||||||
|
<nd ref='-162' />
|
||||||
|
<nd ref='-163' />
|
||||||
|
</way>
|
||||||
|
<way id='-131' action='modify' visible='true'>
|
||||||
|
<nd ref='-132' />
|
||||||
|
<nd ref='-133' />
|
||||||
|
</way>
|
||||||
|
<way id='-75' action='modify' visible='true'>
|
||||||
|
<nd ref='-77' />
|
||||||
|
<nd ref='-76' />
|
||||||
|
</way>
|
||||||
|
<way id='-68' action='modify' visible='true'>
|
||||||
|
<nd ref='-66' />
|
||||||
|
<nd ref='-67' />
|
||||||
|
</way>
|
||||||
|
<way id='-56' action='modify' visible='true'>
|
||||||
|
<nd ref='-54' />
|
||||||
|
<nd ref='-55' />
|
||||||
|
<nd ref='-57' />
|
||||||
|
<nd ref='-59' />
|
||||||
|
<nd ref='-54' />
|
||||||
|
<tag k='type' v='boundary' />
|
||||||
|
</way>
|
||||||
|
</osm>
|
|
@ -0,0 +1,166 @@
|
||||||
|
{
|
||||||
|
"keys": [
|
||||||
|
"",
|
||||||
|
"-68",
|
||||||
|
"-75",
|
||||||
|
"-131",
|
||||||
|
"-161",
|
||||||
|
"-204",
|
||||||
|
"-179",
|
||||||
|
"-372",
|
||||||
|
"-368"
|
||||||
|
],
|
||||||
|
"data": {},
|
||||||
|
"grid": [
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ! ! # # ",
|
||||||
|
" ! !!! !!!! #### ############################## ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" $ ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" % ",
|
||||||
|
" $ %% ",
|
||||||
|
" $$ %% ",
|
||||||
|
" $ & % ",
|
||||||
|
" $ & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" ' & % ",
|
||||||
|
" $ ' & % ",
|
||||||
|
" $ ' % ",
|
||||||
|
" $ ' % ",
|
||||||
|
" $ ' % ",
|
||||||
|
" $ ' && %% ",
|
||||||
|
" $ '' %% ",
|
||||||
|
" $ ' % ",
|
||||||
|
" $$ ' % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ % ",
|
||||||
|
" $ (((( % ",
|
||||||
|
" $ )))))) ",
|
||||||
|
" $ ",
|
||||||
|
" $ & ",
|
||||||
|
" $ & ",
|
||||||
|
" $ & ",
|
||||||
|
" & ",
|
||||||
|
" & ",
|
||||||
|
" & ",
|
||||||
|
" & ",
|
||||||
|
" & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' & ",
|
||||||
|
" ' && ",
|
||||||
|
" ' ",
|
||||||
|
" ' ",
|
||||||
|
" ' ",
|
||||||
|
" ' ",
|
||||||
|
" ' ",
|
||||||
|
" ' ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" & ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" ",
|
||||||
|
" "
|
||||||
|
]
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 9.6 KiB |
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
Binary file not shown.
After Width: | Height: | Size: 23 KiB |
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
29
tests/visual_tests/styles/text-bug1533.xml
Normal file
29
tests/visual_tests/styles/text-bug1533.xml
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!DOCTYPE Map>
|
||||||
|
<!-- Minimal testcase for bug #1523. -->
|
||||||
|
<Map background-color="white" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
|
||||||
|
<Layer name="layer" srs="+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs">
|
||||||
|
<StyleName>My Style</StyleName>
|
||||||
|
<Datasource>
|
||||||
|
<Parameter name="type">osm</Parameter>
|
||||||
|
<Parameter name="file">../data/bug1533.osm</Parameter>
|
||||||
|
</Datasource>
|
||||||
|
</Layer>
|
||||||
|
|
||||||
|
<Style name="My Style">
|
||||||
|
<Rule>
|
||||||
|
<Filter>[type] != "boundary" and [mapnik::geometry_type]=linestring</Filter>
|
||||||
|
<LineSymbolizer stroke-width="1" stroke="red"/>
|
||||||
|
<MarkersSymbolizer file="shape://arrow" placement="line" transform="scale(.5,.5)"/>
|
||||||
|
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="right" dy="10" allow-overlap="true">"right: -->"</TextSymbolizer>
|
||||||
|
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="left" dy="-10" allow-overlap="true">"left: <--"</TextSymbolizer>
|
||||||
|
<TextSymbolizer face-name="DejaVu Sans Book" size="10" placement="line" upright="left_only" allow-overlap="true"
|
||||||
|
placement-type="list">"left only <--"
|
||||||
|
<Placement upright="right_only">"right only -->"</Placement>
|
||||||
|
<Placement upright="right_only">"-->"</Placement>
|
||||||
|
<Placement upright="left_only">"<--"</Placement>
|
||||||
|
</TextSymbolizer>
|
||||||
|
</Rule>
|
||||||
|
</Style>
|
||||||
|
|
||||||
|
</Map>
|
|
@ -75,6 +75,7 @@ text_tests = [
|
||||||
{'name': "jalign-auto", 'sizes': [(200, 200)],'bbox':default_text_box},
|
{'name': "jalign-auto", 'sizes': [(200, 200)],'bbox':default_text_box},
|
||||||
{'name': "line-offset", 'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)},
|
{'name': "line-offset", 'sizes':[(900, 250)],'bbox': mapnik.Box2d(-5.192, 50.189, -5.174, 50.195)},
|
||||||
{'name': "text-bug1532", 'sizes':[(600, 165)]},
|
{'name': "text-bug1532", 'sizes':[(600, 165)]},
|
||||||
|
{'name': "text-bug1533", 'sizes':[(600, 600)]},
|
||||||
]
|
]
|
||||||
|
|
||||||
tiff_tests = [
|
tiff_tests = [
|
||||||
|
|
Loading…
Reference in a new issue