Skip to content
Permalink
Browse files

Modify the graticule layer to store settings in a custom object inste…

…ad of layerinfo (#4913)
  • Loading branch information
szekerest committed Apr 27, 2014
1 parent 1d64d27 commit a5348b86b0b0c180ac0ae890747f7d1b3279ec23
Showing with 84 additions and 43 deletions.
  1. +41 −0 mapcopy.c
  2. +1 −1 mapdraw.c
  3. +30 −13 mapfile.c
  4. +11 −29 mapgraticule.c
  5. +1 −0 mapserver.h
@@ -631,6 +631,36 @@ int msCopyCluster(clusterObj *dst, clusterObj *src)
return MS_SUCCESS;
}

/***********************************************************************
* msCopyGrid() *
**********************************************************************/

int msCopyGrid(graticuleObj *dst, graticuleObj *src)
{
MS_COPYSTELEM(dwhichlatitude);
MS_COPYSTELEM(dwhichlongitude);
MS_COPYSTELEM(dstartlatitude);
MS_COPYSTELEM(dstartlongitude);
MS_COPYSTELEM(dendlatitude);
MS_COPYSTELEM(dendlongitude);
MS_COPYSTELEM(dincrementlatitude);
MS_COPYSTELEM(dincrementlongitude);
MS_COPYSTELEM(minarcs);
MS_COPYSTELEM(maxarcs);
MS_COPYSTELEM(minincrement);
MS_COPYSTELEM(maxincrement);
MS_COPYSTELEM(minsubdivides);
MS_COPYSTELEM(maxsubdivides);
MS_COPYSTELEM(bvertical);
MS_COPYSTELEM(blabelaxes);
MS_COPYSTELEM(ilabelstate);
MS_COPYSTELEM(ilabeltype);
MS_COPYRECT(&(dst->extent), &(src->extent));
MS_COPYSTRING(dst->labelformat, src->labelformat);

return MS_SUCCESS;
}

#ifdef why_on_earth_would_you_copy_a_labelcache

/***********************************************************************
@@ -1053,6 +1083,17 @@ int msCopyLayer(layerObj *dst, layerObj *src)
MS_COPYSTRING(dst->classgroup, src->classgroup);
MS_COPYSTRING(dst->mask, src->mask);

if (src->grid) {
if (dst->grid) {
freeGrid(dst->grid);
msFree(dst->grid);
}
dst->grid = (void *) malloc(sizeof(graticuleObj));
MS_CHECK_ALLOC(dst->grid, sizeof(graticuleObj), -1);
initGrid(dst->grid);
msCopyGrid(dst->grid, src->grid);
}

return MS_SUCCESS;
}

@@ -538,7 +538,7 @@ int msLayerIsVisible(mapObj *map, layerObj *layer)
{
int i;

if(!layer->data && !layer->tileindex && !layer->connection && !layer->features && !layer->layerinfo)
if(!layer->data && !layer->tileindex && !layer->connection && !layer->features && !layer->grid)
return(MS_FALSE); /* no data associated with this layer, not an error since layer may be used as a template from MapScript */

if(layer->type == MS_LAYER_QUERY || layer->type == MS_LAYER_TILEINDEX) return(MS_FALSE);
@@ -1029,6 +1029,13 @@ void initGrid( graticuleObj *pGraticule )
memset( pGraticule, 0, sizeof( graticuleObj ) );
}

void freeGrid( graticuleObj *pGraticule )
{
msFree(pGraticule->labelformat);
msFree(pGraticule->pboundingpoints);
msFree(pGraticule->pboundinglines);
}

