[mapguide-commits] r7912 - in branches/2.5/MgDev: Server/src/PostBuild Server/src/Services/Mapping Server/src/UnitTesting UnitTest/TestData/MappingService

svn_mapguide at osgeo.org svn_mapguide at osgeo.org
Thu Nov 21 19:24:32 PST 2013


Author: jng
Date: 2013-11-21 19:24:32 -0800 (Thu, 21 Nov 2013)
New Revision: 7912

Added:
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTS.ldf
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTSWithTheme.ldf
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTS.ldf
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSSingleCTS.ldf
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSWithTheme.ldf
   branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_SingleFTSMultiCTS.ldf
Modified:
   branches/2.5/MgDev/Server/src/PostBuild/PostBuild.mak
   branches/2.5/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp
   branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
   branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.h
Log:
#2379: Improve the GETMAPLEGENDIMAGE operation:
 - Respect the ShowInLegend property of FeatureTypeStyle
 - Properly handle rendering of multi-FTS/multi-CTS layers with special care to give Composite Styles precedence should they coexist with AreaTypeStyle/PointTypeStyle/LineTypeStyle elements in the same vector scale range.
 - Add extra test data and rendering unit tests to cover these particular cases.

Reviewed by Walt Welton-Lair

Modified: branches/2.5/MgDev/Server/src/PostBuild/PostBuild.mak
===================================================================
--- branches/2.5/MgDev/Server/src/PostBuild/PostBuild.mak	2013-11-17 12:38:39 UTC (rev 7911)
+++ branches/2.5/MgDev/Server/src/PostBuild/PostBuild.mak	2013-11-22 03:24:32 UTC (rev 7912)
@@ -187,6 +187,12 @@
         ..\..\bin\UnitTestFiles\UT_Rail.sdf \
         ..\..\bin\UnitTestFiles\UT_Rail.fs \
         ..\..\bin\UnitTestFiles\UT_Rail.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf \
+        ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf \
         ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf \
         ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource \
         ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf \
@@ -446,6 +452,12 @@
         ..\..\bin\UnitTestFiles\UT_Rail.sdf \
         ..\..\bin\UnitTestFiles\UT_Rail.fs \
         ..\..\bin\UnitTestFiles\UT_Rail.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf \
+        ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf \
+        ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf \
         ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf \
         ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource \
         ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf \
@@ -705,6 +717,12 @@
           ..\..\bin\UnitTestFiles\UT_Rail.sdf \
           ..\..\bin\UnitTestFiles\UT_Rail.fs \
           ..\..\bin\UnitTestFiles\UT_Rail.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf \
+          ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf \
           ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf \
           ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource \
           ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf \
@@ -964,6 +982,12 @@
           ..\..\bin\UnitTestFiles\UT_Rail.sdf \
           ..\..\bin\UnitTestFiles\UT_Rail.fs \
           ..\..\bin\UnitTestFiles\UT_Rail.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf \
+          ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf \
+          ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf \
           ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf \
           ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource \
           ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf \
@@ -1096,6 +1120,12 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.sdf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.fs                     del /F ..\..\bin\UnitTestFiles\UT_Rail.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.ldf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf  del /F ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf      del /F ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf          del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf
@@ -1223,6 +1253,12 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.sdf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.fs                     del /F ..\..\bin\UnitTestFiles\UT_Rail.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.ldf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf  del /F ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf      del /F ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf          del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf
@@ -1350,6 +1386,12 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.sdf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.fs                     del /F ..\..\bin\UnitTestFiles\UT_Rail.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.ldf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf  del /F ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf      del /F ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf          del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf
@@ -1475,6 +1517,12 @@
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.sdf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.sdf
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.fs                     del /F ..\..\bin\UnitTestFiles\UT_Rail.fs
     if EXIST ..\..\bin\UnitTestFiles\UT_Rail.ldf                    del /F ..\..\bin\UnitTestFiles\UT_Rail.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf                del /F ..\..\bin\UnitTestFiles\UT_MultiFTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf       del /F ..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf
+    if EXIST ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf  del /F ..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf
     if EXIST ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf      del /F ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.FeatureSource
     if EXIST ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf          del /F ..\..\bin\UnitTestFiles\Sheboygan_Parcels.sdf
@@ -1574,6 +1622,12 @@
 "..\..\..\UnitTest\TestData\MappingService\UT_Rail.sdf" :
 "..\..\..\UnitTest\TestData\MappingService\UT_Rail.fs" :
 "..\..\..\UnitTest\TestData\MappingService\UT_Rail.ldf" :
+"..\..\..\UnitTestFiles\UT_MultiCTS.ldf" :
+"..\..\..\UnitTestFiles\UT_MultiCTSWithTheme.ldf" :
+"..\..\..\UnitTestFiles\UT_MultiFTS.ldf" :
+"..\..\..\UnitTestFiles\UT_MultiFTSSingleCTS.ldf" :
+"..\..\..\UnitTestFiles\UT_MultiFTSWithTheme.ldf" :
+"..\..\..\UnitTestFiles\UT_SingleFTSMultiCTS.ldf" :
 "..\..\..\UnitTest\TestData\MappingService\UT_RotatedPointStyles.ldf" :
 "..\..\..\UnitTest\TestData\TileService\UT_BaseMap.mdf" :
 "..\..\..\UnitTest\TestData\TileService\UT_Parcels.fs" :
@@ -1773,6 +1827,30 @@
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_Rail.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_Rail.ldf" ..\..\bin\UnitTestFiles\
 
