[mapserver-commits] r10805 - trunk/mapserver

svn at osgeo.org svn at osgeo.org
Fri Dec 17 15:57:50 EST 2010


Author: assefa
Date: 2010-12-17 12:57:50 -0800 (Fri, 17 Dec 2010)
New Revision: 10805

Modified:
   trunk/mapserver/mapdraw.c
Log:
add possibility to use an alternative renderer #3616

Modified: trunk/mapserver/mapdraw.c
===================================================================
--- trunk/mapserver/mapdraw.c	2010-12-17 20:43:56 UTC (rev 10804)
+++ trunk/mapserver/mapdraw.c	2010-12-17 20:57:50 UTC (rev 10805)
@@ -672,9 +672,11 @@
 int msDrawLayer(mapObj *map, layerObj *layer, imageObj *image)
 {
   imageObj *image_draw = image;
-  outputFormatObj *transFormat = NULL;
+  outputFormatObj *transFormat = NULL, *altFormat=NULL;
   int retcode=MS_SUCCESS;
   int originalopacity = layer->opacity;
+  const char *alternativeFomatString = NULL;
+
   if(!msLayerIsVisible(map, layer))
     return MS_SUCCESS;  
 
@@ -687,7 +689,20 @@
   /* inform the rendering device that layer draw is starting. */
   msImageStartLayer(map, layer, image);
 
-  if (MS_RENDERER_PLUGIN(image_draw->format)) {
+  /*check if an alternative renderer should be used for this layer*/
+  alternativeFomatString = msLayerGetProcessingKey( layer, "RENDERER");
+  if (MS_RENDERER_PLUGIN(image_draw->format) && alternativeFomatString!=NULL && 
+      (altFormat=  msSelectOutputFormat(map, alternativeFomatString)))
+  {
+      rendererVTableObj *renderer=NULL; 
+      msInitializeRendererVTable(altFormat);
+
+      image_draw = msImageCreate(image->width, image->height,
+                                 altFormat, image->imagepath, image->imageurl, map->resolution, map->defresolution, &map->imagecolor);
+      renderer = MS_IMAGE_RENDERER(image_draw);
+      renderer->startLayer(image_draw,map,layer);
+  }
+  else if (MS_RENDERER_PLUGIN(image_draw->format)) {
 	    rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw);
 		if (layer->opacity > 0 && layer->opacity < 100) {
 			if (!renderer->supports_transparent_layers) {
@@ -723,7 +738,21 @@
     retcode = msDrawVectorLayer(map, layer, image_draw);
   }
 
-  if( image != image_draw) {
+  if (altFormat)
+  {
+      rendererVTableObj *renderer = MS_IMAGE_RENDERER(image);
+      rendererVTableObj *altrenderer = MS_IMAGE_RENDERER(image_draw);
+      rasterBufferObj rb;
+      memset(&rb,0,sizeof(rasterBufferObj));
+
+      altrenderer->endLayer(image_draw,map,layer);
+
+      altrenderer->getRasterBufferHandle(image_draw,&rb);
+      renderer->mergeRasterBuffer(image,&rb,layer->opacity*0.01,0,0,0,0,rb.width,rb.height);  
+      altrenderer->freeImage( image_draw );
+      
+  }
+  else if( image != image_draw) {
 	  rendererVTableObj *renderer = MS_IMAGE_RENDERER(image_draw);
 	  rasterBufferObj rb;
 	  memset(&rb,0,sizeof(rasterBufferObj));



More information about the mapserver-commits mailing list