static int loadGrid( layerObj *pLayer )
{
for(;;) {
@@ -1041,35 +1048,35 @@ static int loadGrid( layerObj *pLayer )
case(GRID):
break; /* for string loads */
case( LABELFORMAT ):
if(getString(&((graticuleObj *)pLayer->layerinfo)->labelformat) == MS_FAILURE) {
if(getString(&(pLayer->grid->labelformat)) == MS_FAILURE) {
if(strcasecmp(msyystring_buffer, "DD") == 0) /* DD triggers a symbol to be returned instead of a string so check for this special case */
((graticuleObj *)pLayer->layerinfo)->labelformat = msStrdup("DD");
pLayer->grid->labelformat = msStrdup("DD");
else
return(-1);
}
break;
case( MINARCS ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->minarcs) == -1)
if(getDouble(&(pLayer->grid->minarcs)) == -1)
return(-1);
break;
case( MAXARCS ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->maxarcs) == -1)
if(getDouble(&(pLayer->grid->maxarcs)) == -1)
return(-1);
break;
case( MININTERVAL ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->minincrement) == -1)
if(getDouble(&(pLayer->grid->minincrement)) == -1)
return(-1);
break;
case( MAXINTERVAL ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->maxincrement) == -1)
if(getDouble(&(pLayer->grid->maxincrement)) == -1)
return(-1);
break;
case( MINSUBDIVIDE ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->minsubdivides) == -1)
if(getDouble(&(pLayer->grid->minsubdivides)) == -1)
return(-1);
break;
case( MAXSUBDIVIDE ):
if(getDouble(&((graticuleObj *)pLayer->layerinfo)->maxsubdivides) == -1)
if(getDouble(&(pLayer->grid->maxsubdivides)) == -1)
return(-1);
break;
default:
@@ -3803,6 +3810,7 @@ int initLayer(layerObj *layer, mapObj *map)

layer->mask = NULL;
layer->maskimage = NULL;
layer->grid = NULL;

initExpression(&(layer->_geomtransform));
layer->_geomtransform.type = MS_GEOMTRANSFORM_NONE;
@@ -3932,6 +3940,11 @@ int freeLayer(layerObj *layer)
msFreeImage(layer->maskimage);
}

if (layer->grid) {
freeGrid(layer->grid);
msFree(layer->grid);
}

freeExpression(&(layer->utfdata));
msFree(layer->utfitem);

@@ -4216,10 +4229,14 @@ int loadLayer(layerObj *layer, mapObj *map)
break;
case(GRID):
layer->connectiontype = MS_GRATICULE;
layer->layerinfo = (void *) malloc(sizeof(graticuleObj));
MS_CHECK_ALLOC(layer->layerinfo, sizeof(graticuleObj), -1);
if (layer->grid) {
freeGrid(layer->grid);
msFree(layer->grid);
}
layer->grid = (void *) malloc(sizeof(graticuleObj));
MS_CHECK_ALLOC(layer->grid, sizeof(graticuleObj), -1);

initGrid((graticuleObj *) layer->layerinfo);
initGrid(layer->grid);
loadGrid(layer);
break;
case(GROUP):
@@ -4610,8 +4627,8 @@ static void writeLayer(FILE *stream, int indent, layerObj *layer)
for(i=0; i<layer->numjoins; i++) writeJoin(stream, indent, &(layer->joins[i]));
for(i=0; i<layer->numclasses; i++) writeClass(stream, indent, layer->class[i]);

