Skip to content

Commit

Permalink
Use renderer_free_func instead of renderer->freeSymbol to call the re…
Browse files Browse the repository at this point in the history
…nderer specific cleanup code (MapServer#3834)
  • Loading branch information
szekerest committed Sep 8, 2014
1 parent 642f5e7 commit 6a67c37
Show file tree
Hide file tree
Showing 7 changed files with 29 additions and 84 deletions.
30 changes: 0 additions & 30 deletions mapdraw.c
Expand Up @@ -674,21 +674,6 @@ int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image)
if(retcode != MS_SUCCESS) {
return MS_FAILURE;
}
/*
* hack to work around bug #3834: if we have use an alternate renderer, the symbolset may contain
* symbols that reference it. We want to remove those references before the altFormat is destroyed
* to avoid a segfault and/or a leak, and so the the main renderer doesn't pick the cache up thinking
* it's for him.
*/
for(i=0; i<map->symbolset.numsymbols; i++) {
if (map->symbolset.symbol[i]!=NULL) {
symbolObj *s = map->symbolset.symbol[i];
if(s->renderer == MS_IMAGE_RENDERER(maskLayer->maskimage)) {
MS_IMAGE_RENDERER(maskLayer->maskimage)->freeSymbol(s);
s->renderer = NULL;
}
}
}
/* set the imagetype from the original outputformat back (it was removed by msSelectOutputFormat() */
msFree(map->imagetype);
map->imagetype = msStrdup(image->format->name);
Expand Down Expand Up @@ -767,21 +752,6 @@ int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image)
}

altformat_cleanup:
/*
* hack to work around bug #3834: if we have use an alternate renderer, the symbolset may contain
* symbols that reference it. We want to remove those references before the altFormat is destroyed
* to avoid a segfault and/or a leak, and so the the main renderer doesn't pick the cache up thinking
* it's for him.
*/
for(i=0; i<map->symbolset.numsymbols; i++) {
if (map->symbolset.symbol[i]!=NULL) {
symbolObj *s = map->symbolset.symbol[i];
if(s->renderer == altrenderer) {
altrenderer->freeSymbol(s);
s->renderer = NULL;
}
}
}
msFreeImage(image_draw);
/* set the imagetype from the original outputformat back (it was removed by msSelectOutputFormat() */
msFree(map->imagetype);
Expand Down
16 changes: 1 addition & 15 deletions maplegend.c
Expand Up @@ -341,21 +341,6 @@ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass,
if(UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup;
ret = renderer->mergeRasterBuffer(image,&rb,lp->opacity*0.01,0,0,0,0,rb.width,rb.height);
if(UNLIKELY(ret == MS_FAILURE)) goto legend_icon_cleanup;
/*
* hack to work around bug #3834: if we have use an alternate renderer, the symbolset may contain
* symbols that reference it. We want to remove those references before the altFormat is destroyed
* to avoid a segfault and/or a leak, and so the the main renderer doesn't pick the cache up thinking
* it's for him.
*/
for(i=0; i<map->symbolset.numsymbols; i++) {
if (map->symbolset.symbol[i]!=NULL) {
symbolObj *s = map->symbolset.symbol[i];
if(s->renderer == altrenderer) {
altrenderer->freeSymbol(s);
s->renderer = NULL;
}
}
}

} else if(image != image_draw) {
rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw);
Expand Down Expand Up @@ -766,6 +751,7 @@ int msEmbedLegend(mapObj *map, imageObj *img)
if(MS_SUCCESS != renderer->getRasterBufferCopy(image,legendSymbol->pixmap_buffer))
return MS_FAILURE;
legendSymbol->renderer = renderer;
legendSymbol->renderer_free_func = renderer->freeSymbol;

msFreeImage( image );

