[mapserver-dev] MapCache: improvements/changes
Daniele Debernardi
daniele at geosar.ch
Fri Feb 1 08:58:22 PST 2013
Hi,
after using the apache module mapCache, I had to do some changes to the
code to fit best my needs.
I would like to share my considerations on some behavior:
1) when you request a tile outside the extension of the tileset, you get
the error.
with the configuration of the errors as empty_img it returns an empty
image but the http response code was annoying, so I changed it
to a response code of 200 and the browser will not log all the errors.
file lib/core.c around line ~600
...
} else if(ctx->config && ctx->config->reporting ==
MAPCACHE_REPORT_EMPTY_IMG) {
response->data = ctx->config->empty_image;
response->code = 200; //set response code
apr_table_set(response->headers, "Content-Type",
ctx->config->default_image_format->mime_type);
apr_table_set(response->headers, "X-Mapcache-Error", msg);
} else if(ctx->config && ctx->config->reporting ==
MAPCACHE_REPORT_ERROR_IMG) {
...
2) configuring the mapcache with a jpeg output format, when I request a
tile that is half-in and half-out the extension of
the tileset, the half-out image had a black background, as I use maps
with a white background, I changed it using the alpha channel
to determine which part to change to white.
file lib/imageio_jpeg.c around line ~195
...
rowdata =
(JSAMPLE*)malloc(img->w*cinfo.input_components*sizeof(JSAMPLE));
for(row=0; row<img->h; row++) {
JSAMPLE *pixptr = rowdata;
int col;
unsigned char *r,*g,*b,*alpha;
r=&(img->data[2])+row*img->stride;
g=&(img->data[1])+row*img->stride;
b=&(img->data[0])+row*img->stride;
alpha= &(img->data[3])+row*img->stride;
for(col=0; col<img->w; col++) {
if (*alpha == 255) {
*(pixptr++) = *r;
*(pixptr++) = *g;
*(pixptr++) = *b;
} else {
*(pixptr++) = 255;
*(pixptr++) = 255;
*(pixptr++) = 255;
}
r+=4;
g+=4;
b+=4;
alpha+=4;
}
(void) jpeg_write_scanlines(&cinfo, &rowdata, 1);
}
...
3) requesting images as png to maintain transparency, I had some trouble
with the default image format which was JPEG,
this because in the code, the default format is get by dont know what
and by default was jpeg.
I suggest to change it to take the default format specified in the
mapcache xml configuration.
file lib/core.c around line ~400
...
if(basemap->raw_image) {
//remove this line and get image format from configuration xml
//format = req_map->getmap_format; /* always defined, defaults to
JPEG */
format = ctx->config->default_image_format;
response->data = format->write(ctx,basemap->raw_image,format);
if(GC_HAS_ERROR(ctx)) {
return NULL;
}
} else {
...
I would like to know what you guys think of my changes.
Best regards,
Daniele
More information about the mapserver-dev
mailing list