if( layer->layerinfo && layer->connectiontype == MS_GRATICULE)
writeGrid(stream, indent, (graticuleObj *) layer->layerinfo);
if( layer->grid && layer->connectiontype == MS_GRATICULE)
writeGrid(stream, indent, layer->grid);
else {
current = layer->features;
while(current != NULL) {
@@ -67,7 +67,7 @@ int msGraticuleLayerInitItemInfo(layerObj *layer);
*/
int msGraticuleLayerOpen(layerObj *layer)
{
graticuleObj *pInfo = (graticuleObj *) layer->layerinfo;
graticuleObj *pInfo = layer->grid;

if( pInfo == NULL )
return MS_FAILURE;
@@ -115,7 +115,7 @@ int msGraticuleLayerOpen(layerObj *layer)
*/
int msGraticuleLayerIsOpen(layerObj *layer)
{
if(layer->layerinfo)
if(layer->grid)
return MS_TRUE;

return MS_FALSE;
@@ -127,26 +127,6 @@ int msGraticuleLayerIsOpen(layerObj *layer)
*/
int msGraticuleLayerClose(layerObj *layer)
{
graticuleObj *pInfo = (graticuleObj *) layer->layerinfo;

if( pInfo->labelformat ) {
free( pInfo->labelformat );
pInfo->labelformat = NULL;
}

if( pInfo->pboundingpoints ) {
free( pInfo->pboundingpoints );
pInfo->pboundingpoints = NULL;
}

if( pInfo->pboundinglines ) {
free( pInfo->pboundinglines );
pInfo->pboundinglines = NULL;
}

free(layer->layerinfo);
layer->layerinfo=NULL;

return MS_SUCCESS;
}

@@ -155,7 +135,7 @@ int msGraticuleLayerClose(layerObj *layer)
*/
int msGraticuleLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery)
{
graticuleObj *pInfo = (graticuleObj *) layer->layerinfo;
graticuleObj *pInfo = layer->grid;
int iAxisTickCount = 0;
rectObj rectMapCoordinates;

@@ -207,7 +187,9 @@ int msGraticuleLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery)
* These lines will be used when generating labels to get correct placement at arc/rect edge intersections.
*/
rectMapCoordinates = layer->map->extent;
msFree(pInfo->pboundinglines);
pInfo->pboundinglines = (lineObj *) msSmallMalloc( sizeof( lineObj ) * 4 );
msFree(pInfo->pboundingpoints);
pInfo->pboundingpoints = (pointObj *) msSmallMalloc( sizeof( pointObj ) * 8 );

{
@@ -289,7 +271,7 @@ int msGraticuleLayerWhichShapes(layerObj *layer, rectObj rect, int isQuery)
*/
int msGraticuleLayerNextShape(layerObj *layer, shapeObj *shape)
{
graticuleObj *pInfo = (graticuleObj *) layer->layerinfo;
graticuleObj *pInfo = layer->grid;

if( pInfo->minsubdivides <= 0.0 || pInfo->maxsubdivides <= 0.0 )
pInfo->minsubdivides = pInfo->maxsubdivides = MAPGRATICULE_ARC_SUBDIVISION_DEFAULT;
@@ -535,7 +517,7 @@ int msGraticuleLayerGetShape(layerObj *layer, shapeObj *shape, resultObj *record
*/
int msGraticuleLayerGetExtent(layerObj *layer, rectObj *extent)
{
graticuleObj *pInfo = (graticuleObj *) layer->layerinfo;
graticuleObj *pInfo = layer->grid;

if(pInfo) {
*extent = pInfo->extent;
@@ -638,7 +620,7 @@ graticuleIntersectionObj *msGraticuleLayerGetIntersectionPoints(mapObj *map,
if (layer->connectiontype != MS_GRATICULE)
return NULL;

pInfo = (graticuleObj *) layer->layerinfo;
pInfo = layer->grid;

/*set cellsize if bnot already set*/
if (map->cellsize == 0)
@@ -1009,7 +991,7 @@ int msGraticuleLayerInitializeVirtualTable(layerObj *layer)
*/
static void _FormatLabel( layerObj *pLayer, shapeObj *pShape, double dDataToFormat )
{
graticuleObj *pInfo = (graticuleObj *) pLayer->layerinfo;
graticuleObj *pInfo = pLayer->grid;
char cBuffer[32];
int iDegrees, iMinutes;

@@ -1044,14 +1026,14 @@ static void _FormatLabel( layerObj *pLayer, shapeObj *pShape, double dDataToForm
*/
static int _AdjustLabelPosition( layerObj *pLayer, shapeObj *pShape, msGraticulePosition ePosition )
{
graticuleObj *pInfo = (graticuleObj *) pLayer->layerinfo;
graticuleObj *pInfo = pLayer->grid;
rectObj rectLabel;
pointObj ptPoint;
double size = -1;
char *labeltxt;

if( pInfo == NULL || pShape == NULL ) {
msSetError(MS_MISCERR, "Assertion failed: Null shape or layerinfo!, ", "_AdjustLabelPosition()");
msSetError(MS_MISCERR, "Assertion failed: Null shape or non-configured grid!, ", "_AdjustLabelPosition()");
return MS_FAILURE;
}

@@ -1697,6 +1697,7 @@ extern "C" {

#ifndef SWIG
imageObj *maskimage;
graticuleObj* grid;
#endif
char *mask;

0 comments on commit a5348b8

Please sign in to comment.
You can’t perform that action at this time.