+..\..\bin\UnitTestFiles\UT_MultiCTS.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTS.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTS.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTS.ldf" ..\..\bin\UnitTestFiles\
+
+..\..\bin\UnitTestFiles\UT_MultiCTSWithTheme.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTSWithTheme.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTSWithTheme.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_MultiCTSWithTheme.ldf" ..\..\bin\UnitTestFiles\
+
+..\..\bin\UnitTestFiles\UT_MultiFTS.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTS.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTS.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTS.ldf" ..\..\bin\UnitTestFiles\
+
+..\..\bin\UnitTestFiles\UT_MultiFTSSingleCTS.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSSingleCTS.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSSingleCTS.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSSingleCTS.ldf" ..\..\bin\UnitTestFiles\
+
+..\..\bin\UnitTestFiles\UT_MultiFTSWithTheme.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSWithTheme.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSWithTheme.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_MultiFTSWithTheme.ldf" ..\..\bin\UnitTestFiles\
+
+..\..\bin\UnitTestFiles\UT_SingleFTSMultiCTS.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_SingleFTSMultiCTS.ldf"
+    if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
+    if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_SingleFTSMultiCTS.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_SingleFTSMultiCTS.ldf" ..\..\bin\UnitTestFiles\
+
 ..\..\bin\UnitTestFiles\UT_RotatedPointStyles.ldf : "..\..\..\UnitTest\TestData\MappingService\UT_RotatedPointStyles.ldf"
     if NOT EXIST ..\..\bin\UnitTestFiles\nul mkdir ..\..\bin\UnitTestFiles
     if EXIST "..\..\..\UnitTest\TestData\MappingService\UT_RotatedPointStyles.ldf" xcopy /r /d /y "..\..\..\UnitTest\TestData\MappingService\UT_RotatedPointStyles.ldf" ..\..\bin\UnitTestFiles\

Modified: branches/2.5/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp
===================================================================
--- branches/2.5/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp	2013-11-17 12:38:39 UTC (rev 7911)
+++ branches/2.5/MgDev/Server/src/Services/Mapping/LegendPlotUtil.cpp	2013-11-22 03:24:32 UTC (rev 7912)
@@ -274,24 +274,70 @@
             if (ftscol->GetCount() == 0)
                 continue;
 
-            // if there are multiple feature type styles, using the first one
-            MdfModel::FeatureTypeStyle* fts = ftscol->GetAt(0);
-            MdfModel::RuleCollection* rules = fts->GetRules();
-            int nRuleCount = rules->GetCount();
+            //Peek ahead to determine what we're dealing with
+            bool bThemed = false;
+            int nCompositeStyleCount = 0;
+            MdfModel::FeatureTypeStyle* singleFTS = NULL;
+            MdfModel::FeatureTypeStyle* singleCTS = NULL;
+            int nTotalFTSRules = 0;
+            int nTotalCTSRules = 0;
+            //Compile type/rule count to determine if this is a themed layer
+            for (int j = 0; j < ftscol->GetCount(); j++)
+            {
+                MdfModel::FeatureTypeStyle* fts = ftscol->GetAt(j);
+                if (!fts->IsShowInLegend())
+                    continue;
 
+                MdfModel::RuleCollection* rules = fts->GetRules();
+                MdfModel::CompositeTypeStyle* cts = dynamic_cast<MdfModel::CompositeTypeStyle*>(fts);
+                //Composite Styles take precedence (it's what the stylizer does. So we're doing the same thing here). 
+                //If a Composite Style exists, we're using it.
+                if (NULL != cts)
+                {
+                    //For a single type scale range, this will only be set once. Otherwise it could
+                    //be set many times over (for each style type we encounter), but this is okay 
+                    //because we won't be using this pointer anyway for multi-type layers
+                    singleCTS = fts;
+                    nTotalCTSRules += rules->GetCount();
+                    nCompositeStyleCount++;
+                }
+                else
+                {
+                    //For a single type scale range, this will only be set once. Otherwise it could
+                    //be set many times over (for each style type we encounter), but this is okay 
+                    //because we won't be using this pointer anyway for multi-type layers
+                    singleFTS = fts;
+                    nTotalFTSRules += rules->GetCount();
+                }
+            }
+            //It's a themed layer if we found more than one rule of that type
+            bThemed = (nTotalFTSRules > 1);
+            //Found a composite style, re-evaluate against composite rule count
+            if (nCompositeStyleCount > 0)
+                bThemed = (nTotalCTSRules > 1);
+
             //add the layer icon, if any
             x = startX;
             RS_Bounds b2(x, y, x + dIconWidth, y + dIconHeight);
 