Expand Down
23 changes: 20 additions & 3 deletions maprendering.c
Expand Up @@ -573,7 +573,13 @@ int msDrawLineSymbol(mapObj *map, imageObj *image, shapeObj *p,

symbol = map->symbolset.symbol[style->symbol];
/* store a reference to the renderer to be used for freeing */
symbol->renderer = renderer;
if (symbol->renderer != renderer) {
symbol->renderer = renderer;
if (symbol->renderer_free_func)
symbol->renderer_free_func(symbol);

symbol->renderer_free_func = renderer->freeSymbol;
}

width = style->width * scalefactor;
width = MS_MIN(width,style->maxwidth*image->resolutionfactor);
Expand Down Expand Up @@ -708,8 +714,13 @@ int msDrawShadeSymbol(mapObj *map, imageObj *image, shapeObj *p, styleObj *style
rendererVTableObj *renderer = image->format->vtable;
shapeObj *offsetPolygon = NULL;
/* store a reference to the renderer to be used for freeing */
if(style->symbol)
if(style->symbol && symbol->renderer != renderer) {
symbol->renderer = renderer;
if(symbol->renderer_free_func)
symbol->renderer_free_func(symbol);

symbol->renderer_free_func = renderer->freeSymbol;
}

if (style->offsetx != 0 || style->offsety != 0) {
if(style->offsety==MS_STYLE_SINGLE_SIDED_OFFSET) {
Expand Down Expand Up @@ -847,7 +858,13 @@ int msDrawMarkerSymbol(mapObj *map, imageObj *image, pointObj *p, styleObj *styl
double p_x,p_y;
symbolObj *symbol = map->symbolset.symbol[style->symbol];
/* store a reference to the renderer to be used for freeing */
symbol->renderer = renderer;
if (symbol->renderer != renderer) {
symbol->renderer = renderer;
if (symbol->renderer_free_func)
symbol->renderer_free_func(symbol);

symbol->renderer_free_func = renderer->freeSymbol;
}
if(preloadSymbol(&map->symbolset,symbol,renderer) != MS_SUCCESS) {
return MS_FAILURE;
}
Expand Down
12 changes: 7 additions & 5 deletions mapsymbol.c
Expand Up @@ -136,10 +136,6 @@ int msFreeSymbol(symbolObj *s)
if(s->name) free(s->name);
if(s->renderer_free_func) {
s->renderer_free_func(s);
} else {
if(s->renderer!=NULL) {
s->renderer->freeSymbol(s);
}
}
if(s->pixmap_buffer) {
msFreeRasterBuffer(s->pixmap_buffer);
Expand Down Expand Up @@ -868,7 +864,13 @@ int msPreloadImageSymbol(rendererVTableObj *renderer, symbolObj *symbol)
symbol->pixmap_buffer = NULL;
return MS_FAILURE;
}
symbol->renderer = renderer;
if (symbol->renderer != renderer) {
symbol->renderer = renderer;
if (symbol->renderer_free_func)
symbol->renderer_free_func(symbol);

symbol->renderer_free_func = renderer->freeSymbol;
}
symbol->sizex = symbol->pixmap_buffer->width;
symbol->sizey = symbol->pixmap_buffer->height;
return MS_SUCCESS;
Expand Down
2 changes: 1 addition & 1 deletion mapsymbol.h
Expand Up @@ -182,7 +182,7 @@ struct symbolObj{
** MS_SYMBOL_PIXMAP options
*/
#ifndef SWIG
rendererVTableObj *renderer;
rendererVTableObj *renderer; /* should not be used to access vtable just to identify the renderer */
void (*renderer_free_func)(symbolObj *self);
rasterBufferObj *pixmap_buffer;
void *renderer_cache;
Expand Down
15 changes: 0 additions & 15 deletions mapwcs.c
Expand Up @@ -1955,21 +1955,6 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage()", par
map->imagetype = origImageType;
return msWCSException(map, NULL, NULL, params->version );
}
/*
* hack to work around bug #3834: if we have use an alternate renderer, the symbolset may contain
* symbols that reference it. We want to remove those references before the altFormat is destroyed
* to avoid a segfault and/or a leak, and so the the main renderer doesn't pick the cache up thinking
* it's for him.
*/
for(i=0; i<map->symbolset.numsymbols; i++) {
if (map->symbolset.symbol[i]!=NULL) {
symbolObj *s = map->symbolset.symbol[i];
if(s->renderer == MS_IMAGE_RENDERER(maskLayer->maskimage)) {
MS_IMAGE_RENDERER(maskLayer->maskimage)->freeSymbol(s);
s->renderer = NULL;
}
}
}
/* set the imagetype from the original outputformat back (it was removed by msSelectOutputFormat() */
msFree(map->imagetype);
map->imagetype = origImageType;
Expand Down
15 changes: 0 additions & 15 deletions mapwcs20.c
Expand Up @@ -4526,21 +4526,6 @@ this request. Check wcs/ows_enable_request settings.", "msWCSGetCoverage20()", p
msWCSClearCoverageMetadata20(&cm);
return msWCSException(map, NULL, NULL, params->version);
}
/*
* hack to work around bug #3834: if we have use an alternate renderer, the symbolset may contain
* symbols that reference it. We want to remove those references before the altFormat is destroyed
* to avoid a segfault and/or a leak, and so the the main renderer doesn't pick the cache up thinking
* it's for him.
*/
for(i=0; i<map->symbolset.numsymbols; i++) {
if (map->symbolset.symbol[i]!=NULL) {
symbolObj *s = map->symbolset.symbol[i];
if(s->renderer == MS_IMAGE_RENDERER(maskLayer->maskimage)) {
MS_IMAGE_RENDERER(maskLayer->maskimage)->freeSymbol(s);
s->renderer = NULL;
}
}
}
/* set the imagetype from the original outputformat back (it was removed by msSelectOutputFormat() */
msFree(map->imagetype);
map->imagetype = origImageType;
Expand Down

0 comments on commit 6a67c37

Please sign in to comment.