Hi,
While testing plplot 5.11.1 with a map with polygons on Windows my
application terminated due to a call to plabort. It was caused by
calling plfill with n < 3. I investigated further on my Debian Stable
system with a recent version of master [d71e48]. The bug is still
present in this version.
Attached a modified x19.cc which calls plabort when drawing the map. In
order to do so I replaced the cglobe.sh? files with the files in this
archive [1] (854.21 KB). The first plot is fine, the seconds calls plabort.
I added a proof-of-concept fix, which also cleans up the duplicate tests
in the if statements in drawmapdata. I'm not convinced this is the right
approach. I still see glitches, but I'm not sure whether they are all
caused by fact lines at the left hand side of the plot are sometimes
omitted.
[1]
http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/50m/cultural/ne_50m_admin_0_countries_lakes.zip
Regards,
Mark de Wever
diff --git a/src/plmap.c b/src/plmap.c
index 4030512..a175e8d 100644
--- a/src/plmap.c
+++ b/src/plmap.c
@@ -149,17 +149,13 @@ drawmapdata( PLMAPFORM_callback mapform, int shapetype, PLINT n, PLFLT *x, PLFLT
if ( mapform != NULL )
( *mapform )( n, x, y );
- if ( shapetype == SHPT_ARC )
- plline( n, x, y );
- else if ( shapetype == SHPT_POINT )
- for ( i = 0; i < n; ++i )
- plptex( x[i], y[i], dx, dy, just, text );
- else if ( shapetype == SHPT_POLYGON )
- plfill( n, x, y );
- else if ( shapetype == SHPT_ARCZ || shapetype == SHPT_ARCM )
+ if ( shapetype == SHPT_ARC || shapetype == SHPT_ARCZ || shapetype == SHPT_ARCM )
plline( n, x, y );
else if ( shapetype == SHPT_POLYGON || shapetype == SHPT_POLYGONZ || shapetype == SHPT_POLYGONM )
- plfill( n, x, y );
+ if ( n == 2 )
+ plline( n, x, y );
+ else
+ plfill( n, x, y );
else if ( shapetype == SHPT_POINT || shapetype == SHPT_POINTM || shapetype == SHPT_POINTZ )
for ( i = 0; i < n; ++i )
plptex( x[i], y[i], dx, dy, just, text );
//--------------------------------------------------------------------------
// $Id: x19.cc 12532 2013-09-26 15:18:37Z andrewross $
//--------------------------------------------------------------------------
//
//--------------------------------------------------------------------------
// Copyright (C) 2004 Andrew Ross
// Copyright (C) 2004 Alan W. Irwin
//
// This file is part of PLplot.
//
// PLplot is free software; you can redistribute it and/or modify
// it under the terms of the GNU Library General Public License as published by
// the Free Software Foundation; version 2 of the License.
//
// PLplot 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 Library General Public License for more details.
//
// You should have received a copy of the GNU Library General Public License
// along with PLplot; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
//--------------------------------------------------------------------------
//
//--------------------------------------------------------------------------
// Implementation of PLplot example 19 in C++.
//--------------------------------------------------------------------------
#include "plc++demos.h"
#ifdef PL_USE_NAMESPACE
using namespace std;
#endif
class x19 {
public:
x19( int, char ** );
private:
// Class data
plstream *pls;
};
void
map_transform( PLFLT x, PLFLT y, PLFLT *xt, PLFLT *yt, PLPointer /* data */ )
{
PLFLT radius;
radius = 90.0 - y;
*xt = radius * cos( x * M_PI / 180.0 );
*yt = radius * sin( x * M_PI / 180.0 );
}
//--------------------------------------------------------------------------
// mapform19
//
// Defines specific coordinate transformation for example 19.
// Not to be confused with mapform in src/plmap.c.
// x[], y[] are the coordinates to be plotted.
//--------------------------------------------------------------------------
void
mapform19( PLINT n, PLFLT *x, PLFLT *y )
{
int i;
PLFLT xp, yp, radius;
for ( i = 0; i < n; i++ )
{
radius = 90.0 - y[i];
xp = radius * cos( x[i] * M_PI / 180.0 );
yp = radius * sin( x[i] * M_PI / 180.0 );
x[i] = xp;
y[i] = yp;
}
}
// "Normalize" longitude values so that they always fall between -180.0 and
// 180.0
PLFLT
normalize_longitude( PLFLT lon )
{
PLFLT times;
if ( lon >= -180.0 && lon <= 180.0 )
{
return ( lon );
}
else
{
times = floor( ( fabs( lon ) + 180.0 ) / 360.0 );
if ( lon < 0.0 )
{
return ( lon + 360.0 * times );
}
else
{
return ( lon - 360.0 * times );
}
}
}
// A custom axis labeling function for longitudes and latitudes.
void
geolocation_labeler( PLINT axis, PLFLT value, char *label, PLINT length,
PLPointer /* data */ )
{
const char *direction_label = "";
PLFLT label_val = 0.0;
if ( axis == PL_Y_AXIS )
{
label_val = value;
if ( label_val > 0.0 )
{
direction_label = " N";
}
else if ( label_val < 0.0 )
{
direction_label = " S";
}
else
{
direction_label = "Eq";
}
}
else if ( axis == PL_X_AXIS )
{
label_val = normalize_longitude( value );
if ( label_val > 0.0 )
{
direction_label = " E";
}
else if ( label_val < 0.0 )
{
direction_label = " W";
}
else
{
direction_label = "";
}
}
if ( axis == PL_Y_AXIS && value == 0.0 )
{
// A special case for the equator
snprintf( label, length, "%s", direction_label );
}
else
{
snprintf( label, length, "%.0f%s", fabs( label_val ), direction_label );
}
}
x19::x19( int argc, char ** argv )
{
PLFLT minx, maxx, miny, maxy;
pls = new plstream();
pls->parseopts( &argc, argv, PL_PARSE_FULL );
pls->init();
pls->col0( 1 );
pls->slabelfunc( geolocation_labeler, NULL );
miny = -90;
maxy = 90;
minx = -120;
maxx = 238;
pls->env( minx, maxx, miny, maxy, 1, 70 );
pls->map( NULL, "cglobe", minx, maxx, miny, maxy );
// Shift Abort
minx += 20;
maxx += 20;
pls->env( minx, maxx, miny, maxy, 1, 70 );
pls->map( NULL, "cglobe", minx, maxx, miny, maxy );
delete pls;
}
int main( int argc, char ** argv )
{
x19 *x = new x19( argc, argv );
delete x;
}
//--------------------------------------------------------------------------
// End of x19.cc
//--------------------------------------------------------------------------
------------------------------------------------------------------------------
_______________________________________________
Plplot-devel mailing list
Plplot-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/plplot-devel