-            if (nRuleCount > 1)
+            if (bThemed)
             {
                 //in case of themed layer, use standard theme icon
                 DrawPNG(&dr, (unsigned char*)THEMED_LAYER_ICON, sizeof(THEMED_LAYER_ICON), bitmapPixelWidth, bitmapPixelHeight, b2);
             }
             else
             {
+                assert(NULL != singleFTS || NULL != singleCTS); //Should've been set by peek-ahead from above
+
+                MdfModel::FeatureTypeStyle* theFTS = NULL;
+                //Composite TS takes precedence
+                if (NULL != singleCTS)
+                    theFTS = singleCTS;
+                else if (NULL != singleFTS)
+                    theFTS = singleFTS;
+
                 //otherwise pick the icon from the only rule
-                Ptr<MgByteReader> layerIcon = MgMappingUtil::DrawFTS(m_svcResource, fts, bitmapPixelWidth, bitmapPixelHeight, 0);
+                Ptr<MgByteReader> layerIcon = MgMappingUtil::DrawFTS(m_svcResource, theFTS, bitmapPixelWidth, bitmapPixelHeight, 0);
 
                 if (layerIcon.p)
                 {
@@ -309,38 +355,56 @@
             RS_LabelInfo info(x, y + verticalTextAdjust, textDef);
             dr.ProcessLabelGroup(&info, 1, mapLayer->GetLegendLabel(), RS_OverpostType_All, false, NULL, 0.0);
 
-            if (nRuleCount > 1)
+            //layer is themed : draw the theme icons under the layer title
+            if (bThemed)
             {
                 //theme icons draw slightly indented
                 x = startX + initialMarginX;
 
-                //layer is themed : draw the theme icons under the layer title
-                for (int i = 0; i < nRuleCount; i++)
+                for (int j = 0; j < ftscol->GetCount(); j++)
                 {
-                    MdfModel::Rule* rule = rules->GetAt(i);
+                    MdfModel::FeatureTypeStyle* fts = ftscol->GetAt(j);
+                    //Skip items not marked for display
+                    if (!fts->IsShowInLegend())
+                        continue;
 
-                    //move y cursor down one line
-                    y -= verticalDelta;
+                    MdfModel::CompositeTypeStyle* cts = dynamic_cast<MdfModel::CompositeTypeStyle*>(fts);
+                    //If we found one or more composite styles, then they take precedence. So skip all non-composite ones
+                    if (nCompositeStyleCount > 0 && NULL == cts)
+                        continue;
 
-                    if (y < bottomLimit)
-                        break;
+                    MdfModel::RuleCollection* rules = fts->GetRules();
 
-                    //draw the icon for the current theming rule
-                    Ptr<MgByteReader> rdr = MgMappingUtil::DrawFTS(m_svcResource, fts, bitmapPixelWidth, bitmapPixelHeight, i);
-
-                    if (rdr != NULL)
+                    for (int k = 0; k < rules->GetCount(); k++)
                     {
-                        MgByteSink sink(rdr);
-                        Ptr<MgByte> bytes = sink.ToBuffer();
+                        MdfModel::Rule* rule = rules->GetAt(k);
 
-                        RS_Bounds b2(x, y, x + dIconWidth, y + dIconHeight);
-                        DrawPNG(&dr, bytes->Bytes(), bytes->GetLength(), bitmapPixelWidth, bitmapPixelHeight, b2);
+                        //move y cursor down one line
+                        y -= verticalDelta;
+
+                        if (y < bottomLimit)
+                            break;
+
+                        //draw the icon for the current theming rule
+                        Ptr<MgByteReader> rdr = MgMappingUtil::DrawFTS(m_svcResource, fts, bitmapPixelWidth, bitmapPixelHeight, k);
+
+                        if (rdr != NULL)
+                        {
+                            MgByteSink sink(rdr);
+                            Ptr<MgByte> bytes = sink.ToBuffer();
+
+                            RS_Bounds b2(x, y, x + dIconWidth, y + dIconHeight);
+                            DrawPNG(&dr, bytes->Bytes(), bytes->GetLength(), bitmapPixelWidth, bitmapPixelHeight, b2);
+                        }
+
+                        //draw the label after the icon, but also allow
+                        //some blank space for better clarity
+                        RS_LabelInfo info(x + dIconWidth + initialMarginX, y + verticalTextAdjust, textDef);
+                        dr.ProcessLabelGroup(&info, 1, rule->GetLegendLabel(), RS_OverpostType_All, false, NULL, 0.0);
                     }
 
-                    //draw the label after the icon, but also allow
-                    //some blank space for better clarity
-                    RS_LabelInfo info(x + dIconWidth + initialMarginX, y + verticalTextAdjust, textDef);
-                    dr.ProcessLabelGroup(&info, 1, rule->GetLegendLabel(), RS_OverpostType_All, false, NULL, 0.0);
+                    if (y < bottomLimit)
+                        break;
                 }
             }
         }

Modified: branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.cpp
===================================================================
--- branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.cpp	2013-11-17 12:38:39 UTC (rev 7911)
+++ branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.cpp	2013-11-22 03:24:32 UTC (rev 7912)
@@ -365,6 +365,38 @@
         Ptr<MgByteReader> dataReader7 = dataSource7->GetReader();
         m_svcResource->SetResourceData(fsres6, L"UT_VotingDistricts.sdf", L"File", dataReader7);
 
+        // ---------------------------------------------------------
+        // Data for exercising legend rendering
+        // ---------------------------------------------------------
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc14 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTS.ldf", false);
+        Ptr<MgByteReader> ldfrdr14 = ldfsrc14->GetReader();
+        m_svcResource->SetResource(ldfres14, ldfrdr14, NULL);
+
+        Ptr<MgResourceIdentifier> ldfres15 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc15 = new MgByteSource(L"../UnitTestFiles/UT_MultiCTS.ldf", false);
+        Ptr<MgByteReader> ldfrdr15 = ldfsrc15->GetReader();
+        m_svcResource->SetResource(ldfres15, ldfrdr15, NULL);
+
+        Ptr<MgResourceIdentifier> ldfres16 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc16 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTSWithTheme.ldf", false);
+        Ptr<MgByteReader> ldfrdr16 = ldfsrc16->GetReader();
+        m_svcResource->SetResource(ldfres16, ldfrdr16, NULL);
+
+        Ptr<MgResourceIdentifier> ldfres17 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc17 = new MgByteSource(L"../UnitTestFiles/UT_MultiCTSWithTheme.ldf", false);
+        Ptr<MgByteReader> ldfrdr17 = ldfsrc17->GetReader();
+        m_svcResource->SetResource(ldfres17, ldfrdr17, NULL);
+
+        Ptr<MgResourceIdentifier> ldfres18 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc18 = new MgByteSource(L"../UnitTestFiles/UT_MultiFTSSingleCTS.ldf", false);
+        Ptr<MgByteReader> ldfrdr18 = ldfsrc18->GetReader();
+        m_svcResource->SetResource(ldfres18, ldfrdr18, NULL);
+
+        Ptr<MgResourceIdentifier> ldfres19 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
+        Ptr<MgByteSource> ldfsrc19 = new MgByteSource(L"../UnitTestFiles/UT_SingleFTSMultiCTS.ldf", false);
+        Ptr<MgByteReader> ldfrdr19 = ldfsrc19->GetReader();
+        m_svcResource->SetResource(ldfres19, ldfrdr19, NULL);
     }
     catch (MgException* e)
     {
@@ -490,6 +522,19 @@
         Ptr<MgResourceIdentifier> fsres7 = new MgResourceIdentifier(L"Library://UnitTests/Data/VotingDistricts.FeatureSource");
         m_svcResource->DeleteResource(fsres7);
 
+        Ptr<MgResourceIdentifier> ldfres14 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres14);
+        Ptr<MgResourceIdentifier> ldfres15 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres15);
+        Ptr<MgResourceIdentifier> ldfres16 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres16);
+        Ptr<MgResourceIdentifier> ldfres17 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres17);
+        Ptr<MgResourceIdentifier> ldfres18 = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres18);
+        Ptr<MgResourceIdentifier> ldfres19 = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
+        m_svcResource->DeleteResource(ldfres19);
+
         #ifdef _DEBUG
         MgFdoConnectionManager* pFdoConnectionManager = MgFdoConnectionManager::GetInstance();
         if(pFdoConnectionManager)
