Index: mapfile.c
===================================================================
--- mapfile.c	(revision 6216)
+++ mapfile.c	(working copy)
@@ -65,7 +65,7 @@
 ** Must be kept in sync with enumerations and defines found in map.h.
 */
 static char *msUnits[8]={"INCHES", "FEET", "MILES", "METERS", "KILOMETERS", "DD", "PIXELS", "PERCENTAGES"};
-static char *msLayerTypes[8]={"POINT", "LINE", "POLYGON", "RASTER", "ANNOTATION", "QUERY", "CIRCLE", "TILEINDEX"};
+static char *msLayerTypes[9]={"POINT", "LINE", "POLYGON", "RASTER", "ANNOTATION", "QUERY", "CIRCLE", "TILEINDEX","CHART"};
 char *msPositionsText[MS_POSITIONS_LENGTH] = {"UL", "LR", "UR", "LL", "CR", "CL", "UC", "LC", "CC", "AUTO", "XY", "FOLLOW"}; /* msLabelPositions[] also used in mapsymbols.c (not static) */
 static char *msBitmapFontSizes[5]={"TINY", "SMALL", "MEDIUM", "LARGE", "GIANT"};
 static char *msQueryMapStyles[4]={"NORMAL", "HILITE", "SELECTED", "INVERTED"};
@@ -2777,7 +2777,7 @@
       if((layer->transform = getSymbol(11, MS_TRUE,MS_FALSE, MS_UL,MS_UC,MS_UR,MS_CL,MS_CC,MS_CR,MS_LL,MS_LC,MS_LR)) == -1) return(-1);
       break;
     case(TYPE):
-      if((layer->type = getSymbol(8, MS_LAYER_POINT,MS_LAYER_LINE,MS_LAYER_RASTER,MS_LAYER_POLYGON,MS_LAYER_ANNOTATION,MS_LAYER_QUERY,MS_LAYER_CIRCLE,TILEINDEX)) == -1) return(-1);
+      if((layer->type = getSymbol(9, MS_LAYER_POINT,MS_LAYER_LINE,MS_LAYER_RASTER,MS_LAYER_POLYGON,MS_LAYER_ANNOTATION,MS_LAYER_QUERY,MS_LAYER_CIRCLE,MS_LAYER_CHART,TILEINDEX)) == -1) return(-1);
       if(layer->type == TILEINDEX) layer->type = MS_LAYER_TILEINDEX; /* TILEINDEX is also a parameter */
       break;    
     case(UNITS):
Index: mappostgis.c
===================================================================
--- mappostgis.c	(revision 6216)
+++ mappostgis.c	(working copy)
@@ -1058,6 +1058,7 @@
                     break;
 
                 case MS_LAYER_POLYGON:
+					 case MS_LAYER_CHART:
                     result = force_to_polygons(wkb, shape);
                     break;
 
