@@ -1013,6 +1013,40 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10131013 if (layer -> minfeaturesize > 0 )
10141014 minfeaturesize = Pix2LayerGeoref (map , layer , layer -> minfeaturesize );
10151015
1016+ // Select how to render classes
1017+ // MS_FIRST_MATCHING_CLASS: Default and historic MapServer behavior
1018+ // MS_ALL_MATCHING_CLASSES: SLD behavior
1019+ int ref_rendermode ;
1020+ char * rendermodestr = msLayerGetProcessingKey (layer , "RENDERMODE" );
1021+ if (layer -> rendermode == MS_ALL_MATCHING_CLASSES )
1022+ {
1023+ // SLD takes precedence
1024+ ref_rendermode = MS_ALL_MATCHING_CLASSES ;
1025+ }
1026+ else if (!rendermodestr )
1027+ {
1028+ // Default Mapfile
1029+ ref_rendermode = MS_FIRST_MATCHING_CLASS ;
1030+ }
1031+ else if (!strcmp (rendermodestr ,"FIRST_MATCHING_CLASS" ))
1032+ {
1033+ // Explicit default Mapfile
1034+ ref_rendermode = MS_FIRST_MATCHING_CLASS ;
1035+ }
1036+ else if (!strcmp (rendermodestr ,"ALL_MATCHING_CLASSES" ))
1037+ {
1038+ // SLD-like Mapfile
1039+ ref_rendermode = MS_ALL_MATCHING_CLASSES ;
1040+ }
1041+ else
1042+ {
1043+ msLayerClose (layer );
1044+ msSetError (MS_MISCERR ,
1045+ "Unknown RENDERMODE: %s, should be one of: FIRST_MATCHING_CLASS, ALL_MATCHING_CLASSES." ,
1046+ "msDrawVectorLayer()" ,
1047+ rendermodestr );
1048+ return MS_FAILURE ;
1049+ }
10161050
10171051 /* step through the target shapes and their classes */
10181052 msInitShape (& shape );
@@ -1046,7 +1080,7 @@ int msDrawVectorLayer(mapObj *map, layerObj *layer, imageObj *image)
10461080 // i.e. only the first applicable class is actually applied. As a consequence,
10471081 // cache can be enabled when relevant.
10481082 classcount ++ ;
1049- rendermode = layer -> rendermode ;
1083+ rendermode = ref_rendermode ;
10501084 if ((classcount == 1 ) && (msShapeGetNextClass (classindex , layer , map , & shape , classgroup , nclasses ) == -1 ))
10511085 {
10521086 rendermode = MS_FIRST_MATCHING_CLASS ;
0 commit comments