@@ -726,17 +771,17 @@
 
         //Re-draw at 75k. Layer group should not be there because it has no visible layers
         map->SetViewScale(75000.0);
-		Ptr<MgByteReader> rdr3 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
-		rdr3->ToFile(GetPath(L"../UnitTestFiles/RenderLegend75kWithEmptyLayerGroup", imageFormat, extension));
+        Ptr<MgByteReader> rdr3 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr3->ToFile(GetPath(L"../UnitTestFiles/RenderLegend75kWithEmptyLayerGroup", imageFormat, extension));
 
         //Re-draw at 14000. Layer group should still not be there because it has no visible layers
         map->SetViewScale(14000.0);
-		Ptr<MgByteReader> rdr4 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr4 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr4->ToFile(GetPath(L"../UnitTestFiles/RenderLegend14kWithEmptyLayerGroup", imageFormat, extension));
 
         //Re-draw at 12000. Layer group should now be there because its child layer (Parcels) should be visible
         map->SetViewScale(12000.0);
-		Ptr<MgByteReader> rdr5 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        Ptr<MgByteReader> rdr5 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
         rdr5->ToFile(GetPath(L"../UnitTestFiles/RenderLegend12kWithLayerGroup", imageFormat, extension));
     }
     catch (MgException* e)
@@ -751,7 +796,211 @@
     }
 }
 
+void TestRenderingService::TestCase_RenderLegendMultiFTS(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
 
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTS.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTS", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+void TestRenderingService::TestCase_RenderLegendMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
+
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTS.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiCTS", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+void TestRenderingService::TestCase_RenderLegendMultiFTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
+
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSWithTheme.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTSWithTheme", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+void TestRenderingService::TestCase_RenderLegendMultiCTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
+
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiCTSWithTheme.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiCTSWithTheme", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+void TestRenderingService::TestCase_RenderLegendMultiFTSSingleCTS(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
+
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/MultiFTSSingleCTS.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendMultiFTSSingleCTS", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
+
+void TestRenderingService::TestCase_RenderLegendSingleFTSMultiCTS(CREFSTRING imageFormat, CREFSTRING extension)
+{
+    try
+    {
+        // make a runtime map
+        Ptr<MgMap> map = CreateTestMap();
+
+        // Insert our test layer
+        Ptr<MgResourceIdentifier> layerDef = new MgResourceIdentifier(L"Library://UnitTests/Layers/SingleFTSMultiCTS.LayerDefinition");
+        Ptr<MgLayer> layer = new MgLayer(layerDef, m_svcResource);
+        layer->SetLegendLabel(layerDef->GetName());
+        Ptr<MgLayerCollection> layers = map->GetLayers();
+        layers->Insert(0, layer);
+        map->Save();
+
+        // call the API using scales of 75000 and 12000
+        Ptr<MgColor> bgc = new MgColor(255, 255, 255, 255);
+
+        map->SetViewScale(75000.0);
+        Ptr<MgByteReader> rdr1 = m_svcRendering->RenderMapLegend(map, 200, 400, bgc, imageFormat);
+        rdr1->ToFile(GetPath(L"../UnitTestFiles/RenderLegendSingleFTSMultiCTS", imageFormat, extension));
+    }
+    catch (MgException* e)
+    {
+        STRING message = e->GetDetails(TEST_LOCALE);
+        SAFE_RELEASE(e);
+        CPPUNIT_FAIL(MG_WCHAR_TO_CHAR(message.c_str()));
+    }
+    catch (...)
+    {
+        throw;
+    }
+}
+
 void TestRenderingService::TestCase_QueryFeatures()
 {
     try

Modified: branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.h
===================================================================
--- branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.h	2013-11-17 12:38:39 UTC (rev 7911)
+++ branches/2.5/MgDev/Server/src/UnitTesting/TestRenderingService.h	2013-11-22 03:24:32 UTC (rev 7912)
@@ -40,6 +40,12 @@
     CPPUNIT_TEST(TestCase_RenderMapPNG);
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG);
     CPPUNIT_TEST(TestCase_RenderLegendPNG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSPNG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSPNG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemePNG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemePNG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSPNG);
+    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSPNG);
 
 	CPPUNIT_TEST(TestCase_SymbologyPointsPNG8);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamPNG8);
@@ -56,6 +62,12 @@
     CPPUNIT_TEST(TestCase_RenderMapPNG8);
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkPNG8);
     CPPUNIT_TEST(TestCase_RenderLegendPNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSPNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSPNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemePNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemePNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSPNG8);
+    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSPNG8);
 
 	CPPUNIT_TEST(TestCase_SymbologyPointsGIF);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamGIF);
@@ -72,6 +84,12 @@
     CPPUNIT_TEST(TestCase_RenderMapGIF);
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkGIF);
     CPPUNIT_TEST(TestCase_RenderLegendGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemeGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemeGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSGIF);
+    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSGIF);
 
 	CPPUNIT_TEST(TestCase_SymbologyPointsJPG);
     CPPUNIT_TEST(TestCase_SymbologyPointsParamJPG);
@@ -88,6 +106,12 @@
     CPPUNIT_TEST(TestCase_RenderMapJPG);
     CPPUNIT_TEST(TestCase_RenderMapWithWatermarkJPG);
     CPPUNIT_TEST(TestCase_RenderLegendJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSWithThemeJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiCTSWithThemeJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendMultiFTSSingleCTSJPG);
+    CPPUNIT_TEST(TestCase_RenderLegendSingleFTSMultiCTSJPG);
 
     CPPUNIT_TEST(TestCase_QueryFeatures);
 