@@ -1252,6 +1253,7 @@
         wkb = (char *) PQgetvalue(query_result, 0, layer->numitems);  
         /* layer->numitems is the wkt column */
         switch(layer->type) {
+		  		case MS_LAYER_CHART:
             case MS_LAYER_POINT:
                 result = force_to_points(wkb, shape);
                 break;
Index: mapmygis.c
===================================================================
--- mapmygis.c	(revision 6216)
+++ mapmygis.c	(working copy)
@@ -1362,6 +1362,7 @@
 						wkb_force_to_lines(wkb, shape) :
 						force_to_lines(row, layerinfo->query_result, shape, record);
 					break;
+				case MS_LAYER_CHART:
 				case MS_LAYER_POLYGON:
 					result = wkbdata ?
 						wkb_force_to_polygons(wkb, shape) :
Index: map.h
===================================================================
--- map.h	(revision 6216)
+++ map.h	(working copy)
@@ -320,7 +320,7 @@
 enum MS_FILE_TYPE {MS_FILE_MAP, MS_FILE_SYMBOL};
 enum MS_UNITS {MS_INCHES, MS_FEET, MS_MILES, MS_METERS, MS_KILOMETERS, MS_DD, MS_PIXELS, MS_PERCENTAGES};
 enum MS_SHAPE_TYPE {MS_SHAPE_POINT, MS_SHAPE_LINE, MS_SHAPE_POLYGON, MS_SHAPE_NULL};
-enum MS_LAYER_TYPE {MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_POLYGON, MS_LAYER_RASTER, MS_LAYER_ANNOTATION, MS_LAYER_QUERY, MS_LAYER_CIRCLE, MS_LAYER_TILEINDEX};
+enum MS_LAYER_TYPE {MS_LAYER_POINT, MS_LAYER_LINE, MS_LAYER_POLYGON, MS_LAYER_RASTER, MS_LAYER_ANNOTATION, MS_LAYER_QUERY, MS_LAYER_CIRCLE, MS_LAYER_TILEINDEX, MS_LAYER_CHART};
 enum MS_FONT_TYPE {MS_TRUETYPE, MS_BITMAP};
 
 #define MS_POSITIONS_LENGTH 12
@@ -1777,6 +1777,10 @@
 MS_DLL_EXPORT int *msGetGDALBandList( layerObj *layer, void *hDS, int max_bands, int *band_count );
 MS_DLL_EXPORT double msGetGDALNoDataValue( layerObj *layer, void *hBand, int *pbGotNoData );
 
+/* in mapchart.c */
+MS_DLL_EXPORT int msDrawChartLayer(mapObj *map, layerObj *layer, imageObj *image);
+MS_DLL_EXPORT int msDrawChartLayerGD(mapObj *map, layerObj *layer, imageObj *image);
+
 /* ==================================================================== */
 /*      End of prototypes for functions in mapgd.c                      */
 /* ==================================================================== */
Index: Makefile.in
===================================================================
--- Makefile.in	(revision 6216)
+++ Makefile.in	(working copy)
@@ -241,7 +241,7 @@
 
 RM= /bin/rm -f
 
-OBJS= maptemplate.o mapbits.o maphash.o mapshape.o mapxbase.o mapparser.o maplexer.o maptree.o mapsearch.o mapstring.o mapsymbol.o mapfile.o maplegend.o maputil.o mapscale.o mapquery.o maplabel.o maperror.o mapprimitive.o mapproject.o mapraster.o mapsde.o mapogr.o mappostgis.o mapmygis.o maplayer.o mapresample.o mapwms.o mapwmslayer.o maporaclespatial.o mapgml.o mapprojhack.o mapthread.o mapdraw.o mapgd.o mapagg.o mapoutput.o mapgdal.o mapswf.o mapimagemap.o mapows.o mapwfs.o mapwfslayer.o mapcontext.o maphttp.o mapdrawgdal.o mappdf.o mapjoin.o mapgraticule.o mapcopy.o mapogcfilter.o mapogcsld.o maptime.o mapwcs.o mapcpl.o cgiutil.o maprasterquery.o mapobject.o mapgeos.o classobject.o layerobject.o mapio.o mappool.o mapsvg.o mapregex.o mappluginlayer.o mapogcsos.o mappostgresql.o mapcrypto.o mapowscommon.o $(EPPL_OBJ) 
+OBJS= maptemplate.o mapbits.o maphash.o mapshape.o mapxbase.o mapparser.o maplexer.o maptree.o mapsearch.o mapstring.o mapsymbol.o mapfile.o maplegend.o maputil.o mapscale.o mapquery.o maplabel.o maperror.o mapprimitive.o mapproject.o mapraster.o mapsde.o mapogr.o mappostgis.o mapmygis.o maplayer.o mapresample.o mapwms.o mapwmslayer.o maporaclespatial.o mapgml.o mapprojhack.o mapthread.o mapdraw.o mapgd.o mapagg.o mapoutput.o mapgdal.o mapswf.o mapimagemap.o mapows.o mapwfs.o mapwfslayer.o mapcontext.o maphttp.o mapdrawgdal.o mappdf.o mapjoin.o mapgraticule.o mapcopy.o mapogcfilter.o mapogcsld.o maptime.o mapwcs.o mapcpl.o cgiutil.o maprasterquery.o mapobject.o mapgeos.o classobject.o layerobject.o mapio.o mappool.o mapsvg.o mapregex.o mappluginlayer.o mapogcsos.o mappostgresql.o mapcrypto.o mapowscommon.o mapchart.o $(EPPL_OBJ) 
 
 EXE_LIST = 	shp2img shp2pdf legend mapserv shptree shptreevis \
 		shptreetst scalebar sortshp mapscriptvars tile4ms \
Index: mapdraw.c
===================================================================
--- mapdraw.c	(revision 6216)
+++ mapdraw.c	(working copy)
@@ -678,6 +678,10 @@
   {
       retcode = msDrawRasterLayer(map, layer, image_draw);
   }
+  else if(layer->type == MS_LAYER_CHART)
+  {
+  		retcode = msDrawChartLayer(map, layer, image_draw);
+  }
   /* Must be a Vector layer */
   else {
       retcode = msDrawVectorLayer(map, layer, image_draw);
@@ -1101,6 +1105,21 @@
 }
 
 /**
+ * Generic function to render chart layers.
+ */
+int msDrawChartLayer(mapObj *map, layerObj *layer, imageObj *image) 
+{
+    if (image && map && layer)
+    {
+        if( MS_RENDERER_GD(image->format) )
+            return msDrawChartLayerGD(map, layer, image);
+    }
+
+    return MS_FAILURE;
+}
+
+
+/**
  * msDrawWMSLayer()
  *
  * Draw a single WMS layer.  
Index: maplegend.c
===================================================================
--- maplegend.c	(revision 6216)
+++ maplegend.c	(working copy)
@@ -126,6 +126,7 @@
       break;
     case MS_LAYER_CIRCLE:
     case MS_LAYER_RASTER:
+	 case MS_LAYER_CHART:
     case MS_LAYER_POLYGON:
       for(i=0; i<class->numstyles; i++)     
         msDrawShadeSymbolGD(&map->symbolset, img, &box, class->styles[i], lp->scalefactor);
Index: maplexer.l
===================================================================
--- maplexer.l	(revision 6216)
+++ maplexer.l	(working copy)
@@ -285,6 +285,7 @@
 <INITIAL>butt                                  { return(MS_CJC_BUTT); }
 <INITIAL>cartoline                             { return(MS_SYMBOL_CARTOLINE); }
 <INITIAL,VALUE_STRING>cc                       { return(MS_CC); }
+<INITIAL,VALUE_STRING>chart 		       { return(MS_LAYER_CHART); }
 <INITIAL,VALUE_STRING>circle                   { return(MS_LAYER_CIRCLE); }
 <INITIAL,VALUE_STRING>cl                       { return(MS_CL); }
 <INITIAL,VALUE_STRING>cr                       { return(MS_CR); }

