Skip to content

Commit

Permalink
Fix for issue #3834
Browse files Browse the repository at this point in the history
  • Loading branch information
szekerest committed Sep 3, 2014
1 parent 5b9f95d commit 4549f89
Show file tree
Hide file tree
Showing 5 changed files with 38 additions and 54 deletions.
30 changes: 0 additions & 30 deletions mapdraw.c
Expand Up @@ -742,21 +742,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 @@ -825,21 +810,6 @@ int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image)
altrenderer->getRasterBufferHandle(image_draw,&rb);
renderer->mergeRasterBuffer(image,&rb,layer->opacity*0.01,0,0,0,0,rb.width,rb.height);

/*
* 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() */
Expand Down
17 changes: 2 additions & 15 deletions maplegend.c
Expand Up @@ -281,21 +281,7 @@ int msDrawLegendIcon(mapObj *map, layerObj *lp, classObj *theclass,

altrenderer->getRasterBufferHandle(image_draw,&rb);
renderer->mergeRasterBuffer(image,&rb,lp->opacity*0.01,0,0,0,0,rb.width,rb.height);
/*
* 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);

} else if(image != image_draw) {
Expand Down Expand Up @@ -691,6 +677,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 @@ -480,7 +480,13 @@ int msDrawLineSymbol(symbolSetObj *symbolset, imageObj *image, shapeObj *p,

symbol = 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 @@ -630,8 +636,13 @@ int msDrawShadeSymbol(symbolSetObj *symbolset, imageObj *image, shapeObj *p, sty
shapeObj *offsetPolygon = NULL;
symbolObj *symbol = symbolset->symbol[style->symbol];
/* 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==-99)
Expand Down Expand Up @@ -799,7 +810,13 @@ int msDrawMarkerSymbol(symbolSetObj *symbolset,imageObj *image, pointObj *p, sty
double p_x,p_y;
symbolObj *symbol = 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;
}
switch (symbol->type) {
case (MS_SYMBOL_TRUETYPE): {
if (!symbol->full_font_path)
Expand Down
15 changes: 11 additions & 4 deletions mapsymbol.c
Expand Up @@ -112,6 +112,7 @@ void initSymbol(symbolObj *s)
s->filled = MS_FALSE;
s->numpoints=0;
s->renderer=NULL;
s->renderer_free_func=NULL;
s->renderer_cache = NULL;
s->pixmap_buffer=NULL;
s->imagepath = NULL;
Expand All @@ -136,9 +137,9 @@ int msFreeSymbol(symbolObj *s)
}

if(s->name) free(s->name);
if(s->renderer!=NULL) {
s->renderer->freeSymbol(s);
}
if(s->renderer_free_func)
s->renderer_free_func(s);

if(s->pixmap_buffer) {
msFreeRasterBuffer(s->pixmap_buffer);
free(s->pixmap_buffer);
Expand Down Expand Up @@ -837,7 +838,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
7 changes: 5 additions & 2 deletions mapsymbol.h
Expand Up @@ -154,7 +154,9 @@ struct imageCacheObj {
#endif /* SWIG */


typedef struct {
typedef struct tag_symbolObj symbolObj;

typedef struct tag_symbolObj{
char *name;
int type;
int inmapfile; /* boolean value for writing */
Expand Down Expand Up @@ -191,7 +193,8 @@ typedef struct {
** 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;
char *full_font_path;
Expand Down

0 comments on commit 4549f89

Please sign in to comment.