@@ -113,6 +137,12 @@
     void TestCase_RenderMap(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_RenderMapWithWatermark(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_RenderLegend(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendMultiFTS(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendMultiCTS(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendMultiFTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendMultiCTSWithTheme(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendMultiFTSSingleCTS(CREFSTRING imageFormat, CREFSTRING extension);
+    void TestCase_RenderLegendSingleFTSMultiCTS(CREFSTRING imageFormat, CREFSTRING extension);
     
     void TestCase_SymbologyPoints(CREFSTRING imageFormat, CREFSTRING extension);
     void TestCase_SymbologyPointsParam(CREFSTRING imageFormat, CREFSTRING extension);
@@ -138,6 +168,12 @@
     void TestCase_Annotation1PNG() { TestCase_Annotation1(L"PNG", L"png"); }
     void TestCase_Annotation2PNG() { TestCase_Annotation2(L"PNG", L"png"); }
     void TestCase_Annotation3PNG() { TestCase_Annotation3(L"PNG", L"png"); }
+    void TestCase_RenderLegendMultiFTSPNG() { TestCase_RenderLegendMultiFTS(L"PNG", L"png"); }
+    void TestCase_RenderLegendMultiCTSPNG() { TestCase_RenderLegendMultiCTS(L"PNG", L"png"); }
+    void TestCase_RenderLegendMultiFTSWithThemePNG() { TestCase_RenderLegendMultiFTSWithTheme(L"PNG", L"png"); }
+    void TestCase_RenderLegendMultiCTSWithThemePNG() { TestCase_RenderLegendMultiCTSWithTheme(L"PNG", L"png"); }
+    void TestCase_RenderLegendMultiFTSSingleCTSPNG() { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG", L"png"); }
+    void TestCase_RenderLegendSingleFTSMultiCTSPNG() { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG", L"png"); }
 
 	//PNG8 output tests
 	void TestCase_RenderDynamicOverlayPNG8() { TestCase_RenderDynamicOverlay(L"PNG8", L"png"); }
@@ -153,6 +189,12 @@
     void TestCase_Annotation1PNG8() { TestCase_Annotation1(L"PNG8", L"png"); }
     void TestCase_Annotation2PNG8() { TestCase_Annotation2(L"PNG8", L"png"); }
     void TestCase_Annotation3PNG8() { TestCase_Annotation3(L"PNG8", L"png"); }
+    void TestCase_RenderLegendMultiFTSPNG8() { TestCase_RenderLegendMultiFTS(L"PNG8", L"png"); }
+    void TestCase_RenderLegendMultiCTSPNG8() { TestCase_RenderLegendMultiCTS(L"PNG8", L"png"); }
+    void TestCase_RenderLegendMultiFTSWithThemePNG8() { TestCase_RenderLegendMultiFTSWithTheme(L"PNG8", L"png"); }
+    void TestCase_RenderLegendMultiCTSWithThemePNG8() { TestCase_RenderLegendMultiCTSWithTheme(L"PNG8", L"png"); }
+    void TestCase_RenderLegendMultiFTSSingleCTSPNG8() { TestCase_RenderLegendMultiFTSSingleCTS(L"PNG8", L"png"); }
+    void TestCase_RenderLegendSingleFTSMultiCTSPNG8() { TestCase_RenderLegendSingleFTSMultiCTS(L"PNG8", L"png"); }
 
 	//GIF output tests
 	void TestCase_RenderDynamicOverlayGIF() { TestCase_RenderDynamicOverlay(L"GIF", L"gif"); }
@@ -168,6 +210,12 @@
     void TestCase_Annotation1GIF() { TestCase_Annotation1(L"GIF", L"gif"); }
     void TestCase_Annotation2GIF() { TestCase_Annotation2(L"GIF", L"gif"); }
     void TestCase_Annotation3GIF() { TestCase_Annotation3(L"GIF", L"gif"); }
+    void TestCase_RenderLegendMultiFTSGIF() { TestCase_RenderLegendMultiFTS(L"GIF", L"gif"); }
+    void TestCase_RenderLegendMultiCTSGIF() { TestCase_RenderLegendMultiCTS(L"GIF", L"gif"); }
+    void TestCase_RenderLegendMultiFTSWithThemeGIF() { TestCase_RenderLegendMultiFTSWithTheme(L"GIF", L"gif"); }
+    void TestCase_RenderLegendMultiCTSWithThemeGIF() { TestCase_RenderLegendMultiCTSWithTheme(L"GIF", L"gif"); }
+    void TestCase_RenderLegendMultiFTSSingleCTSGIF() { TestCase_RenderLegendMultiFTSSingleCTS(L"GIF", L"gif"); }
+    void TestCase_RenderLegendSingleFTSMultiCTSGIF() { TestCase_RenderLegendSingleFTSMultiCTS(L"GIF", L"gif"); }
 
 	//JPG output tests
 	void TestCase_RenderDynamicOverlayJPG() { TestCase_RenderDynamicOverlay(L"JPG", L"jpg"); }
@@ -183,6 +231,12 @@
     void TestCase_Annotation1JPG() { TestCase_Annotation1(L"JPG", L"jpg"); }
     void TestCase_Annotation2JPG() { TestCase_Annotation2(L"JPG", L"jpg"); }
     void TestCase_Annotation3JPG() { TestCase_Annotation3(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendMultiFTSJPG() { TestCase_RenderLegendMultiFTS(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendMultiCTSJPG() { TestCase_RenderLegendMultiCTS(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendMultiFTSWithThemeJPG() { TestCase_RenderLegendMultiFTSWithTheme(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendMultiCTSWithThemeJPG() { TestCase_RenderLegendMultiCTSWithTheme(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendMultiFTSSingleCTSJPG() { TestCase_RenderLegendMultiFTSSingleCTS(L"JPG", L"jpg"); }
+    void TestCase_RenderLegendSingleFTSMultiCTSJPG() { TestCase_RenderLegendSingleFTSMultiCTS(L"JPG", L"jpg"); }
 
     //void TestCase_RendererPerformance();
 

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTS.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTS.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTS.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,231 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.4.0" xsi:noNamespaceSchemaLocation="LayerDefinition-2.4.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <Watermarks/>
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Square</Name>
+                <Description>Default Point Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M -1.0,-1.0 L 1.0,-1.0 L 1.0,1.0 L -1.0,1.0 L -1.0,-1.0</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                  </Path>
+                </Graphics>
+                <PointUsage>
+                  <Angle>%ROTATION%</Angle>
+                </PointUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffffffff</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>ROTATION</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>&Rotation</DisplayName>
+                    <Description>Rotation</Description>
+                    <DataType>Angle</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffffffff</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>ROTATION</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <AddToExclusionRegion>true</AddToExclusionRegion>
+              <UsageContext>Point</UsageContext>
+              <GeometryContext>Point</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <UsageContext>Line</UsageContext>
+              <GeometryContext>LineString</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Fill</Name>
+                <Description>Default Area Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 h 100.0 v 100.0 h -100.0 z</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                  </Path>
+                </Graphics>
+                <AreaUsage>
+                  <RepeatX>100.0</RepeatX>
+                  <RepeatY>100.0</RepeatY>
+                </AreaUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffbfbfbf</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Fill</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffbfbfbf</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTSWithTheme.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTSWithTheme.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiCTSWithTheme.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,441 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.4.0" xsi:noNamespaceSchemaLocation="LayerDefinition-2.4.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <Watermarks />
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Square</Name>
+                <Description>Default Point Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M -1.0,-1.0 L 1.0,-1.0 L 1.0,1.0 L -1.0,1.0 L -1.0,-1.0</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                  </Path>
+                </Graphics>
+                <PointUsage>
+                  <Angle>%ROTATION%</Angle>
+                </PointUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffffffff</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>ROTATION</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>&Rotation</DisplayName>
+                    <Description>Rotation</Description>
+                    <DataType>Angle</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffffffff</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>ROTATION</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <AddToExclusionRegion>true</AddToExclusionRegion>
+              <UsageContext>Point</UsageContext>
+              <GeometryContext>Point</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel>Single Track</LegendLabel>
+          <Filter>Mod(Autogenerated_SDF_ID, 2) = 0</Filter>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <ScaleX>%StyleEditorGenerated_ScaleX_0%</ScaleX>
+                    <ScaleY>%StyleEditorGenerated_ScaleY_0%</ScaleY>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                    <LineCap>%StyleEditorGenerated_LineCap_0%</LineCap>
+                    <LineJoin>%StyleEditorGenerated_LineJoin_0%</LineJoin>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_ScaleX_0</Identifier>
+                    <DefaultValue>1.0</DefaultValue>
+                    <DisplayName>Path ScaleX</DisplayName>
+                    <Description>Path ScaleX</Description>
+                    <DataType>Real</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_ScaleY_0</Identifier>
+                    <DefaultValue>1.0</DefaultValue>
+                    <DisplayName>Path ScaleY</DisplayName>
+                    <Description>Path ScaleY</Description>
+                    <DataType>Real</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_LineCap_0</Identifier>
+                    <DefaultValue>'Round'</DefaultValue>
+                    <DisplayName>Line Cap</DisplayName>
+                    <Description>The cap type to use at the ends of each segment in the path outline.  This must evaluate to one of: None, Round (default), Triangle, or Square.</Description>
+                    <DataType>String</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_LineJoin_0</Identifier>
+                    <DefaultValue>'Round'</DefaultValue>
+                    <DisplayName>Line Join</DisplayName>
+                    <Description>The join type to use at each vertex in the path outline.  This must evaluate to one of: None, Bevel, Round (default), or Miter.</Description>
+                    <DataType>String</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffff0000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_ScaleX_0</ParameterIdentifier>
+                  <ParameterValue>1.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_ScaleY_0</ParameterIdentifier>
+                  <ParameterValue>1.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_LineCap_0</ParameterIdentifier>
+                  <ParameterValue>'Round'</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_LineJoin_0</ParameterIdentifier>
+                  <ParameterValue>'Round'</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <UsageContext>Line</UsageContext>
+              <GeometryContext>LineString</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+        <CompositeRule>
+          <LegendLabel>Dual Track</LegendLabel>
+          <Filter>Mod(Autogenerated_SDF_ID, 2) = 1</Filter>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <ScaleX>%StyleEditorGenerated_ScaleX_0%</ScaleX>
+                    <ScaleY>%StyleEditorGenerated_ScaleY_0%</ScaleY>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                    <LineCap>%StyleEditorGenerated_LineCap_0%</LineCap>
+                    <LineJoin>%StyleEditorGenerated_LineJoin_0%</LineJoin>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_ScaleX_0</Identifier>
+                    <DefaultValue>1.0</DefaultValue>
+                    <DisplayName>Path ScaleX</DisplayName>
+                    <Description>Path ScaleX</Description>
+                    <DataType>Real</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_ScaleY_0</Identifier>
+                    <DefaultValue>1.0</DefaultValue>
+                    <DisplayName>Path ScaleY</DisplayName>
+                    <Description>Path ScaleY</Description>
+                    <DataType>Real</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_LineCap_0</Identifier>
+                    <DefaultValue>'Round'</DefaultValue>
+                    <DisplayName>Line Cap</DisplayName>
+                    <Description>The cap type to use at the ends of each segment in the path outline.  This must evaluate to one of: None, Round (default), Triangle, or Square.</Description>
+                    <DataType>String</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>StyleEditorGenerated_LineJoin_0</Identifier>
+                    <DefaultValue>'Round'</DefaultValue>
+                    <DisplayName>Line Join</DisplayName>
+                    <Description>The join type to use at each vertex in the path outline.  This must evaluate to one of: None, Bevel, Round (default), or Miter.</Description>
+                    <DataType>String</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff90ee90</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_ScaleX_0</ParameterIdentifier>
+                  <ParameterValue>1.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_ScaleY_0</ParameterIdentifier>
+                  <ParameterValue>1.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_LineCap_0</ParameterIdentifier>
+                  <ParameterValue>'Round'</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>StyleEditorGenerated_LineJoin_0</ParameterIdentifier>
+                  <ParameterValue>'Round'</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <UsageContext>Line</UsageContext>
+              <GeometryContext>LineString</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+        <CompositeRule>
+          <LegendLabel>Other</LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <UsageContext>Line</UsageContext>
+              <GeometryContext>LineString</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Fill</Name>
+                <Description>Default Area Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 h 100.0 v 100.0 h -100.0 z</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                  </Path>
+                </Graphics>
+                <AreaUsage>
+                  <RepeatX>100.0</RepeatX>
+                  <RepeatY>100.0</RepeatY>
+                </AreaUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffbfbfbf</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Fill</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffbfbfbf</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTS.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTS.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTS.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,71 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.2.0" xsi:noNamespaceSchemaLocation="LayerDefinition-1.2.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <PointTypeStyle>
+        <DisplayAsText>false</DisplayAsText>
+        <AllowOverpost>false</AllowOverpost>
+        <PointRule>
+          <LegendLabel />
+          <PointSymbolization2D>
+            <Mark>
+              <Unit>Points</Unit>
+              <SizeContext>DeviceUnits</SizeContext>
+              <SizeX>10</SizeX>
+              <SizeY>10</SizeY>
+              <Rotation>0</Rotation>
+              <Shape>Square</Shape>
+              <Fill>
+                <FillPattern>Solid</FillPattern>
+                <ForegroundColor>ffffffff</ForegroundColor>
+                <BackgroundColor>ffffffff</BackgroundColor>
+              </Fill>
+              <Edge>
+                <LineStyle>Solid</LineStyle>
+                <Thickness>1</Thickness>
+                <Color>ff000000</Color>
+                <Unit>Points</Unit>
+                <SizeContext>MappingUnits</SizeContext>
+              </Edge>
+            </Mark>
+          </PointSymbolization2D>
+        </PointRule>
+      </PointTypeStyle>
+      <LineTypeStyle>
+        <LineRule>
+          <LegendLabel />
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FFFF0000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+      </LineTypeStyle>
+      <AreaTypeStyle>
+        <AreaRule>
+          <LegendLabel />
+          <AreaSymbolization2D>
+            <Fill>
+              <FillPattern>Solid</FillPattern>
+              <ForegroundColor>ffffffff</ForegroundColor>
+              <BackgroundColor>ffffffff</BackgroundColor>
+            </Fill>
+            <Stroke>
+              <LineStyle>Solid</LineStyle>
+              <Thickness>1</Thickness>
+              <Color>ff000000</Color>
+              <Unit>Points</Unit>
+              <SizeContext>MappingUnits</SizeContext>
+            </Stroke>
+          </AreaSymbolization2D>
+        </AreaRule>
+      </AreaTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSSingleCTS.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSSingleCTS.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSSingleCTS.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,150 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.2.0" xsi:noNamespaceSchemaLocation="LayerDefinition-1.2.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <PointTypeStyle>
+        <DisplayAsText>false</DisplayAsText>
+        <AllowOverpost>false</AllowOverpost>
+        <PointRule>
+          <LegendLabel />
+          <PointSymbolization2D>
+            <Mark>
+              <Unit>Points</Unit>
+              <SizeContext>DeviceUnits</SizeContext>
+              <SizeX>10</SizeX>
+              <SizeY>10</SizeY>
+              <Rotation>0</Rotation>
+              <Shape>Square</Shape>
+              <Fill>
+                <FillPattern>Solid</FillPattern>
+                <ForegroundColor>ffffffff</ForegroundColor>
+                <BackgroundColor>ffffffff</BackgroundColor>
+              </Fill>
+              <Edge>
+                <LineStyle>Solid</LineStyle>
+                <Thickness>1</Thickness>
+                <Color>ff000000</Color>
+                <Unit>Points</Unit>
+                <SizeContext>MappingUnits</SizeContext>
+              </Edge>
+            </Mark>
+          </PointSymbolization2D>
+        </PointRule>
+      </PointTypeStyle>
+      <LineTypeStyle>
+        <LineRule>
+          <LegendLabel />
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FFFF0000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+      </LineTypeStyle>
+      <AreaTypeStyle>
+        <AreaRule>
+          <LegendLabel />
+          <AreaSymbolization2D>
+            <Fill>
+              <FillPattern>Solid</FillPattern>
+              <ForegroundColor>ffffffff</ForegroundColor>
+              <BackgroundColor>ffffffff</BackgroundColor>
+            </Fill>
+            <Stroke>
+              <LineStyle>Solid</LineStyle>
+              <Thickness>1</Thickness>
+              <Color>ff000000</Color>
+              <Unit>Points</Unit>
+              <SizeContext>MappingUnits</SizeContext>
+            </Stroke>
+          </AreaSymbolization2D>
+        </AreaRule>
+      </AreaTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Square</Name>
+                <Description>Default Point Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M -1.0,-1.0 L 1.0,-1.0 L 1.0,1.0 L -1.0,1.0 L -1.0,-1.0</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                  </Path>
+                </Graphics>
+                <PointUsage>
+                  <Angle>%ROTATION%</Angle>
+                </PointUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffffffff</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>ROTATION</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>&Rotation</DisplayName>
+                    <Description>Rotation</Description>
+                    <DataType>Angle</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffffffff</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>ROTATION</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <AddToExclusionRegion>true</AddToExclusionRegion>
+              <UsageContext>Point</UsageContext>
+              <GeometryContext>Point</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSWithTheme.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSWithTheme.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_MultiFTSWithTheme.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,93 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="1.2.0" xsi:noNamespaceSchemaLocation="LayerDefinition-1.2.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <PointTypeStyle>
+        <DisplayAsText>false</DisplayAsText>
+        <AllowOverpost>false</AllowOverpost>
+        <PointRule>
+          <LegendLabel />
+          <PointSymbolization2D>
+            <Mark>
+              <Unit>Points</Unit>
+              <SizeContext>DeviceUnits</SizeContext>
+              <SizeX>10</SizeX>
+              <SizeY>10</SizeY>
+              <Rotation>0</Rotation>
+              <Shape>Square</Shape>
+              <Fill>
+                <FillPattern>Solid</FillPattern>
+                <ForegroundColor>ffffffff</ForegroundColor>
+                <BackgroundColor>ffffffff</BackgroundColor>
+              </Fill>
+              <Edge>
+                <LineStyle>Solid</LineStyle>
+                <Thickness>1</Thickness>
+                <Color>ff000000</Color>
+                <Unit>Points</Unit>
+                <SizeContext>MappingUnits</SizeContext>
+              </Edge>
+            </Mark>
+          </PointSymbolization2D>
+        </PointRule>
+      </PointTypeStyle>
+      <LineTypeStyle>
+        <LineRule>
+          <LegendLabel>Single Track</LegendLabel>
+          <Filter>Mod(Autogenerated_SDF_ID, 2) = 0</Filter>
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FFFF0000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+        <LineRule>
+          <LegendLabel>Dual Track</LegendLabel>
+          <Filter>Mod(Autogenerated_SDF_ID, 2) = 1</Filter>
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FF008000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+        <LineRule>
+          <LegendLabel>Other</LegendLabel>
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FF000000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+      </LineTypeStyle>
+      <AreaTypeStyle>
+        <AreaRule>
+          <LegendLabel />
+          <AreaSymbolization2D>
+            <Fill>
+              <FillPattern>Solid</FillPattern>
+              <ForegroundColor>ffffffff</ForegroundColor>
+              <BackgroundColor>ffffffff</BackgroundColor>
+            </Fill>
+            <Stroke>
+              <LineStyle>Solid</LineStyle>
+              <Thickness>1</Thickness>
+              <Color>ff000000</Color>
+              <Unit>Points</Unit>
+              <SizeContext>MappingUnits</SizeContext>
+            </Stroke>
+          </AreaSymbolization2D>
+        </AreaRule>
+      </AreaTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>

Added: branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_SingleFTSMultiCTS.ldf
===================================================================
--- branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_SingleFTSMultiCTS.ldf	                        (rev 0)
+++ branches/2.5/MgDev/UnitTest/TestData/MappingService/UT_SingleFTSMultiCTS.ldf	2013-11-22 03:24:32 UTC (rev 7912)
@@ -0,0 +1,243 @@
+<?xml version="1.0"?>
+<LayerDefinition xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" version="2.4.0" xsi:noNamespaceSchemaLocation="LayerDefinition-2.4.0.xsd">
+  <VectorLayerDefinition>
+    <ResourceId>Library://UnitTests/Data/Rail.FeatureSource</ResourceId>
+    <Watermarks/>
+    <FeatureName>SHP_Schema:Rail</FeatureName>
+    <FeatureNameType>FeatureClass</FeatureNameType>
+    <Geometry>SHPGEOM</Geometry>
+    <VectorScaleRange>
+      <LineTypeStyle>
+        <LineRule>
+          <LegendLabel />
+          <LineSymbolization2D>
+            <LineStyle>Rail</LineStyle>
+            <Thickness>0.0</Thickness>
+            <Color>FFFF0000</Color>
+            <Unit>Centimeters</Unit>
+            <SizeContext>DeviceUnits</SizeContext>
+          </LineSymbolization2D>
+        </LineRule>
+      </LineTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Square</Name>
+                <Description>Default Point Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M -1.0,-1.0 L 1.0,-1.0 L 1.0,1.0 L -1.0,1.0 L -1.0,-1.0</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                  </Path>
+                </Graphics>
+                <PointUsage>
+                  <Angle>%ROTATION%</Angle>
+                </PointUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffffffff</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>ROTATION</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>&Rotation</DisplayName>
+                    <Description>Rotation</Description>
+                    <DataType>Angle</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffffffff</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Square</SymbolName>
+                  <ParameterIdentifier>ROTATION</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <AddToExclusionRegion>true</AddToExclusionRegion>
+              <UsageContext>Point</UsageContext>
+              <GeometryContext>Point</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <UsageContext>Line</UsageContext>
+              <GeometryContext>LineString</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+      <CompositeTypeStyle>
+        <CompositeRule>
+          <LegendLabel></LegendLabel>
+          <CompositeSymbolization>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Fill</Name>
+                <Description>Default Area Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 h 100.0 v 100.0 h -100.0 z</Geometry>
+                    <FillColor>%FILLCOLOR%</FillColor>
+                  </Path>
+                </Graphics>
+                <AreaUsage>
+                  <RepeatX>100.0</RepeatX>
+                  <RepeatY>100.0</RepeatY>
+                </AreaUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>FILLCOLOR</Identifier>
+                    <DefaultValue>0xffbfbfbf</DefaultValue>
+                    <DisplayName>&Fill Color</DisplayName>
+                    <Description>Fill Color</Description>
+                    <DataType>FillColor</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Fill</SymbolName>
+                  <ParameterIdentifier>FILLCOLOR</ParameterIdentifier>
+                  <ParameterValue>0xffbfbfbf</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+            <SymbolInstance>
+              <SimpleSymbolDefinition>
+                <Name>Solid Line</Name>
+                <Description>Default Line Symbol</Description>
+                <Graphics>
+                  <Path>
+                    <Geometry>M 0.0,0.0 L 1.0,0.0</Geometry>
+                    <LineColor>%LINECOLOR%</LineColor>
+                    <LineWeight>%LINEWEIGHT%</LineWeight>
+                    <LineWeightScalable>false</LineWeightScalable>
+                  </Path>
+                </Graphics>
+                <LineUsage>
+                  <Repeat>1.0</Repeat>
+                </LineUsage>
+                <ParameterDefinition>
+                  <Parameter>
+                    <Identifier>LINECOLOR</Identifier>
+                    <DefaultValue>0xff000000</DefaultValue>
+                    <DisplayName>Line &Color</DisplayName>
+                    <Description>Line Color</Description>
+                    <DataType>LineColor</DataType>
+                  </Parameter>
+                  <Parameter>
+                    <Identifier>LINEWEIGHT</Identifier>
+                    <DefaultValue>0.0</DefaultValue>
+                    <DisplayName>Line &Thickness</DisplayName>
+                    <Description>Line Thickness</Description>
+                    <DataType>LineWeight</DataType>
+                  </Parameter>
+                </ParameterDefinition>
+              </SimpleSymbolDefinition>
+              <ParameterOverrides>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINECOLOR</ParameterIdentifier>
+                  <ParameterValue>0xff000000</ParameterValue>
+                </Override>
+                <Override>
+                  <SymbolName>Solid Line</SymbolName>
+                  <ParameterIdentifier>LINEWEIGHT</ParameterIdentifier>
+                  <ParameterValue>0.0</ParameterValue>
+                </Override>
+              </ParameterOverrides>
+              <GeometryContext>Polygon</GeometryContext>
+            </SymbolInstance>
+          </CompositeSymbolization>
+        </CompositeRule>
+      </CompositeTypeStyle>
+    </VectorScaleRange>
+  </VectorLayerDefinition>
+</LayerDefinition>



More information about the mapguide-commits mailing list